*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}

/* ── 全局点击反馈 ─────────────────────────────────────────────── */
button, .qb, .sb-item, .ls-tab, .ls-piece, .ls-theory-card,
.follow-btn, .share-btn, .lb-card, .toc-row, .ls-mark, .ls-toc-toggle,
.mn-btn, .mn-mt, .tn-string-btn, .tn-switch,
.viewer-close, .sb-footer-btn, .icon-btn, .hamburger{
  transition: transform .1s ease-out, opacity .15s, background .15s, border-color .15s, box-shadow .15s;
  -webkit-user-select:none;user-select:none;
  touch-action:manipulation;
}
button:active, .qb:active, .ls-tab:active, .ls-piece:active, .ls-theory-card:active,
.follow-btn:active, .share-btn:active, .toc-row:active, .ls-mark:active, .ls-toc-toggle:active,
.mn-btn:active, .mn-mt:active, .viewer-close:active, .sb-footer-btn:active,
.icon-btn:active, .hamburger:active{
  transform: scale(.95);
  opacity: .78;
}
.sb-item:active{background: var(--surf);opacity:.78}
.lb-card{cursor:default}
/* 保留原有 .tn-string-btn:active :scale(.9) 优先 */
:root{
  --bg:#ffffff;--surf:#f0f2f2;--card:#ffffff;--border:#dfe8e7;
  --gold:#2c7873;--gold2:#3a9e97;--amber:#1c5c58;
  --blue:#3a8fa0;--warn:#d4834a;--red:#c0504a;
  --text:#1c2828;--muted:#7a8a88;--sb:256px;--topbar:52px;
}
:root[data-theme="dark"]{
  --bg:#0f1416;--surf:#1a2124;--card:#1a2124;--border:#2a3438;
  --gold:#62d5cc;--gold2:#4ec8c3;--amber:#4ec8c3;
  --text:#e4ebea;--muted:#8a9a98;
}
:root[data-theme="dark"] .str-card.sel{background:rgba(78,200,195,.15)}
:root[data-theme="dark"] .qb:hover{box-shadow:0 4px 16px rgba(98,213,204,.15)}
@media(prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --bg:#0f1416;--surf:#1a2124;--card:#1a2124;--border:#2a3438;
    --gold:#62d5cc;--gold2:#4ec8c3;--amber:#4ec8c3;
    --text:#e4ebea;--muted:#8a9a98;
  }
  :root:not([data-theme="light"]) .str-card.sel{background:rgba(78,200,195,.15)}
}
html,body{height:100%;background:var(--bg);color:var(--text);
  font-family:-apple-system,'PingFang SC','Helvetica Neue',sans-serif;overflow-x:hidden}

/* ── pages ── */
.page{display:none;min-height:100vh;animation:fadein .18s;padding-bottom:28px}
.page.active{display:block}
@keyframes fadein{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@media(max-width:767px){.page{padding-top:var(--topbar)}}
@media(min-width:768px){.page{margin-left:var(--sb)}}

/* ── top bar (mobile) ── */
.topbar{position:fixed;top:0;left:0;right:0;height:var(--topbar);
  background:#1a1a1a;border-bottom:1px solid rgba(255,255,255,.07);
  box-shadow:0 2px 10px rgba(0,0,0,.25);
  display:flex;align-items:center;justify-content:space-between;
  padding:0 16px;z-index:48}
.topbar-title{font-size:16px;font-weight:700;color:#ffffff}
@media(min-width:768px){.topbar{display:none}}

/* ── sidebar overlay ── */
.sb-overlay{display:none;position:fixed;inset:0;
  background:rgba(0,0,0,.22);z-index:49;opacity:0;transition:opacity .3s}
.sb-overlay.show{display:block;opacity:1}

/* ── sidebar ── */
.sidebar{position:fixed;top:0;left:0;height:100vh;width:var(--sb);
  background:#1a1a1a;border-right:1px solid rgba(255,255,255,.07);
  box-shadow:4px 0 24px rgba(0,0,0,.35);
  display:flex;flex-direction:column;z-index:50;
  transform:translateX(-100%);transition:transform .3s ease}
.sidebar.open{transform:translateX(0)}
@media(min-width:768px){.sidebar{transform:translateX(0)}}

.sb-profile{padding:22px 18px 16px;border-bottom:1px solid rgba(255,255,255,.07)}
.sb-name{font-size:15px;font-weight:700;color:#ffffff}
.sb-sub{font-size:11px;color:rgba(255,255,255,.38);margin-top:3px}

.sb-nav{flex:1;padding:10px 8px;overflow-y:auto}
.sb-item{display:flex;align-items:center;gap:10px;
  width:100%;padding:10px 12px;border-radius:12px;
  font-size:14px;font-weight:500;color:rgba(255,255,255,.78);
  cursor:pointer;border:none;background:none;text-align:left;
  transition:background .18s,color .18s;user-select:none}
.sb-item svg{flex-shrink:0;opacity:.45;transition:opacity .18s}
.sb-item:hover{background:rgba(255,255,255,.07);color:#ffffff}
.sb-item:hover svg{opacity:.9}
.sb-item.active{background:rgba(44,120,115,.28);color:#62d5cc;font-weight:600}
.sb-item.active svg{opacity:1;color:#62d5cc}
.sb-item.disabled{opacity:.3;cursor:default}

.sb-section{margin-top:8px}
.sb-sec-hd{display:flex;align-items:center;justify-content:space-between;
  width:100%;padding:8px 12px;border-radius:10px;
  font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:rgba(255,255,255,.28);cursor:pointer;border:none;background:none;
  transition:background .18s}
.sb-sec-hd:hover{background:rgba(255,255,255,.06)}
.sb-arrow{transition:transform .28s;font-size:10px;opacity:.6}
.sb-arrow.open{transform:rotate(180deg)}
.sb-sec-body{overflow:hidden;max-height:0;
  transition:max-height .32s ease,opacity .25s;opacity:0}
.sb-sec-body.open{max-height:400px;opacity:1}
.sb-sec-row{display:block;width:100%;text-align:left;
  padding:7px 12px;border-radius:8px;font-size:13px;
  color:rgba(255,255,255,.35);border:none;background:none;cursor:default;
  line-height:1.55}

.sb-footer{padding:12px 12px 20px;border-top:1px solid rgba(255,255,255,.07)}
.sb-footer-btn{position:relative;overflow:hidden;
  width:100%;padding:11px;border-radius:12px;
  font-size:14px;font-weight:600;color:#62d5cc;
  border:1px solid rgba(78,200,195,.35);background:rgba(44,120,115,.18);
  cursor:pointer;transition:background .2s,border-color .2s}
.sb-footer-btn::before,.sb-footer-btn::after{content:'';position:absolute;
  left:15%;right:15%;height:1px;
  background:linear-gradient(to right,transparent,#62d5cc,transparent);
  opacity:0;transition:opacity .45s}
.sb-footer-btn::before{top:0}.sb-footer-btn::after{bottom:-1px}
.sb-footer-btn:hover{background:rgba(44,120,115,.3);border-color:rgba(78,200,195,.6)}
.sb-footer-btn:hover::before{opacity:1}.sb-footer-btn:hover::after{opacity:.3}

/* ── icon buttons (topbar) ── */
.icon-btn{width:36px;height:36px;display:flex;align-items:center;justify-content:center;
  cursor:pointer;border:none;background:none;color:#ffffff;
  border-radius:8px;transition:background .18s;padding:6px}
.icon-btn:hover{background:rgba(255,255,255,.1)}
.icon-btn.dark{color:var(--text)}
.icon-btn.dark:hover{background:var(--surf)}

/* ── desktop tools (right-top floating) ── */
.desktop-tools{display:none;position:fixed;top:14px;right:16px;z-index:47;
  gap:6px;background:var(--card);border:1px solid var(--border);
  border-radius:12px;padding:4px;box-shadow:0 2px 8px rgba(0,0,0,.06)}
@media(min-width:768px){.desktop-tools{display:flex}}

/* ── share modal ── */
.share-modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);
  z-index:300;align-items:center;justify-content:center;padding:20px}
.share-modal.show{display:flex;animation:fadein .2s}
.share-box{background:var(--card);border-radius:16px;padding:24px;
  max-width:400px;width:100%;text-align:center;
  border:1px solid var(--border);box-shadow:0 12px 40px rgba(0,0,0,.3)}
.share-title{font-size:17px;font-weight:700;color:var(--text);margin-bottom:16px}
.share-url{background:var(--surf);border:1px solid var(--border);border-radius:10px;
  padding:12px;font-size:13px;color:var(--muted);word-break:break-all;margin-bottom:16px;
  font-family:ui-monospace,SFMono-Regular,monospace}
.share-btns{display:flex;gap:8px;margin-bottom:12px}
.share-btn{flex:1;padding:12px;border-radius:10px;font-size:14px;font-weight:600;
  cursor:pointer;border:1px solid var(--border);background:var(--surf);color:var(--text);
  transition:all .18s}
.share-btn.primary{background:var(--gold);color:#fff;border-color:var(--gold)}
.share-btn:hover{opacity:.88;transform:translateY(-1px)}
.share-hint{font-size:12px;color:var(--muted);margin-bottom:16px;line-height:1.5}
.share-close{background:none;border:none;color:var(--muted);font-size:13px;cursor:pointer;padding:6px}
.share-close:hover{color:var(--text)}

/* ── toast ── */
.toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%);
  background:rgba(0,0,0,.85);color:#fff;padding:10px 20px;border-radius:24px;
  font-size:13px;z-index:400;opacity:0;transition:opacity .3s,transform .3s;
  pointer-events:none}
.toast.show{opacity:1;transform:translateX(-50%) translateY(-6px)}

/* ── hamburger ── */
.hamburger{width:38px;height:38px;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:5px;
  cursor:pointer;border:none;background:none;
  border-radius:8px;transition:background .18s;padding:6px}
.hamburger:hover{background:rgba(255,255,255,.1)}
.hamburger span{display:block;width:20px;height:2px;
  background:#ffffff;border-radius:2px;
  transition:transform .28s,opacity .2s;transform-origin:center}
.hamburger.open span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.hamburger.open span:nth-child(2){opacity:0;transform:scaleX(0)}
.hamburger.open span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* ── header ── */
.hdr{padding:20px 16px 10px}
.hdr-title{font-size:22px;font-weight:700}
.hdr-sub{font-size:13px;color:var(--muted);margin-top:3px}

/* ── card ── */
.card{background:var(--card);border-radius:12px;padding:16px;margin:0 16px 14px;
  border:1px solid var(--border);box-shadow:0 1px 6px rgba(0,0,0,.06)}
.card-label{font-size:11px;color:var(--gold);text-transform:uppercase;
  letter-spacing:.08em;margin-bottom:10px;opacity:.8}

/* ── HOME ── */
.hero{text-align:center;padding:16px 20px 12px;margin-bottom:4px}
.hero img{width:150px!important;margin-bottom:8px!important}
.hero h1{font-size:24px!important;margin-bottom:4px!important}
.hero p{font-size:12px!important}
@media(min-width:768px){
  .hero{padding:32px 20px 24px}
  .hero img{width:220px!important;margin-bottom:16px!important}
  .hero h1{font-size:30px!important;margin-bottom:8px!important}
  .hero p{font-size:13px!important}
}
.qb-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:0 16px 14px}
.qb{background:var(--card);border:1px solid var(--border);border-radius:16px;
  padding:20px 14px 18px;text-align:center;cursor:pointer;
  position:relative;overflow:hidden;
  box-shadow:0 1px 6px rgba(0,0,0,.06);
  transition:border-color .25s,box-shadow .25s,transform .15s}
.qb::before{content:'';position:absolute;top:0;left:15%;right:15%;height:1px;
  background:linear-gradient(to right,transparent,var(--gold),transparent);
  opacity:0;transition:opacity .45s}
.qb:hover{border-color:rgba(44,120,115,.4);box-shadow:0 4px 16px rgba(44,120,115,.12)}
.qb:hover::before{opacity:.8}
.qb:active{transform:scale(.96)}
.qb-icon{display:flex;align-items:center;justify-content:center;
  height:34px;margin-bottom:10px}
.qb-lbl{font-size:14px;font-weight:600;color:var(--text)}
.qb-sub{font-size:11px;color:var(--muted);margin-top:5px;line-height:1.4}
.tip-list{list-style:none}
.tip-list li{display:flex;gap:10px;padding:9px 0;
  font-size:13.5px;line-height:1.55}
.tip-list li:last-child{border-bottom:none}
.tip-num{background:var(--gold);color:#fff;border-radius:50%;
  width:20px;height:20px;min-width:20px;font-size:11px;font-weight:700;
  display:flex;align-items:center;justify-content:center;margin-top:1px}
.tip-num.zh{background:var(--amber);color:#fff}

/* ── STORY & FOLLOW (home) ── */
.story-card .story-body p{font-size:13.5px;line-height:1.75;color:var(--text);margin-bottom:8px}
.story-card .story-body p:last-child{margin-bottom:0}
.story-card b{color:var(--text)}

.follow-card{display:flex;gap:14px;align-items:center;
  margin:0 16px 14px;padding:18px;border-radius:16px;
  background:linear-gradient(135deg,rgba(44,120,115,.08),rgba(58,158,151,.03));
  border:1px solid rgba(44,120,115,.25)}
:root[data-theme="dark"] .follow-card{
  background:linear-gradient(135deg,rgba(98,213,204,.1),rgba(78,200,195,.03));
  border-color:rgba(98,213,204,.28)}
.follow-left{flex:1;min-width:0}
.follow-tag{font-size:10.5px;color:var(--gold);font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;margin-bottom:6px;opacity:.85}
.follow-title{font-size:16px;font-weight:600;color:var(--text);margin-bottom:4px}
.follow-title b{color:var(--gold);font-weight:800}
.follow-sub{font-size:12px;color:var(--muted);line-height:1.55;margin-bottom:12px}
.follow-btns{display:flex;gap:6px;flex-wrap:wrap}
.follow-btn{padding:8px 12px;border-radius:20px;font-size:12.5px;font-weight:600;
  cursor:pointer;border:1px solid var(--border);background:var(--card);color:var(--text);
  text-decoration:none;display:inline-block;transition:all .18s}
.follow-btn.primary{background:var(--gold);color:#fff;border-color:var(--gold)}
.follow-btn:hover{opacity:.9;transform:translateY(-1px)}
.follow-right{flex-shrink:0}
.qr-wrap{width:92px;height:92px;border-radius:12px;overflow:hidden;
  display:block;background:#fff;border:1px solid var(--border);
  box-shadow:0 2px 8px rgba(0,0,0,.08);
  transition:transform .18s,box-shadow .18s}
.qr-wrap img{width:100%;height:100%;object-fit:cover;display:block}
.qr-wrap:hover{transform:scale(1.04);box-shadow:0 4px 14px rgba(44,120,115,.25)}

/* ── LESSONS ── */
.tc-zh-small{font-size:12px;color:var(--muted);font-weight:400;margin-left:4px}
.ls-toc-toggle{display:block;width:100%;padding:8px 12px;margin:0 0 2px;
  border:none;background:none;color:var(--gold);font-size:12.5px;font-weight:600;
  text-align:left;cursor:pointer;border-radius:8px;transition:background .15s}
.ls-toc-toggle:hover{background:rgba(44,120,115,.08)}
.ls-toc{max-height:0;overflow:hidden;transition:max-height .35s ease}
.ls-toc.open{max-height:2000px}
.ls-toc-inner{padding:8px 12px 18px;border-left:2px solid rgba(44,120,115,.2);margin-left:14px}
.toc-cat{font-size:11px;color:var(--gold);font-weight:700;letter-spacing:.05em;
  padding:10px 6px 6px;text-transform:uppercase;opacity:.85}
.toc-row{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 10px;border-radius:8px;cursor:pointer;
  transition:background .15s}
.toc-row:hover{background:var(--surf)}
.toc-name{font-size:13px;color:var(--text);flex:1;min-width:0;line-height:1.5}
.toc-zh{font-size:11.5px;color:var(--muted);font-weight:400}
.toc-page{font-size:11px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace;
  flex-shrink:0}

.ls-search-wrap{padding:0 16px 12px}
.ls-search{width:100%;padding:11px 14px;border-radius:12px;
  border:1px solid var(--border);background:var(--surf);color:var(--text);
  font-size:14px;-webkit-appearance:none;appearance:none;
  transition:border-color .18s,background .18s}
.ls-search:focus{outline:none;border-color:var(--gold);background:var(--card)}
.ls-search::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}
.ls-mark{width:32px;height:32px;flex-shrink:0;margin-right:6px;
  display:flex;align-items:center;justify-content:center;
  border:1.5px solid var(--border);border-radius:50%;background:var(--card);
  color:var(--muted);cursor:pointer;transition:all .18s}
.ls-mark:hover{border-color:var(--gold);color:var(--gold)}
[data-lesson].learned .ls-mark{background:var(--gold2);color:#fff;border-color:var(--gold2)}
[data-lesson].learned .ls-piece-name,
[data-lesson].learned .ls-theory-title{opacity:.55;text-decoration:line-through}
.ls-tabs{display:flex;gap:6px;padding:0 16px 16px}
.ls-tab{flex:1;padding:9px 0;font-size:12.5px;font-weight:600;cursor:pointer;
  border-radius:10px;color:var(--muted);text-align:center;
  background:var(--surf);border:1px solid var(--border);transition:all .15s}
.ls-tab.active{background:var(--green);color:#fff;border-color:var(--green)}
.ls-panel{display:none;padding:0 16px 24px}
.ls-panel.active{display:block}
.ls-piece{display:flex;align-items:center;padding:15px 0;
  border-bottom:1px solid var(--border);cursor:pointer;gap:12px;transition:opacity .1s}
.ls-piece:last-child{border-bottom:none}
.ls-piece:active{opacity:.6}
.ls-piece-info{flex:1;min-width:0}
.ls-piece-name{font-size:15px;font-weight:600;color:var(--text);line-height:1.3}
.ls-piece-sub{font-size:11.5px;color:var(--muted);margin-top:3px}
.ls-piece-arr{font-size:22px;color:var(--muted);flex-shrink:0;line-height:1}
.ls-theory-card{display:flex;align-items:center;padding:15px 0;
  border-bottom:1px solid var(--border);cursor:pointer;gap:12px;transition:opacity .1s}
.ls-theory-card:last-child{border-bottom:none}
.ls-theory-card:active{opacity:.6}
.ls-theory-icon{font-size:26px;flex-shrink:0;width:32px;text-align:center}
.ls-theory-title{font-size:14px;font-weight:600;color:var(--text)}
.ls-theory-sub{font-size:11.5px;color:var(--muted);margin-top:2px}
.ls-empty{text-align:center;padding:52px 20px;color:var(--muted);font-size:14px;line-height:1.8}
/* ── TRANS ── */
.note-roll{padding:0 16px}
.note-item{display:flex;align-items:center;gap:10px;
  padding:7px 12px;border-radius:10px;margin-bottom:4px;
  background:var(--card);border:1px solid var(--border)}
.ni-name{font-size:16px;font-weight:700;min-width:38px;flex-shrink:0}
.ni-bar{height:5px;border-radius:3px;min-width:4px;flex-shrink:0;opacity:.55}
.ni-dur{font-size:11px;color:var(--muted);white-space:nowrap;margin-left:auto;flex-shrink:0}

/* ── VIEWER ── */
.viewer{display:none;position:fixed;inset:0;background:#000;z-index:200;flex-direction:column}
.viewer.open{display:flex}
.viewer-bar{padding:10px 14px;display:flex;align-items:center;gap:10px;
  background:var(--surf);border-bottom:1px solid var(--border)}
.viewer-close{background:var(--card);border:1px solid var(--border);color:var(--text);
  border-radius:8px;padding:7px 14px;font-size:14px;cursor:pointer;flex-shrink:0}
.viewer-name{font-size:13px;font-weight:500;flex:1;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.viewer-body{flex:1;overflow:auto;-webkit-overflow-scrolling:touch;
  display:flex;align-items:flex-start;justify-content:center}
.viewer-body img{width:100%;height:auto;display:block}
.v-skel{position:absolute;inset:44px 0 0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:14px;color:var(--muted);z-index:1;
  background:var(--bg)}
.v-skel-spin{width:40px;height:40px;border-radius:50%;
  border:3px solid var(--border);border-top-color:var(--gold);
  animation:vskel 0.8s linear infinite}
.v-skel-txt{font-size:13px;color:var(--muted)}
@keyframes vskel{to{transform:rotate(360deg)}}
.viewer-body iframe{width:100%;height:100%;border:none}

/* ── TUNER (GuitarTuna-inspired 深色) ── */
/* 保留 meter 供 JS 用，隐藏 */
.meter{position:relative;height:36px;background:var(--surf);border-radius:8px;overflow:hidden}
.meter-bar{position:absolute;top:0;bottom:0;left:50%;width:0;transition:width .08s,left .08s,background .15s}
.meter-ctr{position:absolute;left:50%;top:0;bottom:0;width:2px;background:var(--border);transform:translateX(-50%)}
.meter-marks{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}
.meter-mark{position:absolute;top:0;bottom:0;width:1px;background:rgba(0,0,0,.07)}

.tuner-page{background:#0a0e12;color:#e4ebea;min-height:100vh;padding-top:0!important}
@media(max-width:767px){.tuner-page{padding-top:var(--topbar)!important}}
.tuner-page{background:
  radial-gradient(ellipse at 50% 30%, #1a2530 0%, #0a0e12 60%),
  repeating-linear-gradient(0deg, rgba(255,255,255,.015) 0 1px, transparent 1px 40px),
  repeating-linear-gradient(90deg, rgba(255,255,255,.015) 0 1px, transparent 1px 40px);
  background-color:#0a0e12}

.tn-topbar{display:flex;align-items:center;justify-content:space-between;
  padding:16px 20px 8px}
.tn-brand{font-size:22px;font-weight:800;color:#fff;letter-spacing:-.5px}
.tn-brand span{color:#62d5cc;font-weight:400;margin-left:4px}
.tn-auto{display:flex;align-items:center;gap:8px;font-size:12px;color:#8a9a98;font-weight:600;
  cursor:pointer;padding:4px 6px;border-radius:8px;transition:background .15s}
.tn-auto:hover{background:rgba(255,255,255,.05)}
.tn-auto:active{transform:scale(.95)}
.tn-switch{width:40px;height:22px;border-radius:11px;background:#333;position:relative;transition:background .2s;flex-shrink:0}
.tn-switch.on{background:#62d5cc}
.tn-sw-dot{width:18px;height:18px;border-radius:50%;background:#fff;
  position:absolute;top:2px;left:2px;transition:left .2s}
.tn-switch.on .tn-sw-dot{left:20px}

.tn-preset-row{padding:0 20px 12px}
.tn-preset{width:100%;background:transparent;color:#e4ebea;font-size:14px;font-weight:500;
  padding:8px 0;border:none;-webkit-appearance:none;appearance:none;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2362d5cc' stroke-width='1.5' fill='none'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 4px center;padding-right:20px}
.tn-preset option{background:#1a2530;color:#e4ebea}

.tn-meter-area{display:flex;align-items:center;justify-content:center;gap:22px;
  padding:12px 20px 8px}
.tn-flat,.tn-sharp{font-size:32px;color:#4a5560;font-weight:400;user-select:none}
.tn-indicator{position:relative;width:180px;height:90px;display:flex;align-items:center;justify-content:center}
.tn-indicator::before{content:'';position:absolute;bottom:0;left:10px;right:10px;height:3px;
  background:linear-gradient(90deg,rgba(192,80,74,.28),rgba(244,211,94,.24),rgba(98,213,204,.55),rgba(244,211,94,.24),rgba(192,80,74,.28));
  border-radius:2px}
.tn-indicator::after{content:'';position:absolute;bottom:-3px;left:50%;width:1px;height:9px;
  background:#62d5cc;transform:translateX(-50%);opacity:.4}
.tn-ind-circle{width:70px;height:70px;border-radius:50%;border:2px solid #4a5560;
  display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.03);
  transition:border-color .18s,background .18s,box-shadow .3s}
.tn-ind-note{font-size:24px;font-weight:700;color:#e4ebea;transition:color .18s;
  font-variant-numeric:tabular-nums;letter-spacing:-1px}
.tn-ind-pointer{position:absolute;bottom:-4px;left:50%;
  width:4px;height:11px;background:#62d5cc;border-radius:2px;opacity:0;
  box-shadow:0 0 8px rgba(98,213,204,.7);z-index:2;
  transition:opacity .18s, transform .1s ease-out, background .18s;
  transform:translateX(-50%)}
.tn-ind-circle.close{border-color:#f4d35e;background:rgba(244,211,94,.08)}
.tn-ind-circle.close .tn-ind-note{color:#f4d35e}
.tn-ind-circle.tuned{border-color:#62d5cc;background:rgba(98,213,204,.12);
  box-shadow:0 0 24px rgba(98,213,204,.4)}
.tn-ind-circle.tuned .tn-ind-note{color:#62d5cc}

.tn-bubble{margin:12px auto 6px;padding:10px 18px;
  background:rgba(255,255,255,.06);color:#c4cbca;font-size:13.5px;
  border-radius:20px;text-align:center;max-width:280px}

.tn-dombra{position:relative;padding:12px 0 8px;margin-top:2px;
  display:flex;justify-content:center;align-items:flex-start;min-height:280px}
.tn-dombra-img{width:110px;height:auto;
  filter:drop-shadow(0 12px 28px rgba(0,0,0,.55));user-select:none;pointer-events:none;
  display:block}
/* 手机稍小以节省空间 */
@media(max-width:767px){
  .tn-dombra{min-height:240px}
  .tn-dombra-img{width:90px}
}
/* 桌面版稍大 */
@media(min-width:768px){
  .tn-dombra{min-height:340px}
  .tn-dombra-img{width:130px}
}

.tn-string-btn{position:absolute;
  width:60px;height:60px;border-radius:50%;
  background:rgba(30,40,50,.9);color:#e4ebea;
  border:2px solid rgba(255,255,255,.18);cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  transition:transform .12s,background .18s,box-shadow .18s;
  user-select:none;padding:0;z-index:2}
/* 手机版：按钮放琴头两侧 */
.tn-string-btn.left{left:calc(50% - 100px);top:30px}
.tn-string-btn.right{left:calc(50% + 40px);top:60px}
@media(min-width:768px){
  .tn-string-btn{width:68px;height:68px}
  .tn-string-btn.left{left:calc(50% - 140px);top:50px}
  .tn-string-btn.right{left:calc(50% + 60px);top:120px}
}
.tn-string-btn.sel{background:#62d5cc;color:#0a0e12;border-color:#62d5cc;
  box-shadow:0 0 24px rgba(98,213,204,.55)}
.tn-string-btn:active{transform:scale(.9)}
.tn-str-note{font-size:19px;font-weight:800;line-height:1;letter-spacing:-.5px}
.tn-str-label{font-size:9.5px;opacity:.7;margin-top:2px;font-weight:600}

.tn-ref-row{padding:4px 20px 8px;display:flex;justify-content:center}
.tn-ref-btn{padding:10px 18px;border-radius:20px;
  background:rgba(98,213,204,.12);color:#62d5cc;border:1px solid rgba(98,213,204,.35);
  font-size:13px;font-weight:600;cursor:pointer;transition:all .18s}
.tn-ref-btn:hover{background:rgba(98,213,204,.22)}
.tn-ref-btn:active{transform:scale(.95)}

.tn-status-row{display:flex;align-items:center;justify-content:center;gap:20px;
  padding:4px 20px 8px}
.tn-freq{font-size:13px;color:#8a9a98;font-variant-numeric:tabular-nums}
.tn-cents{font-size:15px;font-weight:700;color:#8a9a98;font-variant-numeric:tabular-nums;
  transition:color .18s}
.tn-cents.close{color:#f4d35e}
.tn-cents.tuned{color:#62d5cc}

.tn-tips{padding:12px 20px calc(24px + env(safe-area-inset-bottom));
  display:flex;flex-direction:column;gap:6px}
.tn-tip{font-size:12px;color:#7a8a88;line-height:1.6;
  padding:8px 14px;background:rgba(255,255,255,.03);border-radius:10px;
  display:flex;align-items:center;gap:8px}
.tn-tip-icon{font-size:14px;flex-shrink:0}
/* 手机版收缩顶部间距 */
@media(max-width:767px){
  .tn-topbar{padding:10px 20px 4px}
  .tn-preset-row{padding:0 20px 6px}
  .tn-meter-area{padding:4px 20px}
  .tn-bubble{margin:8px auto 2px}
  .tn-status-row{padding:2px 20px 4px}
  .tn-tips{padding:8px 20px calc(16px + env(safe-area-inset-bottom));gap:4px}
  .tn-tip{padding:6px 12px;font-size:11.5px}
}

/* 保留旧动画名以兼容原 in-tune 类 */
.in-tune{color:#62d5cc!important;animation:glow .6s infinite alternate}
@keyframes glow{from{text-shadow:0 0 8px rgba(98,213,204,.3)}to{text-shadow:0 0 20px rgba(98,213,204,.6)}}

.btn-big{position:relative;overflow:hidden;
  background:rgba(44,120,115,.06);color:var(--gold);font-weight:700;font-size:16px;
  border:1px solid rgba(44,120,115,.3);border-radius:999px;padding:16px;
  width:calc(100% - 32px);margin:0 16px;cursor:pointer;display:block;
  transition:background .3s,border-color .3s,color .3s}
.btn-big::before,.btn-big::after{content:'';position:absolute;
  left:12.5%;right:12.5%;height:1px;
  background:linear-gradient(to right,transparent,var(--gold),transparent);
  opacity:0;transition:opacity .5s ease}
.btn-big::before{top:0}
.btn-big::after{bottom:-1px}
.btn-big:hover{background:rgba(44,120,115,.04);border-color:rgba(44,120,115,.45)}
.btn-big:hover::before{opacity:1}
.btn-big:hover::after{opacity:.3}
.btn-big:active{transform:scale(.98);opacity:.9}
.btn-big.stop{background:rgba(192,80,74,.08);color:var(--red);border-color:rgba(192,80,74,.32)}
.btn-big.stop::before,.btn-big.stop::after{background:linear-gradient(to right,transparent,var(--red),transparent)}

/* ── LESSONS BASICS (乐理入门 · Accordion 版) ── */
.lb-intro{margin:0 16px 16px;padding:18px 16px;border-radius:14px;
  background:linear-gradient(135deg,rgba(44,120,115,.12),rgba(58,158,151,.04));
  border:1px solid rgba(44,120,115,.28);text-align:center}
:root[data-theme="dark"] .lb-intro{
  background:linear-gradient(135deg,rgba(98,213,204,.13),rgba(78,200,195,.03));
  border-color:rgba(98,213,204,.28)}
.lb-intro-title{font-size:17px;font-weight:700;color:var(--text);margin-bottom:6px}
.lb-intro-sub{font-size:12.5px;color:var(--muted);margin-bottom:12px}
.lb-progress{display:flex;align-items:center;gap:10px}
.lb-progress-track{flex:1;height:6px;background:var(--surf);border-radius:3px;overflow:hidden}
.lb-progress-bar{height:100%;background:var(--gold);width:0;
  transition:width .5s ease;border-radius:3px}
.lb-progress-num{font-size:12px;color:var(--gold);font-weight:700;
  font-variant-numeric:tabular-nums;white-space:nowrap}

/* Accordion 卡片 */
.lb-card{margin:0 16px 10px;border-radius:12px;
  background:var(--card);border:1px solid var(--border);
  box-shadow:0 1px 4px rgba(0,0,0,.04);overflow:hidden}
.lb-head{width:100%;padding:14px 16px;background:none;border:none;cursor:pointer;
  display:flex;align-items:center;gap:12px;text-align:left;color:var(--text)}
.lb-head:hover{background:var(--surf)}
.lb-num{width:28px;height:28px;border-radius:50%;flex-shrink:0;
  background:var(--gold);color:#fff;font-size:13px;font-weight:800;
  display:flex;align-items:center;justify-content:center}
.lb-title{flex:1;font-size:15px;font-weight:600;color:var(--text)}
.lb-chev{color:var(--muted);font-size:14px;transition:transform .28s}
.lb-card.open .lb-chev{transform:rotate(180deg)}

.lb-content{max-height:0;overflow:hidden;opacity:0;
  transition:max-height .35s ease, opacity .28s;padding:0 16px}
.lb-card.open .lb-content{max-height:2000px;opacity:1;padding:0 16px 16px}

.lb-svg{background:var(--surf);border-radius:10px;padding:10px 12px;margin-bottom:12px;
  color:var(--text);text-align:center;overflow-x:auto}
.lb-svg svg{width:100%;max-width:320px;height:auto;display:block;margin:0 auto}
.lb-body{font-size:13.5px;line-height:1.75;color:var(--text);padding:0 2px 8px}
.lb-body p{margin-bottom:8px}
.lb-body p:last-child{margin-bottom:0}
.lb-body b{color:var(--gold)}
.lb-tip{margin-top:12px;padding:10px 12px;border-radius:10px;
  background:rgba(44,120,115,.08);border-left:3px solid var(--gold);
  font-size:12.5px;color:var(--text);line-height:1.65}
.lb-tip b{color:var(--gold)}

.lb-note-cell,.lb-meter-cell{background:var(--card);border:1px solid var(--border);
  border-radius:10px;padding:8px 6px;text-align:center}
.lb-note-sym{font-size:28px;color:var(--text);line-height:1;margin-bottom:4px;
  font-family:'DejaVu Sans','Apple Symbols',serif}
.lb-note-name{font-size:11px;color:var(--text);font-weight:600}
.lb-note-beat{font-size:10px;color:var(--muted);margin-top:2px}
.lb-meter-num{font-size:22px;font-weight:800;color:var(--gold);line-height:1.05;
  font-family:ui-serif,Georgia,serif}
.lb-meter-lbl{font-size:10.5px;color:var(--muted);margin-top:6px;line-height:1.4}

/* 交互按钮：听音 */
.lb-play-row,.lb-play-grid{margin:8px 0 12px}
.lb-play-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.lb-play-grid.c2{grid-template-columns:repeat(2,1fr)}
.lb-play-grid.c3{grid-template-columns:repeat(3,1fr)}
.lb-play{padding:10px 12px;border:1px solid rgba(44,120,115,.35);
  background:rgba(44,120,115,.06);color:var(--gold);
  border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;
  transition:all .15s;width:100%}
.lb-play:hover{background:var(--gold);color:#fff;border-color:var(--gold)}
.lb-play:active{transform:scale(.95)}
.lb-play.primary{background:var(--gold);color:#fff;border-color:var(--gold)}
.lb-play.primary:hover{opacity:.9}

/* 我学完了按钮 */
.lb-done{width:100%;padding:11px;margin-top:14px;
  border:1.5px solid var(--gold);background:var(--card);color:var(--gold);
  border-radius:10px;font-size:13.5px;font-weight:700;cursor:pointer;
  transition:all .18s}
.lb-done:hover{background:var(--gold);color:#fff}
.lb-done.done{background:rgba(78,200,195,.15);color:var(--gold2);border-color:var(--gold2);
  cursor:default}
.lb-done.done:hover{background:rgba(78,200,195,.15);color:var(--gold2)}

/* 小测验 */
.lb-quiz{margin:16px;padding:20px 16px;border-radius:14px;
  background:linear-gradient(135deg,rgba(244,211,94,.14),rgba(244,211,94,.03));
  border:1px solid rgba(244,211,94,.35)}
.lb-quiz-title{font-size:16px;font-weight:700;color:var(--text);margin-bottom:6px}
.lb-quiz-sub{font-size:12.5px;color:var(--muted);margin-bottom:14px}
.lb-quiz-play{width:100%;padding:14px;background:#f4d35e;color:#111;
  border:none;border-radius:12px;font-size:15px;font-weight:800;cursor:pointer;
  margin-bottom:14px;transition:all .18s}
.lb-quiz-play:hover{background:#ecc846}
.lb-quiz-play:active{transform:scale(.97)}
.lb-quiz-opts{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:14px}
.lb-quiz-opt{padding:12px 0;border:1.5px solid var(--border);background:var(--card);
  color:var(--text);border-radius:10px;font-size:14px;font-weight:700;
  cursor:pointer;transition:all .18s}
.lb-quiz-opt:hover{border-color:var(--gold);color:var(--gold)}
.lb-quiz-opt:active{transform:scale(.95)}
.lb-quiz-opt.right{background:#62d5cc;color:#0a0e12;border-color:#62d5cc}
.lb-quiz-opt.wrong{background:#c0504a;color:#fff;border-color:#c0504a}
.lb-quiz-score{text-align:center;font-size:13px;color:var(--muted);font-weight:600}
.lb-quiz-score span{color:var(--gold);font-size:16px;font-variant-numeric:tabular-nums}

.lb-finish{margin:20px 16px;padding:24px 16px;border-radius:14px;
  background:linear-gradient(135deg,rgba(98,213,204,.15),rgba(44,120,115,.05));
  border:1px solid rgba(98,213,204,.35);text-align:center}
.lb-finish-icon{font-size:36px;margin-bottom:8px}
.lb-finish-title{font-size:16px;font-weight:700;color:var(--text);margin-bottom:8px}
.lb-finish-sub{font-size:13px;color:var(--muted);line-height:1.6}

/* ── METRONOME ── */
.mn-box{background:var(--card);border:1px solid var(--border);border-radius:16px;
  margin:0 16px 14px;padding:22px 20px;text-align:center}
.mn-bpm-display{margin-bottom:16px}
.mn-bpm-num{font-size:76px;font-weight:700;color:var(--text);line-height:1;
  font-variant-numeric:tabular-nums;letter-spacing:-2px}
.mn-bpm-lbl{font-size:13px;color:var(--muted);margin-top:6px}
.mn-beats{display:flex;justify-content:center;gap:8px;margin:14px 0 18px;
  min-height:20px}
.mn-beat{width:14px;height:14px;border-radius:50%;
  background:var(--border);transition:transform .06s,background .06s}
.mn-beat.beat-1{background:var(--gold);transform:scale(1.35)}
.mn-beat.on{background:var(--gold2);transform:scale(1.3)}
.mn-beat.on.beat-1{background:var(--gold);transform:scale(1.6)}
.mn-slider{width:100%;height:6px;-webkit-appearance:none;appearance:none;
  background:var(--surf);border-radius:3px;outline:none;margin-bottom:16px}
.mn-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;
  width:22px;height:22px;border-radius:50%;background:var(--gold);cursor:pointer;
  box-shadow:0 2px 6px rgba(0,0,0,.2)}
.mn-slider::-moz-range-thumb{width:22px;height:22px;border-radius:50%;
  background:var(--gold);cursor:pointer;border:none}
.mn-btns{display:flex;gap:6px}
.mn-btn{flex:1;padding:10px;border-radius:10px;font-size:14px;font-weight:600;
  cursor:pointer;border:1px solid var(--border);background:var(--surf);color:var(--text);
  transition:all .15s}
.mn-btn:hover{background:var(--gold);color:#fff;border-color:var(--gold)}
.mn-btn:active{transform:scale(.95)}
.mn-meter{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px}
.mn-mt{padding:12px 0;border-radius:10px;font-size:14px;font-weight:600;
  cursor:pointer;border:1px solid var(--border);background:var(--surf);color:var(--muted);
  transition:all .15s}
.mn-mt.active{background:var(--gold);color:#fff;border-color:var(--gold)}
.mn-mt:hover:not(.active){color:var(--text)}

/* ── TRANSCRIBE (扒谱 v2) ── */
.tr-input-tabs{display:flex;gap:6px;padding:0 16px 12px}
.tr-in-tab{flex:1;padding:11px 0;border-radius:10px;font-size:13px;font-weight:600;
  border:1px solid var(--border);background:var(--surf);color:var(--muted);
  cursor:pointer;transition:all .15s}
.tr-in-tab.active{background:var(--gold);color:#fff;border-color:var(--gold)}
.tr-panel{display:none}
.tr-panel.active{display:block}

.tr-mic-box{margin:0 16px 14px;padding:24px 20px;border-radius:14px;
  background:var(--card);border:1px solid var(--border);text-align:center}
.tr-mic-visualizer{background:var(--surf);border-radius:10px;overflow:hidden;
  margin-bottom:14px;height:80px}
.tr-mic-visualizer canvas{width:100%;height:100%;display:block}
.tr-mic-time{font-size:32px;font-weight:800;font-variant-numeric:tabular-nums;
  color:var(--text);margin-bottom:14px;letter-spacing:-1px}
.tr-mic-btn{padding:14px 24px;border-radius:32px;background:var(--gold);color:#fff;
  border:none;font-size:15px;font-weight:700;cursor:pointer;transition:all .18s;
  display:inline-flex;align-items:center;gap:8px}
.tr-mic-btn:hover{opacity:.9}
.tr-mic-btn:active{transform:scale(.97)}
.tr-mic-btn.recording{background:#c0504a}
.tr-mic-btn.recording .tr-mic-icon{animation:trpulse 1s infinite;color:#fff}
@keyframes trpulse{50%{opacity:.3}}
.tr-mic-icon{font-size:12px}
.tr-mic-hint{font-size:12px;color:var(--muted);margin-top:12px;line-height:1.5}

.tr-result-toolbar{display:flex;align-items:center;justify-content:space-between;
  padding:0 16px 12px;gap:10px}
.tr-play-btn{padding:10px 18px;border-radius:24px;
  background:var(--gold);color:#fff;border:none;
  font-size:13.5px;font-weight:700;cursor:pointer;transition:all .18s}
.tr-play-btn:hover{opacity:.9}
.tr-play-btn:active{transform:scale(.95)}
.tr-play-btn.playing{background:#c0504a}

.tr-view-tabs{display:flex;gap:6px;padding:0 16px 12px}
.tr-view-tab{flex:1;padding:9px 0;border-radius:8px;font-size:12.5px;font-weight:600;
  border:1px solid var(--border);background:var(--surf);color:var(--muted);cursor:pointer}
.tr-view-tab.active{background:var(--card);color:var(--gold);border-color:var(--gold)}
.tr-view{display:none;padding:0 16px 16px}
.tr-view.active{display:block}

.tr-roll-wrap{background:var(--card);border:1px solid var(--border);border-radius:10px;
  padding:8px;overflow-x:auto}
.tr-roll-wrap canvas{width:100%;min-width:600px;display:block;background:var(--surf);border-radius:6px;cursor:pointer}
.tr-roll-hint{font-size:11.5px;color:var(--muted);text-align:center;margin-top:8px;line-height:1.5}

/* 音符编辑面板 */
.tr-edit-panel{margin-top:10px;padding:12px 14px;background:var(--card);
  border:1px solid var(--gold);border-radius:10px;display:flex;flex-direction:column;gap:8px;
  box-shadow:0 2px 8px rgba(0,0,0,.06)}
.tr-edit-header{display:flex;justify-content:space-between;align-items:center;
  font-size:13px;font-weight:700;color:var(--text)}
.tr-edit-close{background:transparent;border:none;color:var(--muted);cursor:pointer;
  font-size:16px;padding:2px 8px;border-radius:6px;line-height:1}
.tr-edit-close:hover{background:var(--surf);color:var(--text)}
.tr-edit-row{display:flex;align-items:center;gap:8px}
.tr-edit-lbl{font-size:12px;color:var(--muted);width:36px;flex-shrink:0}
.tr-edit-btn{width:36px;height:36px;border-radius:8px;border:1px solid var(--border);
  background:var(--surf);color:var(--text);font-size:14px;font-weight:700;cursor:pointer;
  display:flex;align-items:center;justify-content:center;transition:all .15s;
  font-variant-numeric:tabular-nums}
.tr-edit-btn:hover{background:var(--gold);color:#fff;border-color:var(--gold)}
.tr-edit-btn:active{transform:scale(.94)}
.tr-edit-val{flex:1;text-align:center;font-size:14px;font-weight:700;font-variant-numeric:tabular-nums;
  color:var(--gold);padding:8px 10px;background:var(--surf);border-radius:8px;min-width:80px}
.tr-edit-del{width:100%;padding:9px;border-radius:8px;background:transparent;
  color:#c0504a;border:1px solid rgba(192,80,74,.4);font-size:13px;font-weight:600;cursor:pointer;
  transition:all .15s;margin-top:2px}
.tr-edit-del:hover{background:#c0504a;color:#fff;border-color:#c0504a}

/* 保留 .cs 老类 (兼容) */
/* ── TRANSCRIBE (old) ── */
.cs{text-align:center;padding:48px 24px;color:var(--muted)}
.cs-icon{font-size:52px;margin-bottom:18px}
.cs h3{font-size:19px;color:var(--text);margin-bottom:10px}
.cs p{font-size:14px;line-height:1.7}
.cs-tag{display:inline-block;background:var(--card);border:1px solid var(--border);
  border-radius:20px;padding:5px 14px;font-size:12px;color:var(--blue);margin-top:16px}
