:root{color-scheme:light;--ink:#344b3e}
*{box-sizing:border-box}
html,body{margin:0;width:100%;height:100%;overflow:hidden}
body{display:flex;justify-content:center;align-items:center;background:#dedfd5;color:var(--ink);font-family:"Microsoft YaHei","PingFang SC",sans-serif}
button{font:inherit;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
button:focus-visible{outline:3px solid #af704e;outline-offset:5px}
#viewport{position:relative;width:720px;height:1280px;flex:none}
#game{position:absolute;width:720px;height:1280px;transform-origin:top left;overflow:hidden;background:linear-gradient(180deg,#f7f4e9 0%,#f5f2e9 39%,#edf0df55 55%,#ede7d133 100%),url('studio.webp') center bottom/auto 920px no-repeat;box-shadow:0 0 60px #39452d20}
.top{position:absolute;top:30px;left:38px;right:38px;height:60px;display:flex;align-items:center;gap:24px}
.brand{display:flex;align-items:center;gap:13px;font-size:22px;font-weight:700;letter-spacing:3px}
.brand small{display:block;font-size:10px;letter-spacing:3px;color:#829180;margin-top:5px}
.seal{font-size:31px;background:#e2e8d7;border-radius:17px;width:52px;height:52px;display:grid;place-items:center}
.completed{margin-left:auto;text-align:right}
.completed span{display:block;font-size:12px;color:#768670;margin-bottom:3px}
.completed strong{font-size:22px;font-weight:500}
#sound{border:1px solid #d7ddcd;border-radius:24px;background:#fffdf580;padding:10px 14px;font-size:15px}
.rack{position:absolute;left:40px;right:40px;top:120px;height:410px}
.rack-title{display:flex;justify-content:space-between;padding:0 21px;color:#839078;font-size:14px;letter-spacing:3px}
.rack-bar{position:absolute;top:43px;left:12px;right:12px;height:20px;border-radius:10px;background:linear-gradient(180deg,#e9cda6,#c39b70 56%,#a67b54);box-shadow:0 4px 4px #6e4e3524,inset 0 2px 1px #fff2da}
.rack-post{position:absolute;top:43px;bottom:10px;width:13px;border-radius:8px;background:linear-gradient(90deg,#b38e67,#ecd3ac 45%,#bf996f);box-shadow:3px 3px 6px #5c4b3121}
.rack-post.left{left:24px}.rack-post.right{right:24px}
.rack-foot{position:absolute;bottom:0;width:76px;height:14px;border-radius:50%;background:linear-gradient(#d9bb91,#b68c62);box-shadow:0 7px 7px #4a442b19}
.rack-foot.left{left:-6px}.rack-foot.right{right:-6px}
#chains{position:absolute;top:52px;left:50px;right:50px;display:flex;justify-content:space-between}
.chain{position:relative;width:180px;height:340px;flex:none;border:0;background:transparent;padding:0;border-radius:50px;transition:opacity .26s,transform .26s}
.chain.selected{background:radial-gradient(ellipse at 50% 43%,#e3e9d33b,transparent 68%)}
.hook{position:absolute;left:81px;top:-16px;width:18px;height:28px;border:3px solid #aa8055;border-bottom-color:#e5bd84;border-radius:50%;box-shadow:1px 1px 1px #fff4df;transition:opacity .18s}
.cord{position:absolute;top:8px;left:89px;width:2px;height:288px;border:1px solid #b7a389;border-radius:1px;box-shadow:1px 0 1px #fffaf2;transition:all .32s cubic-bezier(.3,.7,.3,1)}
.slot,.flight{position:absolute;width:43px;height:43px;border-radius:50%;background:radial-gradient(ellipse at 31% 24%,#fff9edcc,transparent 42%),radial-gradient(ellipse at 75% 83%,#3d302650,transparent 64%),var(--bead-map);background-color:var(--bead);background-size:cover;box-shadow:inset 0 0 0 1px #fff8e9a0,0 4px 6px #5e41252b}
.slot{translate:-50% -50%;opacity:.29;transition:left .32s cubic-bezier(.3,.7,.3,1),top .32s cubic-bezier(.3,.7,.3,1),opacity .2s;pointer-events:none}
.slot.current{opacity:.51}
.chain.selected .slot.current{outline:1px dashed #718670;outline-offset:6px}
.slot.done{opacity:1}
.chain-label{position:absolute;bottom:6px;left:0;right:0;font:16px Georgia,serif;color:#82917b;letter-spacing:3px;transition:opacity .2s}
.chain.selected .chain-label{color:#3d6247}
.knot{position:absolute;top:120px;left:83px;width:14px;height:9px;border:3px solid #bd9a6e;border-radius:50%;opacity:0;transform:scale(2);transition:opacity .12s .22s,transform .15s .22s;z-index:2}
.chain.tying .cord{top:124px;left:39px;width:102px;height:102px;border-radius:50%;border-width:2px}
.chain.tying .knot{opacity:1;transform:scale(1)}
.chain.tying .hook,.chain.tying .chain-label{opacity:0}
.chain.tying .slot{outline:0}
.chain.leaving{opacity:0;transform:translateY(-34px) scale(.76)}
.flight{position:fixed;z-index:10;pointer-events:none}
#status{position:absolute;top:543px;left:28px;right:28px;text-align:center;min-height:24px;font-size:16px;color:#63775e;letter-spacing:1px}
.stage{position:absolute;top:568px;left:0;right:0;height:610px}
#scene{position:absolute;inset:0;touch-action:none;cursor:grab}
#scene.dragging{cursor:grabbing}
#scene canvas{display:block;width:100%;height:100%}
.rotation-hint{position:absolute;bottom:9px;left:0;right:0;display:flex;align-items:center;justify-content:center;gap:18px;color:#4d6852;font-size:15px;letter-spacing:1px;pointer-events:none}
.rotation-hint span{font-size:30px;color:#85977b}
.controls{position:absolute;top:1190px;left:45px;right:45px;display:flex;align-items:center;justify-content:space-between}
.instruction{font-size:17px;line-height:1.6;letter-spacing:2px}
.instruction small{font-size:12px;letter-spacing:1px;color:#71816a}
#shake{border:1px solid #fff8e6;border-radius:28px;padding:13px 28px;background:#3c5945;box-shadow:0 5px 12px #3c493425;color:#fff8e6;font-size:20px;letter-spacing:1px}
#shake span{font-size:24px;margin-right:8px}
#shake:active{transform:translateY(2px)}
@media(prefers-reduced-motion:reduce){.chain,.slot,.cord,.knot{transition-duration:.01ms;transition-delay:0s}}

/* 所有珠位都是圆球，通过反光和纹理区分材质。 */
.slot[data-material="gem"],.flight[data-material="gem"]{
    border-radius:50%;
    background-image:linear-gradient(135deg,#ffffffb0 0%,transparent 32%,#19274538 33%,transparent 63%,#ffffff80 64%,transparent 81%),var(--bead-map);
    box-shadow:inset 0 0 0 1px #ffffffaa,inset 3px 3px 7px #ffffff70,inset -3px -4px 6px #18273550,0 4px 6px #5e41252b;
}
.slot[data-material="pearl"],.flight[data-material="pearl"]{
    background-image:radial-gradient(ellipse at 30% 23%,#fff 0%,#fff9ebaa 20%,transparent 50%),conic-gradient(#f3e4ed77,#d1e9ed88,#fce4cb77,#f3e4ed77),var(--bead-map);
    box-shadow:inset -4px -5px 9px #998b783d,inset 1px 1px 3px #fff,0 4px 6px #5e41252b;
}

/* 样珠直接显示成品材质，其余位置只显示等待填入的空框。 */
.slot:not(.done){
    background:transparent;
    border:2px dashed #a3ac97;
    box-shadow:none;
    opacity:1;
}
.chain.selected .slot.current{
    outline:none;
    border-color:#698060;
}

.chain.empty{visibility:hidden;pointer-events:none}
