﻿/* ============ Moonlight · 双主题(默认浅色) ============
   浅色:苹果/Kimi 式干净留白;深色:近纯黑克制风。
   原则:克制、留白、发丝分隔、单一主色。 */
*{box-sizing:border-box;margin:0;padding:0}
:root{
  --bg:#f8f9fb; --bg-soft:#ffffff;
  --panel:linear-gradient(180deg,#ffffff,#fbfcfe);
  --line:rgba(15,23,42,.08); --line-strong:rgba(15,23,42,.16);
  --text:#0b1220; --muted:#5c6675; --faint:#9aa4b2;
  --accent:#4c6fff; --accent-hi:#3b5bef; --accent-soft:rgba(76,111,245,.10);
  --violet:#7c5cf6; --danger:#dc2626; --ok:#059669;
  --radius:20px;
  --shadow:0 24px 48px -32px rgba(15,23,42,.16);
  --nav-bg:rgba(248,249,251,.78);
  --ambient1:rgba(76,111,245,.07); --ambient2:rgba(124,92,246,.04);
  --input-bg:rgba(15,23,42,.03);
  --inset-bg:rgba(15,23,42,.035);
  --chip-active-bg:#0b1220; --chip-active-fg:#ffffff;
  --heading:#0b1220; --stat-num:#0b1220; --tag-fg:#3b5bef;
  --text-soft:#3f4756; --inline-code-bg:rgba(15,23,42,.06);
  --msg-ai-bg:#ffffff; --toast-bg:#ffffff;
  --grad-text:linear-gradient(100deg,#3b5bef,#0e9db8);
  --disabled-bg:#e8ebf0; --disabled-fg:#059669;
  --sitem-active-fg:#3b5bef;
  --scrollbar:rgba(15,23,42,.16);
  --big404:rgba(11,18,32,.14);
  --selection:rgba(76,111,245,.2);
  --mono:ui-monospace,"Cascadia Code","JetBrains Mono",Consolas,monospace;
}
html[data-theme="dark"]{
  --bg:#05060b; --bg-soft:#0a0d16;
  --panel:linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.015));
  --line:rgba(255,255,255,.07); --line-strong:rgba(255,255,255,.14);
  --text:#edeff5; --muted:#9aa3b5; --faint:#5f6779;
  --accent:#5b7cfa; --accent-hi:#6d8bff; --accent-soft:rgba(91,124,250,.12);
  --violet:#8b5cf6; --danger:#f87171; --ok:#34d399;
  --shadow:0 24px 48px -24px rgba(0,0,0,.55);
  --nav-bg:rgba(5,6,11,.7);
  --ambient1:rgba(91,124,250,.11); --ambient2:rgba(139,92,246,.05);
  --input-bg:rgba(255,255,255,.04);
  --inset-bg:rgba(0,0,0,.25);
  --chip-active-bg:#ffffff; --chip-active-fg:#0a0c12;
  --heading:#ffffff; --stat-num:#ffffff; --tag-fg:#a8bbff;
  --text-soft:#c3c9da; --inline-code-bg:rgba(255,255,255,.08);
  --msg-ai-bg:rgba(255,255,255,.05); --toast-bg:#10131c;
  --grad-text:linear-gradient(100deg,#c7d2fe,#8fa6ff 55%,#7dd3fc);
  --disabled-bg:#1f2937; --disabled-fg:#34d399;
  --sitem-active-fg:#c7d2fe;
  --scrollbar:rgba(255,255,255,.12);
  --big404:rgba(255,255,255,.16);
  --selection:rgba(91,124,250,.35);
}
html{scroll-behavior:smooth}
html[data-theme="dark"]{color-scheme:dark}
html[data-theme="light"],html:not([data-theme]){color-scheme:light}
body{
  font-family:system-ui,-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--bg); color:var(--text); line-height:1.75; min-height:100vh;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
body::before{
  content:""; position:fixed; inset:0; z-index:-1; pointer-events:none;
  background:
    radial-gradient(1100px 480px at 50% -12%, var(--ambient1), transparent 65%),
    radial-gradient(900px 420px at 88% 110%, var(--ambient2), transparent 60%);
}
::selection{background:var(--selection)}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:var(--scrollbar);border-radius:8px}
::-webkit-scrollbar-track{background:transparent}
a{color:var(--accent-hi);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:1120px;margin:0 auto;padding:0 24px}
.narrow{max-width:680px}
.pad{padding-top:48px;padding-bottom:80px}
.center{text-align:center}
.muted{color:var(--muted)}
.small{font-size:13px}
h1{font-size:30px;line-height:1.25;letter-spacing:-.01em}
h2{font-size:20px;margin:20px 0 10px;letter-spacing:-.01em}
h3{font-size:16px}
.grad-text{background:var(--grad-text);-webkit-background-clip:text;background-clip:text;color:transparent}
.fade-in{animation:fadeUp .4s cubic-bezier(.2,.7,.3,1) both}
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
.boot{display:flex;gap:8px;justify-content:center;align-items:center;height:100vh}
.boot-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);animation:boot 1s infinite ease-in-out}
.boot-dot:nth-child(2){animation-delay:.15s;background:var(--violet)}
.boot-dot:nth-child(3){animation-delay:.3s;background:#0e9db8}
@keyframes boot{0%,100%{transform:translateY(0);opacity:.4}50%{transform:translateY(-7px);opacity:1}}
/* ---------- 导航 ---------- */
.nav{position:sticky;top:0;z-index:20;background:var(--nav-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:1px solid var(--line)}
.nav-inner{display:flex;align-items:center;justify-content:space-between;height:64px;gap:12px}
.brand{font-weight:600;font-size:17px;color:var(--text);display:flex;align-items:center;gap:10px;letter-spacing:.01em}
.brand:hover{text-decoration:none}
.logo{width:28px;height:28px;filter:drop-shadow(0 2px 10px rgba(76,111,245,.3))}
.nav-links{display:flex;gap:26px;align-items:center;flex-wrap:wrap}
.nav-links a{color:var(--muted);font-size:14px;padding:5px 0;transition:color .15s}
.nav-links a:hover{color:var(--text);text-decoration:none}
.nav-links a.active{color:var(--heading);font-weight:600}
.theme-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:10px;border:1px solid var(--line);color:var(--muted);transition:.15s}
.theme-btn:hover{color:var(--text);border-color:var(--line-strong);text-decoration:none !important}
/* ---------- 按钮 ---------- */
.btn{display:inline-block;border:1px solid var(--line-strong);background:transparent;color:var(--text);border-radius:12px;padding:9px 20px;font-size:14px;cursor:pointer;text-decoration:none !important;transition:.18s;font-family:inherit}
.btn:hover{border-color:var(--faint);transform:translateY(-1px)}
.btn:active{transform:scale(.98)}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:0 8px 24px -10px rgba(76,111,245,.45)}
.btn.primary:hover{background:var(--accent-hi);border-color:var(--accent-hi)}
.btn.ghost{background:transparent}
.btn.danger{border-color:rgba(220,38,38,.3);color:var(--danger);background:rgba(220,38,38,.05)}
.btn.danger:hover{border-color:var(--danger)}
.btn.small{padding:4px 12px;font-size:12px;border-radius:9px}
.btn.big{padding:14px 44px;font-size:16px;border-radius:14px}
.btn.wide{width:100%}
.btn:disabled{opacity:.9;cursor:default;background:var(--disabled-bg);border-color:var(--disabled-bg);color:var(--disabled-fg);box-shadow:none;transform:none}
/* ---------- 卡片 ---------- */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:24px;box-shadow:var(--shadow)}
/* ---------- Hero ---------- */
.hero{padding:132px 0 76px}
.hero-tag{display:inline-flex;align-items:center;gap:9px;border:1px solid var(--line);background:var(--inset-bg);border-radius:999px;padding:6px 16px;font-size:13px;color:var(--muted)}
.hero-tag .dot{width:6px;height:6px;border-radius:50%;background:var(--ok);box-shadow:0 0 8px rgba(52,211,153,.7);animation:pulse 2.4s infinite}
@keyframes pulse{50%{opacity:.35}}
.hero h1{font-size:clamp(40px,6vw,64px);font-weight:700;letter-spacing:-.025em;margin:26px 0 16px;line-height:1.12}
.hero-sub{color:var(--muted);font-size:17px;max-width:620px}
.hero-actions{margin:36px 0;display:flex;gap:12px;flex-wrap:wrap}
.hero-stats{display:flex;gap:14px;margin-top:8px;flex-wrap:wrap}
.stat{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:18px 28px;box-shadow:var(--shadow)}
.stat b{font-size:30px;font-weight:700;display:block;letter-spacing:-.02em;color:var(--stat-num)}
.stat span{color:var(--faint);font-size:13px}
/* ---------- 列表 / 筛选 ---------- */
.list-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.more{font-size:14px}
.chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:18px}
.chip{border:1px solid var(--line);background:transparent;border-radius:999px;padding:6px 18px;font-size:13px;cursor:pointer;color:var(--muted);font-family:inherit;transition:.15s}
.chip:hover{border-color:var(--line-strong);color:var(--text)}
.chip.active{background:var(--chip-active-bg);border-color:var(--chip-active-bg);color:var(--chip-active-fg);font-weight:600}
.search{border:1px solid var(--line);background:var(--input-bg);color:var(--text);border-radius:12px;padding:10px 16px;font-size:14px;min-width:240px;font-family:inherit;transition:.15s}
.search::placeholder{color:var(--faint)}
.search:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px;margin-top:22px}
.note-card{display:flex;flex-direction:column;gap:10px;color:var(--text);transition:.25s cubic-bezier(.2,.7,.3,1)}
.note-card:hover{border-color:var(--line-strong);transform:translateY(-4px);box-shadow:0 32px 56px -28px rgba(15,23,42,.35);text-decoration:none}
.note-card h3{color:var(--text);letter-spacing:-.01em}
.nc-meta{display:flex;justify-content:space-between;align-items:center}
.tag{background:var(--accent-soft);color:var(--tag-fg);border-radius:8px;padding:2px 10px;font-size:12px}
.empty{color:var(--muted);text-align:center;padding:56px 0;grid-column:1/-1}
/* ---------- 文章 ---------- */
.article-wrap{display:grid;grid-template-columns:1fr 230px;gap:28px;padding-top:40px;padding-bottom:80px}
.article{padding:44px;min-width:0}
.article h1{margin:10px 0 20px;font-size:32px;letter-spacing:-.02em}
.article h2{margin-top:34px;padding-bottom:8px;border-bottom:1px solid var(--line)}
.article h3{margin-top:24px}
.article p{margin:14px 0}
.article ul{margin:14px 0 14px 22px}
.article blockquote{border-left:2px solid var(--accent);background:var(--accent-soft);padding:12px 18px;border-radius:0 12px 12px 0;margin:16px 0;color:var(--text-soft)}
.article code{background:var(--inline-code-bg);padding:2px 7px;border-radius:6px;font-size:.9em;font-family:var(--mono)}
.article-meta{color:var(--faint);font-size:13px;display:flex;gap:12px;align-items:center}
/* 代码块:两种主题都保持深色,形成高级对比 */
.codeblock{border:1px solid var(--line);border-radius:14px;overflow:hidden;margin:18px 0;background:#0a0d16}
.codebar{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,255,255,.08);padding:8px 16px;font-size:12px;color:#8b93a7}
.codebar .lang{font-family:var(--mono)}
.codeblock pre{padding:18px;overflow-x:auto;color:#d7e0f0;font-size:13px;line-height:1.75;font-family:var(--mono)}
.codeblock pre code{background:none;color:inherit;padding:0}
.copybtn{border:1px solid rgba(255,255,255,.14);background:transparent;color:#9aa3b5;border-radius:8px;font-size:12px;padding:3px 12px;cursor:pointer;font-family:inherit;transition:.15s}
.copybtn:hover{color:#fff;border-color:rgba(255,255,255,.3)}
.toc{position:sticky;top:88px;align-self:start;font-size:14px}
.toc-title{font-weight:600;margin-bottom:10px;color:var(--faint);font-size:12px;letter-spacing:.18em}
.toc a{display:block;color:var(--muted);padding:3px 0;transition:.12s}
.toc a:hover{color:var(--text);text-decoration:none}
.toc-l3{padding-left:14px}
.pn{display:flex;justify-content:space-between;gap:10px;margin-top:36px;padding-top:20px;border-top:1px solid var(--line)}
/* ---------- 登录 / 404 ---------- */
.login-card{max-width:440px;margin:56px auto;text-align:center}
.login-card h1{margin-bottom:6px}
.login-card form{text-align:left;margin-top:20px}
.err{color:var(--danger);font-size:13px;margin:8px 0}
.err-box{background:rgba(220,38,38,.06);border:1px solid rgba(220,38,38,.3);color:var(--danger);padding:10px 14px;border-radius:12px;margin-bottom:12px;font-size:14px}
.big404{font-size:96px;line-height:1.1;font-weight:700;letter-spacing:-.03em;color:var(--big404)}
.footer{border-top:1px solid var(--line);padding:32px 0;color:var(--faint);font-size:13px;margin-top:56px}
/* ---------- 后台 ---------- */
.admin-wrap{display:flex;min-height:100vh}
.sidebar{width:224px;background:var(--nav-bg);border-right:1px solid var(--line);padding:18px 14px;display:flex;flex-direction:column;gap:4px;position:sticky;top:0;height:100vh;flex-shrink:0}
.sidebar .brand{padding:4px 12px 18px}
.sitem{padding:10px 14px;border-radius:12px;color:var(--muted);font-size:14px;transition:.15s}
.sitem:hover{background:var(--inset-bg);color:var(--text);text-decoration:none}
.sitem.active{background:var(--accent-soft);color:var(--sitem-active-fg);font-weight:600}
.sfoot{margin-top:auto;display:flex;flex-direction:column;gap:4px;border-top:1px solid var(--line);padding-top:12px}
.sfoot a{font-size:13px;color:var(--faint);padding:4px 14px}
.sfoot a:hover{color:var(--text);text-decoration:none}
.sfoot .theme-btn{margin:4px 14px;width:auto;height:auto;padding:6px 12px;gap:8px;font-size:13px}
.admin-main{flex:1;padding:36px;min-width:0}
.admin-page{max-width:1000px;margin:0 auto}
.admin-page>h1{margin-bottom:4px}
.dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:18px;margin-top:22px}
.checkin-card{text-align:center}
.checkin-card .btn{margin:18px 0 12px}
.quick{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}
.qbtn{border:1px solid var(--line);border-radius:14px;padding:14px;color:var(--text);font-size:14px;display:block;transition:.15s}
.qbtn:hover{border-color:var(--line-strong);background:var(--inset-bg);color:var(--text);text-decoration:none}
.feed{list-style:none;margin-top:8px}
.feed li{display:flex;justify-content:space-between;gap:10px;padding:10px 0;border-bottom:1px solid var(--line);font-size:14px;flex-wrap:wrap}
.feed li:last-child{border-bottom:none}
/* ---------- 表格 / 表单 ---------- */
.table-card{padding:0;overflow-x:auto;margin-top:18px}
table{width:100%;border-collapse:collapse;font-size:14px;min-width:620px}
th,td{text-align:left;padding:14px 18px;border-bottom:1px solid var(--line)}
th{color:var(--faint);font-size:13px;font-weight:500}
tr:last-child td{border-bottom:none}
tbody tr{transition:.12s}
tbody tr:hover{background:var(--inset-bg)}
td.ops{white-space:nowrap}
td.ops .btn{margin-right:6px}
.field{margin-bottom:16px}
.field label{display:block;font-size:13px;color:var(--muted);margin-bottom:7px}
input[type=text],input[type=password],select,textarea{width:100%;border:1px solid var(--line);background:var(--input-bg);color:var(--text);border-radius:12px;padding:10px 14px;font-size:14px;font-family:inherit;transition:.15s}
textarea{resize:vertical;line-height:1.7;font-family:var(--mono);font-size:13px}
input:focus,textarea:focus,select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
select option{background:var(--bg-soft);color:var(--text)}
.editor-card{margin-top:18px}
.editor-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.preview{border:1px solid var(--line);border-radius:14px;padding:18px 20px;min-height:220px;max-height:460px;overflow-y:auto;background:var(--inset-bg)}
.ed-actions{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
/* ---------- 练习 ---------- */
.deck-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px;margin-top:22px}
.deck-card{display:flex;flex-direction:column;gap:10px;align-items:flex-start}
.session-card{max-width:660px;margin:22px auto;text-align:center}
.flashcard{border:1px solid var(--line-strong);border-radius:24px;min-height:250px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;margin:20px 0;cursor:pointer;padding:28px;transition:.25s;background:var(--inset-bg)}
.flashcard:hover{border-color:var(--faint)}
.flashcard.flipped{border-color:rgba(76,111,245,.5);background:var(--accent-soft)}
.fc-label{font-size:12px;color:var(--faint);letter-spacing:.3em}
.fc-text{font-size:20px;font-weight:600;line-height:1.6;letter-spacing:-.01em}
.fc-hint{font-size:12px}
.result-nums{display:flex;gap:20px;justify-content:center;margin:18px 0}
.rn{padding:16px 34px;border-radius:16px;border:1px solid var(--line)}
.rn.ok{background:rgba(5,150,105,.07);color:var(--ok)}
.rn.bad{background:rgba(220,38,38,.06);color:var(--danger)}
.rn b{font-size:30px;display:block;letter-spacing:-.02em}
.wronglist{text-align:left;background:var(--inset-bg);border:1px solid var(--line);border-radius:14px;padding:18px;margin:14px 0}
.wrong-item{padding:9px 0;border-bottom:1px solid var(--line);font-size:14px}
.wrong-item:last-child{border-bottom:none}
/* ---------- 进度 ---------- */
.cal-head{display:grid;grid-template-columns:repeat(7,1fr);color:var(--faint);font-size:12px;text-align:center;margin:12px 0 8px}
.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin-bottom:14px}
.day{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border-radius:10px;font-size:13px;background:var(--inset-bg)}
.day.blank{background:none}
.day.checked{background:var(--accent);color:#fff;font-weight:600;box-shadow:0 4px 14px -4px rgba(76,111,245,.5)}
.day.future{background:none;color:var(--faint);opacity:.45}
.plan{margin-bottom:16px}
.plan-head{display:flex;justify-content:space-between;font-size:14px;margin-bottom:7px;gap:8px}
.bar{height:8px;background:var(--inset-bg);border-radius:999px;overflow:hidden}
.bar-fill{height:100%;background:var(--accent);border-radius:999px;transition:.4s}
.chart{display:flex;gap:12px;align-items:flex-end;height:150px;margin-top:14px}
.cbar{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:6px;height:100%}
.cbar-fill{width:60%;background:var(--accent);border-radius:8px 8px 2px 2px;min-height:4px;opacity:.9}
.cbar span{font-size:11px;color:var(--faint);white-space:nowrap}
/* ---------- AI 聊天 ---------- */
.ai-page .chat-card{padding:0;overflow:hidden;display:flex;flex-direction:column;margin-top:18px}
.chat-box{height:440px;overflow-y:auto;padding:22px;display:flex;flex-direction:column;gap:12px;background:var(--inset-bg)}
.msg{max-width:82%;padding:12px 16px;border-radius:16px;font-size:14px;line-height:1.7;animation:fadeUp .25s ease both}
.msg.user{align-self:flex-end;background:var(--accent);color:#fff;border-bottom-right-radius:5px}
.msg.ai{align-self:flex-start;background:var(--msg-ai-bg);border:1px solid var(--line);border-bottom-left-radius:5px}
.msg.ai-err{background:rgba(220,38,38,.06);border-color:rgba(220,38,38,.3);color:var(--danger)}
.cursor{animation:blink 1s infinite;color:var(--accent-hi)}
@keyframes blink{50%{opacity:0}}
.chat-input{display:flex;gap:8px;padding:14px;border-top:1px solid var(--line)}
.chat-input input{flex:1}
/* ---------- 弹窗 / 提示 ---------- */
.modal-mask{position:fixed;inset:0;background:rgba(2,3,8,.5);backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;z-index:50}
.modal{background:var(--bg-soft);border:1px solid var(--line-strong);border-radius:20px;padding:28px;max-width:410px;width:90%;box-shadow:0 32px 80px rgba(0,0,0,.35);animation:fadeUp .22s ease both}
.modal h3{margin-bottom:10px}
.modal p{color:var(--muted);font-size:14px;margin-bottom:6px}
.toast{position:fixed;bottom:28px;left:50%;transform:translateX(-50%) translateY(20px);background:var(--toast-bg);border:1px solid var(--line-strong);color:var(--text);padding:12px 22px;border-radius:14px;font-size:14px;opacity:0;transition:.25s;z-index:60;box-shadow:0 16px 40px rgba(0,0,0,.25)}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
/* ---------- 响应式 ---------- */
@media (max-width:860px){
  .brand-text{display:none}
  .nav-inner{flex-wrap:nowrap}
  .nav-links{gap:14px}
  .nav-links a{font-size:13px}
  .theme-btn{width:28px;height:28px}
  .logo{width:26px;height:26px}
  .article-wrap{display:block}
  .toc{position:static;margin:0 24px 18px;border:1px solid var(--line);border-radius:16px;padding:16px;background:var(--inset-bg)}
  .editor-grid{grid-template-columns:1fr}
  .admin-wrap{flex-direction:column}
  .sidebar{width:100%;height:auto;position:static;flex-direction:row;flex-wrap:wrap;align-items:center;gap:6px;padding:10px 12px}
  .sidebar .brand{padding:4px 10px}
  .sfoot{margin-top:0;margin-left:auto;flex-direction:row;border:none;padding:0;gap:8px;align-items:center}
  .sfoot .theme-btn{margin:0}
  .admin-main{padding:20px}
  .hero{padding:72px 0 48px}
  .search{min-width:0;width:100%}
  .list-head{width:100%}
}

/* ================= 书签收藏 ================= */
.bm-cat { margin-bottom: 28px; }
.bm-cat h2 { font-size: 1.1rem; margin: 0 0 12px; color: var(--text); }
.bm-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
.bm-item { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; text-decoration: none; color: var(--text); transition: border-color .15s, box-shadow .15s; }
.bm-item:hover { border-color: var(--accent); box-shadow: 0 2px 12px var(--shadow); }
.bm-title { font-weight: 500; }
.bm-ext { flex-shrink: 0; color: var(--muted); transition: color .15s; }
.bm-item:hover .bm-ext { color: var(--accent); }

/* ================= 访客 AI 悬浮聊天 ================= */
.gai-fab {
  position: fixed; bottom: 24px; right: 24px; z-index: 1000;
  width: 52px; height: 52px; border-radius: 50%;
  background: var(--accent); color: #fff;
  font-size: 24px; display: flex; align-items: center; justify-content: center;
  cursor: pointer; box-shadow: 0 4px 16px rgba(76,111,255,.35);
  transition: transform .2s, box-shadow .2s;
  user-select: none;
}
.gai-fab:hover { transform: scale(1.08); box-shadow: 0 6px 24px rgba(76,111,255,.5); }
.gai-panel {
  position: fixed; bottom: 24px; right: 24px; z-index: 1001;
  width: 360px; max-width: calc(100vw - 48px); height: 480px; max-height: calc(100vh - 120px);
  border-radius: 14px; background: var(--bg); border: 1px solid var(--line);
  box-shadow: 0 8px 40px var(--shadow); display: flex; flex-direction: column;
  overflow: hidden;
}
.gai-head {
  display: flex; align-items: center; gap: 10px; padding: 12px 16px;
  border-bottom: 1px solid var(--line); font-weight: 600; font-size: .95rem;
  flex-shrink: 0;
}
.gai-head .muted { flex: 1; }
.gai-close { background: none; border: none; cursor: pointer; font-size: 1.1rem; color: var(--muted); padding: 4px 6px; line-height: 1; }
.gai-close:hover { color: var(--text); }
.gai-body { flex: 1; overflow-y: auto; padding: 12px 16px; display: flex; flex-direction: column; gap: 10px; }
.gai-body .msg { max-width: 88%; padding: 8px 12px; border-radius: 10px; font-size: .9rem; line-height: 1.55; word-break: break-word; }
.gai-body .msg.user { align-self: flex-end; background: var(--accent); color: #fff; }
.gai-body .msg.ai { align-self: flex-start; background: var(--bg-soft); border: 1px solid var(--line); }
.gai-body .msg.ai-err { color: var(--danger); }
.gai-input { display: flex; gap: 8px; padding: 10px 16px; border-top: 1px solid var(--line); flex-shrink: 0; }
.gai-input input { flex: 1; border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px; font-size: .9rem; background: var(--bg); color: var(--text); outline: none; }
.gai-input input:focus { border-color: var(--accent); }

@media (max-width: 500px) {
  .gai-panel { width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; bottom: 0; right: 0; border-radius: 0; }
  .bm-grid { grid-template-columns: 1fr; }
}