:root{
  --bg:#0f1115;
  --bg-soft:#151922;
  --panel:#1a1f29;
  --panel-2:#222836;
  --line:#2a3140;
  --text:#e9e7e2;
  --muted:#8d96a6;
  --accent:#5eead4;
  --accent-ink:#062a26;
  --warn:#f0b35b;
  --danger:#ef6f6f;
  --radius:14px;
  --nav-h:56px;
  --safe-b:env(safe-area-inset-bottom,0px);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Noto Sans CJK SC","Microsoft YaHei",sans-serif;
  font-size:15px;line-height:1.55;overscroll-behavior-y:contain;
}
button,input{font:inherit;color:inherit}
button{cursor:pointer;background:none;border:0}
[hidden]{display:none!important}

#topbar{
  position:sticky;top:0;z-index:20;display:flex;align-items:center;justify-content:space-between;
  height:calc(50px + env(safe-area-inset-top,0px));padding:env(safe-area-inset-top,0px) 16px 0;
  background:rgba(15,17,21,.86);backdrop-filter:blur(12px);border-bottom:1px solid rgba(255,255,255,.04);
}
#topTitle{font-size:16px;font-weight:600;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.icon-btn{width:36px;height:36px;border-radius:10px;color:var(--muted);font-size:18px}
.icon-btn:active{background:var(--panel)}

main{
  padding:14px 16px calc(var(--nav-h) + var(--safe-b) + 28px);
  max-width:760px;margin:0 auto;
}
.view{animation:fade .18s ease}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* 书架 */
.drop{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  padding:26px 16px;margin-bottom:18px;border:1.5px dashed var(--line);border-radius:var(--radius);
  background:linear-gradient(180deg,rgba(94,234,212,.045),rgba(94,234,212,0));
  color:var(--muted);cursor:pointer;
}
.drop:active{border-color:var(--accent);background:rgba(94,234,212,.08)}
.drop input{display:none}
.drop-icon{font-size:26px;line-height:1;color:var(--accent)}
.drop-title{font-size:16px;font-weight:600;color:var(--text)}
.drop-sub{font-size:12px;color:var(--muted)}
.section-title{font-size:12px;letter-spacing:.12em;color:var(--muted);margin:4px 2px 8px;text-transform:uppercase}
.empty{padding:30px 8px;text-align:center;color:var(--muted);font-size:13px}

.list{display:flex;flex-direction:column;gap:10px}
.book-item{
  display:flex;align-items:center;gap:12px;padding:14px;background:var(--panel);
  border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;
}
.book-item:active{background:var(--panel-2)}
.book-cover{
  width:44px;height:58px;flex:0 0 44px;border-radius:6px;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(145deg,#24303c,#161c25);border:1px solid #33414f;color:var(--accent);
  font-size:18px;font-family:Georgia,serif;
}
.book-info{flex:1;min-width:0}
.book-name{font-size:15px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.book-desc{font-size:12px;color:var(--muted);margin-top:2px}
.book-progress{height:3px;border-radius:2px;background:#2a3140;margin-top:8px;overflow:hidden}
.book-progress i{display:block;height:100%;background:var(--accent);border-radius:2px}
.book-del{padding:8px;color:var(--muted);font-size:15px}

/* 本书 */
.book-meta{padding:2px 2px 14px;border-bottom:1px solid var(--line);margin-bottom:12px}
.book-meta h1{font-size:19px;margin:0 0 4px;line-height:1.35;font-weight:650}
.book-meta p{margin:0;font-size:12px;color:var(--muted)}
.seg-tabs{display:flex;gap:6px;background:var(--bg-soft);padding:4px;border-radius:11px;margin-bottom:14px}
.seg-tab{flex:1;padding:8px;border-radius:8px;color:var(--muted);font-size:13px}
.seg-tab.active{background:var(--panel-2);color:var(--text);box-shadow:0 1px 0 rgba(255,255,255,.03)}

.chapter-item{display:flex;align-items:center;gap:10px;padding:13px 4px;border-bottom:1px solid rgba(255,255,255,.05);cursor:pointer}
.chapter-item:active{background:rgba(255,255,255,.03)}
.chapter-no{width:34px;flex:0 0 34px;color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
.chapter-name{flex:1;min-width:0;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chapter-len{font-size:11px;color:var(--muted)}
.chapter-item.playing .chapter-name{color:var(--accent)}

.cast-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-bottom:10px;font-size:12px;color:var(--muted)}
.cast-actions{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}
.cast-row{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:10px}
.cast-summary{display:flex;align-items:center;gap:8px;cursor:pointer;user-select:none;-webkit-user-select:none}
.cast-summary .cast-title{font-size:15px;font-weight:600;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cast-summary .cast-count{margin-left:auto}
.cast-summary .gchip{display:inline-grid;place-items:center}
.cast-voice-chip{font-size:11px;color:var(--muted);background:var(--bg-soft);border:1px solid var(--line);border-radius:999px;padding:3px 8px;white-space:nowrap}
.cast-caret{flex:0 0 16px;width:16px;text-align:center;font-size:16px;line-height:1;color:var(--muted);transition:transform .18s ease}
.cast-row.open .cast-caret{transform:rotate(90deg)}
.cast-edit{display:none;margin-top:10px}
.cast-row.open .cast-edit{display:block}
.cast-summary:active{opacity:.8}
.cast-top{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.cast-name{flex:1;background:var(--bg-soft);border:1px solid var(--line);border-radius:8px;padding:7px 10px;font-size:14px;font-weight:600;min-width:0}
.gchip{width:26px;height:26px;flex:0 0 26px;border-radius:50%;border:1px solid var(--line);background:var(--bg-soft);color:var(--muted);font-size:11px;line-height:1}
.gchip.g-F{color:#f9a8d4;border-color:#7d3b5c}
.gchip.g-M{color:#93c5fd;border-color:#33507a}
.cast-count{font-size:11px;color:var(--muted);white-space:nowrap}
.cast-grid{display:grid;grid-template-columns:104px 1fr auto;gap:8px;align-items:center}
.cast-grid select,.cast-grid input{background:var(--bg-soft);border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:13px;min-width:0;width:100%}
.cast-grid input{color:var(--muted)}
.cast-grid input:focus,.cast-grid select:focus,.cast-name:focus{outline:none;border-color:var(--accent);color:var(--text)}
.mini-btn{padding:7px 9px;border-radius:8px;border:1px solid var(--line);color:var(--muted);font-size:12px;white-space:nowrap}
.mini-btn:active{border-color:var(--accent);color:var(--accent)}
.clone-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}
.clone-toggle{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);cursor:pointer}
.clone-toggle input{accent-color:var(--accent)}
.clone-toggle input:disabled{cursor:not-allowed}
.clone-info{flex:1;min-width:0;font-size:11px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.clone-del{color:#f0b0b0;border-color:#5a3333}
.cast-note{margin:10px 2px 0;font-size:12px;color:var(--muted);line-height:1.6}
.cast-design{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}
.cast-vdesc{display:block;width:100%;background:var(--bg-soft);border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:13px}
.cast-vdesc:focus{outline:none;border-color:var(--accent)}
.cast-tags{display:block;width:100%;margin-top:8px;background:var(--bg-soft);border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:12px;color:var(--muted)}
.cast-tags:focus{outline:none;border-color:var(--accent);color:var(--text)}
.cast-desc{display:block;width:100%;margin-top:8px;background:var(--bg-soft);border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:12px;color:var(--text)}
.cast-desc:focus{outline:none;border-color:var(--accent)}
.stage-desc{margin-top:0;margin-bottom:6px}
.stage-tags{margin-top:0}
.cast-design .row{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.cast-stages{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}
.stage-caption{font-size:11px;color:var(--accent);opacity:.85;margin-bottom:8px}
.stage-row{padding:8px 0;border-bottom:1px solid rgba(255,255,255,.04)}
.stage-row:last-child{border-bottom:none;padding-bottom:0}
.stage-meta{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted);margin-bottom:6px}
.stage-range{font-variant-numeric:tabular-nums}
.stage-row .row{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.stage-desc{font-size:12px;padding:7px 9px}
.ai-stages{margin-top:4px;display:flex;flex-direction:column;gap:3px}
.ai-stage{display:flex;gap:6px;align-items:flex-start;font-size:12px;color:#aab2bf;line-height:1.55}
.ai-stage-range{flex:0 0 auto;font-size:11px;color:var(--accent);opacity:.85;font-variant-numeric:tabular-nums;padding-top:1px}
.ai-stage-desc{flex:1;min-width:0}
.ai-stage-tags{font-size:11px;color:#aab2bf;margin:2px 0 5px;line-height:1.6}
.ai-tag{white-space:nowrap;margin-right:4px}
.ai-tag[title]:not([title=""]){text-decoration:underline dotted rgba(170,178,191,.5);text-underline-offset:3px}
.ai-line-text{font-size:12px;color:#c9ced8;line-height:1.55;margin-top:4px}
.script-tags{margin-top:6px}
.ai-desc{font-size:12px;color:var(--accent);opacity:.85;margin-top:4px;line-height:1.55}

/* 播放 */
.ai-nudge{display:flex;align-items:center;gap:8px;padding:9px 10px;margin-bottom:12px;border-radius:10px;background:rgba(94,234,212,.07);border:1px solid rgba(94,234,212,.3)}
.ai-nudge span{flex:1;min-width:0;font-size:12px;line-height:1.5;color:#aab2bf}
.ai-nudge .mini-btn{flex:0 0 auto;color:var(--accent);border-color:rgba(94,234,212,.45)}
.ai-nudge .icon-btn{width:30px;height:30px;flex:0 0 30px;font-size:13px}
.now-chapter{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted);margin:0 2px 12px}
#nowChapterTitle{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.seg-list{display:flex;flex-direction:column;gap:8px;touch-action:pan-y}
.seg-item{padding:11px 12px;border-radius:10px;background:var(--panel);border:1px solid transparent;cursor:pointer}
.seg-item:active{background:var(--panel-2)}
.seg-item.current{border-color:rgba(94,234,212,.55);background:rgba(94,234,212,.07)}
.seg-meta{display:flex;align-items:center;gap:6px;margin-bottom:4px}
.chip{font-size:10px;padding:1px 7px;border-radius:20px;background:#2a3140;color:#aab3c2;white-space:nowrap}
.chip.narrator{background:#2b2f26;color:#c9d3a8}
.chip.unknown{background:#3a2b2b;color:#f0b0b0;cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}
.chip.gender{background:#26313a;color:#9fc4da}
.chip.playing{background:var(--accent);color:var(--accent-ink)}
.seg-text{font-size:13.5px;line-height:1.65;color:#c9ced8;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.seg-item.current .seg-text{color:var(--text)}
.seg-tags{font-size:11px;color:var(--accent);opacity:.8;margin-top:4px;line-height:1.5}
.seg-idx{margin-left:auto;font-size:10px;color:#5d6675}

/* 设置 */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:15px;margin-bottom:12px}
.card-title{font-size:13px;font-weight:600;margin-bottom:12px;letter-spacing:.02em}
.card.collapsible .collapsible-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:0;cursor:pointer;user-select:none;-webkit-user-select:none}
.card.collapsible .collapse-caret{color:var(--muted);font-size:14px;line-height:1;transition:transform .16s}
.card.collapsible.open .collapsible-head{margin-bottom:12px}
.card.collapsible.open .collapse-caret{transform:rotate(90deg)}
.card.collapsible .collapsible-body{display:none}
.card.collapsible.open .collapsible-body{display:block}
.card.collapsible .collapsible-head:focus-visible{outline:2px solid rgba(94,234,212,.45);outline-offset:4px;border-radius:4px}

/* 角色主页 */
.char-hero{display:flex;align-items:center;gap:12px;margin-bottom:12px}
.char-avatar{width:64px;height:64px;flex:0 0 64px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:24px;font-weight:600;background-size:cover;background-position:center;overflow:hidden}
.char-hero-name{font-size:16px;font-weight:600}
.char-hero-sub{font-size:12px;color:var(--muted);margin-top:3px}
.char-avatar-row{display:flex;gap:8px;margin:-4px 0 12px}
.char-novel{background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:10px;padding:10px 12px;font-size:12px;line-height:1.7;color:var(--muted);margin-bottom:12px}
.char-novel-title{font-weight:600;color:#c8ced8;margin-bottom:4px}
.char-novel-note{margin-top:4px;font-size:11px;opacity:.8}
.char-voice-row{display:flex;gap:8px;align-items:center}
.char-voice-row select{flex:1;min-width:0}
.char-voice{border:1px solid var(--line);border-radius:10px;margin:4px 0 12px;background:rgba(255,255,255,.02)}
.char-voice-head{display:flex;align-items:center;gap:8px;padding:11px 12px;cursor:pointer;user-select:none;-webkit-user-select:none}
.char-voice-head>span:first-child{font-size:12px;color:var(--muted)}
.char-voice-current{margin-left:auto;font-size:12px;color:var(--text);opacity:.85;max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.char-voice .collapse-caret{color:var(--muted);font-size:14px;line-height:1;transition:transform .16s}
.char-voice.open .collapse-caret{transform:rotate(90deg)}
.char-voice-body{display:none;padding:0 12px 12px}
.char-voice.open .char-voice-body{display:block}
.char-voice-head:focus-visible{outline:2px solid rgba(94,234,212,.45);outline-offset:-2px;border-radius:10px}

/* 角色个人资料页（微信式） */
.char-page{position:fixed;inset:0;z-index:70;display:flex;flex-direction:column;background:#111214;color:#e8e8ea;overflow:hidden}
.char-page[hidden]{display:none}
.char-page-nav{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;padding:calc(env(safe-area-inset-top,0px) + 2px) 10px 2px;background:#111214}
.char-nav-btn{width:40px;height:40px;border-radius:10px;display:grid;place-items:center;color:#e8e8ea;font-size:30px;font-weight:300;line-height:1}
.char-nav-btn:active{background:rgba(255,255,255,.08)}
.char-nav-more{font-size:22px;letter-spacing:0;padding-bottom:2px}
.char-page-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:6px 0 calc(28px + env(safe-area-inset-bottom,0px))}
.wcp-hero{display:flex;align-items:center;gap:14px;padding:8px 22px 28px}
.wcp-avatar{width:66px;height:66px;flex:0 0 66px;border-radius:8px;display:grid;place-items:center;background:#3a3f4a;color:#fff;font-size:26px;font-weight:600;background-size:cover;background-position:center;overflow:hidden}
.wcp-hero-main{flex:1;min-width:0}
.wcp-name{font-size:21px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wcp-id{font-size:13px;color:#8a8a8e;margin-top:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wcp-card{background:#1c1c1e}
.wcp-card+.wcp-card{margin-top:8px}
.wcp-row{display:flex;align-items:center;gap:12px;width:100%;min-height:56px;padding:12px 18px;text-align:left;color:#e8e8ea}
.wcp-row+.wcp-row{border-top:1px solid #2a2a2c}
.wcp-row:active{background:#242426}
.wcp-row-main{flex:1;min-width:0}
.wcp-row-title{font-size:16px;line-height:1.4}
.wcp-row-sub{font-size:12px;color:#8a8a8e;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wcp-chevron{color:#5c5c60;font-size:18px;line-height:1;flex:0 0 auto}
.wcp-action{justify-content:center;font-size:16px;gap:8px}
.wcp-action svg{width:20px;height:20px;flex:0 0 20px;color:#e8e8ea}
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;font-size:12px;color:var(--muted)}
.field input{background:var(--bg-soft);border:1px solid var(--line);border-radius:9px;padding:10px 12px;font-size:14px;color:var(--text)}
.field input:focus{outline:none;border-color:var(--accent)}
.row{display:flex;gap:8px}
.btn{flex:1;padding:10px 14px;border-radius:9px;background:var(--panel-2);border:1px solid var(--line);color:var(--text);font-size:13px}
.btn:active{opacity:.8}
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);font-weight:600}
.btn.danger{color:var(--danger);border-color:rgba(239,111,111,.35);background:rgba(239,111,111,.06)}
.hint{font-size:12px;color:var(--muted);margin:10px 0 0;line-height:1.6}
.adv{margin:0 0 12px;padding-top:2px}
.adv summary{font-size:12px;color:var(--muted);cursor:pointer;margin-bottom:10px}
.adv summary:focus{outline:none;color:var(--accent)}
.switch-row{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:9px 0;font-size:14px}
.switch-row input{appearance:none;width:42px;height:24px;border-radius:20px;background:#2c3442;position:relative;flex:0 0 42px;transition:.16s;margin:0}
.switch-row input::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#8b93a1;transition:.16s}
.switch-row input:checked{background:rgba(94,234,212,.28)}
.switch-row input:checked::after{transform:translateX(18px);background:var(--accent)}

/* 悬浮播放球：半个长椭圆贴边 */
.player-ball{
  position:fixed;right:0;top:58%;z-index:34;
  width:32px;height:36px;border-radius:16px 0 0 16px / 18px 0 0 18px;padding:0;display:grid;place-items:center;
  background:rgba(38,38,38,.94);box-shadow:-2px 3px 12px rgba(0,0,0,.3);
  touch-action:none;user-select:none;-webkit-user-select:none;
  transition:top .16s ease;
}
.player-ball[data-side="left"]{right:auto;left:0;border-radius:0 16px 16px 0 / 0 18px 18px 0;box-shadow:2px 3px 12px rgba(0,0,0,.3)}
.player-ball.dragging{transition:none}
.player-ball:active{transform:scale(.96)}
.pb-ring{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}
.player-ball[data-side="left"] .pb-ring{transform:scaleX(-1)}
.pb-ring path{fill:none;stroke-width:2.4;stroke-linecap:round}
.pb-track{stroke:rgba(61,220,132,.18)}
.pb-fill{stroke:#3ddc84;stroke-dasharray:47.2;stroke-dashoffset:47.2;transition:stroke-dashoffset .3s}
.pb-note{position:relative;z-index:1;display:grid;place-items:center;color:#3ddc84;transform:translateX(-1px)}
.player-ball[data-side="left"] .pb-note{transform:translateX(1px)}
.pb-note svg{width:18px;height:18px;display:block}
.player-ball.playing .pb-note svg{animation:notebob 1.4s ease-in-out infinite}
@keyframes notebob{0%,100%{transform:translateY(0)}50%{transform:translateY(-1.5px)}}
.player-ball.loading .pb-note{opacity:.25}
.player-ball.loading::after{content:'';position:absolute;width:14px;height:14px;border:2px solid rgba(61,220,132,.25);border-top-color:#3ddc84;border-radius:50%;animation:sp .7s linear infinite}

/* 微信听全文式展开条 */
.player-panel{
  position:fixed;z-index:35;display:flex;align-items:center;gap:8px;
  width:min(330px,70vw);padding:8px 8px 8px 12px;border-radius:14px;
  background:rgba(44,44,44,.97);color:#eee;border:1px solid rgba(255,255,255,.08);
  box-shadow:0 10px 30px rgba(0,0,0,.45);backdrop-filter:blur(12px);
}
.pp-note{flex:0 0 22px;display:grid;place-items:center;color:#3ddc84}
.pp-note svg{width:22px;height:22px;display:block}
.pp-title{flex:1;min-width:0;font-size:13px;color:#eaeaea;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pp-btn{flex:0 0 30px;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;color:#e8e8e8}
.pp-btn svg{width:19px;height:19px}
.pp-btn:active{background:rgba(255,255,255,.12)}
.pp-play{color:#fff}
.pp-play svg{width:20px;height:20px}
.pp-close{font-size:14px;color:#a8a8a8}

/* 底部导航 */
#tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:31;display:flex;height:calc(var(--nav-h) + var(--safe-b));
  padding-bottom:var(--safe-b);background:rgba(15,17,21,.97);backdrop-filter:blur(14px);
  border-top:1px solid rgba(255,255,255,.06);
}
#tabbar .tab{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;font-size:10px;color:#6f7888}
#tabbar .tab span{font-size:17px;line-height:1}
#tabbar .tab.active{color:var(--accent)}

/* toast */
.toast{
  position:fixed;left:50%;bottom:calc(var(--nav-h) + var(--safe-b) + 18px);transform:translateX(-50%);
  z-index:100;max-width:86vw;padding:10px 16px;border-radius:10px;background:rgba(40,46,58,.98);
  border:1px solid rgba(255,255,255,.09);font-size:13px;text-align:center;
  box-shadow:0 8px 30px rgba(0,0,0,.4);animation:toast .2s ease;
}
@keyframes toast{from{opacity:0;transform:translate(-50%,6px)}to{opacity:1;transform:translate(-50%,0)}}

.spin{display:inline-block;width:12px;height:12px;border:2px solid rgba(94,234,212,.25);border-top-color:var(--accent);border-radius:50%;animation:sp .7s linear infinite;vertical-align:-2px}
@keyframes sp{to{transform:rotate(360deg)}}

/* AI 角色解析 */
.overlay{position:fixed;inset:0;z-index:80;background:rgba(0,0,0,.62);display:flex;align-items:flex-end;justify-content:center;padding:16px 12px calc(16px + var(--safe-b))}
.overlay[hidden]{display:none}
.modal{width:100%;max-width:560px;max-height:82vh;display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:16px;box-shadow:0 20px 60px rgba(0,0,0,.55)}
.modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 16px;border-bottom:1px solid var(--line);font-size:14px;font-weight:600}
.modal-body{padding:12px 16px;overflow:auto;flex:1;min-height:60px}
.modal-foot{display:flex;gap:8px;padding:12px 16px;border-top:1px solid var(--line)}
.modal-foot .btn{flex:1}
.ai-sum{font-size:12px;color:var(--muted);line-height:1.6;margin-bottom:10px}
.ai-row{display:flex;gap:9px;align-items:flex-start;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.05)}
.ai-row:last-child{border-bottom:none}
.ai-row input[type=checkbox]{margin-top:4px;accent-color:var(--accent);flex:0 0 auto}
.ai-main{flex:1;min-width:0}
.fix-speaker{width:100%;margin-top:6px}
.ai-name{font-size:14px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.ai-alias{font-size:11px;color:var(--muted)}
.ai-meta{font-size:12px;color:#aab2bf;margin-top:3px;line-height:1.55}
.ai-badge{font-size:10px;padding:1px 6px;border-radius:20px;border:1px solid var(--line);color:var(--muted)}
.ai-badge.new{color:var(--accent);border-color:rgba(94,234,212,.4)}
.ai-progress{height:6px;border-radius:6px;background:var(--bg-soft);overflow:hidden;margin:12px 0 8px}
.ai-progress i{display:block;height:100%;width:0;background:var(--accent);transition:width .25s}
.ai-err{font-size:11px;color:var(--danger);margin-top:8px;line-height:1.5}

/* 群聊 */
#topbarActions{display:flex;align-items:center;gap:2px;flex:0 0 auto}
#btnChatNew{display:none}
.chat-new-menu{position:fixed;top:calc(env(safe-area-inset-top,0px) + 48px);right:10px;z-index:60;width:136px;padding:4px;border-radius:8px;background:rgba(76,76,76,.98);box-shadow:0 8px 24px rgba(0,0,0,.28);animation:menupop .12s ease}
.chat-new-menu button{display:flex;width:100%;align-items:center;padding:10px 12px;border-radius:6px;color:#fff;font-size:14px;text-align:left;white-space:nowrap}
.chat-new-menu button:active{background:rgba(255,255,255,.12)}

.chat-list{display:flex;flex-direction:column}
.cgl-row{display:flex;align-items:center;gap:12px;padding:11px 16px;background:#fff;cursor:pointer;position:relative}
.cgl-row:active{background:#f2f2f2}
.cgl-row+.cgl-row::before{content:'';position:absolute;left:76px;right:0;top:0;height:1px;background:#ececec;transform:scaleY(.6);transform-origin:top}
.cgl-avatar{width:48px;height:48px;flex:0 0 48px;border-radius:6px;overflow:hidden;background:#dcdcdc}
.cgl-avatar.single{display:block}
.cgl-avatar.single .cgl-av{width:100%;height:100%}
.cgl-avatar:not(.single){display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:1px}
.cgl-avatar.n2{grid-template-rows:1fr}
.cgl-avatar.n3 .cgl-av:first-child{grid-row:1/3}
.cgl-av{display:grid;place-items:center;min-width:0;min-height:0;font-size:15px;font-weight:600;color:#fff;background-color:#9a9a9a;background-size:cover;background-position:center}
.cgl-av.has-img{color:transparent}
.chat-bg-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.chat-bg-preview{width:76px;height:50px;flex:0 0 76px;border-radius:8px;border:1px solid var(--line);background:#10141b center/cover no-repeat}
@keyframes nudge-shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-5px)}40%{transform:translateX(4px)}60%{transform:translateX(-3px)}80%{transform:translateX(2px)}}
body.chat-mode .cmsg.nudged .cbubble{animation:nudge-shake .45s ease}
.cgl-slot{display:block;background:#e4e4e4}
.cgl-info{flex:1;min-width:0;padding:2px 0}
.cgl-top{display:flex;align-items:center;gap:8px}
.cgl-name{flex:1;min-width:0;font-size:16px;color:#111;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cgl-time{flex:0 0 auto;font-size:12px;color:#b2b2b2}
.cgl-desc{font-size:13px;color:#999;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.chat-head{display:flex;align-items:center;gap:6px;margin:0 -6px 10px;padding-bottom:8px;border-bottom:1px solid var(--line)}
.chat-head-main{flex:1;min-width:0}
.chat-title{font-size:15px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chat-sub{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.chat-msgs{display:flex;flex-direction:column;gap:10px;padding-bottom:150px}
.cmsg{display:flex;gap:8px;align-items:flex-start}
.cmsg.me{flex-direction:row-reverse}
.cavatar{width:32px;height:32px;flex:0 0 32px;border-radius:10px;display:grid;place-items:center;font-size:12px;background:var(--panel-2);border:1px solid var(--line);color:#cfd6e2;overflow:hidden}
.cmsg-body{max-width:78%;min-width:0}
.cmsg-name{font-size:11px;line-height:1.3;color:var(--muted);margin:0 2px 2px}
.cmsg.me .cmsg-name{text-align:right}
.cbubble{position:relative;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:9px 12px;font-size:14px;line-height:1.5;color:#dde2ea;white-space:pre-wrap;word-break:break-word}
.cmsg.me .cbubble{background:rgba(94,234,212,.14);border-color:rgba(94,234,212,.35);color:#eafaf7}
.cmsg.sys{justify-content:center}
.cmsg.sys .cbubble{background:transparent;border:none;color:var(--muted);font-size:11px;padding:2px 8px}
.csticker{font-size:64px;line-height:1;padding:2px 4px}
.csticker img{width:120px;max-width:48vw;border-radius:10px;display:block}
.cvoice{display:flex;align-items:center;justify-content:space-between;gap:8px;cursor:pointer;min-width:86px;height:26px;user-select:none}
.cmsg.me .cvoice{flex-direction:row-reverse}
.cvoice svg{width:22px;height:22px;flex:0 0 22px;overflow:visible}
.cmsg.me .cvoice svg{transform:scaleX(-1)}
.cvoice .cdur{font-size:13px;color:inherit;opacity:.7;line-height:1}
.cvoice.loading{opacity:.55}
.cvoice.pending{cursor:default}
.cvoice.pending svg{opacity:.4}
.cvoice.pending .cwait{animation:cvwait 1.2s ease-in-out infinite}
@keyframes cvwait{0%,100%{opacity:.35}50%{opacity:.8}}
.cbubble.cvoice-bubble{padding:7px 12px}
.cvoice.playing .cv-w1,.cvoice.playing .cv-w2,.cvoice.playing .cv-w3{animation:cvwave 1s ease-in-out infinite}
.cvoice.playing .cv-w2{animation-delay:.18s}
.cvoice.playing .cv-w3{animation-delay:.36s}
@keyframes cvwave{0%,100%{opacity:.3}45%{opacity:1}}
.cvoice-text{font-size:12px;color:var(--muted);margin-top:5px;border-top:1px dashed rgba(255,255,255,.08);padding-top:4px}
.chat-typing{font-size:12px;color:var(--muted);padding:6px 2px 16px}

#chatDock{position:fixed;left:50%;bottom:calc(var(--nav-h) + var(--safe-b));transform:translateX(-50%);z-index:32;width:100%;max-width:760px;padding:0 12px 10px}
.chat-composer{display:flex;align-items:flex-end;gap:6px;padding:8px;background:rgba(22,26,34,.97);border:1px solid var(--line);border-radius:16px;box-shadow:0 8px 30px rgba(0,0,0,.4);backdrop-filter:blur(10px)}
.chat-composer textarea{flex:1;min-width:0;max-height:96px;resize:none;background:var(--bg-soft);border:1px solid var(--line);border-radius:12px;padding:8px 10px;font-size:14px;line-height:1.4;color:var(--text);outline:none;font-family:inherit}
.chat-composer textarea:focus{border-color:var(--accent)}
.chat-tool{width:38px;height:38px;flex:0 0 38px;border-radius:12px;color:var(--muted);font-size:18px;display:grid;place-items:center}
.chat-tool svg{width:24px;height:24px;display:block}
.chat-tool .ic-kb{display:none}
.chat-tool.on .ic-mic{display:none}
.chat-tool.on .ic-kb{display:block}
.chat-tool:active,.chat-tool.on{background:var(--panel-2);color:var(--accent)}
.chat-tool.rec{color:var(--danger);animation:pulse 1s infinite}
.chat-send{height:38px;padding:0 14px;border-radius:12px;background:var(--accent);color:var(--accent-ink);font-size:13px;font-weight:600}
.chat-send[disabled]{opacity:.4}
@keyframes pulse{50%{opacity:.45}}

.sticker-panel{background:rgba(22,26,34,.98);border:1px solid var(--line);border-radius:14px;margin-bottom:8px;padding:10px;max-height:38vh;overflow:auto;box-shadow:0 8px 30px rgba(0,0,0,.4)}
.sticker-head{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--muted);margin-bottom:8px}
.sticker-actions{display:flex;gap:6px}
.sticker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(64px,1fr));gap:8px}
.sticker-item{aspect-ratio:1;border-radius:10px;background:var(--bg-soft);border:1px solid var(--line);display:grid;place-items:center;font-size:30px;overflow:hidden;padding:0}
.sticker-item img{width:100%;height:100%;object-fit:cover}
.sticker-item:active{border-color:var(--accent)}
.sticker-empty{font-size:12px;color:var(--muted);padding:6px 2px;grid-column:1/-1}

.modal textarea,.modal input[type=text],.modal select{width:100%;background:var(--bg-soft);border:1px solid var(--line);border-radius:9px;padding:9px 11px;font-size:14px;color:var(--text);outline:none;font-family:inherit}
.modal textarea{resize:vertical;min-height:64px}
.modal textarea:focus,.modal input[type=text]:focus,.modal select:focus{border-color:var(--accent)}
.chat-members{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.chat-member{display:flex;align-items:center;gap:5px;padding:6px 9px;border:1px solid var(--line);border-radius:20px;font-size:12px;color:var(--muted);cursor:pointer}
.chat-member input{accent-color:var(--accent);margin:0}
.chat-member:has(input:checked){color:var(--text);border-color:rgba(94,234,212,.5);background:rgba(94,234,212,.08)}
.chat-field{margin-bottom:12px}
.chat-field>span{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}
.chat-note{font-size:12px;color:var(--muted);line-height:1.6}
.voice-preview{width:100%;margin:4px 0 10px}
.cbubble{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
.cbubble .cquote{margin:0 0 4px;padding:4px 7px;border-left:2px solid rgba(0,0,0,.2);border-radius:4px;background:rgba(0,0,0,.055);font-size:12px;line-height:1.5;color:#777;word-break:break-word}
.cbubble .cquote .cq-n{color:#576b95}
.chat-quote-bar{display:flex;align-items:center;gap:8px;margin-bottom:6px;padding:7px 10px;border-radius:12px;background:rgba(22,26,34,.97);border:1px solid var(--line);font-size:12px;color:var(--muted)}
.chat-quote-bar[hidden]{display:none}
.cq-main{flex:1;min-width:0;display:flex;gap:4px;overflow:hidden;white-space:nowrap}
.cq-name{flex:0 0 auto;color:var(--accent)}
.cq-text{overflow:hidden;text-overflow:ellipsis}
.cq-clear{width:24px;height:24px;flex:0 0 24px;border-radius:50%;display:grid;place-items:center;color:var(--muted)}
.msg-menu{position:fixed;z-index:75;display:flex;align-items:center;background:rgba(46,46,46,.98);border-radius:10px;padding:0 2px;box-shadow:0 10px 28px rgba(0,0,0,.45);backdrop-filter:blur(12px);animation:menupop .12s ease}
.msg-menu[hidden]{display:none}
.msg-menu button{padding:10px 13px;font-size:13px;color:#eee;white-space:nowrap}
.msg-menu button+button{border-left:1px solid rgba(255,255,255,.1)}
.msg-menu button:active{background:rgba(255,255,255,.1);border-radius:8px}
@keyframes menupop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}

#chatRecOverlay{position:fixed;inset:0;z-index:70;display:grid;place-items:center;background:rgba(0,0,0,.16);pointer-events:none}
.rec-panel{min-width:176px;padding:20px 24px;border-radius:16px;background:rgba(28,32,40,.94);color:#fff;text-align:center;box-shadow:0 14px 44px rgba(0,0,0,.5)}
.rec-wave{display:flex;align-items:center;justify-content:center;gap:5px;height:36px;margin-bottom:8px}
.rec-wave i{width:4px;height:8px;border-radius:3px;background:#7cf3d9;animation:recwave .9s ease-in-out infinite}
.rec-wave i:nth-child(2){animation-delay:.12s}
.rec-wave i:nth-child(3){animation-delay:.24s}
.rec-wave i:nth-child(4){animation-delay:.36s}
.rec-wave i:nth-child(5){animation-delay:.48s}
.rec-hint{font-size:14px;color:#dfe6e4}
.rec-hint.cancel{color:#ff9a9a}
@keyframes recwave{0%,100%{height:8px}50%{height:28px}}

.chat-modes{display:flex;gap:8px;flex-wrap:wrap}
.chat-modes label{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border:1px solid var(--line);border-radius:20px;font-size:12px;color:var(--muted);cursor:pointer}
.chat-modes input{accent-color:var(--accent);margin:0}
.chat-modes label:has(input:checked){color:var(--text);border-color:rgba(94,234,212,.5);background:rgba(94,234,212,.08)}
.ai-sec{font-size:12px;color:var(--accent);letter-spacing:.06em;margin:14px 0 2px;opacity:.9}

/* ---------------- 微信群聊主题 ---------------- */
body.chat-mode{background:#ededed;color:#111}
body.chat-mode #topbar{background:rgba(237,237,237,.95);border-bottom-color:#d9d9d9;color:#111}
body.chat-mode #topTitle{color:#111}
body.chat-mode .icon-btn{color:#333}
body.chat-mode .icon-btn:active{background:rgba(0,0,0,.06)}
body.chat-mode #tabbar{background:rgba(247,247,247,.98);border-top-color:#d9d9d9}
body.chat-mode #tabbar .tab{color:#8a8a8a}
body.chat-mode #tabbar .tab.active{color:#07c160}
body.chat-mode .spin{border-color:rgba(7,193,96,.2);border-top-color:#07c160}

body.chat-mode main{padding:0 0 calc(var(--nav-h) + var(--safe-b) + 24px);max-width:none}
body.chat-mode #view-chat{max-width:760px;margin:0 auto;min-height:calc(100vh - 50px - env(safe-area-inset-top,0px));background:#ededed}

body.chat-mode #btnChatNew{display:grid;place-items:center;font-size:22px;font-weight:400;line-height:1;color:#333}
body.chat-mode #chatLobby{padding:0 0 24px}
body.chat-mode #chatEmpty{padding:60px 24px;text-align:center;font-size:14px;color:#999}
body.chat-mode #chatEmpty:empty{display:none}

body.chat-thread #topbar{display:none}
body.chat-mode .chat-head{position:sticky;top:0;z-index:20;margin:0;padding:calc(env(safe-area-inset-top,0px) + 8px) 8px 8px;background:rgba(237,237,237,.97);border-bottom:1px solid #d9d9d9;backdrop-filter:blur(10px)}
body.chat-mode .chat-head .icon-btn{color:#333}
body.chat-mode .chat-title{color:#111;font-size:16px;font-weight:600;text-align:center}
body.chat-mode .chat-sub{color:#999;font-size:11px;text-align:center}

body.chat-mode .chat-msgs{padding:10px 12px 150px;gap:14px}
.chat-time{text-align:center;color:#b2b2b2;font-size:12px;margin:6px 0 0}
body.chat-mode .cavatar{width:38px;height:38px;flex:0 0 38px;border-radius:6px;border:0;font-size:14px;font-weight:600;background:#9a9a9a;color:#fff}
body.chat-mode .cmsg.me .cavatar{background:#07c160;color:#fff}
.cavatar.has-img{background-size:cover;background-position:center;color:transparent}
body.chat-mode .cavatar.has-img{background-size:cover;background-position:center;color:transparent}
.cavatar.clickable{cursor:pointer}
body.chat-mode .cmsg-body{max-width:76%}
body.chat-mode .cmsg-name{color:#9a9a9a;font-size:11px;line-height:1.3;margin:0 2px 1px}
body.chat-mode .cbubble{background:#fff;border:0;border-radius:6px;color:#111;font-size:15px;line-height:1.5;padding:9px 12px;box-shadow:0 1px 2px rgba(0,0,0,.05)}
body.chat-mode .cmsg.me .cbubble{background:#95ec69;color:#111}
body.chat-mode .cmsg.sys .cbubble{background:transparent;box-shadow:none;color:#a6a6a6;font-size:12px;padding:2px 8px}
body.chat-mode .cmsg{gap:10px}
body.chat-mode .cmsg:not(.sys) .cbubble::after{content:'';position:absolute;top:11px;width:0;height:0;border:6px solid transparent}
body.chat-mode .cmsg:not(.me):not(.sys) .cbubble::after{left:-6px;border-right-color:#fff;border-left:0;border-top-width:6px;border-bottom-width:6px}
body.chat-mode .cmsg.me .cbubble::after{right:-6px;border-left-color:#95ec69;border-right:0;border-top-width:6px;border-bottom-width:6px}
body.chat-mode .cbubble.csticker,body.chat-mode .cmsg.me .cbubble.csticker{background:transparent;box-shadow:none;padding:0;border-radius:0}
body.chat-mode .cmsg .cbubble.csticker::after{display:none}
body.chat-mode .csticker img{border-radius:8px;max-width:48vw}
body.chat-mode .cvoice{gap:8px;color:inherit}
body.chat-mode .cvoice .cdur{color:inherit;opacity:.7}
body.chat-mode .cbubble.cvoice-bubble{padding:7px 12px}
body.chat-mode .cvoice-text{color:#666;border-top-color:rgba(0,0,0,.12)}
body.chat-mode .chat-typing{color:#999}

body.chat-mode #chatDock{background:#f7f7f7;border-top:1px solid #d9d9d9;padding:8px 10px;box-shadow:0 -1px 3px rgba(0,0,0,.04)}
body.chat-mode .chat-composer{background:transparent;border:0;box-shadow:none;padding:0;gap:8px;border-radius:0;backdrop-filter:none}
body.chat-mode .chat-composer textarea{background:#fff;border:1px solid #d9d9d9;border-radius:6px;color:#111;font-size:15px;padding:9px 10px}
body.chat-mode .chat-composer textarea:focus{border-color:#07c160}
body.chat-mode .chat-tool{color:#333;border-radius:6px}
body.chat-mode .chat-tool:active,body.chat-mode .chat-tool.on{background:rgba(0,0,0,.06);color:#07c160}
body.chat-mode .chat-send{background:#07c160;color:#fff;border-radius:6px;font-size:14px}
body.chat-mode .chat-send[disabled]{opacity:.5}
.chat-hold{flex:1;min-width:0;height:38px;display:flex;align-items:center;justify-content:center;border-radius:6px;background:#fff;border:1px solid #d9d9d9;color:#111;font-size:15px;font-weight:500;user-select:none;touch-action:none}
.chat-hold:active,.chat-hold.rec{background:#e9e9e9}
body.chat-mode .sticker-panel{background:#f7f7f7;border:1px solid #d9d9d9;border-radius:10px;box-shadow:0 -2px 12px rgba(0,0,0,.06);margin-bottom:6px}
body.chat-mode .sticker-head{color:#888}
body.chat-mode .sticker-item{background:#fff;border:1px solid #e5e5e5}
