:root{--ink: #1a1d29;--muted: #6b7080;--line: #d9dce2;--bg: #eceff3;--card: #f7f9fb;--blue: #3a3ab8;--green: #10935f}*{box-sizing:border-box}body{margin:0;background:var(--bg);font-family:Inter,system-ui,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;color:var(--ink)}.page{height:100vh;height:100dvh;display:flex;align-items:center;justify-content:center;overflow:hidden}.frame{position:relative}.card{position:absolute;top:0;left:0;width:1048px;height:720px;transform-origin:top left;background:var(--card);border:1px solid var(--line);border-radius:12px;overflow:hidden}.diagram{position:absolute;top:0}.toolbar{position:absolute;top:30px;left:17px;display:flex;gap:8px;z-index:2}.btn{height:27px;padding:0 14px;border-radius:6px;border:1px solid #c3c6cd;background:#fff;font:500 13px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;color:var(--ink);display:inline-flex;align-items:center;gap:7px;cursor:pointer}.btn-dark{background:#12141d;border-color:#12141d;color:#fff;min-width:85px}.ico-pause{width:8px;height:9px;border-left:2.5px solid #fff;border-right:2.5px solid #fff}.ico-play{width:0;height:0;border-left:8px solid #fff;border-top:5px solid transparent;border-bottom:5px solid transparent}.ico-restart{font-size:14px;line-height:1}.seg{display:inline-flex;border:1px solid #c3c6cd;border-radius:6px;overflow:hidden;height:27px}.seg button{border:0;border-right:1px solid #d7d9de;background:#fff;padding:0 9px;font:400 11px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;color:var(--muted);cursor:pointer}.seg button:last-child{border-right:0}.seg button.on{background:#e8eaee;color:var(--ink)}.legend{position:absolute;top:37px;right:21px;display:flex;gap:14px;font:400 11px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;color:#4a4f5c;z-index:2}.legend span{display:inline-flex;align-items:center;gap:7px}.legend i{width:16px;height:3px;border-radius:2px;display:inline-block}.stages{position:absolute;left:17px;bottom:26px;display:flex;gap:8px;align-items:center;z-index:2}.chip{height:28px;padding:0 14px 0 6px;border-radius:14px;border:1px solid #c9ccd3;background:#fff;font:500 12.5px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;color:var(--muted);display:inline-flex;align-items:center;gap:8px;cursor:pointer}.chip b{width:17px;height:17px;border-radius:50%;background:#eceef1;color:var(--muted);font:500 9.5px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;display:inline-flex;align-items:center;justify-content:center}.chip.done{color:var(--ink)}.chip.done b{background:var(--green);color:#fff}.chip.current{color:var(--ink);border:1.5px solid var(--blue)}.chip.current b{background:var(--blue);color:#fff}.hint{font:400 11.5px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;color:var(--muted);margin-left:4px}.t-title{font:600 13.5px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif}.t-title-s{font:600 12px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;fill:var(--ink)}.t-sub{font:400 11px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;fill:var(--muted)}.t-small{font:400 12px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif}.t-mono{font:500 9.5px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;letter-spacing:.6px;fill:#6b7080}.t-mono-s{font:400 9px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;fill:var(--muted)}.t-revise{font:600 11.5px Inter,PingFang SC,Noto Sans SC,Microsoft YaHei,sans-serif;fill:#c0462b}.t-score{font:600 11.5px JetBrains Mono,PingFang SC,Noto Sans SC,monospace}.t-token{font:600 9.5px JetBrains Mono,PingFang SC,Noto Sans SC,monospace;fill:#fff;letter-spacing:.4px}.toolbar.side{left:17px;top:30px;flex-direction:column;align-items:stretch}.toolbar.side .btn{justify-content:center}.toolbar.side .seg{width:100%}.toolbar.side .seg button{flex:1}.stages.side{left:17px;top:180px;bottom:auto;flex-direction:column;align-items:stretch}.stages.side .chip{justify-content:flex-start}.stages.side .hint{margin:6px 0 0 2px;line-height:1.5}.knock{paint-order:stroke;stroke:var(--card);stroke-width:4px;stroke-linejoin:round}.halo{animation:pulse 1.1s ease-in-out infinite}@keyframes pulse{0%,to{opacity:.08}50%{opacity:.22}}
