:root{color-scheme:dark;--bg:#121414;--card:#1b1e1e;--line:#303434;--muted:#909b96;--green:#c2f294;--text:#f4f4ee}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,-apple-system,BlinkMacSystemFont,'PingFang SC',sans-serif;font-size:14px}button,input,a{-webkit-tap-highlight-color:transparent}button,a{transition:background .2s,transform .2s}button{font:inherit;cursor:pointer}button:disabled{opacity:.4;cursor:wait}button:focus-visible,a:focus-visible{outline:2px solid var(--green);outline-offset:4px}button:hover{filter:brightness(1.1)}.rail{position:fixed;width:76px;height:100vh;border-right:1px solid var(--line);display:flex;align-items:center;flex-direction:column;padding:27px 0;gap:42px}.brand{font-size:29px;font-weight:900;text-decoration:none;color:var(--text)}.brand span{color:var(--green)}.rail-icon{font-size:27px;padding:8px 12px;border-radius:12px;background:#2b3428;color:var(--green)}.rail-bottom{margin-top:auto;color:#647069;font-size:9px;letter-spacing:2px;line-height:1.8;text-align:center}main{max-width:1400px;margin-left:76px;padding:40px 46px 18px}header{display:flex;align-items:center;justify-content:space-between;margin-bottom:30px}.eyebrow,.section-number{font-size:10px;letter-spacing:2px;color:var(--muted)}h1{font-size:28px;font-weight:600;letter-spacing:1px;margin:12px 0}h1 span{font-size:10px;padding:5px 9px;background:#2c3429;color:var(--green);vertical-align:middle;letter-spacing:0;border-radius:5px;margin-left:15px}header p{font-size:13px;color:var(--muted);margin:0}.outline{color:var(--text);border:1px solid #465046;padding:12px 17px;text-decoration:none;border-radius:8px;font-size:12px}.outline:hover{background:#303930}.workspace{display:grid;grid-template-columns:minmax(370px,1fr) minmax(430px,1fr);gap:28px}.preview-panel{border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#191c1b}.panel-title{display:flex;justify-content:space-between;padding:17px 22px;font-size:12px;border-bottom:1px solid var(--line)}.status-dot{width:6px;height:6px;border-radius:50%;background:var(--green);display:inline-block;margin-right:6px}.connection{color:var(--green);font-size:11px}.connection.offline{color:#ffaf97}.stage-wrap{padding:22px;background:radial-gradient(ellipse at center,#2a302b,#171a18);display:flex;justify-content:center}.stage{width:340px;aspect-ratio:9/16;position:relative;overflow:hidden;background:#f7eecf;color:#393a2f;border-radius:10px;isolation:isolate;container-type:inline-size;box-shadow:0 12px 45px #0004}.stage:before{content:'';position:absolute;left:-30%;bottom:-42%;width:160%;height:80%;background:#d1dbac;border-radius:50%;z-index:-1}.stage:after{content:'';position:absolute;inset:0;opacity:.18;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 150 150' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.7' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Cpath fill='%23999' filter='url(%23n)' opacity='.3' d='M0 0h150v150H0z'/%3E%3C/svg%3E");z-index:8}.stage-top{position:absolute;top:4%;left:7%;right:7%;display:flex;align-items:center;justify-content:space-between;font-size:2.7cqw}.studio-pill{border:1px solid #6d725d;border-radius:20px;padding:5px 10px;letter-spacing:1px}.demo-pill{color:#787b67}.stage-heading{position:absolute;top:13%;left:9%}.stage-heading>span{font-size:3cqw;letter-spacing:3px}.stage-heading h2{font-size:11cqw;line-height:1.18;letter-spacing:-1px;margin:12px 0;font-weight:850}.stage-heading h2 span{color:#e88862;padding-left:4px}.spark{position:absolute;color:#e88862}.spark-one{font-size:16cqw;right:10%;top:19%;transform:rotate(15deg)}.spark-two{font-size:9cqw;left:8%;top:49%;color:#8e9c67}.spark-three{font-size:5cqw;right:12%;top:65%}.speech{position:absolute;top:37%;left:50%;transform:translateX(-50%);background:#fffdf1;border:1px solid #b9bba0;padding:8px 14px;border-radius:12px;font-size:3cqw;white-space:nowrap;z-index:3;box-shadow:0 3px 0 #4b513010}.speech:after{content:'';position:absolute;width:10px;height:10px;left:48%;bottom:-6px;background:#fffdf1;border-bottom:1px solid #b9bba0;border-right:1px solid #b9bba0;transform:rotate(45deg)}.duck-area{position:absolute;width:77%;height:41%;top:43%;left:11.5%}.duck{position:absolute;width:100%;height:100%;transform-origin:50% 88%;animation:idle 2.8s ease-in-out infinite}.duck img{width:100%;height:100%;object-fit:contain}.duck-shadow{position:absolute;bottom:4%;left:24%;width:56%;height:8%;background:#71834c38;border-radius:50%;filter:blur(2px)}.glasses,.bow,.hammer,.notes,.bonk-star{display:none;position:absolute}.glasses{left:27%;top:25%;font-size:9cqw;color:#272b30;letter-spacing:-5px;transform:rotate(-6deg)}.glasses span{font-size:5cqw;vertical-align:middle}.bow{left:47%;top:49%;font-size:8cqw;color:#d27667}.hammer{right:0;top:0;font-size:17cqw;transform-origin:85% 15%}.notes{top:20%;left:-5%;width:115%;font-size:12cqw;color:#e08063;letter-spacing:12px}.notes span{float:right;color:#72955e}.bonk-star{left:32%;top:-3%;font-size:21cqw;color:#e88862}.stage.dance .duck{animation:dance .55s ease-in-out infinite}.stage.dance .notes{display:block;animation:float .65s infinite alternate}.stage.dress .duck{animation:dress 1s ease-in-out infinite}.stage.dress .glasses,.stage.dress .bow{display:block}.stage.bonk .duck{animation:bonk .6s ease-in-out infinite}.stage.bonk .hammer{display:block;animation:hammer .6s infinite}.stage.bonk .bonk-star{display:block;animation:star .6s infinite}.nameplate{position:absolute;top:83%;left:50%;transform:translateX(-50%);font-size:2.8cqw;border-radius:20px;padding:5px 13px;background:#f8f3daae;white-space:nowrap;max-width:90%;overflow:hidden;text-overflow:ellipsis}.stage-footer{position:absolute;bottom:3%;left:7%;right:7%;text-align:center}.instruction{border-top:1px solid #8e987366;padding-top:12px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px;font-size:2.5cqw}.instruction>span{color:#63704d}.instruction b{font-weight:600}.stage-caption{font-size:2.5cqw;color:#788264;margin-top:10px}.preview-foot{display:flex;justify-content:space-between;padding:13px 19px;font-size:10px;color:var(--muted);align-items:center}.controls{display:flex;flex-direction:column;gap:18px}.card{padding:25px;border:1px solid var(--line);border-radius:14px;background:var(--card)}.card h2{font-size:20px;font-weight:550;margin:12px 0 8px}.muted{color:var(--muted);font-size:12px;margin:0 0 22px}label{display:block;font-size:11px;color:#b6beb8;margin:0 0 9px}input{background:#141717;color:#eeeee4;border:1px solid #384039;border-radius:7px;padding:12px 13px;font:inherit;font-size:12px;width:100%;outline:none}input:focus{border-color:var(--green)}.action-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:15px}.action{background:#272e25;border:1px solid #45503b;border-radius:9px;display:flex;flex-direction:column;align-items:flex-start;padding:15px 12px;color:#f0f2e7}.action:nth-child(2){background:#2e2933;border-color:#4b3e54}.action:nth-child(3){background:#342a25;border-color:#534138}.action:nth-child(4){background:#2a2218;border-color:#5c4a32}.action>span{font-size:28px;color:var(--green);height:39px}.action:nth-child(2)>span{color:#ceb3e6}.action:nth-child(3)>span{color:#edb493}.action:nth-child(4)>span{color:#e8c48a;font-size:22px;font-weight:800;letter-spacing:.12em}.action>b{font-size:13px;font-weight:500}.action>small{color:#a3ab9e;font-size:9px;margin-top:6px}.action:hover{transform:translateY(-3px)}.divider{display:flex;align-items:center;gap:12px;margin:22px 0 15px;font-size:10px;color:var(--muted)}.divider:before,.divider:after{content:'';height:1px;background:var(--line);flex:1}form{display:flex;gap:9px}.primary{border:0;border-radius:7px;background:var(--green);color:#24311e;white-space:nowrap;padding:10px 15px;font-size:12px;font-weight:600}.notice{font-size:10px;color:#7f8981;margin-top:12px}#feedback{font-size:11px;color:var(--green);min-height:14px;margin-top:8px}#feedback.error{color:#ffaf97}.queue-title{display:flex;align-items:center;justify-content:space-between;gap:12px}.queue-title h2{font-size:18px;margin-bottom:16px}#queue-count{font-size:11px;background:#303a2b;color:var(--green);padding:3px 7px;border-radius:5px;vertical-align:middle;margin-left:4px}.text-button{background:none;border:0;color:var(--green);font-size:10px;padding:4px}.secondary{color:var(--muted);margin-left:7px}.now-playing{display:flex;align-items:center;gap:14px;background:#252c24;padding:14px;border-radius:8px}.equalizer{color:var(--green);font-size:20px}.now-playing small{display:block;font-size:9px;color:var(--muted);margin-bottom:6px}.now-playing b{font-size:12px;font-weight:500}#current-time{margin-left:auto;font-size:10px;color:var(--green);white-space:nowrap}.progress{height:2px;background:#2e352a;margin:0 7px}#progress-bar{height:100%;width:0;background:var(--green)}.queue-list{min-height:52px;max-height:115px;overflow:auto}.empty{font-size:11px;color:#7e897f;text-align:center;padding:19px 0}.queue-row{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #303530;padding:10px 2px;font-size:11px;gap:10px}.queue-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.queue-row small{color:var(--muted);white-space:nowrap}.stats{display:flex;border-top:1px solid var(--line);padding-top:16px;justify-content:space-around;margin-top:6px}.stats>div{display:flex;align-items:center;flex-direction:column;gap:7px}.stats b{font-size:21px;font-weight:500;font-variant-numeric:tabular-nums}.stats span{color:var(--muted);font-size:9px}.setup-note{display:flex;gap:13px;padding:0 8px;align-items:center}.setup-note>span{font-size:22px;color:var(--green)}.setup-note b{font-size:11px;font-weight:500}.setup-note p{font-size:10px;color:var(--muted);margin:6px 0 0}.app-footer{display:flex;justify-content:space-between;margin-top:25px;font-size:9px;letter-spacing:1px;color:#667169}.app-footer span{letter-spacing:0}.stage-clip{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#070605;z-index:0}
.stage.png-act .stage-clip{opacity:0}
.stage.png-act .duck-area{display:block}
.duck-area[hidden]{display:none}
.stage.png-act .duck-area[hidden]{display:block}
.clip-error{position:absolute;left:50%;bottom:22%;transform:translateX(-50%);z-index:6;background:#3a1c16e6;color:#ffd7c8;border:1px solid #a45b45;border-radius:10px;padding:10px 12px;font-size:2.8cqw;display:flex;gap:8px;align-items:center;white-space:nowrap}
.clip-error[hidden]{display:none}
.clip-error button{background:var(--green);color:#24311e;border:0;border-radius:6px;padding:6px 10px;font-size:2.6cqw}
#retry{margin-top:12px;width:100%}
.stage-only{background:#000;overflow:hidden}
.stage-only .rail,.stage-only header,.stage-only .controls,.stage-only .panel-title,.stage-only .preview-foot,.stage-only .app-footer{display:none}
.stage-only main{margin:0;padding:0;max-width:none}
.stage-only .workspace{display:block}
.stage-only .preview-panel,.stage-only .stage-wrap{border:0;padding:0;background:#000;border-radius:0}
.stage-only .stage-heading,.stage-only .stage-top,.stage-only .stage-footer,.stage-only .speech,.stage-only .spark{display:none}
.stage-only .nameplate{bottom:6%;top:auto;z-index:5}
.stage-only .stage{width:100vw;height:100vh;max-width:none;aspect-ratio:auto;border-radius:0;box-shadow:none}@keyframes idle{50%{transform:translateY(-5px) rotate(2deg)}}@keyframes dance{0%,100%{transform:rotate(-12deg) translateY(-5px)}50%{transform:rotate(12deg) translateY(-18px)}}@keyframes dress{50%{transform:rotate(-5deg) scale(1.06)}}@keyframes bonk{0%,100%{transform:scale(1,1)}25%{transform:scale(1.16,.8)}60%{transform:scale(.94,1.07) translateY(-7px)}}@keyframes hammer{0%,100%{transform:rotate(25deg)}25%{transform:rotate(-35deg)}}@keyframes star{0%,70%,100%{opacity:0;transform:scale(.5)}25%{opacity:1;transform:scale(1.2)}}@keyframes float{to{transform:translateY(-14px) rotate(8deg)}}@media(min-width:1500px){main{margin-left:auto;margin-right:auto;padding-left:90px}}@media(max-width:1050px){main{padding:28px 24px}.workspace{grid-template-columns:minmax(310px,1fr) minmax(350px,1fr);gap:18px}.card{padding:20px}.stage-wrap{padding:20px 12px}.stage{width:310px}.action{padding:12px 9px}h1{font-size:25px}}@media(max-width:800px){.rail{display:none}main{margin:0;padding:24px 16px}.workspace{grid-template-columns:1fr}.stage{width:340px}header{gap:15px}header h1{font-size:21px}h1 span{display:none}.outline{font-size:10px;padding:10px}.eyebrow{font-size:8px}.app-footer{font-size:8px;gap:15px}.stage-only main{padding:0}.action>small{font-size:10px}}@media(prefers-reduced-motion:reduce){.duck{animation:none}.action{transition:none}}

/* Generated 3D-look character scene. Source PNG preserves generated alpha. */
.stage{background:#100e0d;color:#fff0d6}.stage:before{display:none}.stage:after{background:linear-gradient(180deg,#0909099c,transparent 25%,transparent 72%,#090909df);opacity:1;z-index:1}.stage-top,.stage-heading,.stage-footer,.speech,.nameplate{z-index:4}.stage-top{top:3%}.studio-pill{background:#15120fc9;border-color:#846547;color:#f1c195}.demo-pill{color:#d1b294}.stage-heading{top:10%;left:7%}.stage-heading>span{color:#b7a48e;font-size:2.6cqw;letter-spacing:2px}.stage-heading h2{font-size:6.5cqw;margin-top:6px;text-shadow:0 2px 12px #000}.stage-heading h2 span{color:#f19a50}.duck-area{top:17%;left:0;width:100%;height:75%}.duck img{object-fit:contain;mask-image:linear-gradient(to bottom,transparent,black 6%,black 92%,transparent)}.duck-shadow,.spark{display:none}.speech{top:auto;bottom:21%;left:50%;font-size:2.8cqw;background:#201910e8;color:#ffe0b8;border-color:#9e6d42;box-shadow:0 4px 20px #0006}.speech:after{background:#201910;border-color:#9e6d42}.nameplate{top:auto;bottom:15.8%;background:#332519db;color:#ffd4a7;border:1px solid #79502b}.instruction{border-color:#80532e;color:#fce1bd}.instruction>span{color:#c29b70}.stage-caption{color:#b49576}.stage-footer{bottom:3%}.glasses{left:44%;top:20%;font-size:7cqw;letter-spacing:-4px}.bow{left:47%;top:50%;font-size:8cqw}.notes{z-index:3;top:40%;font-size:11cqw}.hammer{z-index:3;right:3%;top:7%}.bonk-star{z-index:3;left:45%;top:16%}.stage.dress .duck img{filter:hue-rotate(22deg) saturate(1.15)}
/* Ten-second slapstick performance: anticipation, five hits, dizzy, sobbing. */
.slap-hand,.impact-word,.dizzy-stars{display:none;position:absolute;z-index:6;pointer-events:none}.stage.bonk .hammer,.stage.bonk .bonk-star{display:none}.stage.bonk .duck{animation:none}.stage[data-phase=windup] .duck{animation:anticipate .9s both}.stage[data-phase=slap] .duck{animation:slap-recoil .5s infinite}.stage[data-phase=slap] .slap-hand{display:block;top:25%;left:-25%;font-size:30cqw;animation:hand-slap .5s infinite;filter:drop-shadow(4px 5px 2px #0008)}.stage[data-phase=slap] .impact-word{display:block;right:5%;top:23%;font-size:16cqw;color:#ffdf60;font-weight:1000;text-shadow:3px 3px #a03119;transform:rotate(-15deg);animation:impact-pop .5s infinite}.stage[data-phase=dizzy] .duck{animation:dizzy 1s both}.stage[data-phase=dizzy] .dizzy-stars{display:block;top:5%;left:28%;font-size:12cqw;color:#ffe180;animation:float .25s infinite alternate}.stage[data-phase=cry] .duck{animation:sob .32s infinite;transform-origin:50% 65%}.stage[data-phase=cry] .duck img{mask-image:none}.stage[data-phase=cry] .speech{color:#c7efff;border-color:#64bad7;background:#162e40eb}.stage[data-phase=recover] .duck{animation:idle .9s infinite}.stage[data-phase=cry]:after{background:linear-gradient(180deg,#06192844,transparent 25%,transparent 75%,#07101fe0)}
@keyframes anticipate{50%{transform:translateX(-12px) rotate(-9deg) scale(.92)}100%{transform:rotate(-15deg) scale(.96)}}
@keyframes slap-recoil{0%{transform:translateX(-8%) rotate(-12deg)}18%{transform:translateX(19%) rotate(32deg) scale(1.15,.8)}35%{transform:translateX(12%) translateY(-9%) rotate(24deg) scale(.88,1.13)}70%{transform:translateX(-7%) rotate(-18deg)}100%{transform:translateX(-8%) rotate(-12deg)}}
@keyframes hand-slap{0%{transform:translateX(-80%) rotate(-30deg);opacity:0}18%{transform:translateX(190%) rotate(18deg);opacity:1}38%{transform:translateX(200%) rotate(25deg);opacity:1}100%{transform:translateX(-80%);opacity:0}}
@keyframes impact-pop{0%,65%,100%{opacity:0;scale:.4}20%{opacity:1;scale:1.2}40%{opacity:1;scale:1}}
@keyframes dizzy{0%{transform:rotate(25deg) translateY(-10%)}30%{transform:rotate(-30deg) translateY(5%)}60%{transform:rotate(15deg)}100%{transform:rotate(0)}}
@keyframes sob{0%,100%{transform:translateY(0) rotate(-2deg) scale(1)}50%{transform:translateY(-7px) rotate(2deg) scale(1.025,.98)}}
.stage:not(.png-act) .stage-heading{display:none}
.stage:not(.png-act):after{z-index:1;opacity:.55}
.fx{position:absolute;inset:0;z-index:5;pointer-events:none;overflow:hidden}
.fx .blob,.fx .note,.fx .spot,.fx .lyric{display:none}
.stage.dance .blob,.stage.sing .note,.stage.dance .note{display:block}
.stage.sing .spot,.stage.sing .lyric{display:block}
.blob{position:absolute;width:34cqw;height:34cqw;border-radius:50%;filter:blur(8px);mix-blend-mode:screen;opacity:.8}
.b1{left:4%;top:14%;background:#ff4d9a;animation:disco 0.7s linear infinite}
.b2{right:2%;top:22%;background:#41e7ff;animation:disco 0.55s linear infinite reverse}
.b3{left:32%;bottom:18%;background:#ffe14a;animation:disco 0.9s linear infinite}
.note{position:absolute;color:#ffe58a;font-size:9cqw;text-shadow:0 2px 8px #000;animation:float-note .7s ease-in-out infinite}
.n1{left:8%;top:22%;animation-delay:0s}
.n2{right:10%;top:18%;animation-delay:.15s;color:#7ef0c0}
.n3{left:18%;top:38%;animation-delay:.3s;color:#ff9ad4;font-size:7cqw}
.n4{right:16%;top:42%;animation-delay:.45s;font-size:11cqw}
.spot{position:absolute;left:12%;top:-12%;width:76%;height:78%;background:radial-gradient(ellipse at center,#fff7c888 0 22%,transparent 70%);animation:spot 1.1s ease-in-out infinite}
.lyric{position:absolute;left:58%;top:16%;font-size:12cqw;font-weight:900;color:#fff3c2;text-shadow:3px 4px 0 #c25a1a,0 10px 18px #000;animation:lyric 0.34s ease-in-out infinite;letter-spacing:.08em}
.stage.dance .stage-clip{transform-origin:50% 58%;animation:duck-dance .36s ease-in-out infinite}
.stage.sing .stage-clip{transform-origin:50% 48%;animation:duck-sing .42s ease-in-out infinite}
.stage.dance .speech{background:#3a1840e8;border-color:#e07ad6;color:#ffd6fb}
.stage.sing .speech{background:#3a2a12e8;border-color:#e0b15a;color:#ffe9b4}
@keyframes disco{0%{transform:translate(0,0) scale(1)}50%{transform:translate(12%,-10%) scale(1.25)}100%{transform:translate(-8%,8%) scale(.85)}}
@keyframes float-note{0%,100%{transform:translateY(0) rotate(-8deg);opacity:.3}40%{opacity:1}50%{transform:translateY(-28%) rotate(12deg);opacity:1}}
@keyframes spot{50%{opacity:.55;transform:scale(1.08)}0%,100%{opacity:1;transform:scale(1)}}
@keyframes lyric{0%,100%{transform:scale(1) rotate(-8deg)}50%{transform:scale(1.22) rotate(10deg)}}
@keyframes duck-dance{0%,100%{transform:rotate(-9deg) translateY(0) scale(1.06,.94)}25%{transform:rotate(11deg) translateY(-5%) scale(.9,1.1)}50%{transform:rotate(-7deg) translateY(-9%) scale(1.1,.88)}75%{transform:rotate(9deg) translateY(-3%) scale(.94,1.06)}}
@keyframes duck-sing{0%,100%{transform:translateY(0) scale(1,1) rotate(-2deg)}30%{transform:translateY(-3%) scale(1.08,.92) rotate(3deg)}55%{transform:translateY(-6%) scale(.94,1.08) rotate(-4deg)}80%{transform:translateY(-2%) scale(1.05,.96) rotate(2deg)}}
@media(prefers-reduced-motion:reduce){.stage.dance .stage-clip,.stage.sing .stage-clip,.note,.blob,.lyric,.spot{animation:none}}

/* 庭仗：拖上板凳 → 趴下 → 三杖 → 苦求 */
.cane-scene{display:none;position:absolute;inset:0;z-index:2;pointer-events:none}
.stage.cane .cane-scene{display:block}
.stage.cane .stage-clip{opacity:0;visibility:hidden}
.stage.cane .stage-footer,.stage.cane .stage-top,.stage.cane .stage-heading,.stage.cane .fx{display:none}
.stage.cane{background:#140e0c}
.stage.cane:after{opacity:1;background:radial-gradient(ellipse at 50% 28%,#6a241688,transparent 58%),linear-gradient(180deg,#120805cc,transparent 28%,transparent 58%,#080504f0);z-index:1}
.stage.cane .speech{top:6.5%;bottom:auto;z-index:8;background:#3a2214e8;border-color:#c49a62;color:#ffe7c2}
.stage.cane .speech:after{background:#3a2214;border-color:#c49a62}
.stage.cane[data-phase=plead] .speech{background:#162e40eb;border-color:#64bad7;color:#c7efff}
.stage.cane[data-phase=plead] .speech:after{background:#162e40;border-color:#64bad7}
.stage.cane .nameplate{bottom:3.2%;top:auto;z-index:8}
.cane-ground{position:absolute;left:-12%;right:-12%;bottom:-10%;height:34%;background:radial-gradient(ellipse at 50% 0%,#4a3220 0%,#120e0c 72%);z-index:0}
.cane-bench{position:absolute;left:5%;width:90%;bottom:15%;height:17%;z-index:1}
.bench-top{position:absolute;top:0;left:0;right:0;height:34%;border-radius:4px;background:repeating-linear-gradient(90deg,#7a4a20 0 12px,#c48a48 12px 22px,#6a3818 22px 26px),linear-gradient(#e0a45c,#6a3818);background-blend-mode:multiply;box-shadow:0 6px 0 #2a1408,0 14px 20px #0007,inset 0 3px 0 #ffd090aa}
.bench-leg{position:absolute;width:9%;bottom:0;top:24%;background:linear-gradient(90deg,#1a1008,#5a381c 42%,#140c08);box-shadow:3px 0 0 #0005}
.bench-leg.left{left:12%;transform:skewX(-7deg)}
.bench-leg.right{right:12%;transform:skewX(7deg)}
.bench-brace{position:absolute;left:16%;right:16%;top:58%;height:11%;background:#3a2414;box-shadow:0 2px 0 #140c08}
.cane-rope{position:absolute;left:-32%;top:46%;width:58%;height:2.6cqw;border-radius:4px;background:repeating-linear-gradient(90deg,#d2c09a,#8a7048 7px,#e4d6b4 9px);transform-origin:left center;opacity:0;z-index:2;box-shadow:0 3px 0 #0005}
.stage.cane[data-phase=drag] .cane-rope{animation:cane-rope-pull 1.6s both}
.cane-duck{position:absolute;left:12%;top:13%;width:76%;height:64%;z-index:3;transform-origin:50% 62%}
.cane-duck .sprite{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:drop-shadow(4px 12px 10px #0009);transition:opacity .16s linear}
.cane-duck .cry{opacity:0}
.stage.cane[data-phase=plead] .cane-duck .cry{opacity:1}
.stage.cane[data-phase=plead] .cane-duck .idle{opacity:0}
.stage.cane[data-phase=drag] .cane-duck{animation:cane-drag 1.6s cubic-bezier(.2,.7,.2,1) both}
.stage.cane[data-phase=prone] .cane-duck{animation:cane-prone .8s ease-in-out both}
.stage.cane[data-phase=hit1] .cane-duck{animation:cane-hit-a .78s ease-in both}
.stage.cane[data-phase=hit2] .cane-duck{animation:cane-hit-b .78s ease-in both}
.stage.cane[data-phase=hit3] .cane-duck{animation:cane-hit-c .78s ease-in both}
.stage.cane[data-phase=plead] .cane-duck{animation:cane-plead-up .55s cubic-bezier(.2,.8,.2,1) both,cane-plead-sob .34s .55s ease-in-out infinite}
.cane-stick{position:absolute;right:14%;top:3%;width:11%;height:54%;z-index:5;transform-origin:50% 4%;opacity:0;filter:drop-shadow(3px 10px 8px #000c)}
.cane-stick .shaft{position:absolute;inset:12% 6% 8% 6%;border-radius:7px;background:linear-gradient(90deg,#5a220c,#e09040 26%,#ffe2a8 48%,#c46828 70%,#3a1408);box-shadow:inset 3px 0 5px #fff7,inset -3px 0 5px #0007,0 0 0 1.5px #2a1008}
.cane-stick .grip{position:absolute;top:0;left:-8%;right:-8%;height:14%;border-radius:7px;background:linear-gradient(#f0d090,#8a4a18);box-shadow:inset 0 1px 0 #fff3,0 2px 0 #3a1808}
.cane-stick .head{position:absolute;left:-18%;right:-18%;bottom:0;height:11%;border-radius:50%;background:radial-gradient(circle at 35% 32%,#ffe7b0,#c46828 62%,#3a1408);box-shadow:0 4px 0 #1a0a06}
.stage.cane[data-phase=prone] .cane-stick{opacity:1;animation:cane-stick-raise .8s both}
.stage.cane[data-phase=hit1] .cane-stick{opacity:1;animation:cane-stick-a .78s ease-in both}
.stage.cane[data-phase=hit2] .cane-stick{opacity:1;animation:cane-stick-b .78s ease-in both}
.stage.cane[data-phase=hit3] .cane-stick{opacity:1;animation:cane-stick-c .78s ease-in both}
.stage.cane[data-phase=plead] .cane-stick{opacity:.85;transform:rotate(-38deg) translate(8%,-4%)}
.cane-impact{position:absolute;left:38%;top:28%;z-index:6;font-size:16cqw;font-weight:900;color:#ffe27a;text-shadow:3px 3px 0 #7a1c12,0 8px 14px #0008;transform:rotate(-18deg);opacity:0}
.stage.cane[data-phase=hit1] .cane-impact{animation:cane-bang-a .48s ease-out}
.stage.cane[data-phase=hit2] .cane-impact{animation:cane-bang-b .48s ease-out}
.stage.cane[data-phase=hit3] .cane-impact{animation:cane-bang-c .48s ease-out}
.cane-dust{position:absolute;width:11cqw;height:11cqw;border-radius:50%;background:#c4a07066;filter:blur(2px);opacity:0;z-index:6}
.cane-dust.d1{left:28%;top:46%}
.cane-dust.d2{left:46%;top:40%}
.cane-dust.d3{left:60%;top:48%}
.stage.cane[data-phase=hit1] .cane-dust{animation:cane-puff-a .55s ease-out}
.stage.cane[data-phase=hit2] .cane-dust{animation:cane-puff-b .55s ease-out}
.stage.cane[data-phase=hit3] .cane-dust{animation:cane-puff-c .55s ease-out}
.stage.cane[data-phase=hit1] .cane-bench{animation:cane-bench-a .4s ease-out}
.stage.cane[data-phase=hit2] .cane-bench{animation:cane-bench-b .4s ease-out}
.stage.cane[data-phase=hit3] .cane-bench{animation:cane-bench-c .4s ease-out}
@keyframes cane-rope-pull{0%{opacity:1;transform:translateX(0)}22%{opacity:1;transform:translateX(-20%)}68%{opacity:.55;transform:translateX(42%) rotate(14deg)}100%{opacity:0;transform:translateX(72%) rotate(30deg)}}
@keyframes cane-drag{0%{transform:translate(-6%,0) rotate(0) scale(1)}20%{transform:translate(-20%,6%) rotate(-16deg) scale(.96)}46%{transform:translate(6%,10%) rotate(38deg) scale(1.08,.82)}76%{transform:translate(2%,20%) rotate(76deg) scale(.84)}100%{transform:translate(2%,22%) rotate(84deg) scale(.8)}}
@keyframes cane-prone{0%,100%{transform:translate(2%,22%) rotate(84deg) scale(.8)}50%{transform:translate(2%,24%) rotate(87deg) scale(.84,.72)}}
@keyframes cane-hit-a{0%{transform:translate(2%,22%) rotate(84deg) scale(.8)}16%{transform:translate(2%,27%) rotate(84deg) scale(1.2,.46)}38%{transform:translate(5%,16%) rotate(68deg) scale(.74,.98)}100%{transform:translate(2%,22%) rotate(84deg) scale(.8)}}
@keyframes cane-hit-b{0%{transform:translate(2%,22%) rotate(84deg) scale(.8)}16%{transform:translate(2%,27%) rotate(84deg) scale(1.2,.46)}38%{transform:translate(5%,16%) rotate(68deg) scale(.74,.98)}100%{transform:translate(2%,22%) rotate(84deg) scale(.8)}}
@keyframes cane-hit-c{0%{transform:translate(2%,22%) rotate(84deg) scale(.8)}16%{transform:translate(2%,27%) rotate(84deg) scale(1.2,.46)}38%{transform:translate(5%,16%) rotate(68deg) scale(.74,.98)}100%{transform:translate(2%,22%) rotate(84deg) scale(.8)}}
@keyframes cane-plead-up{0%{transform:translate(2%,22%) rotate(84deg) scale(.8)}100%{transform:translate(0,12%) rotate(-4deg) scale(.9)}}
@keyframes cane-plead-sob{0%,100%{transform:translate(0,12%) rotate(-4deg) scale(.9)}50%{transform:translate(0,9%) rotate(5deg) scale(.94,.86)}}
@keyframes cane-stick-raise{from{transform:rotate(-62deg) translate(20%,-8%);opacity:0}to{transform:rotate(-40deg);opacity:1}}
@keyframes cane-stick-a{0%{transform:rotate(-40deg)}18%{transform:rotate(22deg) translateY(6%)}42%{transform:rotate(12deg)}100%{transform:rotate(-40deg)}}
@keyframes cane-stick-b{0%{transform:rotate(-40deg)}18%{transform:rotate(22deg) translateY(6%)}42%{transform:rotate(12deg)}100%{transform:rotate(-40deg)}}
@keyframes cane-stick-c{0%{transform:rotate(-40deg)}18%{transform:rotate(22deg) translateY(6%)}42%{transform:rotate(12deg)}100%{transform:rotate(-40deg)}}
@keyframes cane-bang-a{0%,100%{opacity:0;scale:.4}18%{opacity:1;scale:1.18}40%{opacity:1;scale:1}}
@keyframes cane-bang-b{0%,100%{opacity:0;scale:.4}18%{opacity:1;scale:1.18}40%{opacity:1;scale:1}}
@keyframes cane-bang-c{0%,100%{opacity:0;scale:.4}18%{opacity:1;scale:1.18}40%{opacity:1;scale:1}}
@keyframes cane-puff-a{0%{opacity:0;transform:scale(.25)}28%{opacity:.85;transform:scale(1.35)}100%{opacity:0;transform:scale(1.9) translateY(-24%)}}
@keyframes cane-puff-b{0%{opacity:0;transform:scale(.25)}28%{opacity:.85;transform:scale(1.35)}100%{opacity:0;transform:scale(1.9) translateY(-24%)}}
@keyframes cane-puff-c{0%{opacity:0;transform:scale(.25)}28%{opacity:.85;transform:scale(1.35)}100%{opacity:0;transform:scale(1.9) translateY(-24%)}}
@keyframes cane-bench-a{0%,100%{transform:none}18%{transform:translateY(10%) rotate(1.2deg)}40%{transform:translateY(-3%)}}
@keyframes cane-bench-b{0%,100%{transform:none}18%{transform:translateY(10%) rotate(1.2deg)}40%{transform:translateY(-3%)}}
@keyframes cane-bench-c{0%,100%{transform:none}18%{transform:translateY(10%) rotate(1.2deg)}40%{transform:translateY(-3%)}}
@media(prefers-reduced-motion:reduce){.stage.cane .cane-duck,.stage.cane .cane-stick,.stage.cane .cane-impact,.stage.cane .cane-dust,.stage.cane .cane-rope,.stage.cane .cane-bench{animation:none!important}.stage.cane .cane-duck{transform:translate(0,12%) rotate(-4deg) scale(.9)}.stage.cane .cane-stick{opacity:.85;transform:rotate(-38deg)}}

/* 中国舞：上台 → 水袖 → 劈叉 → 裂裤 → 捂住跑掉 */
.dance-scene{display:none;position:absolute;inset:0;z-index:2;pointer-events:none}
.stage.dance .dance-scene{display:block}
.stage.dance .stage-clip{opacity:0;visibility:hidden;animation:none}
.stage.dance .stage-footer,.stage.dance .stage-top,.stage.dance .stage-heading,.stage.dance .fx{display:none}
.stage.dance{background:#2a0c10}
.stage.dance:after{opacity:1;background:linear-gradient(180deg,#1a060888,transparent 30%,transparent 62%,#140608ee);z-index:1}
.stage.dance .speech{top:7%;bottom:auto;z-index:8;background:#4a1420e8;border-color:#e8b060;color:#ffe7c4;font-family:STKaiti,KaiTi,'PingFang SC',serif}
.stage.dance .speech:after{background:#4a1420;border-color:#e8b060}
.stage.dance[data-phase=rip] .speech,.stage.dance[data-phase=cover] .speech,.stage.dance[data-phase=run] .speech{background:#3a1840e8;border-color:#e07ad6;color:#ffd6fb}
.stage.dance .nameplate{bottom:3.2%;top:auto;z-index:8}
.cn-sky{position:absolute;inset:0 0 28% 0;background:radial-gradient(ellipse at 70% 18%,#5a2030,transparent 42%),linear-gradient(#1a0a14,#3a1018 55%,#5a2418);z-index:0}
.cn-moon{position:absolute;right:12%;top:8%;width:16cqw;height:16cqw;border-radius:50%;background:radial-gradient(circle at 35% 35%,#fff4d2,#e8c878 70%);box-shadow:0 0 24px #e8c87888;z-index:1}
.cn-lantern{position:absolute;top:10%;width:11cqw;padding:7cqw 0 4cqw;text-align:center;font-size:3.4cqw;color:#ffe9b0;font-family:STKaiti,KaiTi,serif;background:radial-gradient(ellipse at 50% 40%,#e05040,#8a1414);border-radius:50% 50% 46% 46%;box-shadow:0 8px 16px #0006;z-index:2}
.cn-lantern:before{content:'';position:absolute;left:50%;top:-18%;width:2px;height:22%;background:#c4a060;transform:translateX(-50%)}
.cn-lantern.ln1{left:8%;animation:lantern-swing 2.4s ease-in-out infinite}
.cn-lantern.ln2{right:22%;animation:lantern-swing 2.8s ease-in-out infinite reverse}
.cn-curtain{position:absolute;top:0;width:18%;height:42%;z-index:2;background:linear-gradient(90deg,#6a0810,#c41e3a 40%,#8a1018);box-shadow:inset -8px 0 12px #0006}
.cn-curtain.left{left:0;border-radius:0 0 80% 0;transform-origin:top left}
.cn-curtain.right{right:0;border-radius:0 0 0 80%;transform-origin:top right;background:linear-gradient(-90deg,#6a0810,#c41e3a 40%,#8a1018)}
.cn-title{position:absolute;top:4%;left:50%;transform:translateX(-50%);z-index:3;font-family:STKaiti,KaiTi,'PingFang SC',serif;font-size:4.6cqw;letter-spacing:.3em;color:#ffe7b0;text-shadow:0 2px 0 #6a1010,0 0 18px #c41e3a88}
.cn-floor{position:absolute;left:-8%;right:-8%;bottom:0;height:30%;z-index:1;background:repeating-linear-gradient(#7a4820 0 9%,#5a3014 9% 11%);box-shadow:inset 0 18px 28px #0005}
.cn-duck{position:absolute;left:16%;top:18%;width:68%;height:62%;z-index:4;transform-origin:50% 78%}
.cn-duck .sprite{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 12px 10px #0008)}
.sleeve{position:absolute;top:40%;width:48%;height:10%;border-radius:40%;z-index:2;opacity:.92;filter:blur(.3px)}
.sleeve.sl{left:-18%;background:linear-gradient(90deg,transparent,#e8c070,#c41e3a 70%,#fff3);transform-origin:100% 50%}
.sleeve.sr{right:-18%;background:linear-gradient(-90deg,transparent,#e8c070,#c41e3a 70%,#fff3);transform-origin:0 50%}
.cn-pants{position:absolute;bottom:2%;width:15%;height:20%;z-index:3;background:linear-gradient(180deg,#d4a24a,#c41e3a 35%,#6a1018);border-radius:36% 36% 14% 14%;box-shadow:inset 2px 0 0 #ffd08066,3px 6px 8px #0005}
.cn-pants.pl{left:34%}
.cn-pants.pr{left:51%}
.split-leg{position:absolute;bottom:5%;height:9%;width:52%;opacity:0;z-index:3;background:linear-gradient(#c41e3a,#e8a060);border-radius:40%;box-shadow:0 4px 6px #0005}
.split-leg.lg{right:48%;transform-origin:100% 50%}
.split-leg.rg{left:48%;transform-origin:0 50%}
.cn-duck .hands{position:absolute;left:26%;bottom:12%;width:48%;height:26%;z-index:6;opacity:0;display:flex;gap:6%}
.cn-duck .hands i{flex:1;border-radius:46%;border:3px solid #5a2010;background:radial-gradient(circle at 32% 28%,#fff8ee,#f0b080 55%,#c46838);box-shadow:0 4px 0 #0005, inset 0 -6px 0 #0002}
.cn-fabric{position:absolute;width:14cqw;height:8cqw;background:linear-gradient(#d4a24a,#c41e3a);border-radius:4px;opacity:0;z-index:6}
.cn-fabric.fb1{left:30%;top:58%}
.cn-fabric.fb2{right:22%;top:52%}
.cn-rip-word{position:absolute;left:50%;top:30%;transform:translateX(-50%) rotate(-8deg);font-size:12cqw;font-weight:900;color:#ffe27a;text-shadow:3px 3px 0 #7a1020;opacity:0;z-index:7;white-space:nowrap}
.stage.dance[data-phase=perform] .cn-duck{animation:cn-dance 0.7s ease-in-out infinite}
.stage.dance[data-phase=perform] .sleeve.sl{animation:sleeve-l .7s ease-in-out infinite}
.stage.dance[data-phase=perform] .sleeve.sr{animation:sleeve-r .7s ease-in-out infinite}
.stage.dance[data-phase=split] .cn-duck{animation:cn-split .7s cubic-bezier(.2,.8,.2,1) both}
.stage.dance[data-phase=split] .sleeve{opacity:.35}
.stage.dance[data-phase=split] .split-leg.lg,.stage.dance[data-phase=rip] .split-leg.lg{opacity:1;transform:rotate(14deg)}
.stage.dance[data-phase=split] .split-leg.rg,.stage.dance[data-phase=rip] .split-leg.rg{opacity:1;transform:rotate(-14deg)}
.stage.dance[data-phase=rip] .cn-duck{animation:cn-split-hold .2s both}
.stage.dance[data-phase=rip] .cn-pants.pl{animation:pants-l .55s ease-out both}
.stage.dance[data-phase=rip] .cn-pants.pr{animation:pants-r .55s ease-out both}
.stage.dance[data-phase=rip] .cn-fabric{animation:fabric-fly .7s ease-out both}
.stage.dance[data-phase=rip] .cn-fabric.fb2{animation-delay:.05s}
.stage.dance[data-phase=rip] .cn-rip-word{animation:cane-bang-a .7s ease-out}
.stage.dance[data-phase=cover] .cn-duck{animation:cn-cover .45s both}
.stage.dance[data-phase=cover] .hands{opacity:1}
.stage.dance[data-phase=cover] .cn-pants,.stage.dance[data-phase=run] .cn-pants,.stage.dance[data-phase=cover] .sleeve,.stage.dance[data-phase=run] .sleeve,.stage.dance[data-phase=cover] .split-leg,.stage.dance[data-phase=run] .split-leg{opacity:0}
.stage.dance[data-phase=run] .cn-duck{animation:cn-run 1.6s cubic-bezier(.4,.1,.8,.2) both}
.stage.dance[data-phase=run] .hands{opacity:1}
@keyframes lantern-swing{0%,100%{transform:rotate(-6deg)}50%{transform:rotate(7deg)}}
@keyframes cn-dance{0%,100%{transform:rotate(-10deg) translateY(0) scale(1,.96)}25%{transform:rotate(12deg) translateY(-7%) scale(.92,1.08)}50%{transform:rotate(-8deg) translateY(-4%) scale(1.06,.9)}75%{transform:rotate(9deg) translateY(-8%) scale(.94,1.05)}}
@keyframes sleeve-l{0%,100%{transform:rotate(-18deg) translateX(0)}50%{transform:rotate(22deg) translateX(-18%)}}
@keyframes sleeve-r{0%,100%{transform:rotate(18deg) translateX(0)}50%{transform:rotate(-22deg) translateX(18%)}}
@keyframes cn-split{0%{transform:translateY(0) scale(1)}100%{transform:translateY(10%) scale(1.18,.78)}}
@keyframes cn-split-hold{0%,100%{transform:translateY(10%) scale(1.18,.78)}}
@keyframes cn-cover{0%{transform:translateY(10%) scale(1.18,.78)}100%{transform:translateY(4%) rotate(-8deg) scale(.92)}}
@keyframes pants-l{0%{transform:none;opacity:1}100%{transform:translate(-40%,-30%) rotate(-42deg);opacity:.2}}
@keyframes pants-r{0%{transform:none;opacity:1}100%{transform:translate(48%,-24%) rotate(38deg);opacity:.2}}
@keyframes fabric-fly{0%{opacity:1;transform:none}100%{opacity:0;transform:translate(30%,-80%) rotate(80deg)}}
@keyframes cn-run{0%{transform:translateY(4%) rotate(-8deg) scale(.92)}20%{transform:translateX(8%) translateY(0) rotate(10deg)}100%{transform:translateX(160%) translateY(6%) rotate(18deg)}}

/* 好声音：红椅舞台 → 苦情歌 → 鼓掌转身 */
.voice-scene{display:none;position:absolute;inset:0;z-index:2;pointer-events:none}
.stage.sing .voice-scene{display:block}
.stage.sing .stage-clip{opacity:0;visibility:hidden;animation:none}
.stage.sing .stage-footer,.stage.sing .stage-top,.stage.sing .stage-heading,.stage.sing .fx{display:none}
.stage.sing{background:#050308}
.stage.sing:after{opacity:1;background:radial-gradient(ellipse at 50% 38%,#5a102088,transparent 50%),linear-gradient(180deg,#0008,transparent 28%,transparent 58%,#000d);z-index:1}
.stage.sing .speech{top:16%;bottom:auto;z-index:8;background:#2a0c12e8;border-color:#e8b060;color:#ffe7c4}
.stage.sing .speech:after{background:#2a0c12;border-color:#e8b060}
.stage.sing[data-phase=clap] .speech{background:#3a1840e8;border-color:#e07ad6;color:#ffd6fb}
.stage.sing .nameplate{bottom:3.2%;top:auto;z-index:8}
.voice-glow{position:absolute;left:8%;top:8%;width:84%;height:52%;background:radial-gradient(ellipse at 50% 70%,#fff3c855 0 12%,transparent 58%);z-index:1;animation:spot 1.4s ease-in-out infinite}
.voice-logo{position:absolute;top:2%;left:50%;transform:translateX(-50%);z-index:3;font-family:STKaiti,KaiTi,'PingFang SC',serif;font-size:5.4cqw;font-weight:900;color:#f2d48a;letter-spacing:.12em;text-shadow:0 0 18px #c41e3a,0 3px 0 #6a1010;white-space:nowrap}
.voice-logo span{display:block;font-size:4.2cqw;letter-spacing:.4em;color:#ff4d4d;text-align:center;margin-top:1cqw}
.voice-chairs{position:absolute;left:4%;right:4%;bottom:7%;height:22%;z-index:5;display:flex;justify-content:space-between;align-items:flex-end;gap:3%}
.chair{width:22%;height:100%;background:linear-gradient(#9a121c,#e01830 42%,#6a0810);border-radius:14px 14px 7px 7px;box-shadow:inset 0 -22% 0 #3a080c,0 8px 16px #0008;position:relative}
.chair:before{content:'';position:absolute;left:10%;right:10%;top:8%;height:8%;border-radius:4px;background:#5a0810}
.chair b{position:absolute;left:50%;top:20%;width:36%;aspect-ratio:1;transform:translateX(-50%);border-radius:50%;background:radial-gradient(circle at 35% 30%,#6a4a10,#3a2808);opacity:.5}
.stage.sing[data-phase=clap] .chair{animation:chair-turn .7s cubic-bezier(.2,.8,.2,1) both;background:linear-gradient(#e02038,#8a1018)}
.stage.sing[data-phase=clap] .chair b{opacity:1;background:radial-gradient(circle at 35% 30%,#ffe9a8,#c49a32 70%,#6a4a10);box-shadow:0 0 8px #e8c06088}
.stage.sing[data-phase=clap] .chair:nth-child(2){animation-delay:.08s}
.stage.sing[data-phase=clap] .chair:nth-child(3){animation-delay:.16s}
.stage.sing[data-phase=clap] .chair:nth-child(4){animation-delay:.24s}
.voice-duck{position:absolute;left:18%;top:14%;width:64%;height:50%;z-index:3;transform-origin:50% 80%}
.voice-duck .sprite{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 0 18px #fff3c844) drop-shadow(0 10px 12px #000a);transition:opacity .2s}
.voice-duck .cry{opacity:0}
.stage.sing[data-phase=ballad] .voice-duck .cry,.stage.sing[data-phase=clap] .voice-duck .cry{opacity:1}
.stage.sing[data-phase=ballad] .voice-duck .idle,.stage.sing[data-phase=clap] .voice-duck .idle{opacity:0}
.voice-duck .mic{position:absolute;left:62%;top:42%;width:7%;height:38%;z-index:5;background:linear-gradient(#f0d090,#8a6a30);border-radius:4px;transform:rotate(18deg);box-shadow:0 4px 8px #0006}
.voice-duck .mic:before{content:'';position:absolute;top:-18%;left:-40%;right:-40%;height:28%;border-radius:50%;background:radial-gradient(circle at 40% 40%,#fff,#333 60%,#111)}
.stage.sing[data-phase=intro] .voice-duck{animation:voice-enter .8s both}
.stage.sing[data-phase=ballad] .voice-duck{animation:voice-sing .42s ease-in-out infinite}
.stage.sing[data-phase=clap] .voice-duck{animation:voice-bow 1s ease-in-out infinite}
.voice-lyric{position:absolute;left:8%;right:8%;bottom:32%;z-index:6;text-align:center;font-family:STKaiti,KaiTi,'PingFang SC',serif;font-size:4.2cqw;color:#ffe9c2;text-shadow:0 2px 8px #000,0 0 12px #c41e3a88}
.stage.sing[data-phase=intro] .voice-lyric{opacity:0}
.voice-crowd{position:absolute;inset:0;z-index:7;opacity:0}
.stage.sing[data-phase=clap] .voice-crowd{opacity:1}
.cheer{position:absolute;font-size:5.5cqw;font-weight:900;color:#ffe27a;text-shadow:2px 2px 0 #7a1020;animation:cheer-pop .8s ease-out infinite}
.cheer.ch1{left:8%;top:22%}
.cheer.ch2{right:8%;top:28%;animation-delay:.15s;color:#7ef0c0}
.cheer.ch3{left:18%;top:36%;animation-delay:.3s;font-size:4.2cqw}
.clap{position:absolute;width:10cqw;height:10cqw;border-radius:50% 10% 50% 10%;background:#f2d2b0;animation:clapper .22s linear infinite}
.clap.cp1{left:10%;bottom:38%}
.clap.cp2{right:12%;bottom:42%;animation-delay:.08s}
.clap.cp3{left:46%;bottom:36%;animation-delay:.14s}
@keyframes chair-turn{0%{transform:scaleX(1)}40%{transform:scaleX(.1)}100%{transform:scaleX(1)}}
@keyframes voice-enter{from{transform:translateY(12%) scale(.9);opacity:0}to{transform:none;opacity:1}}
@keyframes voice-sing{0%,100%{transform:translateY(0) scale(1,1) rotate(-2deg)}30%{transform:translateY(-3%) scale(1.06,.94) rotate(3deg)}60%{transform:translateY(-5%) scale(.96,1.06) rotate(-3deg)}}
@keyframes voice-bow{0%,100%{transform:rotate(0)}50%{transform:rotate(8deg) translateY(4%)}}
@keyframes cheer-pop{0%,100%{transform:translateY(0) scale(1);opacity:.7}50%{transform:translateY(-18%) scale(1.15);opacity:1}}
@keyframes clapper{0%,100%{transform:rotate(-20deg)}50%{transform:rotate(25deg)}}
@media(prefers-reduced-motion:reduce){.stage.dance .cn-duck,.stage.dance .sleeve,.stage.dance .cn-pants,.stage.sing .voice-duck,.stage.sing .chair,.stage.sing .cheer,.stage.sing .clap,.cn-lantern{animation:none!important}}

/* 通用小品舞台：鸭子 + 道具 + 拟声词 + 粒子，十个小品共用 */
.gag-scene{display:none;position:absolute;inset:0;z-index:2;pointer-events:none;overflow:hidden}
.stage.gag .gag-scene{display:block}
.stage.gag .stage-clip{opacity:0;visibility:hidden;animation:none}
.stage.gag .stage-footer,.stage.gag .stage-top,.stage.gag .stage-heading,.stage.gag .fx{display:none}
.stage.gag{background:#14100e}
.stage.gag:after{opacity:1;background:radial-gradient(ellipse at 50% 30%,#5a3a2a66,transparent 60%),linear-gradient(180deg,#0e0806cc,transparent 28%,transparent 60%,#080504f0);z-index:1}
.stage.gag .speech{top:6.5%;bottom:auto;z-index:8;background:#2c2018e8;border-color:#c49a62;color:#ffe7c2}
.stage.gag .speech:after{background:#2c2018;border-color:#c49a62}
.stage.gag .nameplate{bottom:3.2%;top:auto;z-index:8}
.stage.sleep{background:#0a0c1a}.stage.sleep:after{background:radial-gradient(ellipse at 70% 20%,#3a3f7a66,transparent 50%),linear-gradient(180deg,#05061088,transparent 30%,transparent 60%,#040410f0)}
.stage.confess{background:#2a1020}.stage.confess:after{background:radial-gradient(ellipse at 50% 30%,#a0305066,transparent 60%),linear-gradient(180deg,#1a0812cc,transparent 28%,transparent 60%,#100408f0)}
.stage.dress{background:#1a1030}.stage.dress:after{background:radial-gradient(ellipse at 50% 25%,#7a40c066,transparent 60%),linear-gradient(180deg,#0e0820cc,transparent 28%,transparent 60%,#080418f0)}
.stage.zap[data-phase=shock]{background:#e8f0ff}.stage.zap[data-phase=shock]:after{opacity:.35}
.gag-floor{position:absolute;left:-12%;right:-12%;bottom:-8%;height:30%;background:radial-gradient(ellipse at 50% 0%,#4a3626 0%,#14100e 72%);z-index:0}
.gag-duck{position:absolute;left:14%;top:16%;width:72%;height:62%;z-index:3;transform-origin:50% 70%;isolation:isolate}
.gag-duck .sprite{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:drop-shadow(4px 12px 10px #0009);transition:opacity .16s linear,filter .3s}
.gag-duck .cry{opacity:0}
.stage:is(.toss[data-phase=splat],.confess[data-phase=wilt],.basin[data-phase=soaked],.chili[data-phase=red],.chili[data-phase=fire],.tickle[data-phase=topple],.tickle[data-phase=hiccup]) .gag-duck .cry{opacity:1}
.stage:is(.toss[data-phase=splat],.confess[data-phase=wilt],.basin[data-phase=soaked],.chili[data-phase=red],.chili[data-phase=fire],.tickle[data-phase=topple],.tickle[data-phase=hiccup]) .gag-duck .idle{opacity:0}
.gag-wear{position:absolute;left:50%;top:22%;transform:translateX(-50%);font-size:18cqw;z-index:4;line-height:1;filter:drop-shadow(0 4px 6px #0008)}
.gag-wear:empty{display:none}
.gag-back{position:absolute;display:none;z-index:-1}
.gag-bubble{position:absolute;display:none;left:12%;top:16%;width:30cqw;height:30cqw;border-radius:50%;background:radial-gradient(circle at 35% 30%,#ffffffcc,#8fd8ff88 55%,#5ab0ff44);border:2px solid #cfefffaa;z-index:5;transform-origin:0 0}
.gag-basin{position:absolute;display:none;left:22%;top:-6%;width:56%;height:15%;z-index:5;border-radius:0 0 40% 40%/0 0 70% 70%;background:linear-gradient(#8a9aa4,#4a5a64);box-shadow:inset 0 -6px 0 #2a3238,0 6px 8px #0006;transform-origin:50% 100%}
.gag-basin:before{content:'';position:absolute;left:5%;right:5%;top:-16%;height:38%;border-radius:50%;background:radial-gradient(ellipse at 50% 40%,#9fe0ff,#3f9ad8 75%);box-shadow:inset 0 2px 4px #fff8}
.gag-prop,.gag-prop2{position:absolute;z-index:6;font-size:20cqw;line-height:1;opacity:0;filter:drop-shadow(3px 8px 8px #000b)}
.gag-prop:empty,.gag-prop2:empty{display:none}
.gag-word{position:absolute;left:50%;top:26%;transform:translateX(-50%) rotate(-12deg);z-index:7;font-size:15cqw;font-weight:900;color:#ffe27a;text-shadow:3px 3px 0 #7a1c12,0 8px 14px #0008;opacity:0;white-space:nowrap}
.gag-word:empty{display:none}
.stage.gag .gag-word:not(:empty){animation:gag-word .9s ease-out both}
.gag-fx{position:absolute;z-index:6;font-size:8cqw;line-height:1;opacity:0;font-weight:900;color:#ffd27a;text-shadow:2px 2px 0 #6a2010}
.gag-fx:empty{display:none}
.stage.gag .gag-fx:not(:empty){animation:gag-fx-rise 1.1s ease-out infinite}
.gag-fx.f1{left:18%;top:40%}
.gag-fx.f2{left:64%;top:34%;animation-delay:.28s!important}
.gag-fx.f3{left:30%;top:56%;animation-delay:.55s!important}
.gag-fx.f4{left:70%;top:58%;animation-delay:.82s!important}
@keyframes gag-word{0%{opacity:0;scale:.4}18%{opacity:1;scale:1.2}45%{opacity:1;scale:1}100%{opacity:0;scale:1.05}}
@keyframes gag-fx-rise{0%{opacity:0;transform:translateY(0) scale(.6)}25%{opacity:1}100%{opacity:0;transform:translateY(-60%) scale(1.15) rotate(12deg)}}
/* 通用关键帧 */
@keyframes gp-in-left{from{opacity:0;transform:translateX(-150%) rotate(30deg)}to{opacity:1;transform:translateX(0) rotate(30deg)}}
@keyframes gp-in-right{from{opacity:0;transform:translateX(120%)}to{opacity:1;transform:translateX(0)}}
@keyframes gp-in-top{from{opacity:0;transform:translateY(-120%) rotate(45deg)}to{opacity:1;transform:translateY(0) rotate(45deg)}}
@keyframes gp-pop-in{from{opacity:0;transform:scale(.2)}to{opacity:1;transform:scale(1)}}
@keyframes gp-bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-8%)}}
@keyframes gp-float-up{0%{opacity:0;transform:translateY(20%)}30%{opacity:1}100%{opacity:1;transform:translateY(-140%) rotate(40deg)}}
@keyframes gd-peek{to{transform:rotate(-8deg) translateX(-3%)}}
@keyframes gd-shiver{0%,100%{transform:translate(-1.5%,0) rotate(-2deg)}50%{transform:translate(1.5%,-1%) rotate(2deg)}}
/* 挠痒痒 */
.stage.tickle[data-phase=approach] .gag-prop{left:8%;top:44%;animation:gp-in-left 1.2s cubic-bezier(.2,.8,.2,1) both}
.stage.tickle[data-phase=approach] .gag-duck{animation:gd-peek 1.2s ease-in-out both}
.stage.tickle[data-phase=tickle] .gag-prop,.stage.tickle[data-phase=topple] .gag-prop{opacity:1;left:8%;top:44%;animation:gp-poke .23s ease-in-out infinite}
.stage.tickle[data-phase=tickle] .gag-duck{animation:gd-laugh .23s ease-in-out infinite}
.stage.tickle[data-phase=topple] .gag-duck{animation:gd-topple 1.4s cubic-bezier(.3,.9,.3,1.1) both}
.stage.tickle[data-phase=hiccup] .gag-duck{animation:gd-hiccup .75s ease-in-out infinite}
.stage.tickle[data-phase=hiccup] .gag-prop2{left:56%;top:30%;font-size:10cqw;animation:gp-float-up 1.4s .1s ease-out both}
@keyframes gp-poke{0%,100%{transform:rotate(30deg) translateX(0)}50%{transform:rotate(18deg) translateX(14%)}}
@keyframes gd-laugh{0%,100%{transform:rotate(-7deg) translateY(0) scale(1,.96)}50%{transform:rotate(7deg) translateY(-6%) scale(.96,1.05)}}
@keyframes gd-topple{0%{transform:rotate(-7deg)}40%{transform:rotate(30deg) translate(2%,6%)}100%{transform:translate(4%,20%) rotate(80deg) scale(.85)}}
@keyframes gd-hiccup{0%,100%{transform:translate(4%,20%) rotate(80deg) scale(.85)}30%{transform:translate(4%,17%) rotate(74deg) scale(.95,.8)}}
/* 喂辣椒 */
.stage.chili[data-phase=offer] .gag-prop{left:62%;top:36%;animation:gp-in-right 1.3s cubic-bezier(.2,.8,.2,1) both}
.stage.chili[data-phase=offer] .gag-duck{animation:gd-peek 1.3s both}
.stage.chili[data-phase=chew] .gag-duck{animation:gd-chew .32s ease-in-out infinite}
.stage.chili[data-phase=red] .gag-duck{animation:gd-shiver .12s linear infinite}
.stage.chili[data-phase=red] .gag-duck .sprite,.stage.chili[data-phase=fire] .gag-duck .sprite,.stage.chili[data-phase=bucket] .gag-duck .sprite{filter:drop-shadow(4px 12px 10px #0009) sepia(1) saturate(6) hue-rotate(-28deg) brightness(.95)}
.stage.chili[data-phase=fire] .gag-duck{animation:gd-leanback .35s ease-out both}
.stage.chili[data-phase=fire] .gag-prop{left:8%;top:22%;font-size:36cqw;opacity:1;transform-origin:50% 100%;animation:gp-flame .18s ease-in-out infinite alternate}
.stage.chili[data-phase=bucket] .gag-prop2{left:34%;top:58%;font-size:28cqw;opacity:1}
.stage.chili[data-phase=bucket] .gag-duck{animation:gd-dive 1.4s cubic-bezier(.4,.1,.6,1) both}
@keyframes gd-chew{0%,100%{transform:scale(1,1)}50%{transform:scale(1.04,.94) translateY(2%)}}
@keyframes gd-leanback{from{transform:none}to{transform:rotate(-14deg) translate(-4%,2%) scale(1.04)}}
@keyframes gp-flame{from{transform:scale(1) rotate(-4deg)}to{transform:scale(1.18,1.3) rotate(4deg)}}
@keyframes gd-dive{0%{transform:rotate(-14deg) translate(-4%,2%) scale(1.04)}40%{transform:rotate(60deg) translate(6%,10%) scale(.95)}100%{transform:rotate(150deg) translate(0,38%) scale(.8)}}
/* 打针 */
.stage.shot[data-phase=syringe] .gag-prop{left:60%;top:2%;animation:gp-in-top 1.2s both}
.stage.shot[data-phase=syringe] .gag-duck{animation:gd-shiver .3s linear infinite}
.stage.shot[data-phase=chase] .gag-duck{animation:gd-run-circle 1.3s linear infinite}
.stage.shot[data-phase=chase] .gag-prop{opacity:1;left:60%;top:2%;animation:gp-chase 1.3s linear infinite}
.stage.shot[data-phase=caught] .gag-duck{animation:gd-lift 1s ease-out both}
.stage.shot[data-phase=caught] .gag-prop{opacity:1;left:64%;top:40%;animation:gp-shake .2s infinite}
.stage.shot[data-phase=poke] .gag-duck{animation:gd-poke .7s ease-out both}
.stage.shot[data-phase=poke] .gag-prop{opacity:1;left:58%;top:42%;transform:rotate(120deg) translateX(-10%)}
.stage.shot[data-phase=balloon] .gag-duck{animation:gd-inflate 2s cubic-bezier(.3,.7,.4,1) both}
@keyframes gd-run-circle{0%{transform:translate(0,0) scaleX(1)}25%{transform:translate(-18%,8%) scaleX(1)}50%{transform:translate(0,14%) scaleX(-1)}75%{transform:translate(18%,6%) scaleX(-1)}100%{transform:translate(0,0) scaleX(1)}}
@keyframes gp-chase{0%{transform:translate(0,0) rotate(45deg)}25%{transform:translate(-30%,30%) rotate(60deg)}50%{transform:translate(-10%,60%) rotate(90deg)}75%{transform:translate(20%,30%) rotate(60deg)}100%{transform:translate(0,0) rotate(45deg)}}
@keyframes gd-lift{to{transform:translateY(-10%) rotate(-12deg) scale(.95)}}
@keyframes gp-shake{0%,100%{transform:rotate(118deg)}50%{transform:rotate(124deg)}}
@keyframes gd-poke{0%{transform:translateY(-10%) rotate(-12deg) scale(.95)}25%{transform:translateY(-14%) rotate(-12deg) scale(1.2,.7)}60%{transform:translateY(-8%) rotate(-6deg) scale(.9,1.15)}100%{transform:translateY(-10%) rotate(-10deg) scale(1)}}
@keyframes gd-inflate{0%{transform:translateY(-10%) scale(1)}60%{transform:translateY(-12%) scale(1.3,1.22)}100%{transform:translateY(-30%) scale(1.34,1.26) rotate(8deg)}}
/* 触电 */
.stage.zap[data-phase=wire] .gag-prop,.stage.zap[data-phase=shock] .gag-prop{opacity:1;left:70%;top:66%;font-size:12cqw;animation:gp-spark .4s steps(2) infinite}
.stage.zap[data-phase=wire] .gag-duck{animation:gd-walk 1.4s ease-in-out both}
.stage.zap[data-phase=shock] .gag-duck{animation:gd-electric .09s steps(2) infinite}
.stage.zap[data-phase=shock] .gag-prop{animation-duration:.12s}
.stage.zap[data-phase=smoke] .gag-duck,.stage.zap[data-phase=afro] .gag-duck{transform:translateX(10%) scale(1.06)}
.stage.zap[data-phase=smoke] .gag-duck .sprite,.stage.zap[data-phase=afro] .gag-duck .sprite{filter:drop-shadow(4px 12px 10px #0009) brightness(.72) contrast(1.15)}
.stage.zap[data-phase=afro] .gag-duck{animation:gd-cough .7s ease-in-out infinite}
.stage.zap[data-phase=afro] .gag-back{display:block;left:32%;top:-18%;width:58%;height:42%;border-radius:50%;background:radial-gradient(circle at 40% 40%,#6a6a6a,#2a2a2a 60%,#161616);box-shadow:0 0 0 5px #4a4a4a,-14cqw 6cqw 0 -4cqw #3a3a3a,14cqw 5cqw 0 -4cqw #3a3a3a,-8cqw -6cqw 0 -3cqw #444,9cqw -7cqw 0 -3cqw #444,0 -10cqw 0 -2cqw #4a4a4a,0 10px 18px #000a;animation:gp-pop-in .3s both}
@keyframes gd-walk{0%{transform:translateX(0)}25%{transform:translateX(3%) rotate(3deg)}50%{transform:translateX(6%) rotate(-3deg)}75%{transform:translateX(9%) rotate(3deg)}100%{transform:translateX(10%) scale(1.06)}}
@keyframes gp-spark{0%{opacity:1;transform:scale(1)}100%{opacity:.4;transform:scale(1.3) rotate(15deg)}}
@keyframes gd-electric{0%{transform:translate(8%,0) scale(1.06,1);filter:none}50%{transform:translate(12%,-2%) scale(1.02,1.1);filter:invert(1) brightness(1.4) contrast(1.6)}}
@keyframes gd-cough{0%,100%{transform:translateX(10%) scale(1.06)}30%{transform:translateX(10%) scale(1.1,.96) rotate(3deg)}}
/* 抛高高 */
.stage.toss[data-phase=hands] .gag-prop,.stage.toss[data-phase=fly] .gag-prop{opacity:1;left:32%;top:62%;font-size:30cqw}
.stage.toss[data-phase=hands] .gag-prop{animation:gp-bounce .5s ease-in-out infinite}
.stage.toss[data-phase=hands] .gag-duck{animation:gd-bounce .5s ease-in-out infinite}
.stage.toss[data-phase=fly] .gag-duck{animation:gd-launch 1.1s cubic-bezier(.3,.4,.5,1) both}
.stage.toss[data-phase=fly] .gag-prop{animation:gp-throw .5s ease-out both}
.stage.toss[data-phase=lamp] .gag-prop2,.stage.toss[data-phase=hang] .gag-prop2,.stage.toss[data-phase=splat] .gag-prop2{opacity:1;left:40%;top:0;font-size:22cqw;transform-origin:50% 0}
.stage.toss[data-phase=lamp] .gag-prop2{animation:gp-swing .5s ease-in-out infinite alternate}
.stage.toss[data-phase=lamp] .gag-duck{animation:gd-stick-top .3s ease-out both}
.stage.toss[data-phase=hang] .gag-duck{animation:gd-dangle .8s ease-in-out infinite}
.stage.toss[data-phase=hang] .gag-prop2{animation:gp-swing .8s ease-in-out infinite alternate}
.stage.toss[data-phase=splat] .gag-duck{animation:gd-splat .9s cubic-bezier(.6,0,.9,.4) both}
@keyframes gd-bounce{0%,100%{transform:translateY(-6%)}50%{transform:translateY(-14%) rotate(3deg)}}
@keyframes gd-launch{0%{transform:translateY(-6%)}100%{transform:translateY(-150%) rotate(-20deg)}}
@keyframes gp-throw{0%{transform:translateY(0)}40%{transform:translateY(-20%)}100%{transform:translateY(10%);opacity:.6}}
@keyframes gp-swing{from{transform:rotate(-8deg)}to{transform:rotate(8deg)}}
@keyframes gd-stick-top{0%{transform:translateY(-150%)}100%{transform:translateY(-42%) scale(.8) rotate(20deg)}}
@keyframes gd-dangle{0%,100%{transform:translateY(-42%) scale(.8) rotate(16deg)}50%{transform:translateY(-42%) scale(.8) rotate(26deg)}}
@keyframes gd-splat{0%{transform:translateY(-42%) scale(.8) rotate(20deg)}70%{transform:translateY(16%) scale(1) rotate(0)}80%{transform:translateY(20%) scale(1.5,.3)}100%{transform:translateY(18%) scale(1.4,.4)}}
/* 变装 */
.stage.dress[data-phase=spin] .gag-duck{animation:gd-spin .4s linear infinite}
.stage.dress[data-phase=suit] .gag-duck,.stage.dress[data-phase=hanfu] .gag-duck{animation:gd-pose .6s cubic-bezier(.2,.8,.2,1.2) both}
.stage.dress[data-phase=suit] .gag-wear{top:24%;font-size:22cqw}
.stage.dress[data-phase=hanfu] .gag-wear{top:42%;font-size:26cqw}
.stage.dress[data-phase=hanfu] .gag-prop{opacity:1;left:74%;top:28%;font-size:18cqw;transform:rotate(-30deg);animation:gp-pop-in .3s both}
.stage.dress[data-phase=hero] .gag-wear,.stage.dress[data-phase=burst] .gag-wear{top:46%;font-size:14cqw}
.stage.dress[data-phase=hero] .gag-back,.stage.dress[data-phase=burst] .gag-back{display:block;left:18%;top:28%;width:64%;height:66%;background:linear-gradient(#e0202a,#8a0a14);clip-path:polygon(30% 0,70% 0,100% 100%,0 100%);transform-origin:50% 0;animation:gp-cape .6s ease-in-out infinite alternate}
.stage.dress[data-phase=hero] .gag-duck{animation:gd-hero .6s both}
.stage.dress[data-phase=burst] .gag-duck{animation:gd-burst .7s ease-out both}
.stage.dress[data-phase=burst] .gag-back{animation:gp-cape-fall 1.2s ease-in both}
@keyframes gd-spin{0%{transform:scaleX(1)}50%{transform:scaleX(-1) translateY(-3%)}100%{transform:scaleX(1)}}
@keyframes gd-pose{0%{transform:scaleX(.2) translateY(-3%)}60%{transform:scaleX(1.08) rotate(-6deg)}100%{transform:scaleX(1) rotate(-6deg)}}
@keyframes gp-cape{from{transform:skewX(-6deg) scaleY(1)}to{transform:skewX(6deg) scaleY(1.05)}}
@keyframes gd-hero{0%{transform:scaleX(.2)}60%{transform:scale(1.12) rotate(4deg) translateY(-4%)}100%{transform:scale(1.06) translateY(-3%)}}
@keyframes gd-burst{0%{transform:scale(1.06) translateY(-3%)}20%{transform:scale(1.22,1.1) translateY(-3%)}40%{transform:scale(.96,1.04)}100%{transform:scale(1) rotate(-3deg)}}
@keyframes gp-cape-fall{0%{transform:none;opacity:1}100%{transform:translateY(60%) rotate(40deg);opacity:0}}
/* 表白 */
.stage.confess .gag-prop{left:60%;top:42%;font-size:16cqw}
.stage.confess[data-phase=kneel] .gag-duck{animation:gd-kneel .9s ease-out both}
.stage.confess[data-phase=kneel] .gag-prop{animation:gp-pop-in .4s .5s both}
.stage.confess[data-phase=hearts] .gag-duck{animation:gd-sway 1s ease-in-out infinite}
.stage.confess[data-phase=hearts] .gag-prop,.stage.confess[data-phase=shoe] .gag-prop,.stage.confess[data-phase=hit] .gag-prop{opacity:1}
.stage.confess[data-phase=hearts] .gag-prop{animation:gp-bounce 1s infinite}
.stage.confess[data-phase=shoe] .gag-duck,.stage.confess[data-phase=hit] .gag-duck{transform:translateY(12%) scale(.92) rotate(-6deg)}
.stage.confess[data-phase=shoe] .gag-prop2{opacity:1;left:84%;top:16%;font-size:18cqw;animation:gp-incoming .8s .1s ease-in both}
.stage.confess[data-phase=hit] .gag-prop2{opacity:1;left:34%;top:20%;font-size:18cqw;animation:gp-shoe-hit .8s ease-out both}
.stage.confess[data-phase=hit] .gag-duck{animation:gd-headspin .8s ease-out both}
.stage.confess[data-phase=wilt] .gag-duck{animation:gd-sad 1.2s ease-in-out infinite}
.stage.confess[data-phase=wilt] .gag-prop{opacity:1;top:48%;transform:rotate(30deg)}
.stage.confess[data-phase=wilt] .gag-prop2{opacity:1;left:36%;top:0;font-size:22cqw;animation:gp-bounce 1.6s infinite}
@keyframes gd-kneel{to{transform:translateY(12%) scale(.92) rotate(-6deg)}}
@keyframes gd-sway{0%,100%{transform:translateY(12%) scale(.92) rotate(-8deg)}50%{transform:translateY(11%) scale(.92) rotate(-2deg)}}
@keyframes gp-incoming{0%{opacity:0;transform:translateX(60%) rotate(-40deg)}100%{opacity:1;transform:translateX(-10%) rotate(-60deg)}}
@keyframes gp-shoe-hit{0%{transform:translateX(120%) rotate(-60deg)}25%{transform:translateX(0) rotate(-80deg)}100%{transform:translate(-30%,60%) rotate(-140deg);opacity:.9}}
@keyframes gd-headspin{0%,20%{transform:translateY(12%) scale(.92) rotate(-6deg)}30%{transform:translate(-6%,12%) scale(.92) rotate(-20deg)}70%{transform:translateY(12%) scale(.92) rotate(340deg)}100%{transform:translateY(12%) scale(.92) rotate(354deg)}}
@keyframes gd-sad{0%,100%{transform:translateY(14%) scale(.9) rotate(-4deg)}50%{transform:translateY(16%) scale(.9,.86) rotate(-4deg)}}
/* 睡觉 */
.stage.sleep[data-phase=yawn] .gag-duck{animation:gd-yawn 1s ease-in-out both}
.stage.sleep[data-phase=snore] .gag-duck,.stage.sleep[data-phase=alarm] .gag-duck{animation:gd-snore 1.8s ease-in-out infinite}
.stage.sleep[data-phase=snore] .gag-bubble{display:block;animation:gp-bubble-grow 3.2s cubic-bezier(.3,.5,.5,1) both}
.stage.sleep[data-phase=alarm] .gag-bubble{display:block;animation:gp-bubble-wobble .3s ease-in-out infinite}
.stage.sleep[data-phase=alarm] .gag-prop,.stage.sleep[data-phase=pop] .gag-prop,.stage.sleep[data-phase=ceiling] .gag-prop{opacity:1;left:4%;top:58%;font-size:20cqw;animation:gp-ring .1s linear infinite alternate}
.stage.sleep[data-phase=pop] .gag-duck{animation:gd-jump-ceiling .5s cubic-bezier(.2,.8,.3,1) both}
.stage.sleep[data-phase=ceiling] .gag-duck{animation:gd-cling .6s ease-in-out infinite}
@keyframes gd-yawn{0%{transform:none}50%{transform:scale(1.08,1.12) rotate(-6deg) translateY(-4%)}100%{transform:rotate(14deg) translate(3%,8%) scale(.98)}}
@keyframes gd-snore{0%,100%{transform:rotate(14deg) translate(3%,8%) scale(.98)}50%{transform:rotate(15deg) translate(3%,7%) scale(1.04,1.02)}}
@keyframes gp-bubble-grow{0%{transform:scale(.1)}100%{transform:scale(1)}}
@keyframes gp-bubble-wobble{0%,100%{transform:scale(1)}50%{transform:scale(1.04,.97)}}
@keyframes gp-ring{from{transform:rotate(-12deg)}to{transform:rotate(12deg)}}
@keyframes gd-jump-ceiling{0%{transform:rotate(14deg) translate(3%,8%) scale(.98)}100%{transform:translateY(-30%) scale(.85) rotate(-6deg)}}
@keyframes gd-cling{0%,100%{transform:translateY(-30%) scale(.85) rotate(-6deg)}50%{transform:translateY(-29%) scale(.85) rotate(-2deg)}}
/* 吹气球 */
.stage.balloon .gag-prop{left:24%;top:26%;font-size:8cqw;transform-origin:50% 100%}
.stage.balloon[data-phase=hold] .gag-prop{animation:gp-pop-in .3s both}
.stage.balloon[data-phase=inflate] .gag-prop{opacity:1;animation:gp-grow 2.4s steps(4,jump-none) both}
.stage.balloon[data-phase=inflate] .gag-duck{animation:gd-puff .6s ease-in-out infinite}
.stage.balloon[data-phase=float] .gag-prop{opacity:1;animation:gp-grow-rise 1.2s ease-in both}
.stage.balloon[data-phase=float] .gag-duck{animation:gd-rise 1.2s ease-in both}
.stage.balloon[data-phase=pop] .gag-duck{animation:gd-hang-shiver .1s linear infinite}
.stage.balloon[data-phase=zoom] .gag-duck{animation:gd-zoom 1.3s cubic-bezier(.3,.1,.7,.9) both}
@keyframes gp-grow{from{transform:scale(1)}to{transform:translateX(-5cqw) scale(4.5)}}
@keyframes gd-puff{0%,100%{transform:scale(1)}40%{transform:scale(1.1,.95)}60%{transform:scale(.97,1.03)}}
@keyframes gp-grow-rise{from{transform:translate(-5cqw,0) scale(4.5)}to{transform:translate(-5cqw,-8cqw) scale(4.5)}}
@keyframes gd-rise{to{transform:translateY(-22%) rotate(-8deg)}}
@keyframes gd-hang-shiver{0%,100%{transform:translate(-1%,-22%) rotate(-9deg)}50%{transform:translate(1%,-22%) rotate(-7deg)}}
@keyframes gd-zoom{0%{transform:translateY(-22%) rotate(-8deg)}20%{transform:translate(-40%,-20%) rotate(120deg)}40%{transform:translate(35%,-50%) rotate(300deg)}60%{transform:translate(-30%,10%) rotate(500deg)}80%{transform:translate(25%,-15%) rotate(650deg)}100%{transform:translate(0,20%) rotate(720deg) scale(1.3,.5)}}
/* 罚顶盆 */
.stage.basin .gag-basin{display:block}
.stage.basin[data-phase=place] .gag-basin{animation:gp-basin-place 1.1s cubic-bezier(.3,.8,.3,1) both}
.stage.basin[data-phase=place] .gag-duck{animation:gd-stiff .3s both}
.stage.basin[data-phase=wobble] .gag-duck,.stage.basin[data-phase=fly] .gag-duck{animation:gd-tremble .16s linear infinite}
.stage.basin[data-phase=wobble] .gag-basin,.stage.basin[data-phase=fly] .gag-basin{animation:gp-basin-tilt .9s ease-in-out infinite alternate}
.stage.basin[data-phase=fly] .gag-prop2{opacity:1;left:44%;top:44%;font-size:8cqw;animation:gp-fly-land 1s ease-in-out both}
.stage.basin[data-phase=sneeze] .gag-duck{animation:gd-sneeze .7s cubic-bezier(.2,.8,.2,1) both}
.stage.basin[data-phase=sneeze] .gag-basin{animation:gp-basin-flip .7s ease-in both}
.stage.basin[data-phase=soaked] .gag-duck{animation:gd-drip 1s ease-in-out infinite}
.stage.basin[data-phase=soaked] .gag-duck .sprite{filter:drop-shadow(4px 12px 10px #0009) drop-shadow(0 0 16px #5ab0ffcc) brightness(.78) saturate(.85)}
.stage.basin[data-phase=soaked] .gag-basin{top:-2%;transform:rotate(180deg)}
@keyframes gp-basin-place{from{transform:translateY(-140%);opacity:0}to{transform:translateY(0);opacity:1}}
@keyframes gd-stiff{to{transform:scale(.98,1.03)}}
@keyframes gd-tremble{0%,100%{transform:translate(-.8%,0) scale(.98,1.03)}50%{transform:translate(.8%,.5%) scale(.98,1.03)}}
@keyframes gp-basin-tilt{from{transform:rotate(-7deg)}to{transform:rotate(7deg)}}
@keyframes gp-fly-land{0%{transform:translate(60%,-80%) rotate(20deg)}60%{transform:translate(10%,-20%)}100%{transform:translate(0,0)}}
@keyframes gd-sneeze{0%{transform:scale(.98,1.03)}30%{transform:scale(.94,1.12) translateY(-6%) rotate(-6deg)}60%{transform:scale(1.1,.9) translateY(6%) rotate(14deg)}100%{transform:translateY(4%) rotate(10deg)}}
@keyframes gp-basin-flip{0%{transform:rotate(0)}100%{transform:translateY(30%) rotate(180deg)}}
@keyframes gd-drip{0%,100%{transform:translateY(4%) rotate(2deg) scale(1,.98)}50%{transform:translateY(5%) rotate(-2deg) scale(1,.98)}}
@media(prefers-reduced-motion:reduce){.stage.gag .gag-duck,.stage.gag .gag-prop,.stage.gag .gag-prop2,.stage.gag .gag-word,.stage.gag .gag-fx,.stage.gag .gag-back,.stage.gag .gag-bubble,.stage.gag .gag-basin{animation:none!important}.stage.gag .gag-prop,.stage.gag .gag-prop2,.stage.gag .gag-word{opacity:1}}
