  :root{
    --mono:"Consolas","JetBrains Mono",ui-monospace,monospace;
    --sans:"Segoe UI","Microsoft YaHei",system-ui,-apple-system,sans-serif;
    --radius:12px;
    /* 深空科技（默认） */
    --bg0:#0a1019; --bg1:#0d1624; --panel:#101b2c; --panel2:#142338; --panel3:#182a41;
    --edge:#22334a; --edge2:#2b4058; --ink:#e8eff7; --muted:#9db0c4; --faint:#5f7390;
    --accent:#47c1e0; --accent2:#7bd6f0; --accent-dim:rgba(71,193,224,.14); --on-accent:#06222e;
    --green:#63d69b; --amber:#f0b75a; --red:#ef6f6f;
    --gear1:#5ac8e6; --gear2:#7bd6f0; --viz-line:#2b4058;
    --viz-bg:radial-gradient(500px 400px at 50% 30%,#132a40,#0a1626 70%);
    --glow:radial-gradient(300px 200px at 60% 30%, rgba(71,193,224,.18), transparent 70%);
    --topbar-bg:rgba(13,22,36,.72);
    --nav-bg:linear-gradient(180deg,rgba(16,27,44,.92),rgba(10,16,25,.94));
    --status-bg:rgba(13,22,36,.86);
    --body-bg:radial-gradient(1200px 700px at 75% -10%, rgba(71,193,224,.10), transparent 60%),radial-gradient(900px 600px at 10% 110%, rgba(240,183,90,.05), transparent 55%),linear-gradient(160deg,var(--bg0),var(--bg1));
    --user-bubble:linear-gradient(135deg,#174a61,#123a4f); --user-edge:#1d5c7a; --user-bubble-text:#ffffff;
    --thumb:#cfe6f0; --thumb-on:#06222e;
  }
  /* 浅色工程 */
  [data-theme="light"]{
    --bg0:#eef1f6; --bg1:#f5f7fa; --panel:#ffffff; --panel2:#f0f3f8; --panel3:#e5ebf3;
    --edge:#d5dde8; --edge2:#c0ccda; --ink:#1c2735; --muted:#5a6b80; --faint:#8b98aa;
    --accent:#1f7fa8; --accent2:#2a94c2; --accent-dim:rgba(31,127,168,.12); --on-accent:#ffffff;
    --green:#2f9e63; --amber:#c8832b; --red:#c23b3b;
    --gear1:#2a94c2; --gear2:#5eb0d0; --viz-line:#c0ccda;
    --viz-bg:radial-gradient(500px 400px at 50% 30%,#e8f0f7,#f2f6fb 70%);
    --glow:radial-gradient(300px 200px at 60% 30%, rgba(31,127,168,.10), transparent 70%);
    --topbar-bg:rgba(240,243,248,.82);
    --nav-bg:linear-gradient(180deg,rgba(244,247,251,.96),rgba(238,242,248,.96));
    --status-bg:rgba(240,243,248,.92);
    --body-bg:linear-gradient(160deg,var(--bg0),var(--bg1));
    --user-bubble:linear-gradient(135deg,#dcebf4,#cfe4f0); --user-edge:#a9c9db; --user-bubble-text:#1c2735;
    --thumb:#ffffff; --thumb-on:#1f7fa8;
  }
  /* 工业石墨 */
  [data-theme="graphite"]{
    --bg0:#1a1a1e; --bg1:#242428; --panel:#2a2a30; --panel2:#32323a; --panel3:#3a3a44;
    --edge:#3a3a44; --edge2:#4a4a58; --ink:#e8e8ec; --muted:#b0b0bc; --faint:#80808e;
    --accent:#5ac8fa; --accent2:#7dd5fc; --accent-dim:rgba(90,200,250,.12); --on-accent:#0a1a28;
    --green:#7dd69f; --amber:#f0b35a; --red:#ef6f6f;
    --topbar-bg:rgba(36,36,40,.88);
    --nav-bg:linear-gradient(180deg,rgba(42,42,48,.95),rgba(26,26,30,.95));
    --body-bg:linear-gradient(160deg,#1a1a1e,#242428);
    --user-bubble:linear-gradient(135deg,#1a3a4a,#152a38); --user-edge:#2a5a7a; --user-bubble-text:#ffffff;
    --thumb:#4a4a58; --thumb-on:#5ac8fa;
  }
  .hide{display:none !important}
  [data-theme="pink"]{
    --bg0:#fff8f9; --bg1:#fff0f3; --panel:#ffffff; --panel2:#fff5f7; --panel3:#ffe9ee;
    --edge:#f8dce1; --edge2:#f0c2cb; --ink:#4a2f38; --muted:#9c6b78; --faint:#c49aa5;
    --accent:#e8648c; --accent2:#f28aa6; --accent-dim:rgba(232,100,140,.1); --on-accent:#fff;
    --green:#7fc988; --amber:#ffb366; --red:#ef7070;
    --gear1:#f28aa6; --gear2:#e8648c; --viz-line:#f0c2cb;
    --viz-bg:radial-gradient(500px 400px at 50% 30%,#fff0f3,#fff8f9 70%);
    --glow:radial-gradient(300px 200px at 60% 30%, rgba(232,100,140,.08), transparent 70%);
    --topbar-bg:rgba(255,255,255,.88);
    --nav-bg:linear-gradient(180deg,#fff5f7,#fff0f3);
    --body-bg:linear-gradient(160deg,#fff8f9,#fff0f3);
    --user-bubble:linear-gradient(135deg,#e8648c,#f28aa6); --user-edge:#d64472; --user-bubble-text:#ffffff;
  }
  /* 炫酷黑主题：年轻男孩 */
  [data-theme="neon"]{
    --bg0:#0a0a0f; --bg1:#12121a; --panel:#1a1a24; --panel2:#20202e; --panel3:#2a2a3a;
    --edge:#2e2e40; --edge2:#3d3d55; --ink:#e0e0ff; --muted:#9090b0; --faint:#606080;
    --accent:#00e5ff; --accent2:#40c4ff; --accent-dim:rgba(0,229,255,.12); --on-accent:#001018;
    --green:#00e676; --amber:#ffab40; --red:#ff5252;
    --topbar-bg:rgba(10,10,15,.85);
    --nav-bg:linear-gradient(180deg,rgba(26,26,36,.95),rgba(10,10,15,.95));
    --body-bg:radial-gradient(800px 500px at 70% -10%,rgba(0,229,255,.08),transparent 60%),linear-gradient(160deg,#0a0a0f,#12121a);
    --user-bubble:linear-gradient(135deg,#006064,#00838f); --user-edge:#00e5ff; --user-bubble-text:#ffffff;
    --thumb:#3d3d55; --thumb-on:#00e5ff;
  }
  /* 商务蓝主题：中年男领导 */
  [data-theme="business"]{
    --bg0:#f4f7fb; --bg1:#eaf0f7; --panel:#ffffff; --panel2:#f5f8fc; --panel3:#e8eef6;
    --edge:#d6dfe9; --edge2:#b6c5d6; --ink:#1e2a3a; --muted:#566882; --faint:#8899b0;
    --accent:#1a5fb4; --accent2:#2b7cd3; --accent-dim:rgba(26,95,180,.08); --on-accent:#fff;
    --green:#2e7d32; --amber:#e67e22; --red:#c62828;
    --gear1:#2b7cd3; --gear2:#1a5fb4; --viz-line:#b6c5d6;
    --viz-bg:radial-gradient(500px 400px at 50% 30%,#e8f0f9,#f4f7fb 70%);
    --glow:radial-gradient(300px 200px at 60% 30%, rgba(26,95,180,.06), transparent 70%);
    --topbar-bg:rgba(255,255,255,.92);
    --nav-bg:linear-gradient(180deg,#f5f8fc,#eaf0f7);
    --body-bg:linear-gradient(160deg,#f4f7fb,#eaf0f7);
    --user-bubble:linear-gradient(135deg,#1a5fb4,#2b7cd3); --user-edge:#0d47a1; --user-bubble-text:#ffffff;
  }
  /* 优雅紫主题：中年女领导 */
  [data-theme="elegant"]{
    --bg0:#faf7fc; --bg1:#f3edf8; --panel:#ffffff; --panel2:#faf5fc; --panel3:#efe7f6;
    --edge:#e4d7ec; --edge2:#cdb5da; --ink:#33273d; --muted:#6f5c7d; --faint:#a08caf;
    --accent:#7e3fa0; --accent2:#9960b8; --accent-dim:rgba(126,63,160,.08); --on-accent:#fff;
    --green:#5a8f35; --amber:#e08a28; --red:#b83a3a;
    --gear1:#9960b8; --gear2:#7e3fa0; --viz-line:#cdb5da;
    --viz-bg:radial-gradient(500px 400px at 50% 30%,#f0e7f7,#faf7fc 70%);
    --glow:radial-gradient(300px 200px at 60% 30%, rgba(126,63,160,.06), transparent 70%);
    --topbar-bg:rgba(255,255,255,.92);
    --nav-bg:linear-gradient(180deg,#faf5fc,#f3edf8);
    --body-bg:linear-gradient(160deg,#faf7fc,#f3edf8);
    --user-bubble:linear-gradient(135deg,#7e3fa0,#9960b8); --user-edge:#5a237a; --user-bubble-text:#ffffff;
  }
  *{box-sizing:border-box}
  html,body{height:100%}
  body{margin:0;font-family:var(--sans);color:var(--ink);
    background:var(--body-bg);
    overflow:hidden}
  button{font-family:var(--sans)}
  /* ---------- App frame ---------- */
  .app{display:flex;flex-direction:column;height:100vh;max-width:1480px;margin:0 auto}
  .topbar{height:56px;flex:0 0 auto;display:flex;align-items:center;gap:16px;
    padding:0 18px;border-bottom:1px solid var(--edge);background:var(--topbar-bg);
    backdrop-filter:blur(10px);position:relative;z-index:30}
  .brand{display:flex;align-items:center;gap:10px}
  .brand .logo{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,#12324a,#0c2236);
    border:1px solid var(--edge2);display:flex;align-items:center;justify-content:center;overflow:hidden}
  .brand .logo img{width:72%;height:72%;object-fit:contain;border-radius:6px}
  .brand .t1{font-size:15px;font-weight:600;letter-spacing:.02em}
  .brand .t2{font-size:11px;color:var(--faint);letter-spacing:.06em}
  .spacer{flex:1}
  .topmeta{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--muted)}
  .ver{font-family:var(--mono);color:var(--faint);border:1px solid var(--edge);border-radius:6px;padding:3px 8px}
  .top-actions{display:flex;gap:8px;align-items:center;flex:0 1 auto;min-width:0}
  .top-actions .btn{flex:0 0 auto}
  /* ---------- Body row ---------- */
  .row{flex:1;display:flex;min-height:0}
  /* Sidebar */
  .nav{width:216px;flex:0 0 auto;border-right:1px solid var(--edge);
    background:var(--nav-bg);
    padding:14px 10px;display:flex;flex-direction:column;gap:4px;position:relative;z-index:20;
    overflow-y:auto;scrollbar-width:thin;scrollbar-color:#3d5875 var(--bg1)}
  /* 导航宽度拖拽手柄：贴在导航右缘，折叠态/窄屏隐藏 */
  .nav-resizer{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize;z-index:25;background:transparent;transition:background .15s}
  .nav-resizer:hover,.nav-resizer.drag{background:rgba(71,193,224,.35)}
  body.nav-collapsed .nav-resizer{display:none}
  .nav .group-label{font-size:11px;letter-spacing:.1em;color:var(--faint);padding:12px 10px 6px}
  .nav-item{display:flex;align-items:center;gap:11px;padding:11px 12px;border-radius:9px;
    color:var(--muted);cursor:pointer;border:1px solid transparent;font-size:13.5px;transition:.16s}
  .nav-item svg{flex:0 0 auto;opacity:.85}
  /* 业务模块导航项支持拖拽排序 */
  #customNavList .nav-item{cursor:grab}
  #customNavList .nav-item:active{cursor:grabbing}
  .nav-item:hover{background:rgba(255,255,255,.04);color:var(--ink)}
  .nav-item.active{background:var(--accent-dim);border-color:rgba(71,193,224,.35);color:var(--accent2)}
  .nav-item .dot{margin-left:auto;width:8px;height:8px;border-radius:50%;background:var(--faint)}
  .recent-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .recent-empty{font-size:12px;color:var(--faint);padding:8px 12px;line-height:1.6}
  .nav-item .dot.ok{background:var(--green);box-shadow:0 0 8px rgba(99,214,155,.7)}
  .nav-item .dot.warn{background:var(--amber)}
  .nav-item .dot.off{background:var(--red)}
  .nav-bottom{margin-top:auto}
  /* Main */
  .main{flex:1;min-width:0;display:flex;flex-direction:column;position:relative}
  .view{flex:1;overflow:auto;padding:clamp(18px,3vw,30px);opacity:1}
  .view.hide{display:none}
  @keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
  /* Status bar */
  .statusbar{height:34px;flex:0 0 auto;display:flex;align-items:center;gap:22px;
    padding:0 16px;border-top:1px solid var(--edge);background:var(--status-bg);
    font-family:var(--mono);font-size:12px;color:var(--muted)}
  .st{display:flex;align-items:center;gap:7px}
  .st .led{width:8px;height:8px;border-radius:50%;background:var(--faint)}
  .st.on .led{background:var(--green);box-shadow:0 0 8px rgba(99,214,155,.8)}
  .st.warn .led{background:var(--amber);box-shadow:0 0 8px rgba(240,183,90,.8)}
  .st.off .led{background:var(--red)}
  .st .k{color:var(--faint)}
  .statusbar .rt{margin-left:auto;color:var(--faint)}
  /* ---------- Launcher view ---------- */
  .hero{display:flex;gap:clamp(20px,3vw,34px);align-items:center;min-height:420px}
  .hero .copy{flex:1 1 400px}
  .hero h1{font-size:clamp(24px,3.6vw,34px);line-height:1.2;margin:0 0 12px;font-weight:650;letter-spacing:.005em}
  .hero h1 .accent{color:var(--accent2)}
  .hero p{color:var(--muted);font-size:clamp(14px,1.4vw,15px);line-height:1.75;margin:0 0 26px;max-width:520px}
  .hero .cta-row{display:flex;gap:12px;flex-wrap:wrap}
  .btn{display:inline-flex;align-items:center;gap:8px;padding:12px 20px;border-radius:9px;
    border:1px solid var(--edge2);background:var(--panel2);color:var(--ink);cursor:pointer;
    font-size:14px;font-weight:600;transition:.18s;user-select:none}
  .btn:hover{border-color:var(--accent);background:var(--panel3)}
  .btn.primary{background:var(--accent);border-color:transparent;color:var(--on-accent)}
  .btn.primary:hover{filter:brightness(1.08)}
  .btn.ghost{background:transparent}
  .btn.danger{background:transparent;color:var(--red);border-color:rgba(239,111,111,.4)}
  .btn.danger:hover{background:rgba(239,111,111,.08);border-color:var(--red)}
  .btn .key{font-family:var(--mono);font-size:11px;color:var(--faint)}
  .env-chips{display:flex;gap:10px;flex-wrap:wrap;margin-top:26px}
  .chip{display:flex;align-items:center;gap:8px;padding:7px 12px;border-radius:20px;font-size:12.5px;
    border:1px solid var(--edge);background:var(--panel);color:var(--muted)}
  .chip .led{width:7px;height:7px;border-radius:50%;background:var(--faint)}
  .chip.ok .led{background:var(--green)} .chip.ok{color:var(--ink)}
  .chip.warn .led{background:var(--amber)}
  .hero .viz{flex:0 0 clamp(340px,28vw,440px)}
  .viz-wrap{position:relative;border:1px solid var(--edge);border-radius:16px;overflow:hidden;
    background:var(--viz-bg);
    aspect-ratio:1.15;display:flex;align-items:center;justify-content:center}
  .viz-wrap .glow{position:absolute;inset:0;background:var(--glow)}
  .viz-wrap .badge{position:absolute;top:12px;left:12px;font-size:11px;letter-spacing:.08em;
    color:var(--accent2);border:1px solid var(--edge2);background:var(--accent-dim);
    padding:5px 10px;border-radius:6px;font-family:var(--mono)}
  /* feature cards */
  .cards{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-top:34px}
  .card{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);
    padding:20px;transition:.2s;cursor:pointer}
  .card:hover{border-color:var(--edge2);transform:translateY(-2px)}
  .card .ico{width:40px;height:40px;border-radius:10px;background:var(--accent-dim);
    display:flex;align-items:center;justify-content:center;margin-bottom:14px}
  .card h3{margin:0 0 6px;font-size:16px;font-weight:600}
  .card p{margin:0;color:var(--muted);font-size:13px;line-height:1.65}
  .card .tag{margin-top:12px;display:inline-block;font-size:11px;color:var(--accent2);
    border:1px solid var(--edge2);padding:3px 9px;border-radius:5px;font-family:var(--mono)}
  .section-label{font-size:11px;letter-spacing:.12em;color:var(--faint);margin:30px 0 14px;
    display:flex;align-items:center;gap:8px}
  /* 启动台 · 业务板块网格 */
  .mod-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:14px}
  .mod-card{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);
    padding:18px;display:flex;flex-direction:column;gap:10px;transition:.2s;cursor:pointer}
  .mod-card:hover{border-color:var(--edge2);transform:translateY(-2px)}
  .mod-card .mc-top{display:flex;align-items:center;gap:12px}
  .mod-card .ico{width:38px;height:38px;border-radius:10px;background:var(--accent-dim);
    display:flex;align-items:center;justify-content:center;flex:0 0 auto}
  .mod-card .mc-name{font-size:15.5px;font-weight:600}
  .mod-card .mc-count{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--faint);
    border:1px solid var(--edge);border-radius:5px;padding:2px 8px;flex:0 0 auto}
  .mod-card p{margin:0;color:var(--muted);font-size:12.5px;line-height:1.6;flex:1;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .mod-card .mc-foot{display:flex;align-items:center;gap:8px}
  .mod-card .tag{font-size:11px;color:var(--accent2);border:1px solid var(--edge2);
    padding:3px 9px;border-radius:5px;font-family:var(--mono)}
  .mod-card .mc-go{margin-left:auto;color:var(--faint);font-size:12px}
  .home-recent{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px;margin-top:14px}
  .home-empty{font-size:12.5px;color:var(--faint);padding:14px 4px;line-height:1.7}
  @media(max-width:1100px){.mod-grid{grid-template-columns:repeat(2,1fr)}}
  /* ---------- CAD chat view ---------- */
  /* ===== CAD 智能体 · 豆包风格 ===== */
  .cad{display:flex;gap:18px;height:100%;min-height:0}
  /* 对话区 / 信息面板拖拽手柄：落在两栏间隙中央，纵向堆叠窄屏隐藏 */
  .cad-resizer{flex:0 0 6px;align-self:stretch;margin:0 -6px;cursor:col-resize;border-radius:3px;background:transparent;transition:background .15s;z-index:5}
  .cad-resizer:hover,.cad-resizer.drag{background:rgba(71,193,224,.35)}
  body.resizing{user-select:none;cursor:col-resize}
  body.resizing .cad-resizer,body.resizing .nav-resizer{background:rgba(71,193,224,.35)}
  .chat{flex:1 1 60%;display:flex;flex-direction:column;min-width:0;min-height:0;
    background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);overflow:hidden}
  .chat-head{display:flex;align-items:center;gap:12px;padding:15px 20px;border-bottom:1px solid var(--edge);
    background:var(--panel)}
  .ai-head{display:flex;align-items:center;gap:11px}
  .ai-ava{width:36px;height:36px;border-radius:11px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;
    font-weight:700;font-size:15px;color:var(--on-accent);
    background:linear-gradient(135deg,var(--accent),var(--accent2));box-shadow:0 4px 12px var(--accent-dim)}
  .msg.ai .ai-ava{width:32px;height:32px;border-radius:10px;font-size:13.5px}
  .chat-head .t{font-weight:600;font-size:14.5px}
  .chat-head .sub{font-size:11.5px;color:var(--faint);font-family:var(--mono);margin-top:2px}
  .chat-head .pill{margin-left:auto;font-size:11.5px;color:var(--green);border:1px solid rgba(99,214,155,.4);
    padding:4px 11px;border-radius:999px;background:rgba(99,214,155,.08)}
  .chat-head .pill.cloud{color:var(--amber);border-color:rgba(240,183,90,.45);background:rgba(240,183,90,.08)}
  .cloud-warn{margin:0 20px 6px;padding:9px 12px;border:1px solid rgba(240,183,90,.45);background:rgba(240,183,90,.08);
    color:var(--amber);font-size:12px;border-radius:9px;line-height:1.55}
  .thread{flex:1;overflow:auto;padding:24px 20px 12px;display:flex;flex-direction:column;gap:22px}
  .msg{max-width:84%;display:flex;gap:11px}
  .msg.user{align-self:flex-end}
  .msg.user .bubble{background:var(--user-bubble);border:1px solid var(--user-edge);
    padding:12px 15px;border-radius:18px 18px 5px 18px;font-size:14px;line-height:1.7;color:var(--user-bubble-text);font-weight:500}
  .msg.ai{align-self:stretch;max-width:100%}
  .ai-body{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:7px}
  .stage-row{display:flex;gap:8px;align-items:center}
  .ai-text{font-size:14px;line-height:1.8;color:var(--ink);padding:4px 0}
  .ai-text p{margin:8px 0}
  .ai-text ol,.ai-text ul{margin:8px 0;padding-left:24px}
  .ai-text li{margin:4px 0}
  .ai-text table{margin:12px 0;border-radius:8px;overflow:hidden}
  .ai-card{background:var(--panel2);border:1px solid var(--edge);border-radius:14px;
    padding:16px 20px;font-size:13.5px;line-height:1.8;color:var(--ink)}
  .stage{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:2px 9px;border-radius:5px;
    font-family:var(--mono)}
  .stage.think{background:rgba(240,183,90,.12);color:var(--amber)}
  .stage.tool{background:rgba(71,193,224,.12);color:var(--accent2)}
  .stage.res{background:rgba(99,214,155,.12);color:var(--green)}
  .typing{display:inline-flex;gap:4px;padding:4px 2px}
  .typing span{width:6px;height:6px;border-radius:50%;background:var(--faint);animation:blink 1.2s infinite}
  .typing span:nth-child(2){animation-delay:.2s}.typing span:nth-child(3){animation-delay:.4s}
  @keyframes blink{0%,80%,100%{opacity:.25}40%{opacity:1}}
  .composer-resizer{height:6px;cursor:ns-resize;background:transparent;display:flex;align-items:center;justify-content:center;flex-shrink:0}
  .composer-resizer:hover{background:var(--edge)}
  .composer{padding:16px 20px 18px;border-top:1px solid var(--edge);background:var(--panel)}
  .composer textarea{width:100%;background:transparent;border:none;resize:none;outline:none;color:var(--ink);
    font-size:14px;font-family:var(--sans);line-height:1.6;min-height:26px;max-height:180px;padding:2px 2px 10px}
  .comp-bar{display:flex;align-items:center;gap:6px}
  .comp-tools{display:flex;gap:2px}
  .tool-btn{width:36px;height:36px;border-radius:10px;border:1px solid transparent;background:transparent;
    color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s}
  .tool-btn:hover{background:var(--panel2);color:var(--ink)}
  /* 语音输入：录音中红色脉动，识别中半透明且不可重复点 */
  .tool-btn.is-rec{color:#e5484d;background:rgba(229,72,77,.12);animation:voicePulse 1.2s ease-in-out infinite}
  .tool-btn.is-busy{opacity:.55;cursor:progress}
  @keyframes voicePulse{0%,100%{box-shadow:0 0 0 0 rgba(229,72,77,.35)}50%{box-shadow:0 0 0 6px rgba(229,72,77,0)}}
  .composer .send{margin-left:auto;width:38px;height:38px;border-radius:50%;border:none;background:var(--accent);
    color:var(--on-accent);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:.15s}
  .composer .send:hover{filter:brightness(1.08);transform:translateY(-1px)}
  /* result panel */
  .result{flex:1 1 40%;min-width:0;display:flex;flex-direction:column;gap:14px;overflow:auto}
  .r-card{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);padding:18px}
  .r-card h4{margin:0 0 14px;font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px}
  .r-card h4 .bar{width:3px;height:14px;background:var(--accent);border-radius:2px}
  .kv{display:flex;flex-direction:column;gap:10px}
  .kv .row{display:flex;justify-content:space-between;font-size:13px;border-bottom:1px dashed var(--edge);padding-bottom:8px}
  .kv .k{color:var(--muted)} .kv .v{font-family:var(--mono);color:var(--ink)}
  .kv .v.ok{color:var(--green)} .kv .v.warn{color:var(--amber)}
  .log{font-family:var(--mono);font-size:12px;line-height:1.8;color:var(--muted)}
  .log .l{padding:2px 0;border-left:2px solid var(--edge);padding-left:10px;margin-bottom:2px}
  .log .l.ok{border-color:var(--green)} .log .l.tool{border-color:var(--accent)}
  .log .t{color:var(--faint)}
  .views-chip{display:flex;gap:6px;margin-bottom:8px;flex-wrap:wrap}
  .views-chip span{font-size:11px;font-family:var(--mono);padding:3px 9px;border-radius:5px;color:var(--faint);
    border:1px solid var(--edge)}
  .views-chip span.on{color:var(--green);border-color:rgba(99,214,155,.4);background:rgba(99,214,155,.08)}
  /* 对话历史会话列表（#31，阶段 B 最小新增） */
  .session-new{margin-left:auto;font-size:12px;border:1px solid var(--edge);background:transparent;color:var(--muted);
    border-radius:8px;padding:4px 10px;cursor:pointer;transition:.15s}
  .session-new:hover{background:var(--panel2);color:var(--ink)}
  .session-list{display:flex;flex-direction:column;gap:6px;max-height:220px;overflow:auto}
  .session-empty{font-size:12px;color:var(--faint);padding:6px 0}
  .session-item{display:flex;align-items:center;gap:8px;border:1px solid var(--edge);border-radius:10px;padding:8px 10px;cursor:pointer;transition:.15s}
  .session-item:hover{background:var(--panel2)}
  .session-item.active{border-color:rgba(99,214,155,.4);background:rgba(99,214,155,.08)}
  .session-item .s-title{flex:1;min-width:0;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .session-item .s-time{font-size:11px;color:var(--faint);font-family:var(--mono)}
  .session-item .s-ops{display:flex;gap:2px;flex:none}
  .session-item .s-op{width:26px;height:26px;border:none;background:transparent;color:var(--faint);border-radius:7px;cursor:pointer;display:flex;align-items:center;justify-content:center}
  .session-item .s-op:hover{background:var(--panel2);color:var(--ink)}
  /* ---------- Modal ---------- */
  .overlay{position:fixed;inset:0;background:rgba(4,8,14,.62);backdrop-filter:blur(3px);display:none;
    align-items:center;justify-content:center;z-index:60}
  .overlay.show{display:flex}
  .modal{width:min(560px,92vw);background:var(--panel2);border:1px solid var(--edge2);border-radius:16px;
    padding:22px;box-shadow:0 30px 80px rgba(0,0,0,.5);animation:pop .2s ease}
  @keyframes pop{from{transform:scale(.96);opacity:0}to{transform:none;opacity:1}}
  .modal h3{margin:0 0 4px;font-size:17px}
  .modal .sub{color:var(--muted);font-size:13px;margin:0 0 18px}
  .m-row{display:flex;justify-content:space-between;align-items:center;padding:13px 2px;
    border-bottom:1px solid var(--edge);font-size:13.5px}
  .m-row .l{color:var(--ink)} .m-row .d{color:var(--faint);font-size:12px;margin-top:2px}
  .m-row .k{margin-left:auto;display:flex;align-items:center;gap:8px}
  .toggle{width:42px;height:23px;border-radius:12px;background:var(--panel3);border:1px solid var(--edge2);
    cursor:pointer;position:relative;transition:.2s}
  .toggle.on{background:var(--accent);border-color:transparent}
  .toggle::after{content:"";position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;
    background:var(--thumb);transition:.2s}
  .toggle.on::after{left:21px;background:var(--thumb-on)}
  .toggle.locked{cursor:not-allowed}
  .modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}
  .mono-input{width:100%;background:var(--bg1);border:1px solid var(--edge);border-radius:8px;color:var(--ink);
    font-family:var(--mono);font-size:12.5px;padding:10px 12px;margin-top:6px}
  /* theme picker */
  .theme-pick{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px}
  .tpick{display:inline-flex;align-items:center;gap:9px;padding:9px 13px;border-radius:9px;
    border:1px solid var(--edge2);background:var(--panel);color:var(--ink);cursor:pointer;font-size:13px;font-weight:600}
  .tpick.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
  .tpick .sw{width:20px;height:20px;border-radius:6px;border:1px solid var(--edge2)}
  .brand-logo-row{display:flex;align-items:center;gap:16px;margin-top:10px;flex-wrap:wrap}
  .brand-preview{width:52px;height:52px;border-radius:12px;background:linear-gradient(135deg,#12324a,#0c2236);
    border:1px solid var(--edge2);display:flex;align-items:center;justify-content:center;overflow:hidden;flex:0 0 auto}
  .brand-preview img{width:74%;height:74%;object-fit:contain;border-radius:8px}
  .brand-actions{display:flex;gap:10px;flex-wrap:wrap}
  .sw-deep{background:linear-gradient(135deg,#101b2c,#47c1e0)}
  .sw-light{background:linear-gradient(135deg,#ffffff,#1f7fa8)}
  .sw-graphite{background:linear-gradient(135deg,#191921,#f0a33a)}
  .sw-auto{background:linear-gradient(135deg,#101b2c 50%,#ffffff 50%)}
  .theme-cycle{display:inline-flex;align-items:center;gap:7px}
  .theme-cycle .cur{font-family:var(--mono);font-size:10px;color:var(--faint)}
  /* ---------- Settings page ---------- */
  .set-wrap{display:grid;grid-template-columns:210px 1fr;gap:18px;align-items:start}
  .set-side{background:var(--panel2);border:1px solid var(--edge2);border-radius:14px;padding:10px;position:sticky;top:14px}
  .set-side .set-tab{display:flex;align-items:center;gap:9px;width:100%;padding:10px 12px;border-radius:9px;border:0;
    background:transparent;color:var(--muted);font-size:13px;cursor:pointer;text-align:left}
  .set-side .set-tab:hover{background:var(--panel);color:var(--ink)}
  .set-side .set-tab.active{color:var(--green);background:var(--accent-dim)}
  .set-side .set-tab svg{width:16px;height:16px;flex:0 0 auto}
  .set-main{display:flex;flex-direction:column;gap:16px;min-width:0}
  .set-sec{scroll-margin-top:14px}
  .set-sec .sec-title{font-size:13px;font-weight:600;color:var(--muted);letter-spacing:.03em;margin:2px 0 10px}
  .set-row{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:14px 2px;border-bottom:1px solid var(--edge);font-size:13.5px}
  .set-row:last-child{border-bottom:0}
  .set-row .set-info{min-width:0;flex:1}
  .set-row .set-info .l{color:var(--ink)}
  .set-row .set-info .d{color:var(--faint);font-size:12px;margin-top:3px;line-height:1.5}
  .set-row .set-ctrl{margin-left:auto;display:flex;align-items:center;gap:10px;flex:0 0 auto}
  .set-select{background:var(--bg1);border:1px solid var(--edge);border-radius:8px;color:var(--ink);font-size:12.5px;padding:8px 10px;min-width:150px}
  .set-select:focus{outline:none;border-color:var(--accent)}
  .set-range{display:flex;align-items:center;gap:10px;min-width:220px}
  .set-range input[type=range]{flex:1;accent-color:var(--accent)}
  .set-range .rv{font-family:var(--mono);font-size:12px;color:var(--green);min-width:74px;text-align:right}
  .set-note{display:flex;align-items:center;gap:8px;color:var(--faint);font-size:12px;margin-top:12px}
  .web-offline-note,.perm-lock-note{display:inline-flex;margin-left:8px;padding:1px 7px;border-radius:5px;font-size:11px;line-height:1.6;vertical-align:middle}
  .web-offline-note{color:var(--amber);border:1px solid rgba(214,164,94,.35);background:rgba(214,164,94,.08)}
  .perm-lock-note{color:var(--muted);border:1px solid var(--edge);background:var(--panel2)}
  .set-web-offline .set-ctrl{opacity:.45;filter:grayscale(.4)}
  .set-web-offline .web-offline-control,.set-no-perm .perm-locked{pointer-events:none;cursor:not-allowed}
  .set-no-perm .set-ctrl{opacity:.6}
  .set-status{display:inline-flex;align-items:center;gap:6px;font-size:12px}
  .set-status .dot{width:8px;height:8px;border-radius:50%;background:var(--green)}
  /* ---------- 在线升级面板 ---------- */
  .upd-head{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;padding:14px 2px;border-bottom:1px solid var(--edge)}
  .upd-head .set-info{min-width:0;flex:1}
  .upd-head .set-info .l{color:var(--ink)}
  .upd-head .set-info .d{color:var(--faint);font-size:12px;margin-top:3px;line-height:1.5}
  .ver-chip{font-family:var(--mono);font-size:12.5px;color:var(--green);border:1px solid rgba(99,214,155,.35);background:rgba(99,214,155,.08);padding:5px 11px;border-radius:7px;white-space:nowrap}
  .ver-chip.old{color:var(--amber);border-color:rgba(240,183,90,.4);background:rgba(240,183,90,.08)}
  .upd-card{margin-top:14px;border:1px solid var(--edge2);border-radius:12px;background:var(--panel);padding:16px}
  .upd-ver{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
  .upd-ver .nv{font-size:18px;font-weight:650;font-family:var(--mono);color:var(--accent2)}
  .upd-ver .meta{font-size:12px;color:var(--faint);font-family:var(--mono)}
  .upd-meta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:14px 0}
  .upd-meta-grid .m{background:var(--bg1);border:1px solid var(--edge);border-radius:9px;padding:10px 12px}
  .upd-meta-grid .m .k{font-size:11px;color:var(--faint)}
  .upd-meta-grid .m .v{font-size:12.5px;color:var(--ink);font-family:var(--mono);margin-top:4px;word-break:break-all}
  .upd-log{margin:6px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}
  .upd-log .grp{font-size:12.5px;color:var(--muted);font-weight:600;margin-top:4px}
  .upd-log li{font-size:12.5px;color:var(--ink);padding-left:16px;position:relative;line-height:1.55}
  .upd-log li::before{content:"";position:absolute;left:2px;top:8px;width:5px;height:5px;border-radius:50%;background:var(--accent)}
  .upd-steps{display:flex;flex-direction:column;gap:0;margin-top:14px}
  .upd-step{display:flex;gap:12px;align-items:flex-start;padding:11px 2px;border-bottom:1px dashed var(--edge)}
  .upd-step:last-child{border-bottom:0}
  .upd-step .st-ic{width:22px;height:22px;flex:0 0 auto;border-radius:50%;border:1px solid var(--edge);display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--faint);font-family:var(--mono)}
  .upd-step .st-body{flex:1;min-width:0}
  .upd-step .st-t{font-size:13px;color:var(--ink)}
  .upd-step .st-d{font-size:11.5px;color:var(--faint);margin-top:2px}
  .upd-step.doing .st-ic{border-color:var(--accent);color:var(--accent2);background:var(--accent-dim)}
  .upd-step.done .st-ic{border-color:rgba(99,214,155,.4);color:var(--green);background:rgba(99,214,155,.08)}
  .upd-step.done .st-t{color:var(--green)}
  .upd-step.fail .st-ic{border-color:rgba(239,111,111,.4);color:var(--red);background:rgba(239,111,111,.08)}
  .upd-prog{height:8px;border-radius:6px;background:var(--bg1);border:1px solid var(--edge);overflow:hidden;margin:12px 0 4px}
  .upd-prog>i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--accent),var(--green));transition:width .3s ease;border-radius:6px}
  .upd-prog-txt{display:flex;justify-content:space-between;font-size:11.5px;color:var(--muted);font-family:var(--mono)}
  .upd-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}
  .upd-actions .btn{min-width:120px;justify-content:center}
  .upd-ok{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;border:1px solid rgba(99,214,155,.35);background:rgba(99,214,155,.07);border-radius:10px;color:var(--green);font-size:13px;line-height:1.6;margin-top:14px}
  .upd-hidden{display:none}
  body.compact .r-card{padding:14px}
  body.compact .m-row,.set-row{padding:10px 2px}
  body[data-font-size="small"] .app{zoom:.92}
  body[data-font-size="large"] .app{zoom:1.08}
  body.density-relaxed .r-card{padding:22px}
  body.density-relaxed .m-row,.set-row{padding:14px 2px}
  body.nav-collapsed .nav{width:64px;padding:14px 8px}
  body.nav-collapsed .group-label, body.nav-collapsed #grpModule{display:none}
  body.nav-collapsed .nav-item{justify-content:center;gap:0;padding:11px 0;font-size:0}
  body.nav-collapsed .recent-title,body.nav-collapsed .nav-item .dot{display:none}
  @media (max-width:860px){
    .set-wrap{grid-template-columns:1fr}
    .set-side{position:static;display:flex;gap:6px;overflow-x:auto;padding:8px}
    .set-side .set-tab{white-space:nowrap;flex:0 0 auto}
    .set-row{flex-direction:column;align-items:flex-start;gap:10px}
    .set-row .set-ctrl{margin-left:0}
  }
  /* toast */
  .toast{position:fixed;left:50%;bottom:52px;transform:translateX(-50%) translateY(20px);
    background:var(--panel3);border:1px solid var(--edge2);color:var(--ink);padding:11px 18px;border-radius:9px;
    font-size:13px;opacity:0;pointer-events:none;transition:.25s;z-index:80;box-shadow:0 12px 34px rgba(0,0,0,.4)}
  .toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
  /* ---------- Login / access gate ---------- */
  #loginGate{position:fixed;inset:0;background:var(--body-bg);z-index:90;display:flex;
    align-items:center;justify-content:center;padding:20px;overflow:auto}
  #loginGate.hide{display:none}
  .lg-card{width:min(440px,94vw);background:var(--panel2);border:1px solid var(--edge2);border-radius:18px;
    padding:clamp(20px,3vw,28px);box-shadow:0 40px 90px rgba(0,0,0,.45);animation:pop .22s ease}
  .lg-brand{display:flex;align-items:center;gap:12px;margin-bottom:16px}
  .lg-brand .lg-logo{width:40px;height:40px;border-radius:10px;background:linear-gradient(135deg,#12324a,#0c2236);
    border:1px solid var(--edge2);display:flex;align-items:center;justify-content:center;overflow:hidden}
  .lg-brand .lg-logo img{width:72%;height:72%;object-fit:contain;border-radius:7px}
  .lg-t1{font-size:16px;font-weight:650;letter-spacing:.02em}
  .lg-t2{font-size:11px;color:var(--faint);letter-spacing:.06em}
  .lg-srv{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11.5px;color:var(--muted);
    border:1px solid var(--edge);border-radius:8px;padding:8px 10px;margin-bottom:20px}
  .lg-srv .led{width:8px;height:8px;border-radius:50%;background:var(--green);box-shadow:0 0 8px rgba(99,214,155,.7)}
  #loginGate h2{margin:0 0 4px;font-size:20px}
  .lg-sub{color:var(--muted);font-size:13px;margin:0 0 14px;line-height:1.6}
  #loginGate label{display:block;font-size:12.5px;color:var(--faint);margin:14px 0 6px;letter-spacing:.02em}
  .lg-input{width:100%;background:var(--bg1);border:1px solid var(--edge);border-radius:9px;color:var(--ink);
    font-size:16px;padding:11px 13px}
  .lg-input:focus{outline:none;border-color:var(--accent)}
  .role-pick{display:flex;flex-direction:column;gap:8px;margin-top:4px}
  .rpick{display:flex;align-items:center;gap:12px;padding:11px 13px;border-radius:10px;border:1px solid var(--edge2);
    background:var(--panel);color:var(--ink);cursor:pointer;text-align:left;transition:.16s}
  .rpick:hover{border-color:var(--accent)}
  .rpick.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset;background:var(--accent-dim)}
  .rpick .rp-rank{display:flex;gap:3px;flex:0 0 auto}
  .rpick .rp-rank i{width:6px;height:6px;border-radius:50%;background:var(--faint)}
  .rpick.active .rp-rank i{background:var(--accent)}
  .rpick b{font-size:14px;display:block;line-height:1.2}
  .rpick em{display:block;font-style:normal;font-size:11.5px;color:var(--faint);margin-top:2px}
  .lg-btn{flex:1;justify-content:center;margin-top:20px;padding:13px}
  .lg-btn + .lg-btn{margin-left:0}
  .lg-actions{display:flex;gap:10px}
  .lg-actions .lg-btn:first-child{margin-top:20px}
  .lg-foot{text-align:center;font-size:11.5px;color:var(--faint);margin-top:14px}
  /* role badge & user chip */
  .userchip{display:flex;align-items:center;gap:8px;padding:5px 9px 5px 5px;border:1px solid var(--edge);
    border-radius:20px;background:var(--panel);min-width:0;flex:0 1 auto;max-width:220px}
  .userchip .ava{width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,var(--accent),var(--accent2));
    color:var(--on-accent);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:0 0 auto}
  .userchip > span:last-child{display:flex;flex-direction:column;min-width:0;line-height:1.25;gap:1px}
  .userchip .u-name{display:block;font-size:12.5px;color:var(--ink);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .userchip .u-role{display:block;font-size:10.5px;color:var(--faint);font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .role-badge{font-size:10.5px;font-family:var(--mono);padding:3px 8px;border-radius:5px;letter-spacing:.03em;white-space:nowrap;flex:0 0 auto}
  .role-badge.user{background:var(--accent-dim);color:var(--accent2);border:1px solid rgba(71,193,224,.35)}
  .role-badge.admin{background:rgba(240,183,90,.12);color:var(--amber);border:1px solid rgba(240,183,90,.4)}
  .role-badge.super{background:rgba(99,214,155,.12);color:var(--green);border:1px solid rgba(99,214,155,.4)}
  .topbar .logout{color:var(--muted);padding:8px 12px;font-size:13px}
  /* management pages */
  .pg-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap;margin-bottom:20px}
  .pg-head h2{margin:0 0 6px;font-size:22px;font-weight:650}
  .pg-head p{color:var(--muted);font-size:13.5px;margin:0;line-height:1.6;max-width:640px}
  .pg-head .pg-tools{margin-left:auto;display:flex;gap:10px}
  .mng-table{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);overflow:hidden}
  .kb-note{margin:0 0 14px;padding:12px 14px;border:1px solid var(--edge);border-left:3px solid var(--accent2);border-radius:10px;background:var(--panel);color:var(--muted);font-size:12.5px;line-height:1.7}
  .kb-upload{margin:0 0 14px;padding:14px;border:1px solid var(--edge);border-radius:var(--radius);background:var(--panel)}
  .kb-upload-t{font-size:13px;font-weight:600;margin-bottom:10px;color:var(--ink)}
  .kb-upload-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
  .kb-upload-row .mono-input{flex:1 1 180px;min-width:150px;width:auto}
  .kb-upload-row .set-select{flex:0 0 auto}
  .kb-file-btn{display:inline-flex;align-items:center;padding:9px 13px;border:1px dashed var(--edge);border-radius:8px;color:var(--accent2);font-size:12.5px;cursor:pointer;white-space:nowrap}
  .kb-file-btn:hover{border-color:var(--accent2)}
  .kb-file-name{font-size:12px;color:var(--muted);max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .kb-upload-row .btn{padding:9px 16px;font-size:12.5px}
  .kb-upload-status{margin-top:10px;font-size:12.5px;line-height:1.6}
  .kb-upload-status.ok{color:var(--green)}
  .kb-upload-status.err{color:var(--red)}
  /* 嵌入模型守卫条：换过嵌入模型 / 维度变化时提示并支持一键重建 */
  .kb-embed-guard{display:flex;gap:14px;align-items:flex-start;margin:0 0 14px;padding:13px 15px;border:1px solid var(--edge);border-left:3px solid var(--amber);border-radius:10px;background:var(--panel2);flex-wrap:wrap}
  .kb-embed-guard.warn{border-left-color:var(--amber)}
  .kb-embed-guard.busy{border-left-color:var(--accent2)}
  .kb-embed-guard.note{border-left-color:var(--muted)}
  .kb-embed-guard.ok{border-left-color:var(--green)}
  .kb-embed-guard-main{flex:1 1 320px;min-width:0}
  .kb-embed-guard-title{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:5px}
  .kb-embed-guard-desc{font-size:12px;line-height:1.65;color:var(--muted);overflow-wrap:break-word}
  .kb-embed-guard .btn{padding:8px 14px;font-size:12.5px;white-space:nowrap}
  .kb-del{cursor:pointer;color:var(--red);font-family:var(--mono);font-size:12px}
  .kb-src{font-size:12px;color:var(--muted);overflow-wrap:break-word}
  .kb-module-pick{margin-top:12px;padding-top:12px;border-top:1px dashed var(--edge)}
  .kb-module-pick-t{font-size:12.5px;font-weight:600;color:var(--ink);margin-bottom:8px}
  .kb-module-chips{display:flex;flex-wrap:wrap;gap:8px}
  .kb-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 11px;border:1px solid var(--edge);border-radius:8px;font-size:12px;color:var(--muted);cursor:pointer;user-select:none;min-width:0}
  .kb-chip input{accent-color:var(--accent2);margin:0;flex:0 0 auto}
  .kb-chip.on{border-color:var(--accent2);color:var(--ink);background:var(--accent-dim)}
  .kb-module-hint{margin-top:8px;font-size:11.5px;color:var(--muted);line-height:1.6}
  .kb-filter-row{display:flex;align-items:center;gap:10px;margin:0 0 10px;flex-wrap:wrap}
  .kb-filter-label{font-size:12.5px;color:var(--muted);white-space:nowrap}
  .kb-filter-row .set-select{flex:0 0 auto;min-width:170px}
  .kb-mod-tag{display:inline-block;padding:1px 7px;border-radius:6px;font-size:11px;margin:1px 3px 1px 0;background:var(--panel2);color:var(--muted);border:1px solid var(--edge);white-space:nowrap}
  .kb-mod-tag.pub{color:var(--accent2);border-color:var(--accent2)}
  /* B3 两级审批：提交入口、分区与审批弹窗 */
  .kb-sub-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:4px 0 12px;flex-wrap:wrap}
  .kb-sub-title{font-size:13.5px;font-weight:600;color:var(--ink);margin-bottom:4px}
  .kb-sub-hint{font-size:12px;color:var(--muted);line-height:1.6;max-width:640px}
  .kb-channel{margin:0 0 20px;padding:16px 18px;border:1px solid var(--edge);border-radius:var(--radius);background:var(--panel)}
  .kb-channel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:14px;flex-wrap:wrap}
  .kb-channel-title{font-size:14px;font-weight:600;color:var(--ink);letter-spacing:.2px}
  .kb-channel-desc{margin-top:5px;font-size:12px;color:var(--muted);line-height:1.65;max-width:760px}
  .kb-queue{margin-top:22px}
  .kb-queue .kb-sub-title{margin-bottom:10px}
  .sub-review-content{white-space:pre-wrap;line-height:1.7;font-size:13px;color:var(--ink);background:var(--panel2);border:1px solid var(--edge);border-radius:8px;padding:12px;max-height:240px;overflow:auto}
  .sub-review-att{font-size:13px}
  .sub-review-att .kb-file-name{color:var(--muted);font-size:12px}
  .kb-refs{margin-top:10px;padding-top:10px;border-top:1px dashed var(--edge)}
  /* 设置页「对话中显示参考资料」关闭：只隐藏知识库引用块，技能标注（.kb-skill-refs）保持显示 */
  body.hide-kb-refs .kb-refs:not(.kb-skill-refs){display:none}
  .kb-refs-t{font-size:11.5px;color:var(--muted);margin-bottom:6px;letter-spacing:.02em}
  .kb-ref{display:block;font-size:12px;color:var(--muted);line-height:1.6;padding:3px 0}
  .kb-ref b{color:var(--accent2);font-weight:600}
.kb-skill-refs{border-top-color:var(--accent2)}
.kb-skill-ref b{color:var(--accent)}
  .kb-detail{margin-top:14px;padding:14px;border:1px solid var(--edge);border-radius:var(--radius);background:var(--panel)}
  .kb-detail-t{font-size:13px;font-weight:600;margin-bottom:4px}
  .kb-detail-meta{font-size:12px;color:var(--muted);margin-bottom:10px}
  .kb-detail-chunk{font-size:12.5px;line-height:1.7;color:var(--ink);padding:8px 10px;border:1px solid var(--edge);border-radius:8px;margin-bottom:8px;background:var(--bg1)}
  .kb-detail-chunk .seq{font-family:var(--mono);font-size:11px;color:var(--accent2);margin-right:6px}
/* 通道 C：知识蒸馏工作台 */
.kb-distill-pick-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.kb-distill-pick-t{font-size:12px;color:var(--muted)}
.kb-distill-count{font-size:12px;font-family:var(--mono);color:var(--accent2)}
.kb-doc-pick{display:flex;flex-wrap:wrap;gap:8px;max-height:176px;overflow:auto;padding:10px;border:1px solid var(--edge);border-radius:8px;background:var(--bg1)}
.kb-doc-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid var(--edge);border-radius:999px;font-size:12px;cursor:pointer;background:var(--panel);color:var(--ink);max-width:320px}
.kb-doc-chip input{accent-color:var(--accent2);margin:0}
.kb-doc-chip.on{border-color:var(--accent2);box-shadow:0 0 0 1px var(--accent2) inset}
.kb-doc-chip .lv{font-size:11px;color:var(--muted)}
.kb-distill-hint{font-size:12px;color:var(--muted)}
.kb-skill-sec{border:1px solid var(--edge);border-radius:8px;padding:10px;margin-bottom:10px;background:var(--bg1)}
.kb-skill-sec-row{display:flex;gap:8px;align-items:center;margin-bottom:6px}
.kb-skill-sec-row input.mono-input{flex:0 0 200px}
.kb-skill-sec textarea{width:100%;min-height:74px;resize:vertical;font-size:12.5px;line-height:1.6;padding:8px 10px;border:1px solid var(--edge);border-radius:6px;background:var(--panel);color:var(--ink);font-family:inherit}
.kb-skill-count{font-size:12px;font-family:var(--mono);color:var(--muted)}
.kb-skill-count.over{color:var(--red)}
.kb-ver-diff{max-height:340px;overflow:auto;border:1px solid var(--edge2);border-radius:10px;padding:10px 12px;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.6;background:rgba(10,18,30,.5)}
.kb-ver-line{white-space:pre-wrap;word-break:break-all;color:var(--muted)}
.kb-ver-line.add{color:#7ee2a8;background:rgba(60,180,110,.12)}
.kb-ver-line.del{color:#ff9a9a;background:rgba(220,80,80,.12)}

  table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px}
  .mng-table th,.mng-table td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--edge);vertical-align:middle}
  .mng-table td{overflow-wrap:break-word}
  .mng-table .row-actions{gap:6px;flex-wrap:wrap;align-items:center}
  .mng-table .row-actions .btn{padding:6px 9px;font-size:12px;white-space:nowrap}
  .mng-table th{background:var(--panel2);color:var(--muted);font-size:12px;letter-spacing:.02em;font-weight:600}
  .mng-table tr:last-child td{border-bottom:none}
  .mng-table .tag{font-size:11px;font-family:var(--mono);padding:3px 8px;border-radius:5px}
  .tag.on{color:var(--green);border:1px solid rgba(99,214,155,.4);background:rgba(99,214,155,.1)}
  .tag.off{color:var(--red);border:1px solid rgba(239,111,111,.4);background:rgba(239,111,111,.1)}
  .team-tag{font-size:11px;color:var(--accent2);white-space:nowrap}
  tr.team-head td{background:var(--accent-dim);border-top:1px solid var(--edge2);padding:9px 12px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
  tr.team-head .team-name{font-weight:700;font-size:13px;color:var(--text)}
  tr.team-head .team-owner{font-size:11.5px;color:var(--muted)}
  tr.team-head .team-desc{font-size:11px;color:var(--faint);margin-left:auto}
  .row-actions{display:flex;gap:6px;flex-wrap:wrap}
  .row-actions .btn{padding:6px 10px;font-size:12px;border-radius:7px}
  .stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:18px}
  .stat-card{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);padding:16px}
  .stat-card .s-k{font-size:11px;color:var(--faint);letter-spacing:.05em}
  .stat-card .s-v{font-size:15px;font-weight:650;margin-top:6px;font-family:var(--mono)}
  .stat-card .s-d{font-size:11.5px;color:var(--muted);margin-top:4px}
  .usage-block{margin-bottom:18px}
  .usage-block-t{font-size:13.5px;font-weight:600;margin-bottom:10px;color:var(--ink)}
  .usage-trend{display:flex;align-items:flex-end;gap:10px;height:120px;background:var(--panel);
    border:1px solid var(--edge);border-radius:var(--radius);padding:16px 14px 10px}
  .usage-trend .t-col{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;gap:6px;height:100%}
  .usage-trend .t-bar{width:100%;max-width:26px;border-radius:5px 5px 0 0;background:var(--accent);min-height:2px}
  .usage-trend .t-bar.local{background:var(--edge2)}
  .usage-trend .t-lb{font-size:10.5px;color:var(--faint);font-family:var(--mono)}
  .usage-trend .t-empty{color:var(--faint);font-size:12.5px;margin:auto}
  .usage-amt{font-family:var(--mono);font-weight:600}
  .usage-zero{color:var(--faint)}
  .price-row{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:10px;align-items:center;padding:8px 0;border-bottom:1px dashed var(--edge)}
  .price-row:last-child{border-bottom:none}
  .price-row.price-head{font-size:11.5px;color:var(--faint);border-bottom:1px solid var(--edge)}
  .price-row .price-name{font-size:13px;min-width:0;overflow-wrap:break-word}
  .price-row .price-in{width:100%;min-width:0}
  @media (max-width:571px){
    .price-row{grid-template-columns:1fr 1fr;gap:8px}
    .price-row .price-name{grid-column:1/-1}
  }
  .mono-block{background:var(--bg1);border:1px solid var(--edge);border-radius:9px;padding:10px 12px;
    font-family:var(--mono);font-size:12px;color:var(--ink);overflow:auto;word-break:break-all;line-height:1.5}
  .kv2{display:flex;flex-direction:column;gap:9px}
  .kv2 .row{display:flex;justify-content:space-between;font-size:13px;border-bottom:1px dashed var(--edge);padding-bottom:8px}
  .kv2 .k{color:var(--muted)} .kv2 .v{font-family:var(--mono)}
  .kv2 .v.ok{color:var(--green)} .kv2 .v.warn{color:var(--amber)}
  .perm-note{display:flex;align-items:center;gap:9px;padding:10px 13px;border:1px solid var(--amber);border-radius:9px;
    background:rgba(240,183,90,.08);color:var(--amber);font-size:12.5px;margin-bottom:16px}
  .perm-note svg{flex:0 0 auto}
  /* job / drafting view */
  .job-form{display:flex;flex-direction:column;gap:10px}
  .job-up{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
  .job-file{color:var(--muted);font-size:12.5px;font-family:var(--mono)}
  .job-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .job-k{flex:0 0 96px;font-size:12.5px;color:var(--faint);letter-spacing:.02em}
  .job-views{display:flex;gap:6px;flex-wrap:wrap;margin:0}
  .job-views span{cursor:pointer;transition:.15s;padding:4px 12px;border:1px solid var(--edge);border-radius:6px;background:var(--card);font-size:12.5px;white-space:nowrap}
  .job-views span:hover{border-color:var(--accent2);color:var(--accent2)}
  .job-views span.on{border-color:var(--accent2);color:var(--accent2);background:var(--accent-dim)}
  .job-textarea{width:100%;box-sizing:border-box;padding:7px 10px;border:1px solid var(--edge);border-radius:6px;background:var(--card);color:var(--ink);font-size:12.5px;font-family:inherit;resize:vertical;line-height:1.5}
  .job-textarea:focus{outline:none;border-color:var(--accent2)}
  .job-actions{display:flex;justify-content:flex-end;margin-top:2px}
  /* 新增业务板块/工作流/分组卡片统一对齐内置板块视觉标准 */
  #cModAddCard .job-form,
  #cWfAddCard .job-form,
  #cGroupCard .job-form{background:var(--panel);border:1px solid var(--edge);border-radius:var(--radius);padding:14px 12px}
  #cModAddCard .job-k,
  #cWfAddCard .job-k,
  #cGroupCard .job-k{color:var(--muted);font-weight:600;font-size:12px}
  #cModAddCard .lg-input,
  #cWfAddCard .lg-input,
  #cGroupCard .lg-input{font-size:13px;padding:8px 12px;border-radius:8px}
  #cModAddCard .job-actions .btn,
  #cWfAddCard .job-actions .btn,
  #cGroupCard .job-actions .btn{padding:6px 12px;font-size:12px}
  #cWfAddCard .btn.ghost{font-size:12px;padding:6px 10px}
  #cWfAddCard .views-chip span{font-size:12px;padding:4px 10px}
  .job-scope{font-size:12px;color:var(--faint);font-family:var(--mono);border:1px solid var(--edge);padding:5px 10px;border-radius:6px}
  .job-progress{height:6px;border-radius:4px;background:var(--bg1);overflow:hidden;margin-top:6px}
  .job-progress .bar{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent2));transition:width .4s;border-radius:4px}
  .job-link{cursor:pointer;color:var(--accent2);font-family:var(--mono);font-size:12px}
  /* 机械设计板块 · 工作流项目 */
  .mflow{display:flex;flex-wrap:wrap;gap:6px}
  .mflow-item{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border:1px solid var(--edge);border-radius:6px;cursor:pointer;font-size:12px;color:var(--ink);transition:.15s;background:var(--bg1);white-space:nowrap}
  .mflow-item:hover{border-color:var(--accent2);color:var(--accent2)}
  .mflow-item::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--accent2)}
  /* 板块智能体对话：样式100%对齐全局智能体 */
  /* 对话记录占满卡片余高，内容超出就在框内滚动，长对话不顶长整页；输入区与图标行常驻卡片底部 */
  .agent-chat{display:flex;flex-direction:column;gap:16px;min-height:140px;
    overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;margin:4px 0 12px;padding:4px 2px}
  .agent-msg{font-size:14px;line-height:1.8}
  .agent-msg p{margin:8px 0;color:var(--ink)}
  .agent-msg p:first-child{margin-top:0}
  .agent-msg p:last-child{margin-bottom:0}
  .agent-msg b{color:var(--accent2);font-size:14px;font-weight:600}
  .agent-msg ol,.agent-msg ul{margin:8px 0;padding-left:24px}
  .agent-msg li{margin:4px 0}
  /* AI回复：对齐全局普通ai-text，无背景无边框，带左侧头像，全宽显示文字 */
  .agent-msg.bot{display:flex;gap:10px;align-self:stretch;max-width:100%;background:transparent;border:none;padding:0}
  .agent-msg.bot .ai-ava{width:32px;height:32px;border-radius:10px;flex:0 0 auto;display:flex;align-items:center;justify-content:center;
    font-weight:700;font-size:13.5px;color:var(--on-accent);
    background:linear-gradient(135deg,var(--accent),var(--accent2));box-shadow:0 4px 12px var(--accent-dim)}
  .agent-msg.bot .ai-body{flex:1;min-width:0}
  /* 用户消息：完全对齐全局用户气泡 */
  .agent-msg.user{align-self:flex-end;max-width:84%;background:var(--user-bubble);border:1px solid var(--user-edge);border-radius:18px 18px 5px 18px;padding:12px 15px;font-weight:500}
  .agent-msg.user p{color:var(--user-bubble-text)}
  .agent-in{display:flex;gap:8px}
  .agent-in .lg-input{flex:1;margin:0}
  .agent-in .btn{flex:0 0 auto}
  /* 板块权限弹窗 */
  .mod-pick{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin:6px 0 14px}
  .mod-pick label{display:flex;align-items:center;gap:10px;border:1px solid var(--edge);border-radius:9px;padding:11px 12px;cursor:pointer;font-size:13px}
  .mod-pick input{width:16px;height:16px;accent-color:var(--accent2)}
  .mod-pick .mod-off{opacity:.4}
  .mod-pick input:checked + b{color:var(--accent2)}
  .perm-block{border-top:1px solid var(--edge);padding:14px 0 4px}
  .perm-block:first-of-type{border-top:0;padding-top:0}
  .perm-block-t{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:6px}
  .perm-block-t em{font-style:normal;font-family:var(--mono);font-size:11px;color:var(--faint);margin-left:6px}
  .perm-block-d{color:var(--faint);font-size:12px;margin:2px 0 10px;line-height:1.5}
  .perm-lock{display:flex;align-items:center;gap:8px;color:var(--faint);font-size:12px;padding:9px 11px;border:1px dashed var(--edge);border-radius:9px;margin:6px 0}
  .perm-template-row{display:flex;gap:10px;align-items:center;margin:4px 0 12px}
  .perm-template-row select{flex:1;background:var(--bg1);border:1px solid var(--edge);border-radius:8px;color:var(--ink);font-size:12.5px;padding:9px 10px}
  /* ---------- Responsive（自适应） ---------- */
  /* 超宽屏：放大布局以利用空间 */
  @media(min-width:1400px){
    .app{max-width:1720px}
    .hero h1{font-size:36px}
  }
  /* 大屏/宽笔记本：收窄侧栏与留白 */
  @media(max-width:1100px){
    .nav{width:196px}
    .hero{gap:24px}
    .hero .viz{flex-basis:380px}
    .topmeta{font-size:11px;gap:8px}
  }
  /* 中屏：先收起顶栏中间的长说明文案，给右侧操作区腾宽度 */
  @media(max-width:1020px){
    .topmeta #topMode{display:none}
  }
  /* 中屏/平板：折叠副信息、压缩侧栏 */
  @media(max-width:900px){
    .nav{width:176px;padding:14px 8px}
    .nav-item{padding:10px 10px;font-size:13px}
    .topmeta .ver{display:none}
    .userchip .u-role{display:none}
  }
  /* 平板：hero 纵向、CAD 纵向、结果面板限高 */
  @media(max-width:980px){
    .hero{flex-direction:column;min-height:0;align-items:stretch}
    .hero .viz{flex:0 0 auto;width:100%}
    .viz-wrap{aspect-ratio:16/9}
    .cad{flex-direction:column}
    .cad-resizer{display:none}
    .result{max-height:42vh}
  }
  /* 窄屏：横向导航 + 单列 */
  @media(max-width:760px){
    .row{flex-direction:column}
    .nav{width:100%;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;border-right:none;
      border-bottom:1px solid var(--edge);padding:8px 10px;gap:8px;scrollbar-width:none;align-items:center}
    .nav::-webkit-scrollbar{display:none}
    .nav-resizer{display:none}
    .nav .group-label{display:none}
    .nav-item{flex:0 0 auto;padding:9px 13px;white-space:nowrap}
    .nav-item .dot{display:none}
    .nav-bottom{margin-top:0;display:contents}
    /* 横向导航：最近使用空态提示不进导航；列表包裹容器不被挤压 */
    .nav .recent-empty{display:none}
    #recentWfList,#customNavList{flex:0 0 auto;min-width:0;display:flex;align-items:center;gap:8px}
    .cards{grid-template-columns:1fr}
    .mod-grid{grid-template-columns:1fr}
    .mod-pick{grid-template-columns:1fr}
    .modal{max-height:88vh;overflow-y:auto}
    .hero h1{font-size:24px}
    .hero p{font-size:14px}
    .topmeta{display:none}
    .composer textarea,.mono-input{font-size:16px}
    .mng-table{overflow-x:auto}
    .mng-table table{min-width:600px}
    #loginGate{padding:12px}
    .statusbar{flex-wrap:wrap;gap:6px 14px;padding:8px 14px;height:auto}
    .statusbar .st{font-size:11px}
    .statusbar #stOllama,.statusbar #stSw,.statusbar #stBridge{display:none}
    .statusbar .rt{font-size:11px}
    .kv .row,.kv2 .row{flex-direction:column;gap:4px;align-items:flex-start}
    .kv .row .k,.kv2 .row .k{font-size:11.5px}
    .pg-head .pg-tools{margin-left:0;width:100%}
    .role-badge{display:none}
    /* SOP 步骤6：移动端触摸热区 ≥44px */
    .nav-item{min-height:44px}
    .tool-btn{width:44px;height:44px}
    .composer .send{width:44px;height:44px}
    .mod-pick label{min-height:44px}
    .rpick{min-height:44px}
    .row-actions .btn,.mng-table .row-actions .btn{min-height:38px}
  }
  /* 手机：最紧凑 */
  @media(max-width:520px){
    body{overflow-x:hidden}
    .topbar{padding:0 12px;gap:8px;overflow:hidden}
    .brand{min-width:0}
    .brand .t2{display:none}
    .brand .t1{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    .top-actions{flex:0 1 auto;min-width:0;overflow:hidden;gap:6px}
    .userchip{max-width:96px;min-width:0}
    .userchip .u-name{font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    .userchip .ava{width:24px;height:24px;font-size:11px;flex:0 0 auto}
    .theme-cycle .cyc-label{display:none}
    #btnSettings,#btnLogout{padding:8px 10px;font-size:12px;flex:0 0 auto}
    .view{padding:16px 14px}
    .hero h1{font-size:22px}
    .cta-row .btn{flex:1 1 100%}
    .section-label{margin:22px 0 10px}
    .card{padding:16px}
    .chat-head .sub{display:none}
    .result{max-height:38vh}
    .env-chips{gap:8px}
    .chip{font-size:11.5px;padding:6px 10px}
    .lg-sub{font-size:12.5px}
    .pg-head h2{font-size:20px}
    .stat-grid{grid-template-columns:1fr 1fr}
  }
  ::-webkit-scrollbar{width:11px;height:11px}
  ::-webkit-scrollbar-thumb{background:#3d5875;border-radius:6px;border:2px solid var(--bg1)}
  ::-webkit-scrollbar-thumb:hover{background:#4a6890}
  ::-webkit-scrollbar-track{background:transparent}
  *{scrollbar-width:thin;scrollbar-color:#3d5875 var(--bg1)}

  /* 阶段 D · 已接入工作流：模型文本全文与外部系统边界说明（仅在线工作流结果区使用） */
  .wf-result-text{margin-top:12px;padding:18px 20px;background:var(--bg1);border:1px solid var(--edge);border-radius:9px;
    color:var(--ink);font-size:14px;line-height:1.8;white-space:pre-wrap;overflow-wrap:break-word;min-height:260px;max-height:960px;overflow:auto}

/* 朗读按钮豆包风格 */
.ai-read.speaking { color:#4080ff !important; opacity:1 !important; }
.ai-read.speaking svg .wave { animation: wave 1.2s ease-in-out infinite; }
.ai-read.speaking svg .wave:nth-child(2) { animation-delay: 0.3s; }
@keyframes wave {
  0%, 100% { opacity: 0.3; }
  50% { opacity: 1; }
}
  .wf-boundary-note{margin-top:10px;color:var(--faint);font-size:12px;line-height:1.6;padding:9px 12px;
    border-left:2px solid var(--edge);background:var(--bg1);border-radius:0 8px 8px 0}
  .wf-result-text[hidden],.wf-boundary-note[hidden]{display:none}
  /* .btn 作者规则 display:inline-flex 会覆盖 UA [hidden]，在线结果未出前显式隐藏提交按钮 */
  #btnSubmitWfKb[hidden]{display:none}

/* 技能注入预算（v0.10.04 补充十） */
.kb-budget { margin-top: 10px; }
.kb-budget-global { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 12px; margin-bottom: 10px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel-2); }
.kb-budget-t { font-size: 13px; color: var(--muted); margin-right: 4px; }
.kb-budget-in { width: 92px; }
.kb-budget-unit { font-size: 12px; color: var(--muted); }
