

/* ===== 静态样式块 1：<head> 主样式（全局基础/布局/组件/动画） ===== */
*{margin:0;padding:0;box-sizing:border-box}
:root{--app-font-scale:1}
body{font-family:"PingFang SC","Microsoft YaHei",sans-serif;background:#0D0D1A;color:#fff;min-height:100vh;overflow-x:hidden;font-size:calc(15px * var(--app-font-scale))}
.tab-bar{position:fixed;bottom:0;left:0;right:0;height:60px;background:#1A1A2E;display:flex;justify-content:space-around;align-items:center;z-index:100;border-top:1px solid #333}
.tab-item{display:flex;flex-direction:column;align-items:center;gap:2px;color:#888;font-size:10px;cursor:pointer;padding:4px 8px;transition:color .2s}
.tab-item.active{color:#FFD700}
.tab-item .icon{font-size:22px}
.page{display:none;padding:12px 12px 70px;max-width:420px;margin:0 auto}
.page.active{display:block}
/* 私人乐谱模块：脱离 .page 容器，复用 padding/max-width */
.private-score-area{padding:0 12px 70px;max-width:420px;margin:0 auto;box-sizing:border-box}
.card{background:#1A1A2E;border-radius:16px;padding:18px;margin-bottom:14px;border:1px solid #333}
.btn{font-family:inherit;font-size:15px;font-weight:700;padding:12px 24px;border-radius:25px;border:none;cursor:pointer;transition:all .15s}
.btn:active{transform:scale(.96)}
.btn-primary{background:#E53935;color:#fff}
.btn-gold{background:#FFD700;color:#000}
.btn-outline{background:transparent;color:#ccc;border:1.5px solid #555}
.btn-block{display:block;width:100%;text-align:center}

/* 调音器 */
.tuner-wrap{background:#1A1A2E;border-radius:20px;padding:20px 16px;text-align:center;margin-bottom:16px;border:1px solid #333}
.tuner-note{font-size:64px;font-weight:900;transition:color .2s;line-height:1}
.tuner-note.in-tune{color:#4CAF50;text-shadow:0 0 20px rgba(76,175,80,.3)}
.tuner-note.sharp{color:#E53935}
.tuner-note.flat{color:#42A5F5}
.tuner-freq{font-size:15px;color:#aaa;margin-bottom:2px}
.tuner-cents{font-size:12px;font-weight:700;margin-bottom:10px;height:18px}
.tuner-bar-outer{width:100%;max-width:280px;height:8px;margin:0 auto 10px;position:relative;background:#222;border-radius:4px;overflow:visible}
.tuner-bar-fill{position:absolute;top:0;left:0;height:100%;border-radius:4px;transition:left .15s ease-out}
.tuner-dot{position:absolute;top:50%;width:18px;height:18px;border-radius:50%;transform:translate(-50%,-50%);z-index:3;transition:left .12s ease-out;box-shadow:0 0 8px rgba(0,0,0,.5)}
.tuner-center-mark{position:absolute;top:-6px;left:50%;width:3px;height:20px;background:#4CAF50;border-radius:2px;transform:translateX(-50%)}
.tuner-green-zone{position:absolute;top:-4px;height:16px;background:rgba(76,175,80,.15);border-radius:3px}
.tuner-status{font-size:12px;font-weight:700;padding:5px 12px;border-radius:14px;display:inline-block;margin-top:6px;transition:all .3s}
/* ★ b07646：调音器改为指针式半圆表盘（替代原滚珠水平条）★ b07710 320×280；★ b07711 表盘 400×280 顶到小字下、指针入 SVG 等比缩放 */
.tuner-gauge{position:relative;width:400px;max-width:96%;height:auto;margin:2px auto 8px}
.tuner-gauge-svg{width:100%;height:auto;display:block;overflow:visible}
#tuner-needle-svg{transform-origin:200px 270px;transition:none}
.tuner-needle{position:absolute;left:50%;bottom:10px;width:5px;height:192px;background:#E53935;border-radius:2.5px;transform-origin:50% 100%;transform:translateX(-50%) rotate(0deg);transition:transform .12s ease-out;box-shadow:0 0 6px rgba(0,0,0,.5);z-index:3}
.tuner-hub{position:absolute;left:50%;bottom:2px;width:18px;height:18px;border-radius:50%;background:#3a3a52;border:2px solid #15151f;transform:translateX(-50%);z-index:4}
.tuner-gauge-cap{position:absolute;left:0;right:0;bottom:-4px;text-align:center;font-size:10px;color:#7a7a90;letter-spacing:1px}
.mic-btn{width:76px;height:76px;border-radius:50%;border:none;font-size:30px;cursor:pointer;transition:all .3s;margin:14px auto 6px;display:block;background:#555}
.mic-btn.listening{background:#E53935;animation:micPulse 1.5s infinite}
@keyframes micPulse{0%,100%{box-shadow:0 0 0 0 rgba(229,57,53,.4)}50%{box-shadow:0 0 0 18px rgba(229,57,53,0)}}

/* 节拍器 */
.bpm-num{font-size:72px;font-weight:900;color:#E53935;text-align:center;transition:all .1s;line-height:1}
.bpm-num.beat{color:#FFD700;transform:scale(1.04)}
.beat-dots{display:flex;justify-content:center;gap:8px;margin:14px 0;flex-wrap:wrap}
.beat-dot{width:28px;height:28px;border-radius:50%;background:#2A2A3E;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:#666;transition:all .12s;border:1.5px solid #333}
.beat-dot.accent{border-color:#E53935}
.beat-dot.active{background:#FFD700;color:#000;transform:scale(1.15)}
.beat-dot.active.accent{background:#E53935;color:#fff}
.ts-btn{padding:6px 14px;border-radius:8px;font-size:14px;font-weight:700;cursor:pointer;border:1.5px solid #333;background:#1A1A2E;color:#aaa;transition:all .15s;font-family:inherit}
.ts-btn:active{transform:scale(.95)}
.ts-btn.active{border-color:#FFD700;background:rgba(255,215,0,.12);color:#FFD700}
.sound-btn{padding:8px 16px;border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;border:1.5px solid #333;background:#1A1A2E;color:#aaa;transition:all .15s;font-family:inherit;flex:1;text-align:center}
.sound-btn:active{transform:scale(.95)}
.sound-btn.active{border-color:#E53935;background:rgba(229,57,53,.12);color:#E53935}

/* 排位赛 */
.song-card{background:#1A1A2E;border-radius:12px;padding:13px;margin-bottom:9px;border:1px solid #333;display:flex;align-items:center;gap:11px;cursor:pointer;transition:all .15s}
.song-card:active{transform:scale(.98)}
.song-card.locked{opacity:.35;cursor:not-allowed}
.diff-tag{padding:3px 9px;border-radius:6px;font-size:11px;font-weight:700;white-space:nowrap}
.diff-1{background:#4CAF50;color:#000}
.diff-2{background:#8BC34A;color:#000}
.diff-3{background:#FF9800;color:#000}
.diff-4{background:#FF5722;color:#fff}
.diff-5{background:#E53935;color:#fff}

/* 评分弹窗 */
.result-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.85);display:none;align-items:center;justify-content:center;z-index:200;padding:16px}
.result-overlay.active{display:flex}
.result-card{background:#1A1A2E;border-radius:20px;padding:22px;width:100%;max-width:370px;border:1px solid #444;text-align:center}

/* 通知 */
.toast{position:fixed;top:18px;left:50%;transform:translateX(-50%);background:#1A1A2E;padding:11px 18px;border-radius:10px;border:1px solid #FFD700;z-index:100000;font-size:13px;display:none;white-space:nowrap;box-shadow:0 4px 20px rgba(0,0,0,.4)}
.toast.active{display:block;animation:toastIn .3s ease}
@keyframes toastIn{from{transform:translateX(-50%) translateY(-12px);opacity:0}to{transform:translateX(-50%) translateY(0);opacity:1}}

/* 评分维度条 */
.dim-bar-outer{width:100%;height:8px;background:#333;border-radius:4px;margin-top:4px;overflow:hidden}
.dim-bar-fill{height:100%;border-radius:4px;transition:width .6s ease-out}

/* 自由练习 - 谱面 (新方案: 原谱图片+高亮层)
   结构: pd-img-wrap > [pd-img + pd-overlay > .pd-note(N个)]
   视觉: 原谱图片自带所有记谱法细节, 零渲染bug
   练习: 高亮当前/正确/错误音符, 用position绝对定位
*/
.pd-img-wrap{position:relative;width:100%;background:#fff;border-radius:8px;overflow:hidden;-webkit-user-select:none;user-select:none}
.pd-img{width:100%;height:auto;display:block;pointer-events:none}
.pd-overlay{position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none}

/* 音符高亮框 — 绝对定位, 默认透明 */
.pd-note{position:absolute;border:1.5px solid transparent;border-radius:3px;transition:all .2s;box-sizing:border-box;pointer-events:none}
.pd-note.pending{background:rgba(33,150,243,.04);border-color:rgba(33,150,243,.15)}
.pd-note.current{background:rgba(255,215,0,.28);border-color:#FFD700;box-shadow:0 0 8px rgba(255,215,0,.5);z-index:2}
.pd-note.correct{background:rgba(76,175,80,.35);border-color:#4CAF50;z-index:1}
.pd-note.wrong{background:rgba(229,57,53,.4);border-color:#E53935;z-index:1}
.pd-note.missed{background:rgba(255,152,0,.2);border-color:rgba(255,152,0,.5);z-index:1}
.pd-note.rest{opacity:.6}

/* 校准模式高亮: 已校准的音符有半透明绿底 */
.pd-note.calibrated{background:rgba(76,175,80,.15);border-color:rgba(76,175,80,.3)}

/* 错误提示 */
.pd-err-hint{font-size:8px;color:#E53935;position:absolute;bottom:-12px;left:50%;transform:translateX(-50%);white-space:nowrap;background:rgba(0,0,0,.7);padding:1px 3px;border-radius:3px;z-index:4;pointer-events:none}

/* 连音线 SVG (pd-row层) */
.pd-tie-svg{position:absolute;top:0;left:0;pointer-events:none;overflow:visible;z-index:1}

/* 结构化规范简谱（无原图）：按小节分行，人和机器读同一份 */
.pd-staff{display:flex;flex-direction:column;gap:2px;padding:8px 6px;background:#fff;border-radius:10px;font-family:'PingFang SC','Microsoft YaHei',sans-serif}
.pd-row{position:relative;display:flex;align-items:flex-end;flex-wrap:nowrap;gap:6px;padding:18px 3px 9px;border-bottom:1px solid #eee}
.pd-row:last-child{border-bottom:none}
.pd-measure{position:relative;display:inline-flex;align-items:flex-end;flex-wrap:nowrap;flex-shrink:0;padding:16px 4px 4px 2px}
.pd-measure-num{position:absolute;top:1px;left:2px;font-size:9px;color:#999;font-weight:700}
.pd-staff .pd-note{position:relative;display:inline-flex;flex-direction:column;align-items:center;justify-content:flex-start;width:28px;min-height:48px;padding:1px 0;border:1.5px solid transparent;border-radius:5px;pointer-events:auto;cursor:default}
.pd-staff .pd-note .pd-num-row{display:flex;align-items:center;justify-content:center;line-height:1}
.pd-staff .pd-note .pd-num{font-size:22px;font-weight:800;color:#111}
.pd-staff .pd-note .pd-bow{font-size:11px;color:#1565C0;line-height:1.1;font-weight:700}
.pd-staff .pd-note .pd-fng{font-size:11px;color:#6A1B9A;line-height:1.1;font-weight:700}
.pd-staff .pd-note .pd-dot-high,.pd-staff .pd-note .pd-dot-low{font-size:14px;color:#111;line-height:.55}
.pd-staff .pd-note .pd-dotted,.pd-staff .pd-note .pd-sustain{font-size:11px;color:#111}
.pd-staff .pd-note .pd-expr{font-size:9px;color:#E65100;line-height:1}
.pd-beam-group{position:relative;display:inline-flex;align-items:flex-end;gap:6px;padding-bottom:11px}
.pd-beam{position:absolute;left:3px;right:3px;height:0;border-bottom:2px solid #333}
.pd-staff .pd-note.rest .pd-num{color:#999}
.pd-staff .pd-note.correct{background:rgba(76,175,80,.28);border-color:#4CAF50}
.pd-staff .pd-note.correct .pd-num{color:#1B5E20}
.pd-staff .pd-note.wrong{background:rgba(229,57,53,.28);border-color:#E53935}
.pd-staff .pd-note.wrong .pd-num{color:#B71C1C}
.pd-staff .pd-note.missed{background:rgba(255,152,0,.2);border-color:rgba(255,152,0,.5)}
.pd-staff .pd-note.current{background:rgba(255,215,0,.28);border-color:#FFD700;box-shadow:0 0 8px rgba(255,215,0,.5)}
.pd-staff .pd-err-hint{bottom:-13px}
.pd-bar{display:inline-block;width:2px;height:42px;background:#333;align-self:center;margin:0 1px}
.pd-bar-final{position:relative;width:7px;background:none}
.pd-bar-final::before,.pd-bar-final::after{content:'';position:absolute;top:0;height:42px;background:#333}
.pd-bar-final::before{left:0;width:2px}
.pd-bar-final::after{left:4px;width:4px}

/* ===== 交流区 ===== */
.ptype-tab{flex:1;background:#0D0D1A;border:1px solid #333;border-radius:10px;padding:10px 4px;text-align:center;font-size:12px;font-weight:700;color:#888;cursor:pointer;transition:all .15s}
.ptype-tab.active{background:#E53935;color:#fff;border-color:#E53935}
.vis-tab{background:#0D0D1A;border:1px solid #333;border-radius:8px;padding:8px 12px;font-size:11px;font-weight:700;color:#888;cursor:pointer;transition:all .15s}
.vis-tab.active{background:#FFD700;color:#000;border-color:#FFD700}
.pd-mode-btn{flex:1;background:#0D0D1A;border:1.5px solid #333;border-radius:10px;padding:9px 4px;text-align:center;font-size:12px;font-weight:700;color:#aaa;cursor:pointer;transition:all .15s;white-space:nowrap}
.pd-mode-btn.active{background:#534AB7;color:#fff;border-color:#534AB7}
.pd-kind-btn{flex:1;background:#0D0D1A;border:1.5px solid #333;border-radius:10px;padding:11px 4px;text-align:center;font-size:13px;font-weight:800;color:#aaa;cursor:pointer;transition:all .15s;white-space:nowrap}
.pd-kind-btn.active{background:#FB8C00;color:#1A1A2E;border-color:#FB8C00}
.flower-option{background:#0D0D1A;border:1.5px solid #333;border-radius:12px;padding:14px 10px;cursor:pointer;transition:all .15s;min-width:60px}
.flower-option:active{transform:scale(.95);background:#2A1A2E;border-color:#FF69B4}
.cm-post{background:#1A1A2E;border-radius:14px;padding:14px;margin-bottom:12px;border:1px solid #333}
.cm-post-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.cm-avatar{width:36px;height:36px;border-radius:50%;background:#333;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0}
.cm-post-title{font-size:14px;font-weight:700;margin-bottom:6px}
.cm-post-content{font-size:13px;color:#ccc;line-height:1.7;margin-bottom:8px}
.cm-audio-player{width:100%;margin-bottom:8px;border-radius:8px}
.cm-post-img{width:100%;border-radius:10px;margin-bottom:8px;cursor:pointer}
.cm-video-card{background:#0D0D1A;border:1px solid #333;border-radius:10px;padding:12px;margin-bottom:8px;display:flex;align-items:center;gap:10px;cursor:pointer;transition:all .15s}
.cm-video-card:active{background:#1A1A2E}
.cm-video-icon{font-size:28px;flex-shrink:0}
.cm-video-info{flex:1}
.cm-video-platform{font-size:12px;font-weight:700;color:#42A5F5}
.cm-video-hint{font-size:11px;color:#666}
.cm-vis-tag{display:inline-block;font-size:10px;padding:2px 8px;border-radius:4px;margin-bottom:8px}
.cm-vis-public{background:rgba(76,175,80,.15);color:#4CAF50}
.cm-vis-group{background:rgba(66,165,245,.15);color:#42A5F5}
.cm-vis-private{background:rgba(255,152,0,.15);color:#FF9800}
.cm-vis-self{background:rgba(128,128,128,.15);color:#888}
.cm-actions{display:flex;gap:16px;padding-top:10px;border-top:1px solid #2A2A3E}
.cm-action{display:flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:#888;transition:color .15s}
.cm-action:active{transform:scale(.92)}
.cm-action.liked{color:#E53935}
.cm-flower-btn{color:#FF69B4}
.cm-comments{margin-top:10px;padding-top:8px;border-top:1px solid #2A2A3E}
.cm-comment{display:flex;gap:8px;margin-bottom:6px;font-size:12px}
.cm-comment-user{color:#FFD700;font-weight:700;flex-shrink:0}
.cm-comment-text{color:#bbb}
.cm-comment-input{display:flex;gap:6px;margin-top:8px}
.cm-comment-input input{flex:1;background:#0D0D1A;border:1px solid #333;border-radius:8px;padding:8px 10px;color:#fff;font-size:12px;font-family:inherit}

/* 简谱输入器 v3.0 — 弦趣风格5层布局 */
.si-topbar{display:flex;align-items:center;gap:4px;padding:8px 6px;background:linear-gradient(135deg,#5C6BC0,#3949AB);border-radius:10px;margin-bottom:4px}
.si-back{font-size:20px;color:#fff;cursor:pointer;padding:0 4px}
.si-topbar-title{font-size:15px;font-weight:700;color:#fff;flex:1;cursor:pointer}
.si-topbar-ico{font-size:18px;color:#fff;cursor:pointer;padding:0 6px}
.si-meta-bar{display:flex;gap:10px;padding:4px 8px;font-size:12px;color:#888;margin-bottom:4px;flex-wrap:wrap}
.si-meta-bar span{white-space:nowrap}
.si-canvas{background:#1A1A2E;border-radius:8px;padding:10px;min-height:100px;max-height:220px;overflow-y:auto;margin-bottom:4px}
.si-rhythm-preview{background:#0D0D1A;border-radius:8px;padding:6px;margin-bottom:4px;min-height:44px}
.si-rhythm-label{font-size:10px;color:#666;margin-bottom:3px}
.si-rhythm-candidates{display:flex;gap:5px;overflow-x:auto}
.si-rhythm-cand{flex-shrink:0;background:#1A1A2E;border:1px solid #444;border-radius:6px;padding:6px 10px;cursor:pointer;text-align:center;transition:all .12s;min-width:72px}
.si-rhythm-cand:active{transform:scale(.93)}
.si-rhythm-cand.selected{border-color:#42A5F5;background:rgba(66,165,245,.12)}
.si-rhythm-cand-visual{font-size:15px;font-weight:900;color:#fff;line-height:1.2;position:relative;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2px 0}
.si-rhythm-cand-name{font-size:9px;color:#888;margin-top:3px}
.si-rhythm-empty{font-size:11px;color:#555;padding:8px;text-align:center}
/* 减时线视觉预览 — grid连音线 */
.si-rv-grid{display:inline-grid;justify-items:center;gap:0}
.si-rv-num{font-size:13px;font-weight:900;color:#fff;line-height:1}
.si-rv-beam-on{border-bottom:2px solid #aaa;width:100%;height:3px}
.si-rv-beam-off{height:3px}
.si-rv-tuplet{font-size:8px;color:#42A5F5;position:absolute;top:-1px;left:50%;transform:translateX(-50%)}
.si-keyboard{background:#0D0D1A;border-radius:8px;padding:5px;margin-bottom:4px}
/* 拖拽滑动：隐藏滚动轴，用pointer拖拽 */
.si-kb-row{display:flex;gap:3px;margin-bottom:3px;overflow-x:auto;padding-bottom:2px;cursor:grab;scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;user-select:none}
.si-kb-row::-webkit-scrollbar{display:none}
.si-kb-row.dragging{cursor:grabbing;scroll-behavior:auto}
.si-kb-row:last-child{margin-bottom:0}
/* 音符键盘条 */
.si-kb-note{flex-shrink:0;width:42px;height:56px;border:1px solid #444;border-radius:8px;background:#1A1A2E;cursor:pointer;font-family:inherit;transition:all .1s;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2px 0;position:relative}
.si-kb-note:active{transform:scale(.92);background:rgba(66,165,245,.2)}
.si-kb-note .si-dots-up{display:flex;flex-direction:column;align-items:center;line-height:.6;height:10px;justify-content:flex-end}
.si-kb-note .si-dots-dn{display:flex;flex-direction:column;align-items:center;line-height:.6;height:10px;justify-content:flex-start}
.si-kb-note .si-dot{font-size:7px;color:#42A5F5}
.si-kb-note .si-num{font-size:20px;font-weight:900;color:#fff;line-height:1}
.si-kb-note.cur-oct{background:rgba(66,165,245,.12);border-color:#42A5F5}
/* 普通按钮 */
.si-kb-num{flex:1;font-size:22px;font-weight:900;padding:11px 0;border:1px solid #444;border-radius:8px;background:#1A1A2E;color:#fff;cursor:pointer;font-family:inherit;transition:all .1s;min-width:0}
.si-kb-num:active{transform:scale(.92);background:rgba(66,165,245,.2)}
.si-kb-num.rest{color:#E53935}
.si-kb-btn{flex-shrink:0;font-size:13px;font-weight:600;padding:7px 9px;border:1px solid #444;border-radius:6px;background:#1A1A2E;color:#ccc;cursor:pointer;font-family:inherit;transition:all .12s;white-space:nowrap}
.si-kb-btn:active{transform:scale(.93)}
.si-kb-btn.flash{background:rgba(229,57,53,.2);border-color:#E53935;color:#E53935}
/* 钢琴键「按下即发声」：用 pointerdown 触发，故加视觉反馈（替代 :active，因 touch 无 hover） */
.pk-down{background:#bfe3ff !important}
.piano-black.pk-down{background:#5a5a73 !important}
/* 音阶钢琴键基类背景：避免 spClear 清空内联色后黑键回退成默认浅色（变"白键"） */
.sp-key{background:#fff}
.sp-key.sp-black{background:#2b2b3a}
.si-kb-btn.section{font-size:10px;color:#666;border:none;background:none;padding:0 4px;cursor:default}

/* ═══ 单音编辑器：紧凑优先级布局 ═══ */
.ne-r{display:flex;flex-wrap:wrap;align-items:center;gap:3px 4px;margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid rgba(255,255,255,.035)}
.ne-l{font-size:9px;color:#556;font-weight:700;padding:0 1px 0 2px;white-space:nowrap;flex-shrink:0}
.ne-gap{width:8px;flex-shrink:0}
/* 音名按钮 */
.ne-n{width:30px;height:32px;border:1.3px solid #3a3a50;border-radius:5px;background:#111;color:#eee;font-size:15px;font-weight:800;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;transition:all .07s}
.ne-n:active{transform:scale(.9)}
.ne-n.active-note{background:#2563eb;border-color:#3b82f6;color:#fff;box-shadow:0 0 7px rgba(59,130,246,.35)}
.ne-n.rest-n{color:#ef4444;border-color:rgba(239,68,68,.4)}
/* 八度 */
.ne-o{height:28px;padding:0 7px;border:1.2px solid #3a3a50;border-radius:5px;background:#111;color:#bbb;font-size:10px;font-weight:700;cursor:pointer;transition:all .07s}
.ne-o:active{transform:scale(.9)}
.ne-o.active-o{background:rgba(234,179,8,.15);border-color:#eab308;color:#facc15}
/* 时值 */
.ne-d{height:28px;padding:0 6px;border:1.2px solid #3a3a50;border-radius:5px;background:#111;color:#ccc;font-size:10px;font-weight:600;cursor:pointer;transition:all .07s;white-space:nowrap}
.ne-d:active{transform:scale(.9)}
.ne-d.active-d{background:rgba(34,197,94,.18);border-color:#22c55e;color:#4ade80}
/* 功能按钮 */
.ne-b{height:28px;padding:0 6px;border:1.1px solid #333;border-radius:5px;background:#0d0d1a;color:#99a;font-size:10px;font-weight:600;cursor:pointer;transition:all .07s;white-space:nowrap}
.ne-b:active{transform:scale(.9);background:#222}
.ne-b.active-prop,.ne-b.active-bow{background:rgba(59,130,246,.15);border-color:#3b82f6;color:#93c5fd}
/* 小按钮 */
.ne-s{min-width:26px;height:27px;padding:0 5px;border:1.1px solid #2a2a3e;border-radius:4px;background:#12121c;color:#889;font-size:10px;font-weight:600;cursor:pointer;transition:all .07s;display:inline-flex;align-items:center;justify-content:center}
.ne-s:active{transform:scale(.92);background:#1a1a2e}
.ne-s.active-prop{background:rgba(59,130,246,.16);border-color:#3b82f6;color:#93c5fd}
/* 底部操作栏 */
.ne-ok{height:33px;padding:0 14px;border:none;border-radius:6px;background:linear-gradient(135deg,#22c55e,#16a34a);color:#fff;font-size:12px;font-weight:700;cursor:pointer}
.ne-ok:active{transform:scale(.95)}
.ne-play{height:33px;padding:0 11px;border:none;border-radius:6px;background:linear-gradient(135deg,#f97316,#ea580c);color:#fff;font-size:11px;font-weight:700;cursor:pointer}
.ne-play:active{transform:scale(.95)}
.ne-op{height:30px;padding:0 7px;border:1px solid #444;border-radius:5px;background:transparent;color:#999;font-size:10px;font-weight:600;cursor:pointer}
.ne-op:active{background:#222}
.ne-del{height:30px;padding:0 7px;border:1px solid #dc2626;border-radius:5px;background:transparent;color:#ef4444;font-size:10px;font-weight:600;cursor:pointer}
.ne-del:active{background:rgba(220,38,38,.12)}

/* 起止点脉冲 */
.ne-b.range-waiting,.ne-s.range-waiting{border-color:#f97316;color:#fb923c;animation:nePulse 1.2s infinite}
@keyframes nePulse{0%,100%{box-shadow:0 0 0 0 rgba(249,115,22,.3)}50%{box-shadow:0 0 0 4px rgba(249,115,22,0)}}
.si-bottom-bar{display:flex;gap:4px;padding:3px 0}
.si-bottom-bar button{flex:1;font-size:13px;padding:8px 0;border:1px solid #444;border-radius:6px;background:#1A1A2E;color:#ccc;cursor:pointer;font-family:inherit;transition:all .1s}
.si-bottom-bar button:active{transform:scale(.93)}
.si-bottom-bar button.danger{color:#E53935}
.si-modal{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:9999}
.si-modal-content{background:#1A1A2E;border-radius:12px;padding:20px;width:85%;max-width:320px;max-height:80vh;overflow-y:auto}
.si-modal-title{font-size:16px;font-weight:700;color:#FFD700;margin-bottom:12px;text-align:center}
.si-modal-content input[type="text"]{width:100%;background:#0D0D1A;border:1px solid #444;border-radius:6px;padding:10px;color:#fff;font-size:14px;font-family:inherit;margin-bottom:8px;box-sizing:border-box}
.si-modal-label{font-size:11px;color:#888;margin:8px 0 4px}
.si-modal-opts{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:4px}
.si-modal-opts button{padding:7px 12px;font-size:13px;border:1px solid #444;border-radius:6px;background:#0D0D1A;color:#ccc;cursor:pointer;font-family:inherit;transition:all .1s}
.si-modal-opts button:active{transform:scale(.93)}
.si-modal-opts button.sel{background:rgba(66,165,245,.15);border-color:#42A5F5;color:#42A5F5}
.si-modal-content input[type="range"]{width:100%;margin:4px 0}
.si-modal-btn{width:100%;padding:10px;font-size:14px;font-weight:700;border:none;border-radius:8px;background:linear-gradient(135deg,#42A5F5,#1A237E);color:#fff;cursor:pointer;font-family:inherit;margin-top:10px}
.si-modal-btn:active{transform:scale(.97)}
.si-menu-item{display:flex;align-items:center;gap:10px;padding:12px;font-size:14px;color:#ccc;border-bottom:1px solid #333;cursor:pointer;transition:background .1s}
.si-menu-item:active{background:rgba(66,165,245,.1)}
.si-menu-item:last-child{border-bottom:none}
.si-menu-group{font-size:11px;color:#8a8aff;font-weight:700;padding:14px 12px 4px;letter-spacing:1px}
.si-sub-modal{display:none;flex-direction:column;gap:4px;margin-top:8px}
.si-sub-modal.show{display:flex}
.si-sub-opts{display:flex;flex-wrap:wrap;gap:6px}
.si-sub-opts button{padding:8px 14px;font-size:14px;border:1px solid #444;border-radius:6px;background:#0D0D1A;color:#ccc;cursor:pointer;font-family:inherit;transition:all .1s;min-width:44px;text-align:center}
.si-sub-opts button:active{transform:scale(.93)}
.si-sub-opts button.sel{background:rgba(66,165,245,.15);border-color:#42A5F5;color:#42A5F5}
.si-score{display:flex;flex-wrap:wrap;align-items:flex-start;gap:0;position:relative}
.si-overlay-svg{position:absolute;top:0;left:0;pointer-events:none;overflow:visible;z-index:5;width:100%;height:100%}
.si-demo-playing{background:rgba(255,215,0,0.25)!important;border-radius:4px;box-shadow:0 0 8px rgba(255,215,0,0.6)}
.si-col{display:inline-flex;flex-direction:column;align-items:center;min-width:30px;text-align:center;position:relative;padding:0 1px;vertical-align:top}
.si-col.sep{min-width:10px;max-width:10px}
/* 顶部记号区——固定高度+绝对定位，不管加多少记号音符和减时线绝不下沉 */
.si-top-zone{position:relative;height:48px;width:100%;overflow:visible}
.si-top-zone>div{position:absolute;left:0;right:0;text-align:center;white-space:nowrap;line-height:1}
.si-top1{font-size:9px;color:#534AB7;bottom:36px}
.si-top2{font-size:9px;bottom:23px}
.si-top3a{font-size:9px;bottom:11px}
.si-top3{font-size:9px;color:#42A5F5;bottom:0}
.si-note{font-size:22px;font-weight:900;line-height:1.4;color:#fff;position:relative;min-width:18px;white-space:nowrap}
.si-beam-row{display:flex;flex-direction:column;gap:1px;box-sizing:border-box}
.si-beam-line{height:0;border-bottom:2px solid #b0b0b0;width:100%}
.si-beam-row.conn-both{width:calc(100% + 2px);margin:1px -1px 0}
.si-beam-row.conn-left{width:calc(100% + 1px);margin:1px 0 0 -1px}
.si-beam-row.conn-right{width:calc(100% + 1px);margin:1px -1px 0 0}
.si-beam-row.conn-none{width:14px;margin:1px auto 0}
.si-col.dash{padding-right:0}
.si-col.beam-gap{margin-right:14px}
.si-beam-grp{display:inline-flex;align-items:flex-start;gap:0}
.si-beam-grp.si-beam-gap{margin-right:14px}
.si-bot1{font-size:9px;line-height:1.3;min-height:13px;color:#42A5F5;white-space:nowrap}
.si-bot2{font-size:9px;line-height:1.3;min-height:13px;color:#3B6D11;white-space:nowrap}
.si-bot3{font-size:9px;line-height:1.3;min-height:13px;color:#854F0B;font-style:italic;white-space:nowrap}
.si-sep{font-size:18px;color:#888;line-height:1.4;font-weight:700;display:flex;align-items:center;justify-content:center;min-height:31px}
.si-col.sep .si-note{display:flex;align-items:flex-end;justify-content:center;width:100%;min-height:31px;flex-shrink:0}
.si-cursor{display:inline-block;width:2px;height:28px;background:#42A5F5;animation:si-blink 1s steps(2) infinite;vertical-align:middle;margin:0 1px;cursor:pointer;border-radius:1px}
.si-col.clickable{cursor:pointer;transition:background .12s}
.si-col.clickable:hover{background:rgba(66,165,245,.08);border-radius:4px}
.si-col.clickable:active{background:rgba(66,165,245,.15)}
.si-col.selected{background:rgba(66,165,245,.12);border-radius:4px}
@keyframes si-blink{0%,100%{opacity:1}50%{opacity:0}}
@keyframes spBounce{0%{transform:translate(-50%,-50%) scale(.4);opacity:0}30%{transform:translate(-50%,-50%) scale(1.3);opacity:1}60%{transform:translate(-50%,-50%) scale(1);opacity:1}100%{transform:translate(-50%,-50%) scale(1);opacity:.85}}
@keyframes slideDown{from{transform:translateY(-100%)}to{transform:translateY(0)}}
@keyframes slideUp{from{transform:translateY(0)}to{transform:translateY(-100%)}}
#scale-overlay{transition:left .15s ease,top .15s ease}
#scale-overlay.sp-bounce{animation:spBounce .5s ease-out}
/* 乐谱录入 Canvas：可点击选音 */
#ne-canvas{display:block;width:100%;max-width:none;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}
#score-scroll-wrapper.active-edit{border-color:#4a90d9!important;box-shadow:0 0 12px rgba(74,144,217,.35)}
  <link rel="icon" href="logo/风格_B_阴阳分色_512.png">


/* ===== 静态样式块 2：#pd-score 区预备拍 keyframes ===== */
@keyframes pdCountPop {
      0%   { transform: translate(-50%,-50%) scale(0.2); opacity: 0; }
      45%  { transform: translate(-50%,-50%) scale(1.32); opacity: 1; }
      70%  { transform: translate(-50%,-50%) scale(0.94); }
      100% { transform: translate(-50%,-50%) scale(1); opacity: 1; }
    }
    #pd-countin.pop { animation: pdCountPop 0.55s cubic-bezier(.2,.8,.3,1); }
    #piano-countin.pop { animation: pdCountPop 0.55s cubic-bezier(.2,.8,.3,1); }


/* ===== 静态样式块 3：#page-timbre 二胡测试页样式 ===== */
#page-timbre{ padding-top:6px; }
    #page-timbre .wrap{ padding:0 14px 40px; max-width:1280px; margin:0 auto; }
    #page-timbre .toolbar{ display:flex; gap:12px; flex-wrap:wrap; align-items:center; margin:14px 0 18px; }
    #page-timbre button{ cursor:pointer; border:none; border-radius:10px; padding:11px 20px; font-size:14px; font-weight:600; transition:.15s; background:#2c7be5; color:#fff; box-shadow:0 6px 20px rgba(40,60,100,.08); font-family:inherit; }
    #page-timbre button.ghost{ background:#eef2f9; color:#33415a; }
    #page-timbre button:disabled{ opacity:.45; cursor:not-allowed; }
    #page-timbre button:hover:not(:disabled){ transform:translateY(-1px); }
    #page-timbre .status{ font-size:13px; color:#9aa3b2; margin-left:auto; }
    #page-timbre .status b{ color:#fff; }
    #page-timbre .grid{ display:grid; grid-template-columns:repeat(4,1fr); gap:16px; }
    @media(max-width:980px){ #page-timbre .grid{ grid-template-columns:repeat(2,1fr); } }
    #page-timbre .card{ background:#fff; border:1px solid #e6e9ef; border-radius:16px; padding:16px; box-shadow:0 6px 20px rgba(40,60,100,.10); color:#33415a; }
    #page-timbre .card h3{ margin:0 0 10px; font-size:14px; color:#6b7686; font-weight:600; }
    #page-timbre .gauge-wrap{ display:flex; flex-direction:column; align-items:center; }
    #page-timbre canvas.gauge{ width:100%; max-width:220px; height:auto; }
    #page-timbre .mid{ grid-column:1 / -1; display:grid; grid-template-columns:1.4fr 1fr; gap:16px; margin-top:16px; }
    @media(max-width:980px){ #page-timbre .mid{ grid-template-columns:1fr; } }
    #page-timbre .panel{ background:#fff; border:1px solid #e6e9ef; border-radius:16px; padding:16px; box-shadow:0 6px 20px rgba(40,60,100,.10); color:#33415a; }
    #page-timbre .panel h3{ margin:0 0 12px; font-size:14px; color:#6b7686; font-weight:600; }
    #page-timbre canvas.scope{ width:100%; height:150px; display:block; background:#0f1830; border-radius:10px; }
    #page-timbre canvas.spectrum{ width:100%; height:150px; display:block; background:#0f1830; border-radius:10px; }
    #page-timbre .note-big{ display:flex; align-items:baseline; gap:10px; justify-content:center; margin:4px 0 10px; }
    #page-timbre .note-big .n{ font-size:54px; font-weight:800; line-height:1; color:#2c7be5; }
    #page-timbre .note-big .c{ font-size:18px; color:#6b7686; }
    #page-timbre .readouts{ display:grid; grid-template-columns:1fr 1fr; gap:8px 14px; font-size:13px; }
    #page-timbre .readouts div{ display:flex; justify-content:space-between; border-bottom:1px dashed #e6e9ef; padding:4px 0; color:#33415a; }
    #page-timbre .readouts span:last-child{ font-weight:700; color:#33415a; }
    #page-timbre .rangebar{ margin-top:12px; }
    #page-timbre .rangebar .track{ position:relative; height:14px; background:#eef2f9; border-radius:8px; overflow:hidden; }
    #page-timbre .rangebar .fill{ position:absolute; top:0; bottom:0; background:linear-gradient(90deg,#2c7be5,#23a55a); }
    #page-timbre .rangebar .lbl{ display:flex; justify-content:space-between; font-size:12px; color:#6b7686; margin-top:4px; }
    #page-timbre .report{ margin-top:16px; }
    #page-timbre .report .scoreline{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; }
    #page-timbre .report .big{ font-size:46px; font-weight:800; color:#33415a; }
    #page-timbre .report .tag{ font-size:14px; font-weight:700; padding:5px 12px; border-radius:20px; color:#fff; }
    #page-timbre .bars{ margin-top:14px; display:grid; gap:10px; }
    #page-timbre .bar{ display:grid; grid-template-columns:80px 1fr 40px; align-items:center; gap:10px; font-size:13px; color:#33415a; }
    #page-timbre .bar .track{ height:12px; background:#eef2f9; border-radius:7px; overflow:hidden; }
    #page-timbre .bar .v{ height:100%; border-radius:7px; }
    #page-timbre .radar{ width:100%; max-width:520px; height:auto; display:block; margin:14px auto 0; background:#fff; border:1px solid #e6e9ef; border-radius:16px; box-shadow:0 6px 20px rgba(40,60,100,.08); }
    #page-timbre .sugg{ margin-top:14px; font-size:13px; line-height:1.7; color:#33415a; }
    #page-timbre .sugg li{ margin:4px 0; }
    #page-timbre .hint{ font-size:12px; color:#6b7686; margin-top:8px; line-height:1.6; }
    #page-timbre .err{ color:#e5534b; font-weight:600; }
    #page-timbre .legend{ font-size:12px; color:#6b7686; margin-top:6px; }
