/* ==========================================================================
   vCSO Consulting Platform — Design System
   Tokens: primitive → semantic. Dark default, light supported via [data-theme].
   ========================================================================== */
/* ── Apple Liquid Glass tokens ──────────────────────────────────────────
   变量名保持不变，只换值 —— 全站 700 行 CSS 都从这里渲染，改这里等于改全站。
   浅色是 skill 的原生规范；深色一套按 macOS / iOS 系统深色模式推导
   （skill 只提供浅色），因为本应用默认深色，不能直接砍掉。
   ─────────────────────────────────────────────────────────────────────── */
:root{
  /* ---- spacing scale (4pt) ---- */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:20px; --s6:24px; --s8:32px; --s10:40px;
  /* ---- radius：分层，不自造中间值 ---- */
  --r-pill:999px; --r-sm:6px; --r:12px; --r-lg:18px; --r-panel:22px; --r-hero:26px;
  /* ---- motion ---- */
  --dur:200ms; --ease:cubic-bezier(.25,1,.5,1);          /* ease-out-quart：小位移 */
  --ease-spring:cubic-bezier(.32,.72,0,1);                /* 弹簧：浮层进场 */
  --sidebar:248px;
  /* ---- type：系统 SF / PingFang，不拿网络字体当品牌脸 ---- */
  --font:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display",
         "Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  --display:-apple-system,BlinkMacSystemFont,"SF Pro Display","SF Pro Text",
         "Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  --mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  --max-grid:1080px;
}

/* ---------- Light —— skill 的原生规范 ---------- */
:root,[data-theme="light"]{
  --bg:#f5f5f7;                  /* 冷灰白，绝不暖调 */
  --bg-glow:none;                /* 渐变洗底已移除 */
  --surface:#ffffff;
  --surface-2:#fbfbfd;           /* 行悬浮 */
  --surface-3:#f0f0f3;           /* 安静填充 / chip */
  --overlay:rgba(0,0,0,.28);
  --border:rgba(0,0,0,.07);      /* hairline —— 全站唯一分隔线 */
  --border-strong:rgba(0,0,0,.13);
  --text:#1d1d1f;
  --text-2:#6e6e73;
  --text-3:#86868b;
  --faint:#d2d2d7;
  --accent:#0071e3;              /* 唯一强调色 */
  --accent-text:#0066cc;
  --accent-hover:#0077ed;
  --accent-fg:#ffffff;
  --accent-soft:rgba(0,113,227,.08);
  --accent-glow:rgba(0,113,227,.22);
  --accent-2:#5e5ce6;            /* 仅作 CTA 渐变第二停 */
  --grad:linear-gradient(135deg,#0071e3 0%,#5e5ce6 100%);
  --ok:#248a3d;      --ok-soft:rgba(48,209,88,.13);
  --warn:#ff6b00;    --warn-soft:rgba(255,107,0,.1);      /* heat：仅真·最热 */
  --danger:#d70015;  --danger-soft:rgba(215,0,21,.09);
  --crit:#b3000f;    --crit-soft:rgba(179,0,15,.1);
  --info:#0071e3;    --info-soft:rgba(0,113,227,.09);
  --shadow:0 1px 2px rgba(0,0,0,.04),0 8px 24px rgba(0,0,0,.05);   /* 双层，绝不单硬阴影 */
  --sh-panel:0 1px 3px rgba(0,0,0,.05),0 14px 40px rgba(0,0,0,.05);
  --sh-lift:0 12px 32px rgba(0,0,0,.1);
  --sh-overlay:0 2px 8px rgba(0,0,0,.1),0 30px 80px rgba(0,0,0,.24);
  --glass:rgba(245,245,247,.72);
  --track:#e8e8ed;
  --th-text:#86868b;
  color-scheme:light;
}
/* ---------- Dark —— 按 macOS / iOS 系统深色推导 ---------- */
[data-theme="dark"]{
  --bg:#000000;
  --bg-glow:none;
  --surface:#1c1c1e;
  --surface-2:#2c2c2e;
  --surface-3:#3a3a3c;
  --overlay:rgba(0,0,0,.6);
  --border:rgba(255,255,255,.1);
  --border-strong:rgba(255,255,255,.18);
  --text:#f5f5f7;
  --text-2:#98989d;
  --text-3:#8e8e93;
  --faint:#48484a;
  --accent:#0a84ff;              /* Apple 深色模式蓝 */
  --accent-text:#4ea3ff;
  --accent-hover:#3b9bff;
  --accent-fg:#ffffff;
  --accent-soft:rgba(10,132,255,.16);
  --accent-glow:rgba(10,132,255,.3);
  --accent-2:#5e5ce6;
  --grad:linear-gradient(135deg,#0a84ff 0%,#5e5ce6 100%);
  --ok:#30d158;      --ok-soft:rgba(48,209,88,.16);
  --warn:#ff9f0a;    --warn-soft:rgba(255,159,10,.16);
  --danger:#ff453a;  --danger-soft:rgba(255,69,58,.16);
  --crit:#ff375f;    --crit-soft:rgba(255,55,95,.16);
  --info:#0a84ff;    --info-soft:rgba(10,132,255,.16);
  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px rgba(0,0,0,.36);
  --sh-panel:0 1px 3px rgba(0,0,0,.4),0 14px 40px rgba(0,0,0,.34);
  --sh-lift:0 12px 32px rgba(0,0,0,.5);
  --sh-overlay:0 2px 8px rgba(0,0,0,.5),0 30px 80px rgba(0,0,0,.6);
  --glass:rgba(28,28,30,.72);
  --track:#38383a;
  --th-text:#8e8e93;
  color-scheme:dark;
}

*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  background:var(--bg);background-image:var(--bg-glow);background-attachment:fixed;
  color:var(--text);font-family:var(--font);
  font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;
  font-feature-settings:"cv05","ss01","ss03";letter-spacing:-.1px;
}
a{color:var(--accent);text-decoration:none}
a:hover{color:var(--accent-hover)}
button,input,select,textarea{font-family:inherit;font-size:14px;color:inherit}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--r-sm)}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:6px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-track{background:transparent}
.num,.mono,td.num,.tabular{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
.mono{font-family:var(--mono);font-size:12.5px;letter-spacing:-.2px}
svg.i{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.75;
  stroke-linecap:round;stroke-linejoin:round;flex:none}
svg.i.lg{width:20px;height:20px}
@media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;transition-duration:.01ms!important}}

/* ================= Login ================= */
#login{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:var(--s6);
  background:var(--bg);position:relative;overflow:hidden}
#login::before{content:"";position:absolute;inset:-20%;pointer-events:none;
  background:
    radial-gradient(680px 520px at 32% 30%,color-mix(in srgb,var(--accent) 30%,transparent),transparent 62%),
    radial-gradient(620px 480px at 70% 68%,color-mix(in srgb,var(--accent-2) 20%,transparent),transparent 60%);
  filter:blur(18px)}
/* 细网格纹理，暗色下有质感又不喧宾夺主 */
#login::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:
    linear-gradient(to right,color-mix(in srgb,var(--border) 55%,transparent) 1px,transparent 1px),
    linear-gradient(to bottom,color-mix(in srgb,var(--border) 55%,transparent) 1px,transparent 1px);
  background-size:52px 52px;
  mask-image:radial-gradient(circle at 50% 45%,#000 0%,transparent 72%);
  -webkit-mask-image:radial-gradient(circle at 50% 45%,#000 0%,transparent 72%)}
.login-card{position:relative;z-index:1;backdrop-filter:blur(6px)}
.login-card{width:400px;max-width:100%;background:color-mix(in srgb,var(--surface) 88%,transparent);
  border:1px solid var(--border-strong);
  border-radius:14px;padding:var(--s8) var(--s8) var(--s6);box-shadow:var(--shadow)}
.login-mark{display:flex;align-items:center;gap:10px;margin-bottom:var(--s5)}
.login-mark svg{width:26px;height:26px;stroke:var(--accent)}
.login-mark b{font-family:var(--display);font-size:17px;font-weight:700;
  letter-spacing:-.4px;display:block}
.login-mark span{font-size:11px;color:var(--text-3);letter-spacing:.4px;text-transform:uppercase}
.login-card label{display:block;font-size:12px;color:var(--text-2);margin:var(--s4) 0 6px;font-weight:500}
.login-err{color:var(--danger);font-size:12.5px;min-height:20px;margin-top:var(--s3)}
.login-foot{margin-top:var(--s5);padding-top:var(--s4);border-top:1px solid var(--border);
  display:flex;justify-content:space-between;align-items:center;font-size:11.5px;color:var(--text-3)}

/* ================= Shell ================= */
#app{display:none;min-height:100vh}
#app.on{display:block}
.sidebar{position:fixed;inset:0 auto 0 0;width:var(--sidebar);background:var(--surface);
  border-right:1px solid var(--border);display:flex;flex-direction:column;z-index:30}
.brand{padding:var(--s4) var(--s5);border-bottom:1px solid var(--border);display:flex;gap:10px;align-items:center}
.brand svg{width:22px;height:22px;stroke:var(--accent)}
.brand b{font-family:var(--display);font-size:15px;font-weight:700;letter-spacing:-.3px;
  display:block;line-height:1.3}
.brand span{font-size:10.5px;color:var(--text-3);letter-spacing:.5px;text-transform:uppercase}
.proj-switch{padding:var(--s3) var(--s4);border-bottom:1px solid var(--border)}
.proj-switch label{font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:var(--text-3);
  display:block;margin-bottom:5px}
.nav{flex:1;overflow-y:auto;padding:var(--s3) 0 var(--s6)}
.nav-group{padding:var(--s4) var(--s5) 6px;font-size:10px;letter-spacing:1.1px;
  color:var(--text-3);text-transform:uppercase;font-weight:600}
.nav a{display:flex;align-items:center;gap:10px;padding:7.5px var(--s5);color:var(--text-2);
  font-size:13px;font-weight:500;border-left:2px solid transparent;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.nav a:hover{background:var(--surface-2);color:var(--text)}
/* 选中态：一块安静的实心底，不用渐变、不用发光竖条 */
.nav a.on{background:var(--accent-soft);color:var(--accent-text);font-weight:600;
  border-left-color:transparent}
.nav a.on svg{stroke:var(--accent-text)}
.nav a .ph{margin-left:auto;font-size:10px;color:var(--text-3);font-family:var(--mono)}
.sb-foot{padding:var(--s3) var(--s4);border-top:1px solid var(--border);display:flex;
  align-items:center;gap:var(--s2);justify-content:space-between}
.sb-user{min-width:0}
.sb-user b{display:block;font-size:12.5px;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-user span{font-size:10.5px;color:var(--text-3)}

.main{margin-left:var(--sidebar);padding:0 var(--s8) var(--s10)}
.topbar{position:sticky;top:0;z-index:20;background:color-mix(in srgb,var(--bg) 92%,transparent);
  backdrop-filter:saturate(160%) blur(10px);border-bottom:1px solid var(--border);
  margin:0 calc(-1 * var(--s8)) var(--s6);padding:var(--s4) var(--s8);
  display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap}
.topbar .ttl{min-width:0}
.topbar h2{font-family:var(--display);font-size:20px;font-weight:700;
  letter-spacing:-.5px;line-height:1.25}
.topbar .desc{font-size:12px;color:var(--text-3);margin-top:1px}
.topbar .tools{display:flex;gap:var(--s2);align-items:center;flex-wrap:wrap;margin-left:auto}

/* ================= Controls ================= */
.btn{display:inline-flex;align-items:center;gap:6px;background:var(--surface-2);color:var(--text);
  border:1px solid var(--border-strong);padding:7px 13px;border-radius:var(--r);cursor:pointer;
  white-space:nowrap;font-size:13px;font-weight:600;min-height:34px;letter-spacing:-.05px;
  transition:background var(--dur) var(--ease),border-color var(--dur) var(--ease),color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease)}
.btn:hover{background:var(--surface-3);border-color:var(--accent)}
.btn:active{transform:translateY(.5px)}
.btn.primary{background:var(--grad);border-color:transparent;color:var(--accent-fg);
  box-shadow:0 2px 10px var(--accent-glow)}
.btn.primary:hover{filter:brightness(1.08);
  box-shadow:0 4px 18px var(--accent-glow);transform:translateY(-1px)}
.btn.primary:active{transform:translateY(0)}
.btn.ghost{background:transparent;border-color:var(--border)}
.btn.ghost:hover{background:var(--surface-2)}
.btn.danger{color:var(--danger);border-color:var(--border-strong)}
.btn.danger:hover{background:var(--danger-soft);border-color:var(--danger)}
.btn.sm{padding:4px 9px;font-size:12px;min-height:28px}
.btn.icon{padding:6px;min-width:34px;justify-content:center}
.btn[disabled]{opacity:.45;pointer-events:none}
.seg{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--r);overflow:hidden}
.seg button{background:transparent;border:none;padding:5px 10px;cursor:pointer;font-size:12px;
  color:var(--text-3);transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.seg button:hover{color:var(--text)}
.seg button.on{background:var(--accent-soft);color:var(--accent-text);font-weight:600;
  box-shadow:inset 0 -2px 0 var(--accent)}

input,select,textarea{background:var(--bg);border:1px solid var(--border-strong);
  border-radius:var(--r);padding:7px 10px;width:100%;outline:none;min-height:34px;
  transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
[data-theme="light"] input,[data-theme="light"] select,[data-theme="light"] textarea{background:var(--surface)}
input::placeholder,textarea::placeholder{color:var(--text-3)}
input:hover,select:hover,textarea:hover{border-color:var(--border-strong)}
input:focus,select:focus,textarea:focus{border-color:var(--accent);
  box-shadow:0 0 0 3px var(--accent-soft),0 0 14px -4px var(--accent-glow)}
textarea{resize:vertical;min-height:84px;line-height:1.65}
select{cursor:pointer;appearance:none;padding-right:28px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23667486' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 8px center;background-size:14px}
input[type=checkbox]{width:16px;height:16px;min-height:0;accent-color:var(--accent);cursor:pointer}
label.chk{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--text-2);min-height:34px}

/* ================= Cards / grid ================= */
.grid{display:grid;gap:var(--s3)}
.g2{grid-template-columns:repeat(auto-fit,minmax(340px,1fr))}
.g3{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}
.g4{grid-template-columns:repeat(auto-fit,minmax(196px,1fr))}
.grid.stats{align-items:stretch}
.grid.mixed{align-items:start}
.card{position:relative;background:var(--surface);border:1px solid var(--border);
  border-radius:var(--r-lg);padding:var(--s4) var(--s5);box-shadow:0 1px 2px rgba(0,0,0,.03);
  overflow:hidden}
.card::before{content:"";position:absolute;inset:0 0 auto;height:1px;
  background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--accent) 34%,transparent),transparent);
  opacity:.55;pointer-events:none}
.card h3{font-size:11px;letter-spacing:.8px;text-transform:uppercase;color:var(--text-3);
  font-weight:700;margin-bottom:var(--s3);display:flex;align-items:center;gap:var(--s2);justify-content:space-between}
.card h3 .r{text-transform:none;letter-spacing:0;font-weight:400}
/* 统计卡：等高、上下留白一致，数字与单位不粘连 */
.card.stat{display:flex;flex-direction:column;justify-content:flex-start;min-height:112px}
.stat .v{font-family:var(--display);font-size:29px;font-weight:700;letter-spacing:-1px;line-height:1.2;
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum";
  display:flex;align-items:baseline;gap:3px;flex-wrap:wrap}
.stat .v small{font-size:13px;color:var(--text-3);font-weight:500;
  letter-spacing:normal;line-height:1}
.stat .l{font-size:11.5px;color:var(--text-2);margin-top:4px;line-height:1.4}
.stat .sub{font-size:11px;color:var(--text-3);margin-top:auto;padding-top:8px;
  font-variant-numeric:tabular-nums;line-height:1.5}
.stat .bar{margin-top:10px}
.stat .bar + .sub{margin-top:7px;padding-top:0}
.bar{display:block;height:5px;background:var(--track);border-radius:3px;
  overflow:hidden;margin-top:9px}
.bar>i{display:block;height:100%;min-width:3px;background:var(--accent);
  border-radius:var(--r-pill);transition:width .5s var(--ease)}
.bar>i[style*="width:0%"]{min-width:0}
.bar.ok>i{background:var(--ok)} .bar.warn>i{background:var(--warn)} .bar.danger>i{background:var(--danger)}

/* ================= Table ================= */
.tablewrap{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);
  overflow:auto;max-height:calc(100vh - 232px)}
table{width:100%;border-collapse:collapse;font-size:13px}
.tablewrap table{min-width:1180px}
th{position:sticky;top:0;background:var(--surface-2);text-align:left;padding:9px 12px;
  font-size:10.5px;letter-spacing:.7px;text-transform:uppercase;color:var(--text-3);font-weight:600;
  border-bottom:1px solid var(--border);white-space:nowrap;z-index:2}
td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:top;min-width:74px}
tbody tr:last-child td{border-bottom:none}
tbody tr{transition:background var(--dur) var(--ease)}
tbody tr:hover{background:color-mix(in srgb,var(--accent) 5%,var(--surface-2))}
td.wrap{min-width:210px;max-width:430px;white-space:pre-wrap;word-break:break-word;color:var(--text-2)}
td.title{min-width:180px;font-weight:600;color:var(--text)}
td.nowrap{white-space:nowrap}
td.num{text-align:right}
.card table th{background:transparent;border-bottom:1px solid var(--border)}
.card table td{padding:8px 10px}
.empty{padding:52px var(--s5);text-align:center;color:var(--text-3);font-size:13px}
.empty svg{width:30px;height:30px;stroke:var(--text-3);opacity:.5;margin-bottom:10px}
.rowacts{display:flex;gap:5px;white-space:nowrap}

/* ================= Tags ================= */
.tag{display:inline-flex;align-items:center;gap:4px;padding:1px 8px;border-radius:4px;font-size:11px;
  line-height:19px;font-weight:600;white-space:nowrap;border:1px solid transparent}
.tag::before{content:"";width:5px;height:5px;border-radius:50%;background:currentColor;flex:none}
.tag.plain::before{display:none}
.t-gray{background:var(--surface-3);color:var(--text-2)}
.t-blue{background:var(--accent-soft);color:var(--accent-text)}
.t-green{background:var(--ok-soft);color:var(--ok)}
.t-yellow{background:var(--warn-soft);color:var(--warn)}
.t-red{background:var(--danger-soft);color:var(--danger)}
.t-crit{background:var(--crit-soft);color:var(--crit)}
.t-purple{background:var(--info-soft);color:var(--info)}
.chip{display:inline-block;background:var(--surface-3);border:1px solid var(--border);color:var(--text-2);
  border-radius:var(--r-sm);padding:0 6px;font-size:10.5px;line-height:18px;margin:2px 4px 2px 0;
  font-family:var(--mono);letter-spacing:-.2px}
.count{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}

/* ================= Modal ================= */
.mask{position:fixed;inset:0;background:var(--overlay);backdrop-filter:blur(4px);
  display:flex;align-items:flex-start;justify-content:center;padding:var(--s10) var(--s5);
  z-index:100;overflow-y:auto;animation:fade var(--dur) var(--ease)}
.modal{background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--r-lg);
  width:100%;max-width:880px;box-shadow:var(--shadow);animation:pop var(--dur) var(--ease)}
.modal.wide{max-width:1140px}
@keyframes fade{from{opacity:0}}
@keyframes pop{from{opacity:0;transform:translateY(-8px) scale(.99)}}
.modal header{padding:var(--s4) var(--s5);border-bottom:1px solid var(--border);
  display:flex;align-items:center;justify-content:space-between;gap:var(--s4)}
.modal header h3{font-family:var(--display);font-size:16px;font-weight:700;letter-spacing:-.3px}
.modal .body{padding:var(--s5);max-height:68vh;overflow-y:auto}
.modal footer{padding:var(--s3) var(--s5);border-top:1px solid var(--border);
  display:flex;justify-content:flex-end;gap:var(--s2)}
.close{background:none;border:none;color:var(--text-3);cursor:pointer;padding:4px;
  border-radius:var(--r-sm);display:flex;transition:background var(--dur) var(--ease)}
.close:hover{background:var(--surface-3);color:var(--text)}
.form{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--s3) var(--s4)}
.form .fld{display:flex;flex-direction:column;gap:5px;min-width:0}
.form .fld.full{grid-column:1/-1}
.form label{font-size:12px;color:var(--text-2);font-weight:500}
.form label .req{color:var(--danger);margin-left:2px}
.form .hint{font-size:11px;color:var(--text-3);line-height:1.45}

/* ================= Filters ================= */
.filters{display:flex;gap:var(--s2);flex-wrap:wrap;align-items:center;margin-bottom:var(--s3)}
.filters input,.filters select{width:auto;min-width:136px}
.filters .search{position:relative;min-width:250px}
.filters .search svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);
  stroke:var(--text-3);pointer-events:none}
.filters .search input{padding-left:31px;width:100%}
.filters .spacer{flex:1}

/* ================= Methodology ================= */
.phase{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);
  margin-bottom:var(--s2);overflow:hidden}
.phase>.head{padding:var(--s3) var(--s5);display:flex;align-items:center;gap:var(--s3);cursor:pointer;
  transition:background var(--dur) var(--ease)}
.phase>.head:hover{background:var(--surface-2)}
.phase>.head .k{background:var(--accent-soft);color:var(--accent);border-radius:var(--r-sm);
  padding:1px 8px;font-size:11.5px;font-weight:600;font-family:var(--mono)}
.phase>.head b{font-family:var(--display);font-size:15px;font-weight:700;letter-spacing:-.2px}
.phase>.head .d{font-size:11.5px;color:var(--text-3);margin-left:auto;white-space:nowrap}
.phase>.head .chev{transition:transform var(--dur) var(--ease);stroke:var(--text-3)}
.phase.open>.head .chev{transform:rotate(180deg)}
.phase .bd{padding:0 var(--s5) var(--s5);display:none;border-top:1px solid var(--border)}
.phase.open .bd{display:block}
.goal{color:var(--text);margin:var(--s4) 0;padding:10px var(--s4);border-left:2px solid var(--accent);
  background:var(--accent-soft);border-radius:0 var(--r) var(--r) 0;font-size:13.5px}
.secs{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--s4) var(--s6)}
.sec h5{font-size:10px;letter-spacing:1px;color:var(--text-3);text-transform:uppercase;
  margin-bottom:7px;font-weight:600}
.sec ul{list-style:none;display:flex;flex-direction:column;gap:5px}
.sec ul li{padding-left:15px;position:relative;color:var(--text-2);font-size:12.8px;line-height:1.55}
.sec ul li::before{content:"";position:absolute;left:0;top:8px;width:5px;height:5px;
  border-radius:1px;background:var(--accent);opacity:.65}
.pitfall{margin-top:var(--s4);background:var(--warn-soft);border:1px solid color-mix(in srgb,var(--warn) 32%,transparent);
  border-radius:var(--r);padding:10px var(--s4);font-size:12.5px;color:var(--text-2);
  display:flex;gap:9px;align-items:flex-start}
.pitfall svg{stroke:var(--warn);flex:none;margin-top:2px}
.pitfall b{color:var(--warn)}

/* ================= Gap analysis ================= */
.gapbar{position:relative;height:18px;background:var(--track);border-radius:var(--r-sm);overflow:hidden}
.gapbar>.cur{position:absolute;inset:0 auto 0 0;background:var(--accent);opacity:.85}
.gapbar>.tgt{position:absolute;top:0;bottom:0;width:2px;background:var(--warn)}
.fwtabs{display:flex;gap:6px;margin-bottom:var(--s4);flex-wrap:wrap}
.fwtabs button{background:var(--surface-2);border:1px solid var(--border);color:var(--text-2);
  padding:7px 14px;border-radius:var(--r);cursor:pointer;font-size:12.5px;font-weight:500;
  display:flex;align-items:center;gap:7px;transition:all var(--dur) var(--ease)}
.fwtabs button:hover{border-color:var(--border-strong);color:var(--text)}
.fwtabs button.on{background:var(--accent-soft);border-color:var(--accent);
  color:var(--accent-text);box-shadow:0 2px 12px -6px var(--accent-glow)}
.fwtabs button b{font-variant-numeric:tabular-nums}
.legend{font-size:11px;color:var(--text-3);display:flex;gap:var(--s4);flex-wrap:wrap;margin-top:var(--s2)}

/* ================= Roadmap ================= */
.wave{margin-bottom:var(--s5)}
.wave>h4{font-size:12.5px;margin-bottom:var(--s2);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.wave>h4 .meta{margin-left:auto;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.init{background:var(--surface);border:1px solid var(--border);border-left:2px solid var(--accent);
  border-radius:var(--r);padding:var(--s3) var(--s4);margin-bottom:6px;cursor:pointer;
  transition:background var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.init:hover{background:var(--surface-2);border-left-color:var(--accent-hover)}
.init .t{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.init .t b{font-family:var(--display);font-size:14px;font-weight:600;letter-spacing:-.2px}
.init .m{font-size:11.5px;color:var(--text-3);margin-top:7px;display:flex;gap:var(--s4);flex-wrap:wrap}
.init .m span{display:flex;align-items:center;gap:5px}
.init .m svg{width:13px;height:13px;stroke:var(--text-3)}

/* ================= Detail / misc ================= */
.kv{display:grid;grid-template-columns:132px 1fr;gap:8px var(--s4);font-size:13px;align-items:start}
.kv dt{color:var(--text-3);font-size:12px}
.kv dd{color:var(--text);white-space:pre-wrap;word-break:break-word}
.tabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:var(--s4);flex-wrap:wrap}
.tabs button{background:none;border:none;border-bottom:2px solid transparent;color:var(--text-3);
  padding:9px 15px;cursor:pointer;font-size:13px;font-weight:500;
  transition:color var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.tabs button:hover{color:var(--text-2)}
.tabs button.on{color:var(--text);border-bottom-color:var(--accent)}
.toast{position:fixed;right:var(--s5);bottom:var(--s5);background:var(--surface);
  border:1px solid var(--border-strong);border-left:3px solid var(--ok);padding:11px var(--s4);
  border-radius:var(--r);box-shadow:var(--shadow);z-index:200;max-width:400px;font-size:13px;
  display:flex;gap:9px;align-items:flex-start;animation:slide var(--dur) var(--ease)}
.toast svg{stroke:var(--ok);flex:none;margin-top:2px}
.toast.err{border-left-color:var(--danger)}
.toast.err svg{stroke:var(--danger)}
@keyframes slide{from{transform:translateY(12px);opacity:0}}
.drop{border:1.5px dashed var(--border-strong);border-radius:var(--r-lg);padding:var(--s8);
  text-align:center;color:var(--text-3);cursor:pointer;background:var(--surface);
  transition:border-color var(--dur) var(--ease),background var(--dur) var(--ease)}
.drop:hover,.drop.over{border-color:var(--accent);background:var(--accent-soft);color:var(--text-2)}
.drop svg{width:26px;height:26px;stroke:var(--text-3);margin-bottom:8px}
.drop b{display:block;color:var(--text);font-size:13.5px;font-weight:500;margin-bottom:3px}

/* 平板及以下：侧栏收成顶部横条，导航横向滚动，首屏留给内容 */
@media(max-width:1024px){
  .sidebar{position:sticky;top:0;width:100%;height:auto;border-right:none;
    border-bottom:1px solid var(--border);flex-direction:row;align-items:center;
    flex-wrap:wrap;gap:var(--s3);padding:var(--s2) var(--s4)}
  .brand{padding:0;border:none;flex:none}
  .brand span span{display:none}
  .proj-switch{padding:0;border:none;flex:1;min-width:180px;max-width:340px}
  .proj-switch label{display:none}
  .nav{flex:0 0 100%;order:3;display:flex;overflow-x:auto;overflow-y:hidden;
    padding:0 0 var(--s2);gap:2px;scrollbar-width:none}
  .nav::-webkit-scrollbar{display:none}
  .nav-group{display:none}
  .nav a{border-left:none;border-bottom:2px solid transparent;padding:7px 12px;
    white-space:nowrap;border-radius:var(--r) var(--r) 0 0}
  .nav a.on{border-left:none;border-bottom-color:var(--accent)}
  .sb-foot{border:none;padding:0;flex:none;gap:4px}
  .sb-user{display:none}
  .main{margin-left:0;padding:0 var(--s4) var(--s8)}
  .topbar{position:static;margin:0 calc(-1 * var(--s4)) var(--s5);padding:var(--s4)}
  .form{grid-template-columns:1fr}
  .kv{grid-template-columns:104px 1fr}
  .fw-grid{grid-template-columns:1fr}
}
@media(max-width:640px){
  .grid.g4,.grid.g3,.grid.g2{grid-template-columns:1fr}
  .stat .v{font-size:24px}
  .topbar .tools{width:100%;margin-left:0}
}

/* ================= 选择器网格 ================= */
.pickgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px}
.pick{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--border);
  border-radius:var(--r);cursor:pointer;font-size:12.5px;background:var(--surface-2);
  transition:border-color var(--dur) var(--ease),background var(--dur) var(--ease)}
.pick:hover{border-color:var(--border-strong)}
.pick:has(input:checked){border-color:var(--accent);background:var(--accent-soft);color:var(--accent);font-weight:600}
.pick input{width:15px;height:15px;min-height:0;flex:none}

/* ================= 访谈结构化问答 ================= */
.qa-head{position:sticky;top:0;z-index:3;background:var(--surface);
  border-bottom:1px solid var(--border);margin:calc(-1 * var(--s5)) calc(-1 * var(--s5)) var(--s4);
  padding:var(--s4) var(--s5)}
.qa-stat{display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap;font-size:12.5px;
  color:var(--text-2);margin-bottom:var(--s3)}
.qa-stat b{color:var(--text);font-variant-numeric:tabular-nums}
.qa-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.qa-section{margin-bottom:var(--s5)}
.qa-section>h5{font-size:10.5px;letter-spacing:1px;text-transform:uppercase;color:var(--accent);
  font-weight:700;margin-bottom:var(--s2);padding-bottom:5px;border-bottom:1px solid var(--border)}
.qa{border:1px solid var(--border);border-left:2px solid var(--border-strong);
  border-radius:var(--r);padding:var(--s3) var(--s4);margin-bottom:var(--s2);
  background:var(--surface-2);transition:border-color var(--dur) var(--ease)}
.qa.done{border-left-color:var(--ok)}
.qa.flagged{border-left-color:var(--danger);background:var(--danger-soft)}
.qa-q{display:flex;gap:10px;align-items:flex-start;margin-bottom:var(--s2)}
.qa-n{flex:none;width:22px;height:22px;border-radius:var(--r-sm);background:var(--surface-3);
  color:var(--text-2);font-size:11px;font-weight:700;display:flex;align-items:center;
  justify-content:center;font-variant-numeric:tabular-nums}
.qa.done .qa-n{background:var(--ok-soft);color:var(--ok)}
.qa.flagged .qa-n{background:var(--danger-soft);color:var(--danger)}
.qa-text{flex:1;min-width:0}
.qa-text b{font-size:13.5px;font-weight:600;line-height:1.5;display:block}
.qa-intent{display:flex;gap:6px;align-items:flex-start;margin-top:5px;font-size:11.5px;
  color:var(--text-3);line-height:1.5}
.qa-intent svg{width:13px;height:13px;flex:none;margin-top:2px;stroke:var(--text-3)}
.qa-a{width:100%;min-height:62px;font-size:13px;line-height:1.6}
.qa-meta{display:flex;gap:var(--s2);align-items:center;margin-top:var(--s2);flex-wrap:wrap}
.qa-meta input[data-f]{flex:1;min-width:160px;font-size:12px;min-height:30px;padding:5px 9px}
.qa-meta .chk{font-size:12px;white-space:nowrap;min-height:30px}
.qa-meta .chk svg{width:13px;height:13px;stroke:var(--text-3)}
.qa.flagged .qa-meta .chk svg{stroke:var(--danger)}
.qa-state{font-size:11px;color:var(--text-3);min-width:52px;text-align:right}

/* 访谈详情页微调 */
.qa-section>h5{display:flex;align-items:center;justify-content:space-between}
.qa-section>h5 span{font-family:var(--mono);font-size:11px;color:var(--text-3);
  letter-spacing:0;text-transform:none;font-weight:500}
.qa-side{display:flex;align-items:center;gap:6px;flex:none}
.qa-del{opacity:0;transition:opacity var(--dur) var(--ease);padding:3px;min-width:24px;min-height:24px}
.qa:hover .qa-del{opacity:.55}
.qa-del:hover{opacity:1!important;color:var(--danger)}

/* 操作列固定在右侧，宽表无需横向拖到底 */
.tablewrap th.sticky-col,
.tablewrap td.sticky-col{
  position:sticky;right:0;z-index:3;
  background:var(--surface);
  box-shadow:-6px 0 8px -6px rgba(0,0,0,.28);
}
.tablewrap th.sticky-col{z-index:4;background:var(--surface-2)}
.tablewrap tbody tr:hover td.sticky-col{background:var(--surface-2)}

/* ================= 清单分组 ================= */
.grp{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);
  margin-bottom:var(--s2);overflow:hidden}
.grp-head{display:flex;align-items:center;gap:var(--s3);padding:11px var(--s4);cursor:pointer;
  transition:background var(--dur) var(--ease);user-select:none}
.grp-head:hover{background:var(--surface-2)}
.grp-head .chev{stroke:var(--text-3);transition:transform var(--dur) var(--ease);flex:none}
.grp.open .grp-head .chev{transform:rotate(180deg)}
.grp-head b{font-family:var(--display);font-size:14px;font-weight:600;
  letter-spacing:-.2px;white-space:nowrap}
.grp-count{font-size:11px;color:var(--text-3);font-family:var(--mono);
  background:var(--surface-3);border-radius:var(--r-sm);padding:1px 7px;flex:none}
.grp-bar{flex:1;max-width:260px;min-width:70px}
.grp-head .count{flex:none;min-width:48px;text-align:right}
.grp-export{flex:none;opacity:0;transition:opacity var(--dur) var(--ease)}
.grp-head:hover .grp-export{opacity:.7}
.grp-export:hover{opacity:1!important}
.grp-body{display:none;border-top:1px solid var(--border)}
.grp.open .grp-body{display:block}
.grp-body .tablewrap{border:none;border-radius:0;max-height:calc(100vh - 300px)}
@media(max-width:900px){.grp-bar{display:none}}

/* 控制点证据行 */
.ev-row{display:flex;align-items:center;gap:9px;padding:8px 11px;border:1px solid var(--border);
  border-radius:var(--r);margin-bottom:6px;background:var(--surface-2);font-size:12.5px}
.ev-row svg{stroke:var(--text-3);flex:none}
.ev-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
.ev-row .count{flex:none;white-space:nowrap}
.tag svg{width:12px;height:12px}

/* 按标准实施率：两列铺开，名称/数量/进度/百分比各占固定位，不互相挤压 */
.fw-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
  gap:10px var(--s6)}
.fw-row{display:flex;align-items:center;gap:var(--s3);font-size:12.5px}
.fw-name{flex:none;width:82px;font-weight:600}
.fw-cnt{flex:none;width:58px;color:var(--text-3);font-family:var(--mono);font-size:11.5px}
.fw-bar{flex:1;min-width:60px}
.fw-pct{flex:none;width:42px;text-align:right}


/* ===== 全局排版收敛：数字与文字不粘连、行高统一 ===== */
/* 数字与紧随的中文之间留出气口 */
.count b, .count strong{margin:0 2px}
.card h3 .r{white-space:nowrap;flex:none;margin-left:auto}
.card h3{gap:var(--s4);flex-wrap:wrap;align-items:baseline}
.card h3 > span:first-child{min-width:0}

/* 表格：行内进度条与数字并排时给固定宽度，避免挤压 */
td .bar{min-width:52px}
td .count{white-space:nowrap}

/* 分组头：小屏隐藏进度条而不是压扁 */
.grp-head b{min-width:0;overflow:hidden;text-overflow:ellipsis}

/* 卡片内表格首列不被长中文顶开 */
.card table td:first-child{white-space:nowrap}
.card table td.wrap:first-child{white-space:normal}

/* 键值对：值过长时换行而不是溢出 */
.kv dd{min-width:0;overflow-wrap:anywhere}

/* 标签与 chip 垂直居中对齐数字 */
.tag, .chip{vertical-align:middle}

/* 空状态与说明文字统一行高 */
.empty div{line-height:1.7;max-width:520px;margin:0 auto}

/* 卡片内的紧凑统计行：名称与数值一行，进度条独占一行，窄卡片也不挤 */
.mini-row{padding:6px 0;font-size:12.5px;min-width:0}
.mini-row + .mini-row{border-top:1px solid var(--border)}
.mini-top{display:flex;align-items:baseline;gap:10px;min-width:0}
.mini-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mini-v{flex:none;text-align:right;font-weight:600}
.mini-x{flex:none;text-align:right;color:var(--text-3);font-size:11.5px}

/* ===== 细节层：Apple 的质感来自小处，不来自装饰 ===== */

/* 按钮微交互 */
.btn{transition:background var(--dur) var(--ease),border-color var(--dur) var(--ease),
  color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform 90ms var(--ease)}

/* 滚动条：安静 */
::-webkit-scrollbar-thumb{background:var(--border-strong)}
::-webkit-scrollbar-thumb:hover{background:var(--text-3)}

/* 编号 / 代码 */
td .mono{color:var(--text-2)}

/* 官方标准引用行 */
.ref-row{display:flex;gap:11px;padding:9px 0;border-top:1px solid var(--border)}
.ref-row:first-of-type{border-top:none}
.ref-id{flex:none;width:82px;color:var(--accent-text);font-weight:600;font-size:11.5px;padding-top:1px}
.ref-body{flex:1;min-width:0}
.ref-body b{font-size:12.5px;font-weight:600;line-height:1.5;display:block}
.ref-ex{font-size:11.5px;color:var(--text-3);line-height:1.55;margin-top:3px}
/* ============ 最佳实践指南库 ============ */
.kb-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:var(--s4)}
.kb-card{display:flex;flex-direction:column;gap:var(--s2);text-align:left;cursor:pointer;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);
  padding:var(--s5);color:var(--text);font:inherit;
  transition:border-color var(--dur) var(--ease),transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.kb-card:hover{border-color:var(--accent);transform:translateY(-2px);box-shadow:var(--shadow)}
.kb-top{display:flex;justify-content:space-between;align-items:center;gap:var(--s2)}
.kb-cat{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent-text);
  background:var(--accent-soft);border-radius:var(--r-sm);padding:2px 8px}
.kb-ver{font-size:11.5px;color:var(--text-3)}
.kb-card h4{margin:0;font-family:var(--display);font-size:16px;line-height:1.35}
.kb-sum{margin:0;font-size:12.5px;color:var(--text-2);line-height:1.6}
.kb-nums{display:flex;flex-wrap:wrap;gap:var(--s3);margin-top:var(--s1)}
.kb-nums span{font-size:11.5px;color:var(--text-3);display:flex;gap:4px;align-items:baseline}
.kb-nums b{font-family:var(--mono);font-size:14px;color:var(--text);font-variant-numeric:tabular-nums}
.kb-nums .kb-p0 b{color:var(--danger)}
.kb-foot{display:flex;justify-content:space-between;align-items:center;gap:var(--s2);
  margin-top:auto;padding-top:var(--s3);border-top:1px solid var(--border)}
.kb-st{font-size:11px;padding:2px 8px;border-radius:var(--r-sm)}
.kb-st.st-ok{color:var(--ok);background:var(--ok-soft)}
.kb-st.st-draft{color:var(--warn);background:var(--warn-soft)}
.kb-rev{display:flex;align-items:center;gap:5px;font-size:11.5px;color:var(--text-3)}
.kb-rev svg{width:13px;height:13px}
.kb-rev.overdue{color:var(--danger)}

.kb-note{display:flex;gap:var(--s3);align-items:flex-start;margin:var(--s3) 0 0;
  padding:var(--s3) var(--s4);border-radius:var(--r);
  background:var(--warn-soft);border:1px solid var(--warn);font-size:12.5px;color:var(--text-2);line-height:1.65}
.kb-note svg{flex:none;width:16px;height:16px;color:var(--warn);margin-top:2px}
.kb-acts{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s4)}
.kb-stat{display:flex;flex-direction:column;gap:2px;padding:var(--s4) var(--s5)}
.kb-stat span:last-child{font-size:11.5px;color:var(--text-3)}
.kb-stat .num{font-family:var(--display);font-size:26px;font-variant-numeric:tabular-nums;line-height:1.1}
.kb-stat.p0 .num{color:var(--danger)}
.kb-stat.p1 .num{color:var(--warn)}
.kb-stat.p2 .num{color:var(--text-2)}
.kb-filters{margin-bottom:var(--s4)}

.kb-items{display:flex;flex-direction:column;gap:var(--s6)}
.kb-dom>header{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s4);
  border-bottom:2px solid var(--border-strong);padding-bottom:var(--s2);margin-bottom:var(--s3)}
.kb-dom>header h4{margin:0;font-family:var(--display);font-size:15.5px}
.kb-dom>header span{font-size:11.5px;color:var(--text-3)}
.kb-row{display:grid;grid-template-columns:126px minmax(0,1fr);gap:var(--s4);
  background:var(--surface);border:1px solid var(--border);border-radius:var(--r);
  padding:var(--s4);margin-bottom:var(--s2)}
.kb-row.ph-p0{border-left:3px solid var(--danger)}
.kb-row.ph-p1{border-left:3px solid var(--warn)}
.kb-row.ph-p2{border-left:3px solid var(--border-strong)}
.kb-rid{display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.kb-code{font-size:12.5px;font-weight:600;color:var(--text)}
.kb-gate{display:inline-flex;flex-direction:column;gap:1px;line-height:1.3;font-size:9.5px;
  padding:3px 7px;border-radius:var(--r-sm)}
.kb-gate b{font-family:var(--mono);font-size:11px}
.kb-gate.g-p0{color:var(--danger);background:var(--danger-soft)}
.kb-gate.g-p1{color:var(--warn);background:var(--warn-soft)}
.kb-gate.g-p2{color:var(--text-2);background:var(--surface-2)}
.kb-role{font-size:11px;color:var(--text-3);border:1px solid var(--border);
  border-radius:var(--r-sm);padding:1px 7px}
.kb-rb h5{margin:0 0 5px;font-size:14.5px;font-family:var(--display);line-height:1.4}
.kb-rb>p{margin:0 0 var(--s3);font-size:13px;color:var(--text-2);line-height:1.7}
.kb-ev{font-size:12px;color:var(--text-2);background:var(--surface-2);border-radius:var(--r-sm);
  padding:7px 10px;margin-bottom:var(--s2);line-height:1.6}
.kb-ev>span{display:inline-block;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--text-3);margin-right:7px;font-family:var(--display)}
.kb-maps{display:flex;flex-wrap:wrap;gap:5px}
.kb-map{display:inline-flex;align-items:baseline;gap:5px;font-family:var(--mono);font-size:10.5px;
  padding:2px 7px;border:1px solid var(--border);border-radius:var(--r-sm);color:var(--text-2)}
.kb-map i{font-style:normal;font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3)}
.kb-map.hip{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-text)}
.kb-map.hip i{color:var(--accent-text)}
.kb-pre{white-space:pre-wrap;word-break:break-word;font-family:var(--mono);font-size:12px;
  line-height:1.75;color:var(--text-2);margin:0;background:var(--surface-2);
  padding:var(--s4);border-radius:var(--r);max-height:52vh;overflow:auto}
@media (max-width:760px){
  .kb-row{grid-template-columns:1fr;gap:var(--s3)}
  .kb-rid{flex-direction:row;align-items:center;flex-wrap:wrap;gap:var(--s2)}
}
.kb-why{margin:0 0 var(--s2)!important;font-size:12.5px;color:var(--text-2);line-height:1.65;
  padding-left:10px;border-left:2px solid var(--border-strong)}
.kb-why>span{display:inline-block;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--text-3);margin-right:7px;font-family:var(--display)}
.kb-cmd{display:flex;align-items:flex-start;gap:8px;background:var(--surface-2);
  border-radius:var(--r-sm);padding:8px 10px;margin-bottom:var(--s2)}
.kb-cmd>span{flex:none;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--text-3);font-family:var(--display);padding-top:3px}
.kb-cmd code{flex:1;min-width:0;font-family:var(--mono);font-size:11.5px;line-height:1.65;
  color:var(--text-2);white-space:pre;overflow-x:auto;overflow-y:hidden;
  display:block;padding-bottom:2px}
/* 长命令在自己的框内横向滚动，绝不撑破卡片或让页面横向滚动 */
.kb-cmd code::-webkit-scrollbar{height:6px}
.kb-cmd code::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}
.kb-copy{flex:none;background:none;border:1px solid var(--border);border-radius:var(--r-sm);
  padding:3px;cursor:pointer;color:var(--text-3);line-height:0}
.kb-copy:hover{color:var(--accent-text);border-color:var(--accent)}
.kb-copy svg{width:13px;height:13px}
.kb-map.ref{border-style:dashed}

/* 对比度修正：P0 徽章浅色主题 4.06 → ≥4.5；验证标签深色 4.46 → ≥4.5 */
:root,[data-theme="dark"]{ --gate-p0-fg:#ff8fa0; --kb-label:#8e9bb0; }
[data-theme="light"]{ --gate-p0-fg:#b02338; --kb-label:#5d6b7d; }
@media (prefers-color-scheme:light){ :root:not([data-theme="dark"]){
  --gate-p0-fg:#b02338; --kb-label:#5d6b7d; } }
.kb-gate.g-p0{color:var(--gate-p0-fg)}
.kb-cmd>span,.kb-ev>span,.kb-why>span{color:var(--kb-label)}
.kb-caution{display:flex;gap:9px;align-items:flex-start;margin-top:var(--s2);
  padding:8px 11px;border-radius:var(--r-sm);background:var(--warn-soft);
  font-size:12px;color:var(--text-2);line-height:1.65}
.kb-caution svg{flex:none;width:14px;height:14px;color:var(--warn);margin-top:2px}

/* 视角切换：同一份数据的四个切面 */
.kb-views{display:flex;gap:2px;border-bottom:1px solid var(--border);
  margin-bottom:var(--s4);flex-wrap:wrap}
.kb-views button{background:none;border:none;border-bottom:2px solid transparent;
  color:var(--text-3);padding:9px 15px;cursor:pointer;font-size:13px;font-weight:500;
  display:flex;align-items:center;gap:7px;
  transition:color var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.kb-views button:hover{color:var(--text-2)}
.kb-views button.on{color:var(--text);border-bottom-color:var(--accent)}
.kb-views button span{font-family:var(--mono);font-size:11px;color:var(--text-3);
  background:var(--surface-2);border-radius:var(--r-sm);padding:1px 6px;
  font-variant-numeric:tabular-nums}
.kb-views button.on span{color:var(--accent-text);background:var(--accent-soft)}
.kb-row.is-gate{border-left-color:var(--danger)}
.kb-cmd.is-impl code{max-height:420px;overflow-y:auto;white-space:pre-wrap;word-break:break-word}
.kb-svc{font-size:12px;color:var(--text-2);margin-bottom:var(--s2);line-height:1.6}
.kb-svc>span{display:inline-block;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--kb-label);margin-right:7px;font-family:var(--display)}

/* ==========================================================================
   Apple Liquid Glass —— 统一表面层
   核心一条：同类内容放在「一块白面板 + 发丝分隔线」上，
   而不是一堆各自带边框、各自带底色的卡片。碎片化是头号敌人。
   ========================================================================== */

/* ---------- 面板：卡片去装饰，回到一块干净的白 ---------- */
.card{
  position:relative;
  background:var(--surface);
  border:none;                       /* 边框由阴影和留白代替 */
  border-radius:var(--r-panel);
  padding:clamp(17px,2.4vw,24px);
  box-shadow:var(--sh-panel);
  overflow:hidden;
  transition:box-shadow var(--dur) var(--ease);
}
.card::before{content:none}          /* 右上角柔光：删 */
.card:hover{transform:none}          /* 面板不做悬浮位移，只有可点的卡片才做 */

/* 面板小标题：不加色块、不加左侧色条，靠字重和字号分层 */
.card h3{
  font-size:13px;font-weight:600;letter-spacing:-.01em;text-transform:none;
  color:var(--text);margin-bottom:var(--s4);
  display:flex;align-items:center;gap:var(--s2);justify-content:space-between;
}
.card h3 .r{font-size:12.5px;font-weight:400;color:var(--text-3);letter-spacing:0}

/* ---------- 统一行列表：同类条目共用一块面板，发丝线分隔 ---------- */
.panel{background:var(--surface);border-radius:var(--r-panel);
  box-shadow:var(--sh-panel);overflow:hidden}
.panel .row{display:block;padding:15px clamp(17px,2.4vw,24px);color:var(--text);
  text-decoration:none;transition:background .15s var(--ease)}
.panel .row + .row{border-top:1px solid var(--border)}
a.row:hover,button.row:hover{background:var(--surface-2)}
.row-t{font-size:15px;font-weight:600;letter-spacing:-.01em;line-height:1.45}
.row-s{margin-top:3px;font-size:13px;color:var(--text-2);line-height:1.5}

/* ---------- 指标网格：一块面板，格间发丝线，格子本身没有边框 ----------
   .grid.g4 全站有 7 处都是指标行，改这里等于七个页面一起变。
   用 1px gap 露出底色当分隔线，列数随宽度变也不会错位。 */
.grid.g4{
  background:var(--surface);          /* 面板底就是白的，格子数填不满也不会露出灰格 */
  border-radius:var(--r-panel);
  box-shadow:var(--sh-panel);
  gap:0;overflow:hidden;              /* overflow 把最右列 / 最底行多出的那条线裁掉 */
  grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
}
.grid.g4 > .card,.grid.g4 > .card.stat{
  background:transparent;border:none;border-radius:0;min-height:0;
  padding:17px clamp(16px,2.2vw,22px);
  box-shadow:1px 0 0 var(--border),0 1px 0 var(--border);   /* 发丝线画在格子上 */
}
.grid.g4 > .card:hover{background:var(--surface-2)}
.grid.g4 > .card::before{content:none}

/* ---------- 数字：字重字号扛层级，不用渐变、不用发光 ---------- */
.stat .v{
  font-family:var(--display);font-size:32px;font-weight:600;letter-spacing:-.028em;
  line-height:1.12;color:var(--text);
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum";
  display:flex;align-items:baseline;gap:3px;flex-wrap:wrap;
  background:none;-webkit-text-fill-color:currentColor;
}
.stat .v small{font-size:14px;color:var(--text-3);font-weight:400;letter-spacing:0;
  -webkit-text-fill-color:var(--text-3)}
.stat .l{font-size:13px;color:var(--text-2);margin-top:5px;line-height:1.4}
.stat .sub{font-size:12px;color:var(--text-3);margin-top:auto;padding-top:9px;
  font-variant-numeric:tabular-nums;line-height:1.5}
.stat.hero .v{font-size:38px}         /* 主指标只靠更大更重，不换颜色 */

/* 进度条：安静的轨 + 单色填充，无辉光 */
.bar{height:4px;background:var(--track);border-radius:var(--r-pill);margin-top:10px}
.bar>i{background:var(--accent);border-radius:var(--r-pill);box-shadow:none}
.bar.ok>i{background:var(--ok)} .bar.warn>i{background:var(--warn)}
.bar.danger>i{background:var(--danger)}

/* ---------- 阶段轨：分段控件，不是七个小卡片 ---------- */
.phaserail{display:flex;background:var(--surface-3);border-radius:var(--r-pill);
  padding:3px;gap:2px;margin-top:var(--s5)}
.phaserail a{flex:1;min-width:0;display:block;text-decoration:none;text-align:center;
  border-radius:var(--r-pill);padding:6px 6px 7px;
  transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.phaserail .k{display:block;font-family:var(--mono);font-size:10px;color:var(--text-3);
  letter-spacing:.02em;line-height:1.3}
.phaserail .n{display:block;font-size:11.5px;color:var(--text-2);line-height:1.35;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.phaserail a:hover{background:rgba(127,127,127,.1)}
.phaserail a.done .k{color:var(--text-2)}
.phaserail a.on{background:var(--surface);box-shadow:0 1px 3px rgba(0,0,0,.12)}
.phaserail a.on .k{color:var(--accent-text);font-weight:600}
.phaserail a.on .n{color:var(--text);font-weight:600}

/* ---------- 玻璃只出现在真正有层叠的地方 ---------- */
/* 顶栏悬浮在滚动内容之上 —— 这里该用玻璃 */
.topbar{background:var(--glass);
  backdrop-filter:saturate(180%) blur(20px);-webkit-backdrop-filter:saturate(180%) blur(20px);
  border-bottom:1px solid transparent;box-shadow:none;
  transition:border-color .3s var(--ease),box-shadow .3s var(--ease)}
.topbar.scrolled{border-bottom-color:var(--border);box-shadow:0 1px 12px rgba(0,0,0,.04)}
.topbar h2{font-family:var(--display);font-size:24px;font-weight:600;letter-spacing:-.024em;
  line-height:1.2}
.topbar .desc{font-size:13px;color:var(--text-3);margin-top:2px}
/* 平铺内容不用玻璃 */
.card,.panel,.tablewrap,.kb-card{backdrop-filter:none;-webkit-backdrop-filter:none}

/* ---------- 其余部件对齐圆角与发丝线 ---------- */
.btn{border-radius:var(--r-pill);font-weight:500;border-color:var(--border-strong)}
.btn.primary{background:var(--accent);border-color:transparent;box-shadow:none}
.btn.primary:hover{background:var(--accent-hover);filter:none;transform:none;box-shadow:none}
.seg{border-radius:var(--r-pill);border:none;background:var(--surface-3);padding:3px;gap:2px}
.seg button{border-radius:var(--r-pill);font-weight:500}
.seg button.on{background:var(--surface);color:var(--text);font-weight:600;
  box-shadow:0 1px 3px rgba(0,0,0,.12)}
.chip{border-radius:var(--r-pill);background:var(--surface-3);border:none;color:var(--text-2);
  padding:2px 10px}
.tablewrap{border-radius:var(--r-panel);border:none;box-shadow:var(--sh-panel)}
input,select,textarea{border-radius:var(--r);border-color:var(--border-strong)}
input:focus,select:focus,textarea:focus{border-color:var(--accent);
  box-shadow:0 0 0 3px var(--accent-soft)}
.kb-card{border-radius:var(--r-lg);border:none;background:var(--surface);
  box-shadow:var(--shadow)}
.kb-card:hover{transform:translateY(-3px);box-shadow:var(--sh-lift)}
.modal,.modal-box{border-radius:var(--r-panel);box-shadow:var(--sh-overlay)}
.modal::before{content:none}          /* 弹窗顶部渐变线：删 */
.login-card::before{content:none}     /* 登录卡渐变描边：删 */
.brand svg,.login-mark svg{filter:none}   /* 品牌图标辉光：删 */
.empty svg{stroke:var(--text-3);opacity:.5}
th{background:var(--surface-2);color:var(--th-text);border-bottom:1px solid var(--border)}
.grp.open::before{content:none}       /* 分组头左侧渐变条：删 */
.phase>.head{background:none}         /* 阶段卡头部渐变：删 */

/* ---------- 页面 hero：不用卡片包住，直接落在页面地上 ---------- */
.hero{padding:clamp(10px,2vw,18px) 0 clamp(20px,3vw,28px)}
.hero .eyebrow{display:flex;align-items:center;gap:9px;font-size:12px;font-weight:600;
  letter-spacing:.1em;color:var(--text-3);text-transform:uppercase}
.hero h1{margin-top:12px;font-family:var(--display);
  font-size:clamp(27px,4.4vw,40px);font-weight:600;letter-spacing:-.032em;line-height:1.12}
.hero .lede{margin-top:12px;font-size:clamp(14px,1.6vw,16px);color:var(--text-2);
  line-height:1.6;max-width:620px;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.hero .statline{margin-top:14px;font-size:13px;color:var(--text-3);
  font-variant-numeric:tabular-nums;display:flex;gap:var(--s5);flex-wrap:wrap}
.hero .statline b{color:var(--text);font-weight:600}

/* ---------- 设置式行列表：标签在左，值在右，行间发丝线 ---------- */
.rows{display:flex;flex-direction:column}
.rows .r2{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s5);
  padding:11px 0;font-size:13.5px;line-height:1.55}
.rows .r2 + .r2{border-top:1px solid var(--border)}
.rows .r2 > span:first-child{color:var(--text-2);flex:none}
.rows .r2 > span:last-child{color:var(--text);text-align:right;min-width:0;
  overflow-wrap:anywhere}
.rows .r2 .mono{font-variant-numeric:tabular-nums}
/* 段落型行：标签在上、正文在下，长正文行高放到 1.85 */
.rows .r2.col{display:block;padding:13px 0}
.rows .r2.col .obj-k{display:block;font-size:11.5px;font-weight:600;letter-spacing:.05em;
  color:var(--text-3);margin-bottom:6px}
.rows .r2.col .obj-v{display:block;color:var(--text-2);text-align:left;
  font-size:13.5px;line-height:1.85}

/* 四标准行：同一块面板里的行，靠发丝线分隔 */
.fw-row{display:flex;align-items:center;gap:var(--s4);font-size:13.5px;padding:11px 0;margin:0}
.fw-row + .fw-row{border-top:1px solid var(--border)}
.fw-name{flex:none;width:88px;font-weight:600;letter-spacing:-.01em}
.fw-cnt{flex:none;width:56px;color:var(--text-3);font-family:var(--mono);font-size:11.5px}
.fw-bar{flex:1;min-width:60px}
.fw-bar .bar{margin:0}
.fw-pct{flex:none;width:44px;text-align:right;font-variant-numeric:tabular-nums;font-weight:600}

/* ---------- 键值对 ---------- */
.kv2{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
  gap:0 var(--s8);align-items:start}
.kv2 .kv{grid-template-columns:78px 1fr}
.kv dd.clamp{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.6}

/* ---------- 内容容器：网格页 1080，两栏用 gap 不用 margin ---------- */
.grid{gap:var(--s4);align-items:start}   /* 面板该多高就多高，不padding到齐 */
.grid.g4{align-items:stretch}            /* 指标面板例外：它本身是一整块 */
.g2{grid-template-columns:repeat(auto-fit,minmax(340px,1fr))}
.g3{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
.stack{display:flex;flex-direction:column;gap:var(--s4)}

/* .bento 保留为普通网格，避免遗漏的调用处塌掉 */
.bento{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--s4);
  align-items:stretch;margin-bottom:var(--s4)}
.bento>*{grid-column:span 3;min-width:0}
.b2{grid-column:span 2} .b3{grid-column:span 3} .b4{grid-column:span 4}
.b5{grid-column:span 5} .b6{grid-column:span 6} .b8{grid-column:span 8}
.b9{grid-column:span 9} .b12{grid-column:span 12}
.rs2{grid-row:span 2}
.bento.fit{align-items:start}

@media (max-width:1180px){
  .bento{grid-template-columns:repeat(6,minmax(0,1fr))}
  .bento>*,.b2,.b3{grid-column:span 3}
  .b4,.b5,.b6,.b8,.b9,.b12{grid-column:span 6}
  .rs2{grid-row:span 1}
}
@media (max-width:680px){
  .bento{grid-template-columns:1fr}
  .bento>*,.b2,.b3,.b4,.b5,.b6,.b8,.b9,.b12{grid-column:span 1}
  .card{padding:var(--s4)}
  .stat .v{font-size:28px}
  .stat.hero .v{font-size:32px}
  .phaserail{flex-wrap:wrap}
  .phaserail a{flex:1 1 30%}
  .hide-sm{display:none}
}
/* ---------- 客户在场模式 ----------
   开着时费率与金额显示为 ••••。编辑表单里的费率输入框用 text-security 遮：
   值和可编辑性都保留，只是看不见 —— 直接清空或替换成占位符会有把真实费率
   覆盖掉的风险。 */
#maskBtn.on{color:var(--accent);background:var(--accent-soft)}
body.masked input#f_hourly_rate,
body.masked input#f_rate{-webkit-text-security:disc;text-security:disc}
body.masked input#f_hourly_rate:focus,
body.masked input#f_rate:focus{-webkit-text-security:none;text-security:none}

/* ── 框架覆盖 ── */
.cov-summary .cov-fw{cursor:pointer;border-bottom:1px solid var(--border);border-radius:0;padding:12px 8px;margin:0 -8px;transition:background .15s}
.cov-summary .cov-fw:last-child{border-bottom:0}
.cov-summary .cov-fw:hover{background:var(--bg-2)}
.cov-summary .cov-fw.on{background:var(--bg-2)}
.cov-summary .cov-fw:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.cov-group{margin-top:var(--s4)}
.cov-group:first-of-type{margin-top:0}
.cov-ghead{display:flex;align-items:baseline;gap:var(--s3);padding:6px 0 8px;border-bottom:1px solid var(--border-strong);font-size:13px}
.cov-ghead .count{margin-left:auto}
.cov-clause{display:grid;grid-template-columns:120px 64px 1fr;gap:var(--s3);align-items:start;padding:9px 0;border-bottom:1px solid var(--border);font-size:13px}
.cov-clause:last-child{border-bottom:0}
.cov-ref{font-size:12px;padding-top:2px;word-break:break-all}
.cov-ctrls{display:flex;flex-wrap:wrap;gap:6px 14px}
.cov-ctl{display:inline-flex;align-items:center;gap:2px;color:var(--text-2);text-decoration:none;font-size:12px;padding:2px 0}
.cov-ctl:hover .mono{color:var(--accent)}
.cov-ctl .mono{font-size:11.5px}
@media (max-width:720px){.cov-clause{grid-template-columns:1fr;gap:4px}}


/* ---------- AI 安全助手 ---------- */
.ai-wrap{display:grid;grid-template-columns:280px 1fr;gap:var(--s4);height:calc((100vh - 200px) / var(--zoom,1));min-height:480px}
[data-nav="side"] .ai-wrap{height:calc((100vh - 160px) / var(--zoom,1))}
.ai-side{display:flex;flex-direction:column;gap:var(--s3);min-height:0}
.ai-roles{display:grid;grid-template-columns:1fr 1fr;gap:var(--s2)}
.ai-role{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:10px 12px;background:var(--surface);
  border:1px solid var(--border);border-radius:var(--r-panel);cursor:pointer;text-align:left;color:var(--text-2);font:inherit}
.ai-role svg{width:18px;height:18px}
.ai-role span{display:flex;flex-direction:column;gap:1px}
.ai-role b{font-size:13px;color:var(--text)} .ai-role small{font-size:11px;color:var(--text-3);line-height:1.3}
.ai-role.on{border-color:var(--accent);background:var(--surface-2);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 22%,transparent)}
.ai-qs-title{font-size:11px;letter-spacing:.06em;color:var(--text-3);text-transform:uppercase;margin-top:var(--s2)}
.ai-qs{display:flex;flex-direction:column;gap:6px;overflow:auto;min-height:0}
.ai-q{text-align:left;font:inherit;font-size:12.5px;line-height:1.45;padding:8px 10px;background:var(--surface);
  border:1px solid var(--border);border-radius:var(--r);color:var(--text-2);cursor:pointer}
.ai-q:hover{border-color:var(--accent);color:var(--text)}
.ai-chat{display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-panel);min-height:0;overflow:hidden}
.ai-thread{flex:1;overflow:auto;padding:var(--s5);display:flex;flex-direction:column;gap:var(--s4)}
.ai-thread{gap:var(--s3)}
.ai-msg{display:flex;flex-direction:column;max-width:100%}
.ai-msg.user{align-self:flex-end;align-items:flex-end;max-width:78%}
.ai-bubble{padding:8px 13px;border-radius:14px 14px 4px 14px;font-size:13px;line-height:1.55;background:var(--accent);color:var(--accent-fg)}
.ai-answer{border:1px solid var(--border);border-radius:var(--r-panel);background:var(--surface);overflow:hidden}
.ai-answer-head{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--surface-2);border-bottom:1px solid var(--border);font-size:12px;color:var(--text-2)}
.ai-answer-head svg{width:14px;height:14px;color:var(--accent)} .ai-answer-head .ai-meta{margin:0 0 0 auto}
.ai-copy{background:none;border:none;cursor:pointer;color:var(--text-3);padding:2px;display:flex} .ai-copy:hover{color:var(--text)} .ai-copy svg{width:14px;height:14px}
.ai-answer-src{display:flex;flex-wrap:wrap;gap:6px;padding:6px 12px;border-top:1px dashed var(--border)}
.ai-meta{font-size:11px;color:var(--text-3)}
/* 正文：紧凑、有层次 */
.ai-md{padding:10px 14px;font-size:13px;line-height:1.55;color:var(--text)}
.ai-md p{margin:0 0 6px} .ai-md p:last-child{margin-bottom:0}
.ai-md h4,.ai-md h5,.ai-md h6{font-size:13px;font-weight:600;margin:10px 0 4px;color:var(--text);display:flex;align-items:center;gap:8px}
.ai-md h4::before,.ai-md h5::before,.ai-md h6::before{content:"";width:3px;height:13px;border-radius:2px;background:var(--accent);flex:none}
.ai-md h4:first-child,.ai-md h5:first-child,.ai-md h6:first-child{margin-top:0}
.ai-md ul,.ai-md ol{margin:2px 0 6px 18px;padding:0} .ai-md li{margin:1px 0} .ai-md li::marker{color:var(--text-3)}
.ai-md blockquote{margin:6px 0;padding:6px 10px;border-left:3px solid var(--accent);background:var(--surface-2);border-radius:0 var(--r) var(--r) 0;color:var(--text-2)}
.ai-md hr{border:none;border-top:1px solid var(--border);margin:8px 0}
.ai-md pre{background:var(--bg);padding:8px 10px;border-radius:var(--r);font-family:var(--mono);font-size:12px;overflow:auto;margin:6px 0;line-height:1.45}
.ai-md code{font-family:var(--mono);font-size:12px;background:var(--bg);padding:1px 5px;border-radius:4px;color:var(--text)}
.ai-md b{font-weight:600;color:var(--text)} .ai-md a{color:var(--accent)}
.ai-tw{overflow:auto;margin:6px 0;border:1px solid var(--border);border-radius:var(--r)}
.ai-md table{border-collapse:collapse;width:100%;font-size:12.5px}
.ai-md th{background:var(--surface-2);text-align:left;padding:5px 9px;font-weight:600;color:var(--text-2);white-space:nowrap;border-bottom:1px solid var(--border)}
.ai-md td{padding:5px 9px;border-top:1px solid var(--border);vertical-align:top;font-variant-numeric:tabular-nums}
.ai-md tr:nth-child(even) td{background:color-mix(in srgb,var(--surface-2) 45%,transparent)}
/* 严重度 / 状态词 */
.sev{display:inline-block;padding:0 6px;border-radius:999px;font-size:11.5px;font-weight:600;line-height:17px;vertical-align:1px}
.sev.crit{background:#fde2e1;color:#a5231b} .sev.high{background:#fdebd3;color:#a4541a} .sev.med{background:#fff4cc;color:#8a6a00}
.sev.ok{background:#dcf3e6;color:#1f7a4d} .sev.off{background:var(--surface-3);color:var(--text-3)}
[data-theme="dark"] .sev.crit{background:#4a1f1c;color:#f3a29c} [data-theme="dark"] .sev.high{background:#4a2f14;color:#f1b56f}
[data-theme="dark"] .sev.med{background:#46390c;color:#e8cf6a} [data-theme="dark"] .sev.ok{background:#173f2b;color:#8fd8b0}
.ai-hello{margin:auto;text-align:center;max-width:460px;color:var(--text-2)} .ai-hello h3{margin:8px 0 4px} .ai-hint{font-size:12px;color:var(--text-3)}
.ai-input{display:flex;gap:var(--s2);padding:var(--s3);border-top:1px solid var(--border);background:var(--surface);position:sticky;bottom:0}
.ai-input textarea{flex:1;min-height:44px;resize:none} .ai-input .btn{align-self:flex-end;height:40px}
.ai-typing i{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--text-3);margin:0 2px;animation:aiBlink 1.2s infinite}
.ai-typing i:nth-child(2){animation-delay:.2s} .ai-typing i:nth-child(3){animation-delay:.4s}
@keyframes aiBlink{0%,80%,100%{opacity:.25}40%{opacity:1}}
.ai-sources{display:inline-flex;gap:6px;margin-right:var(--s2);flex-wrap:wrap}
.ai-src{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:2px 8px;border-radius:var(--r-pill);background:var(--surface-3);color:var(--text-2)}
.ai-src i{width:7px;height:7px;border-radius:50%;background:var(--text-3)} .ai-src.ok i{background:#2f9e6f} .ai-src.off{opacity:.65}
.ai-tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:var(--s4)}
.ai-tabs button{font:inherit;font-size:13px;padding:8px 14px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-2);cursor:pointer;margin-bottom:-1px}
.ai-tabs button.on{color:var(--text);border-bottom-color:var(--accent)}
.ai-tabpane .hint{font-size:12px;color:var(--text-3);margin:0 0 var(--s3)}
.ai-seg{display:flex;gap:var(--s2);margin-bottom:var(--s4)}
.ai-seg button{flex:1;display:flex;align-items:center;justify-content:center;gap:8px;font:inherit;font-size:13.5px;padding:12px;background:var(--surface);
  border:1px solid var(--border);border-radius:var(--r-panel);color:var(--text-2);cursor:pointer}
.ai-seg button svg{width:16px;height:16px}
.ai-seg button.on{border-color:var(--accent);color:var(--text);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 22%,transparent)}
.ai-presets{display:flex;flex-wrap:wrap;gap:6px} .ai-presets .chip{cursor:pointer;font-family:inherit;font-size:12px;padding:4px 10px;line-height:1.4}
.ai-presets .chip.on{background:var(--accent);color:var(--accent-fg)}
.ai-secret{display:flex;align-items:center;gap:8px;min-height:36px} .ai-secret input{flex:1} .ai-dots{color:var(--text-3);letter-spacing:2px;font-size:11px}
.ai-adv{margin-top:var(--s3)} .ai-adv summary{font-size:12.5px;color:var(--text-3);cursor:pointer}
.ai-testrow{display:flex;align-items:flex-start;gap:var(--s3);margin-top:var(--s4);padding-top:var(--s3);border-top:1px dashed var(--border)}
.ai-test{font-size:12px;word-break:break-all;flex:1} .ai-parts{margin-top:6px;display:flex;flex-wrap:wrap;gap:4px}
.ai-parts .chip.ok{color:#2f9e6f} .ai-parts .chip.bad{color:var(--danger,#c0392b)}
@media (max-width:900px){.ai-wrap{grid-template-columns:1fr;height:auto}.ai-chat{height:60vh}}
.ai-scope{font-size:12px;color:var(--text-3);margin-bottom:var(--s3);display:flex;align-items:center;gap:8px}


/* ==========================================================================
   外观预设：字体 × 风格 × 密度。只覆盖 token，不碰组件 —— 这是全站唯一的设计杠杆。
   ========================================================================== */
/* ---- 字体 ---- */
[data-font="jakarta"]{--font:'Plus Jakarta Sans',"PingFang SC","Hiragino Sans GB","Source Han Sans SC","Microsoft YaHei",sans-serif;--display:var(--font)}
[data-font="grotesk"]{--font:'Plus Jakarta Sans',"PingFang SC","Hiragino Sans GB","Source Han Sans SC","Microsoft YaHei",sans-serif;
  --display:'Space Grotesk',"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif}
[data-font="helvetica"]{--font:"Helvetica Neue",Helvetica,Arial,"PingFang SC","Hiragino Sans GB","Source Han Sans SC","Microsoft YaHei",sans-serif;--display:var(--font)}
[data-font="serif"]{--font:-apple-system,BlinkMacSystemFont,"SF Pro Text","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  --display:"New York","Iowan Old Style","Palatino Linotype",Georgia,"Songti SC","Noto Serif SC","Source Han Serif SC","SimSun",serif}
[data-font="serif"] h2,[data-font="serif"] h3,[data-font="serif"] .brand b{letter-spacing:0}
[data-font="jakarta"] body,[data-font="grotesk"] body,[data-font="helvetica"] body{letter-spacing:0}
[data-font] .mono,[data-font] .num{font-family:'JetBrains Mono',var(--mono)}

/* ---- 密度 ---- */
[data-density="compact"]{--s1:3px;--s2:6px;--s3:10px;--s4:13px;--s5:16px;--s6:20px;--s8:26px;--s10:32px;--sidebar:224px}

/* ---- 风格 · Linear：工程感，冷灰蓝底、小圆角、硬发丝线、靛蓝强调 ---- */
[data-style="linear"]{--r-sm:5px;--r:8px;--r-lg:10px;--r-panel:12px;--r-hero:14px}
[data-style="linear"][data-theme="light"],[data-style="linear"]:not([data-theme="dark"]){
  --bg:#f7f8fa;--surface:#ffffff;--surface-2:#f3f4f7;--surface-3:#eceef2;
  --border:#e4e6ec;--border-strong:#d3d6de;--text:#16181d;--text-2:#5c6370;--text-3:#8a90a0;--faint:#c9cdd6;
  --accent:#5e6ad2;--accent-text:#4f5bc4;--accent-hover:#6b76e0;--accent-soft:rgba(94,106,210,.1);--accent-glow:rgba(94,106,210,.25);
  --accent-2:#8b93e8;--grad:linear-gradient(135deg,#5e6ad2,#8b93e8);--info:#5e6ad2;--info-soft:rgba(94,106,210,.1);
  --shadow:0 1px 2px rgba(16,18,28,.05);--sh-panel:0 1px 2px rgba(16,18,28,.05);--sh-lift:0 8px 24px rgba(16,18,28,.12);--glass:rgba(247,248,250,.85);--track:#e4e6ec}
[data-style="linear"][data-theme="dark"]{
  --bg:#0b0d12;--surface:#12151c;--surface-2:#181c25;--surface-3:#20242f;
  --border:rgba(255,255,255,.08);--border-strong:rgba(255,255,255,.14);--text:#e6e8ee;--text-2:#9298a8;--text-3:#6b7182;--faint:#3a3f4d;
  --accent:#7c88ff;--accent-text:#9aa3ff;--accent-hover:#8e98ff;--accent-soft:rgba(124,136,255,.14);--accent-glow:rgba(124,136,255,.3);
  --accent-2:#a5adff;--grad:linear-gradient(135deg,#7c88ff,#a5adff);--info:#7c88ff;--info-soft:rgba(124,136,255,.14);
  --shadow:0 1px 2px rgba(0,0,0,.5);--sh-panel:0 1px 2px rgba(0,0,0,.5);--sh-lift:0 8px 24px rgba(0,0,0,.6);--glass:rgba(11,13,18,.85);--track:#20242f}
[data-style="linear"] .card::before{display:none}

/* ---- 风格 · Enterprise：企业仪表盘，浅色为主、明确边框、Fluent 蓝 ---- */
[data-style="enterprise"]{--r-sm:4px;--r:6px;--r-lg:8px;--r-panel:10px;--r-hero:12px}
[data-style="enterprise"][data-theme="light"],[data-style="enterprise"]:not([data-theme="dark"]){
  --bg:#eef1f6;--surface:#ffffff;--surface-2:#f6f8fb;--surface-3:#e9edf3;
  --border:#d9dfe8;--border-strong:#bfc8d6;--text:#14213d;--text-2:#4b5975;--text-3:#7a879c;--faint:#c3cad6;
  --accent:#0f6cbd;--accent-text:#0c5aa0;--accent-hover:#115ea3;--accent-soft:rgba(15,108,189,.1);--accent-glow:rgba(15,108,189,.22);
  --accent-2:#2b88d8;--grad:linear-gradient(135deg,#0f6cbd,#2b88d8);--info:#0f6cbd;--info-soft:rgba(15,108,189,.1);
  --ok:#107c41;--warn:#c05a00;--danger:#c42b1c;
  --shadow:0 1px 2px rgba(20,33,61,.06);--sh-panel:0 1px 2px rgba(20,33,61,.06);--sh-lift:0 6px 20px rgba(20,33,61,.14);--glass:rgba(238,241,246,.9);--track:#dfe4ec}
[data-style="enterprise"][data-theme="dark"]{
  --bg:#0f172a;--surface:#1e293b;--surface-2:#243044;--surface-3:#2c3a50;
  --border:#31415a;--border-strong:#425571;--text:#e2e8f0;--text-2:#a3b0c2;--text-3:#7c8aa0;--faint:#4a5a73;
  --accent:#4da3ff;--accent-text:#7dbcff;--accent-hover:#63afff;--accent-soft:rgba(77,163,255,.14);--accent-glow:rgba(77,163,255,.3);
  --accent-2:#7dbcff;--grad:linear-gradient(135deg,#4da3ff,#7dbcff);--info:#4da3ff;--info-soft:rgba(77,163,255,.14);
  --shadow:0 1px 2px rgba(0,0,0,.4);--sh-panel:0 1px 2px rgba(0,0,0,.4);--sh-lift:0 8px 24px rgba(0,0,0,.5);--glass:rgba(15,23,42,.88);--track:#2c3a50}
[data-style="enterprise"] .card{border:1px solid var(--border)}
[data-style="enterprise"] .card::before{display:none}
[data-style="enterprise"] .grid.g4{border:1px solid var(--border)}

/* ---- 外观面板 ---- */
.ap-sec{margin-bottom:var(--s5)} .ap-sec h4{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);margin-bottom:var(--s2)}
.ap-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s2)}
.ap-opt{border:1px solid var(--border);border-radius:var(--r);padding:10px 12px;cursor:pointer;background:var(--surface);text-align:left;font:inherit;color:var(--text);display:flex;flex-direction:column;gap:4px}
.ap-opt:hover{border-color:var(--border-strong)} .ap-opt.on{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.ap-opt b{font-size:13px} .ap-opt small{font-size:11.5px;color:var(--text-3);line-height:1.35}
.ap-sw{display:flex;gap:4px;margin-top:4px} .ap-sw i{width:18px;height:10px;border-radius:3px;border:1px solid rgba(0,0,0,.08)}
.ap-font{grid-template-columns:1fr}
.ap-font .ap-opt{flex-direction:row;align-items:center;justify-content:space-between;gap:var(--s3)}
.ap-font .ap-sample{font-size:16px;letter-spacing:-.2px;white-space:nowrap} .ap-font .ap-sample .n{font-variant-numeric:tabular-nums;color:var(--text-2);margin-left:8px;font-size:14px}
.ap-4{grid-template-columns:repeat(4,1fr)}

.goal{cursor:pointer} .goal:hover{background:var(--surface-2)} .goal.done .obj-v b{text-decoration:line-through;color:var(--text-3)}
.obj-d{color:var(--text-2);font-size:12.5px} .mono.late{color:var(--danger)}
.obj-more{margin-top:var(--s3)} .obj-more summary{font-size:12px;color:var(--text-3);cursor:pointer}

/* ==========================================================================
   方向 A · 编辑部 / 杂志感（Editorial）
   衬线大标题与大数字、纸面底色、墨线分隔、非对称留白；颜色只做一处强调（钴蓝）。
   全部走 token + 少量组件覆盖，其它风格不受影响。
   ========================================================================== */
[data-font="editorial"]{
  --font:'Inter',-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Source Han Sans SC","Microsoft YaHei",sans-serif;
  --display:'Instrument Serif',"Songti SC","Noto Serif SC","Source Han Serif SC","SimSun",Georgia,serif;
  --mono:'JetBrains Mono',ui-monospace,"SF Mono",Menlo,monospace;
}
[data-font="editorial"] body{letter-spacing:0;font-feature-settings:"cv11","ss01"}

[data-style="editorial"]{--r-sm:3px;--r:4px;--r-lg:6px;--r-panel:6px;--r-hero:8px;--max-grid:1240px}
[data-style="editorial"][data-theme="light"],[data-style="editorial"]:not([data-theme="dark"]){
  --bg:#f3f3f0;--surface:#ffffff;--surface-2:#f8f8f6;--surface-3:#ebebe7;--overlay:rgba(20,20,18,.32);
  --border:#e2e2dc;--border-strong:#c9c9c2;--rule:#141414;
  --text:#141414;--text-2:#4c4c47;--text-3:#7d7d76;--faint:#cfcfc8;
  --accent:#1f3fbf;--accent-text:#1a36a8;--accent-hover:#2a4ee0;--accent-fg:#ffffff;
  --accent-soft:rgba(31,63,191,.08);--accent-glow:rgba(31,63,191,.2);--accent-2:#1f3fbf;--grad:var(--accent);
  --mark:#f4e86e;
  --ok:#1e7a45;--ok-soft:rgba(30,122,69,.1);--warn:#b45309;--warn-soft:rgba(180,83,9,.1);
  --danger:#b3261e;--danger-soft:rgba(179,38,30,.09);--crit:#8a1c16;--crit-soft:rgba(138,28,22,.1);
  --info:#1f3fbf;--info-soft:rgba(31,63,191,.08);
  --shadow:none;--sh-panel:none;--sh-lift:0 10px 30px rgba(20,20,18,.12);--sh-overlay:0 24px 64px rgba(20,20,18,.22);
  --glass:rgba(243,243,240,.9);--track:#e2e2dc;--th-text:#7d7d76;
}
[data-style="editorial"][data-theme="dark"]{
  --bg:#141412;--surface:#1c1c1a;--surface-2:#232321;--surface-3:#2c2c29;--overlay:rgba(0,0,0,.6);
  --border:#2f2f2b;--border-strong:#454540;--rule:#ecebe6;
  --text:#ecebe6;--text-2:#b5b4ad;--text-3:#84837c;--faint:#4a4a45;
  --accent:#7c93ff;--accent-text:#9aabff;--accent-hover:#8fa3ff;--accent-fg:#0f1530;
  --accent-soft:rgba(124,147,255,.14);--accent-glow:rgba(124,147,255,.3);--accent-2:#7c93ff;--grad:var(--accent);
  --mark:#8c7f1f;
  --ok:#5fc98a;--ok-soft:rgba(95,201,138,.14);--warn:#f0a442;--warn-soft:rgba(240,164,66,.14);
  --danger:#f0655d;--danger-soft:rgba(240,101,93,.14);--crit:#ff7b73;--crit-soft:rgba(255,123,115,.14);
  --info:#7c93ff;--info-soft:rgba(124,147,255,.14);
  --shadow:none;--sh-panel:none;--sh-lift:0 10px 30px rgba(0,0,0,.5);--sh-overlay:0 24px 64px rgba(0,0,0,.6);
  --glass:rgba(20,20,18,.9);--track:#2c2c29;--th-text:#84837c;
}

/* ---- 面板：墨线压顶，去阴影 ---- */
[data-style="editorial"] .card,[data-style="editorial"] .panel,[data-style="editorial"] .grid.g4,
[data-style="editorial"] .tablewrap,[data-style="editorial"] .kb-card{
  border:1px solid var(--border);border-top:2px solid var(--rule);border-radius:var(--r-panel);box-shadow:none}
[data-style="editorial"] .card{padding:18px 22px}
[data-style="editorial"] .card h3{font-family:var(--display);font-size:21px;font-weight:400;letter-spacing:-.005em;
  padding-bottom:10px;margin-bottom:14px;border-bottom:1px solid var(--border)}
[data-style="editorial"] .card h3 .r{font-family:var(--font);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-3)}
[data-style="editorial"] .grid.g4>.card{box-shadow:1px 0 0 var(--border),0 1px 0 var(--border);border:none;padding:20px 22px 18px}
[data-style="editorial"] .grid.g4>.card:hover{background:var(--surface-2)}

/* ---- 数字与标题：衬线扛层级 ---- */
[data-style="editorial"] .stat .v{font-family:var(--display);font-size:40px;font-weight:400;letter-spacing:-.02em;line-height:1;
  font-variant-numeric:lining-nums tabular-nums}
[data-style="editorial"] .stat .v small{font-family:var(--font);font-size:13px;letter-spacing:0}
[data-style="editorial"] .stat.hero .v{font-size:56px}
[data-style="editorial"] .stat .l{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-3);margin-top:8px;font-weight:500}
[data-style="editorial"] .stat .sub{font-size:12.5px;color:var(--text-2)}
[data-style="editorial"] .hero{padding:8px 0 16px;border-bottom:1px solid var(--rule);margin-bottom:var(--s4)}
[data-style="editorial"] .hero .eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--accent-text);font-weight:500}
[data-style="editorial"] .hero h1{font-family:var(--display);font-size:clamp(26px,2.6vw,34px);font-weight:400;letter-spacing:-.01em;line-height:1.15;margin-top:10px;max-width:40ch}
[data-style="editorial"] .hero .lede{font-family:var(--font);font-size:14px;line-height:1.65;color:var(--text-2);max-width:78ch;margin-top:10px}
[data-style="editorial"] .hero .statline{font-family:var(--font);font-size:12.5px;letter-spacing:.02em;margin-top:14px;gap:0 22px}
[data-style="editorial"] .hero .statline b{font-family:var(--display);font-size:16px;font-weight:400;padding:0 2px;background:linear-gradient(transparent 55%,var(--mark) 55%)}
[data-style="editorial"] .topbar{background:var(--bg);backdrop-filter:none;-webkit-backdrop-filter:none}
[data-style="editorial"] .topbar h2{font-family:var(--display);font-size:26px;font-weight:400;letter-spacing:-.01em}
[data-style="editorial"] .topbar .desc{font-size:13px;color:var(--text-3)}
[data-style="editorial"] .topbar.scrolled{box-shadow:none;border-bottom-color:var(--border)}
[data-style="editorial"] .phaserail{border-radius:var(--r);background:var(--surface-3);padding:3px}
[data-style="editorial"] .phaserail a,[data-style="editorial"] .phaserail a.on{border-radius:var(--r-sm)}
[data-style="editorial"] .phaserail a.on{box-shadow:none;border:1px solid var(--border-strong)}

/* ---- 控件：方角、墨色主按钮 ---- */
[data-style="editorial"] .btn{border-radius:var(--r);font-weight:500;letter-spacing:0}
[data-style="editorial"] .btn.primary{background:var(--text);color:var(--bg);border-color:transparent}
[data-style="editorial"] .btn.primary:hover{background:var(--accent);color:var(--accent-fg)}
[data-style="editorial"] .seg,[data-style="editorial"] .seg button{border-radius:var(--r)}
[data-style="editorial"] .seg button.on{box-shadow:none;border:1px solid var(--border-strong)}
[data-style="editorial"] .chip{border-radius:var(--r-sm);font-family:var(--mono);font-size:10.5px;letter-spacing:.02em}
[data-style="editorial"] .tag{border-radius:var(--r-sm);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600}
[data-style="editorial"] input,[data-style="editorial"] select,[data-style="editorial"] textarea{border-radius:var(--r);background:var(--surface)}
[data-style="editorial"] .modal{border-radius:var(--r-lg);border:1px solid var(--border);border-top:3px solid var(--rule)}
[data-style="editorial"] .modal header h3{font-family:var(--display);font-size:24px;font-weight:400}
[data-style="editorial"] th{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-3);
  background:var(--surface);border-bottom:1px solid var(--rule);padding:10px 12px}
[data-style="editorial"] td{padding:10px 12px}
[data-style="editorial"] .bar{height:3px;border-radius:0} [data-style="editorial"] .bar>i{border-radius:0}
[data-style="editorial"] .nav-group{font-size:10px;letter-spacing:.14em}
[data-style="editorial"] .login-mark b{font-family:var(--display);font-size:24px;font-weight:400}
[data-style="editorial"] .login-card{border-top:3px solid var(--rule);border-radius:var(--r-lg);backdrop-filter:none}
[data-style="editorial"] .ai-answer{border-top:2px solid var(--rule)}
[data-style="editorial"] .ai-md h4::before,[data-style="editorial"] .ai-md h5::before,[data-style="editorial"] .ai-md h6::before{background:var(--rule)}
[data-style="editorial"] .ai-role.on{box-shadow:none;border-color:var(--rule)}
[data-style="editorial"] .obj-k{font-family:var(--mono);font-size:11px;letter-spacing:.04em}

/* ==========================================================================
   顶部导航（桌面）：品牌 · 项目 · 分组下拉 · 工具；正文居中、最大 1240px
   ========================================================================== */
@media (min-width:1025px){
  [data-nav="top"] .sidebar{position:fixed;inset:0 0 auto 0;width:auto;height:58px;flex-direction:row;align-items:center;
    gap:var(--s5);padding:0 clamp(20px,3vw,40px);border-right:none;border-bottom:1px solid var(--border);background:var(--surface)}
  [data-nav="top"] .brand{padding:0;border:none;flex:none}
  [data-nav="top"] .brand>span>span{display:none}
  [data-nav="top"] .brand b{font-size:15px;letter-spacing:.02em}
  [data-nav="top"] .proj-switch{padding:0;border:none;flex:none;width:auto;max-width:300px}
  [data-nav="top"] .proj-switch label{display:none}
  [data-nav="top"] .proj-switch select{font-size:12.5px;padding:6px 10px}
  [data-nav="top"] .nav{flex:1;display:flex;align-items:center;gap:2px;padding:0;overflow:visible;height:100%;min-width:0}
  [data-nav="top"] .ng,[data-nav="top"] .nav>a.solo{flex:none}
  [data-nav="top"] .nav>a.solo span,[data-nav="top"] .ng>.nav-group{white-space:nowrap}
  [data-nav="top"] .ng{position:relative;height:100%;display:flex;align-items:center}
  [data-nav="top"] .ng>.nav-group,[data-nav="top"] .nav>a.solo{padding:7px 10px;font-size:13px;letter-spacing:0;text-transform:none;font-weight:500;
    color:var(--text-2);border-radius:var(--r);cursor:default;display:flex;align-items:center;gap:6px;border:none;white-space:nowrap}
  [data-nav="top"] .ng>.nav-group::after{content:"";width:5px;height:5px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg) translateY(-2px);opacity:.55}
  [data-nav="top"] .ng:hover>.nav-group,[data-nav="top"] .ng.open>.nav-group,[data-nav="top"] .nav>a.solo:hover{color:var(--text);background:var(--surface-3)}
  [data-nav="top"] .ng.on>.nav-group,[data-nav="top"] .nav>a.solo.on{color:var(--text);box-shadow:inset 0 -2px 0 var(--accent);border-radius:var(--r) var(--r) 0 0;background:transparent}
  [data-nav="top"] .ng-items{display:none;position:absolute;top:calc(100% - 4px);left:0;min-width:236px;background:var(--surface);border:1px solid var(--border);
    border-radius:var(--r-lg);box-shadow:var(--sh-lift);padding:6px;z-index:40}
  [data-nav="top"] .ng:hover .ng-items,[data-nav="top"] .ng.open .ng-items{display:block}
  [data-nav="top"] .ng-items a{padding:8px 10px;border-radius:var(--r-sm);border-left:none;font-size:13px}
  [data-nav="top"] .ng-items a.on{background:var(--accent-soft);color:var(--accent-text)}
  [data-nav="top"] .nav>a.solo svg{display:none}
  [data-nav="top"] .sb-foot{border:none;padding:0;margin-left:auto;gap:2px;flex:none}
  [data-nav="top"] .sb-user{display:none}
  [data-nav="top"] .main{margin-left:0;max-width:var(--max-grid);margin-inline:auto;padding:58px clamp(20px,3vw,40px) var(--s10)}
  [data-nav="top"] .topbar{top:58px;margin:0 0 var(--s6);padding:var(--s5) 0 var(--s4)}
  [data-nav="top"][data-style="editorial"] .sidebar{background:var(--bg);border-bottom-color:var(--rule)}
}
.ap-2{grid-template-columns:repeat(2,1fr)}
.solo-label{display:none}
[data-nav="side"] .solo-label{display:block}
@media (max-width:1024px){.ng>.nav-group{display:none}.ng-items{display:contents}}
.goal{position:relative} .goal-edit{position:absolute;right:10px;top:10px;color:var(--text-3);opacity:0;transition:opacity var(--dur)} .goal:hover .goal-edit{opacity:1} .goal-edit svg{width:14px;height:14px}
.btn.danger{color:var(--danger);border-color:var(--danger)} .btn.danger:hover{background:var(--danger-soft)}

/* ---- 项目切换：公司眉题 + 项目名，按公司分组的下拉 ---- */
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.proj-switch{position:relative}
.proj-btn{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;color:var(--text);cursor:pointer;
  background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--r);padding:5px 10px;min-height:34px}
.proj-btn:hover{border-color:var(--text-3)}
.pb-co{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--text-3);flex:none}
.pb-name{flex:1;min-width:0;font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pb-caret{flex:none;width:6px;height:6px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg) translateY(-2px);opacity:.55}
.proj-menu{position:absolute;top:calc(100% + 6px);left:0;min-width:300px;max-width:420px;z-index:45;background:var(--surface);
  border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--sh-lift);padding:6px;max-height:60vh;overflow:auto}
.pm-co{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--text-3);padding:8px 10px 4px}
.pm-item{display:flex;flex-direction:column;gap:2px;width:100%;text-align:left;font:inherit;color:var(--text);background:none;border:none;
  border-radius:var(--r-sm);padding:8px 10px;cursor:pointer}
.pm-item:hover{background:var(--surface-2)} .pm-item.on{background:var(--accent-soft);color:var(--accent-text)}
.pm-name{font-size:13px;font-weight:500} .pm-meta{font-size:11px;color:var(--text-3);font-family:var(--mono)}
[data-style="editorial"] .proj-btn{border-radius:var(--r);background:var(--bg)}
[data-style="editorial"] .pb-name{font-family:var(--display);font-size:15px;font-weight:400}
[data-style="editorial"] .pm-name{font-family:var(--display);font-size:15px;font-weight:400}
[data-style="editorial"] .proj-menu{border-top:2px solid var(--rule)}
[data-nav="top"] .proj-switch{width:auto;max-width:300px}

.fld-otp{margin-top:var(--s3)} .fld-otp input{font-family:var(--mono);letter-spacing:4px;font-size:16px}
.tfa-setup{display:flex;gap:var(--s5);align-items:flex-start;flex-wrap:wrap}
.tfa-setup img{border:1px solid var(--border);border-radius:var(--r);background:#fff;padding:6px}
.tfa-secret{background:var(--surface-2);padding:8px 10px;border-radius:var(--r);font-size:13px;letter-spacing:1px}
.tfa-codes{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--s2);margin-top:var(--s3)}
.tfa-codes code{font-family:var(--mono);font-size:14px;background:var(--surface-2);padding:8px 12px;border-radius:var(--r);text-align:center;letter-spacing:1px}

/* ---------- 仪表盘上的 AI 助手入口 ---------- */
.ai-cta{display:flex;align-items:center;gap:var(--s4);padding:14px 18px;margin-bottom:var(--s4);
  background:var(--surface);border:1px solid var(--border);border-radius:var(--r-panel);color:var(--text);
  transition:border-color var(--dur) var(--ease),transform var(--dur) var(--ease)}
.ai-cta:hover{border-color:var(--accent);transform:translateY(-1px);color:var(--text)}
.ai-cta-mark{flex:none;width:38px;height:38px;border-radius:var(--r);display:grid;place-items:center;
  background:var(--accent-soft);color:var(--accent-text)}
.ai-cta-mark svg{width:20px;height:20px;stroke-width:1.6}
.ai-cta-txt{min-width:0;display:flex;flex-direction:column;gap:2px}
.ai-cta-txt b{font-size:14px;font-weight:600}
.ai-cta-txt small{font-size:12px;color:var(--text-3);line-height:1.4}
.ai-cta-qs{display:flex;gap:6px;margin-left:auto;flex-wrap:wrap}
.ai-cta-qs i{font-style:normal;font-size:11.5px;color:var(--text-2);background:var(--surface-3);
  padding:3px 10px;border-radius:var(--r-pill);white-space:nowrap}
.ai-cta-go{flex:none;color:var(--text-3)} .ai-cta:hover .ai-cta-go{color:var(--accent)}
[data-style="editorial"] .ai-cta{border-top:2px solid var(--rule);border-radius:var(--r-panel)}
[data-style="editorial"] .ai-cta-txt b{font-family:var(--display);font-size:17px;font-weight:400}
@media (max-width:900px){.ai-cta-qs{display:none}}

/* ---------- 甘特图 ---------- */
.g-card{padding:0;overflow:hidden}
.g-wrap{overflow:auto;max-height:calc((100vh - 280px) / var(--zoom,1));min-height:320px}
.g-head{display:flex;position:sticky;top:0;z-index:3;background:var(--surface);border-bottom:1px solid var(--border)}
.g-corner{display:flex;align-items:center;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3)}
.g-label{flex:none;width:280px;padding:8px 14px;position:sticky;left:0;z-index:2;background:var(--surface);
  border-right:1px solid var(--border);display:flex;flex-direction:column;gap:2px;min-width:0}
.g-track{position:relative;flex:1;min-width:var(--g-w,600px);height:34px}
.g-ticks{height:32px}
.g-tick{position:absolute;top:0;bottom:-10000px;border-left:1px solid var(--border)}
.g-tick.major{border-left-color:var(--border-strong)}
.g-tick.we{background:color-mix(in srgb,var(--surface-3) 55%,transparent);width:var(--tw,26px)}
.g-tick i{position:absolute;top:6px;left:4px;font-style:normal;font-size:10.5px;color:var(--text-3);
  font-family:var(--mono);white-space:nowrap}
.g-today{position:absolute;top:0;bottom:-10000px;border-left:2px solid var(--danger);z-index:2}
.g-today i{position:absolute;top:2px;left:4px;font-style:normal;font-size:10px;color:var(--danger);white-space:nowrap}
.g-body{position:relative}
.g-row{display:flex;align-items:stretch;border-bottom:1px solid var(--border);cursor:pointer}
.g-row:hover{background:var(--surface-2)} .g-row:hover .g-label{background:var(--surface-2)}
.g-name{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;gap:6px}
.g-name svg{width:13px;height:13px;color:var(--accent);flex:none}
.g-meta{font-size:11px;color:var(--text-3);display:flex;align-items:center;gap:6px}
.g-goal{background:var(--surface-2);cursor:default} .g-goal .g-label{background:var(--surface-2)}
.g-goal .g-name{font-weight:700}
[data-style="editorial"] .g-goal .g-name{font-family:var(--display);font-size:16px;font-weight:400}
.g-addwrap{display:inline-flex;gap:4px;margin-left:4px}
.g-add{border:1px solid var(--border);background:var(--surface);color:var(--text-3);cursor:pointer;
  font-size:10.5px;line-height:1;padding:3px 7px;border-radius:var(--r-pill);display:inline-flex;align-items:center;gap:3px;font-family:inherit}
.g-add svg{width:10px;height:10px}
.g-add:hover{color:var(--accent-text);border-color:var(--accent)}
.g-add.ms:hover{color:var(--accent-text)}
.g-row:not(:hover) .g-addwrap{opacity:0} .g-addwrap{transition:opacity var(--dur)}
.g-bar{position:absolute;top:7px;height:20px;border-radius:4px;background:var(--accent);color:var(--accent-fg);
  display:flex;align-items:center;overflow:hidden}
.g-bar b{position:relative;font-size:11px;font-weight:500;padding:0 7px;white-space:nowrap;z-index:1}
.g-bar i{position:absolute;inset:0 auto 0 0;background:rgba(255,255,255,.28)}
.g-bar.done{background:var(--ok)} .g-bar.late{background:var(--danger)} .g-bar.blocked{background:var(--warn)}
.g-bar.doing{background:var(--accent)}
.g-bar:not(.done):not(.late):not(.blocked):not(.doing){background:var(--surface-3);color:var(--text-2)}
.g-ms{position:absolute;top:9px;width:14px;height:14px;background:var(--accent);transform:rotate(45deg);margin-left:-7px;border-radius:2px}
.g-ms.done{background:var(--ok)}
.g-goalmark{position:absolute;top:4px;bottom:4px;width:3px;background:var(--danger);margin-left:-1px;border-radius:2px}
.g-span{position:absolute;top:15px;height:4px;border-radius:2px;background:var(--border-strong);opacity:.7}
.g-nodate{position:absolute;left:8px;top:9px;font-size:11px;color:var(--text-3)}
.g-legend{display:flex;gap:var(--s4);flex-wrap:wrap;padding:10px 16px;border-top:1px solid var(--border);
  font-size:11.5px;color:var(--text-3);align-items:center}
.g-legend span{display:flex;align-items:center;gap:5px}
.g-k{width:14px;height:9px;border-radius:2px;display:inline-block}
.g-k.doing{background:var(--accent)} .g-k.done{background:var(--ok)} .g-k.late{background:var(--danger)}
.g-k.blocked{background:var(--warn)} .g-k.ms{background:var(--accent);transform:rotate(45deg);width:9px}
.g-k.goal{background:var(--danger);width:3px;height:14px}
@media (max-width:760px){.g-label{width:170px}}

/* 登录卡在编辑部风格下的收口：标题一行放得下，副标题与页脚对齐 */
[data-style="editorial"] .login-card{width:420px}
[data-style="editorial"] .login-mark{align-items:baseline;gap:8px}
[data-style="editorial"] .login-mark b{font-size:20px;line-height:1.2;white-space:nowrap}
[data-style="editorial"] .login-mark svg{width:20px;height:20px;transform:translateY(2px)}
[data-style="editorial"] .login-mark span{display:block;margin-top:2px}

/* 甘特图三级层次：目标（衬线大字） > 里程碑（强调色中号） > 任务（常规小号） */
.g-goal .g-name{font-size:15px;color:var(--text)}
.g-ms-row .g-name{font-size:13.5px;font-weight:600;color:var(--accent-text);padding-left:6px}
.g-ms-row .g-meta{padding-left:6px}
.g-task-row .g-name{font-size:12.5px;font-weight:400;color:var(--text-2);padding-left:14px}
.g-task-row .g-meta{padding-left:14px;font-size:10.5px}
.g-dot{width:4px;height:4px;border-radius:50%;background:var(--text-3);flex:none;display:inline-block}
.g-ms-row{background:color-mix(in srgb,var(--accent-soft) 40%,transparent)}
.g-ms-row .g-label{background:color-mix(in srgb,var(--accent-soft) 40%,transparent)}
.g-row[draggable="true"]{cursor:grab} .g-row.g-dragging{opacity:.45}
.g-group.g-dropover{outline:2px dashed var(--accent);outline-offset:-2px;background:var(--accent-soft)}
.g-group.g-dropover .g-label{background:transparent}

/* 甘特图：全屏、批量选择 */
body.gantt-full .sidebar,body.gantt-full .topbar .desc{display:none}
body.gantt-full .main{margin:0;max-width:none;padding:0}
body.gantt-full .topbar{position:fixed;top:0;left:0;right:0;z-index:50;margin:0;padding:8px 16px;background:var(--surface);border-bottom:1px solid var(--border)}
body.gantt-full #view{padding:52px 0 0}
body.gantt-full .g-card{border:none;border-radius:0;margin:0}
body.gantt-full .g-wrap{max-height:calc((100vh - 60px) / var(--zoom,1))}
.g-pick{width:13px;height:13px;margin-right:2px;accent-color:var(--accent);flex:none;cursor:pointer}
.g-row.g-picked{background:var(--accent-soft)} .g-row.g-picked .g-label{background:var(--accent-soft)}
.g-bulk{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);z-index:60;display:flex;align-items:center;gap:var(--s3);
  background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--r-pill);padding:8px 14px;box-shadow:var(--sh-lift)}
.g-bulk .gb-n{font-size:12.5px;color:var(--text-2);white-space:nowrap}
.g-bulk select{min-width:190px;font-size:12.5px;padding:5px 8px}

/* 图上直接改日期 */
.g-bar{cursor:grab;user-select:none;touch-action:none}
.g-bar.g-moving,.g-ms.g-moving{cursor:grabbing;box-shadow:0 2px 10px rgba(0,0,0,.25);z-index:5}
.g-ms{cursor:grab;touch-action:none}
.g-h{position:absolute;top:0;bottom:0;width:8px;cursor:ew-resize;opacity:0;background:rgba(255,255,255,.55);border-radius:3px}
.g-h-l{left:0} .g-h-r{right:0}
.g-bar:hover .g-h{opacity:.8}
.g-tip{position:absolute;z-index:8;background:var(--text);color:var(--bg);font-family:var(--mono);font-size:11px;
  padding:2px 7px;border-radius:var(--r-sm);white-space:nowrap;pointer-events:none}
.g-nodate{cursor:pointer;text-decoration:underline dotted}
.g-nodate:hover{color:var(--accent-text)}

.fld[hidden]{display:none!important}


/* ==========================================================================
   更多外观：Swiss / 终端 / 北欧 / 暖纸 / 高对比。全部只覆盖 token。
   ========================================================================== */

/* ---- Swiss 国际主义：黑白 + 一个红，方角，标签全大写 ---- */
[data-style="swiss"]{--r-sm:0px;--r:0px;--r-lg:0px;--r-panel:0px;--r-hero:0px}
[data-style="swiss"][data-theme="light"],[data-style="swiss"]:not([data-theme="dark"]){
  --bg:#ffffff;--surface:#ffffff;--surface-2:#f2f2f2;--surface-3:#e8e8e8;--overlay:rgba(0,0,0,.4);
  --border:#d6d6d6;--border-strong:#111111;--rule:#111111;
  --text:#111111;--text-2:#444444;--text-3:#757575;--faint:#c4c4c4;
  --accent:#e2231a;--accent-text:#c41c14;--accent-hover:#ff3a30;--accent-fg:#ffffff;
  --accent-soft:rgba(226,35,26,.08);--accent-glow:rgba(226,35,26,.2);--accent-2:#e2231a;--grad:var(--accent);
  --ok:#0a7d3e;--warn:#b35c00;--danger:#e2231a;--crit:#a5140d;--info:#111111;--info-soft:#f2f2f2;
  --shadow:none;--sh-panel:none;--sh-lift:none;--glass:#ffffff;--track:#e8e8e8;--mark:#ffe600}
[data-style="swiss"][data-theme="dark"]{
  --bg:#0d0d0d;--surface:#141414;--surface-2:#1c1c1c;--surface-3:#252525;
  --border:#2a2a2a;--border-strong:#efefef;--rule:#efefef;
  --text:#f2f2f2;--text-2:#b0b0b0;--text-3:#8a8a8a;--faint:#3d3d3d;
  --accent:#ff453a;--accent-text:#ff6b62;--accent-hover:#ff6b62;--accent-fg:#0d0d0d;
  --accent-soft:rgba(255,69,58,.14);--accent-2:#ff453a;--grad:var(--accent);
  --ok:#3ecf74;--warn:#e9a13b;--danger:#ff453a;--crit:#ff6b62;--info:#f2f2f2;--info-soft:#1c1c1c;
  --shadow:none;--sh-panel:none;--sh-lift:none;--glass:#0d0d0d;--track:#252525;--mark:#6b6200}
[data-style="swiss"] .card,[data-style="swiss"] .panel,[data-style="swiss"] .grid.g4,
[data-style="swiss"] .tablewrap,[data-style="swiss"] .kb-card{border:1px solid var(--rule);box-shadow:none}
[data-style="swiss"] .card h3{text-transform:uppercase;letter-spacing:.08em;font-size:11.5px;font-weight:700;border-bottom:2px solid var(--rule);padding-bottom:8px}
[data-style="swiss"] .stat .v{font-weight:700;letter-spacing:-.04em;font-size:44px}
[data-style="swiss"] .stat .l{text-transform:uppercase;letter-spacing:.1em;font-size:10.5px}
[data-style="swiss"] .btn{border-radius:0;text-transform:uppercase;letter-spacing:.06em;font-size:11.5px;font-weight:700}
[data-style="swiss"] .btn.primary{background:var(--accent);color:var(--accent-fg)}
[data-style="swiss"] th{text-transform:uppercase;letter-spacing:.08em;border-bottom:2px solid var(--rule)}
[data-style="swiss"] .tag,[data-style="swiss"] .chip{border-radius:0}
[data-style="swiss"] .hero h1{font-weight:700;letter-spacing:-.03em}

/* ---- 终端：深色等宽，安全运营台的味道 ---- */
[data-style="terminal"]{--r-sm:2px;--r:3px;--r-lg:4px;--r-panel:4px;--r-hero:4px;
  --font:'JetBrains Mono',ui-monospace,"SF Mono",Menlo,"PingFang SC","Microsoft YaHei",monospace;--display:var(--font)}
[data-style="terminal"],[data-style="terminal"][data-theme="dark"],[data-style="terminal"][data-theme="light"]{
  --bg:#0b0f0c;--surface:#11160f;--surface-2:#161d14;--surface-3:#1e2719;--overlay:rgba(0,0,0,.7);
  --border:#233021;--border-strong:#33452f;--rule:#33452f;
  --text:#d6ffd0;--text-2:#8fb98a;--text-3:#5f7f5c;--faint:#2b3a28;
  --accent:#4ade80;--accent-text:#86efac;--accent-hover:#6ee7a0;--accent-fg:#06210f;
  --accent-soft:rgba(74,222,128,.12);--accent-glow:rgba(74,222,128,.28);--accent-2:#4ade80;--grad:var(--accent);
  --ok:#4ade80;--ok-soft:rgba(74,222,128,.14);--warn:#fbbf24;--warn-soft:rgba(251,191,36,.14);
  --danger:#f87171;--danger-soft:rgba(248,113,113,.14);--crit:#fb7185;--crit-soft:rgba(251,113,133,.14);
  --info:#4ade80;--info-soft:rgba(74,222,128,.12);
  --shadow:none;--sh-panel:0 0 0 1px rgba(74,222,128,.06);--sh-lift:0 8px 26px rgba(0,0,0,.6);
  --glass:rgba(11,15,12,.9);--track:#1e2719;--th-text:#5f7f5c;--mark:#2f5e33;color-scheme:dark}
[data-style="terminal"] body{letter-spacing:0}
[data-style="terminal"] .card,[data-style="terminal"] .panel,[data-style="terminal"] .grid.g4,
[data-style="terminal"] .tablewrap{border:1px solid var(--border)}
[data-style="terminal"] .card h3::before{content:"$ ";color:var(--accent);opacity:.7}
[data-style="terminal"] .stat .v{font-weight:600;letter-spacing:-.02em}
[data-style="terminal"] .btn{border-radius:3px;text-transform:none}
[data-style="terminal"] th{text-transform:uppercase;letter-spacing:.06em}

/* ---- 北欧：低饱和蓝灰，最耐看 ---- */
[data-style="nordic"]{--r-sm:6px;--r:10px;--r-lg:14px;--r-panel:16px;--r-hero:20px}
[data-style="nordic"][data-theme="light"],[data-style="nordic"]:not([data-theme="dark"]){
  --bg:#eceff4;--surface:#ffffff;--surface-2:#f6f8fb;--surface-3:#e5e9f0;--overlay:rgba(46,52,64,.35);
  --border:#dde3ec;--border-strong:#c4cddc;--rule:#4c566a;
  --text:#2e3440;--text-2:#4c566a;--text-3:#7b8494;--faint:#c9d0dd;
  --accent:#5e81ac;--accent-text:#4c6f9a;--accent-hover:#6c8fbb;--accent-fg:#ffffff;
  --accent-soft:rgba(94,129,172,.1);--accent-glow:rgba(94,129,172,.22);--accent-2:#81a1c1;
  --grad:linear-gradient(135deg,#5e81ac,#81a1c1);
  --ok:#5a9367;--warn:#c98b3d;--danger:#bf616a;--crit:#a3454f;--info:#5e81ac;--info-soft:rgba(94,129,172,.1);
  --shadow:0 1px 2px rgba(46,52,64,.05);--sh-panel:0 2px 10px rgba(46,52,64,.06);
  --sh-lift:0 10px 28px rgba(46,52,64,.12);--glass:rgba(236,239,244,.86);--track:#e5e9f0;--mark:#ebcb8b}
[data-style="nordic"][data-theme="dark"]{
  --bg:#2e3440;--surface:#343c4a;--surface-2:#3b4252;--surface-3:#434c5e;
  --border:#434c5e;--border-strong:#4c566a;--rule:#d8dee9;
  --text:#eceff4;--text-2:#d8dee9;--text-3:#9aa4b6;--faint:#4c566a;
  --accent:#88c0d0;--accent-text:#a3d4e2;--accent-hover:#9ed0de;--accent-fg:#2e3440;
  --accent-soft:rgba(136,192,208,.14);--accent-2:#81a1c1;--grad:linear-gradient(135deg,#88c0d0,#81a1c1);
  --ok:#a3be8c;--warn:#ebcb8b;--danger:#bf616a;--crit:#d08770;--info:#88c0d0;--info-soft:rgba(136,192,208,.14);
  --shadow:0 1px 2px rgba(0,0,0,.3);--sh-panel:0 2px 10px rgba(0,0,0,.28);
  --sh-lift:0 10px 28px rgba(0,0,0,.42);--glass:rgba(46,52,64,.88);--track:#434c5e;--mark:#6b5b2e}

/* ---- 暖纸：米色纸面、墨褐字，长时间阅读不刺眼 ---- */
[data-style="warm"]{--r-sm:4px;--r:8px;--r-lg:12px;--r-panel:14px;--r-hero:16px}
[data-style="warm"][data-theme="light"],[data-style="warm"]:not([data-theme="dark"]){
  --bg:#f6f1e7;--surface:#fffdf8;--surface-2:#f9f4ea;--surface-3:#efe7d8;--overlay:rgba(60,48,36,.32);
  --border:#e5dbc9;--border-strong:#c9bba3;--rule:#3f342a;
  --text:#3f342a;--text-2:#6b5c4a;--text-3:#8f8272;--faint:#d5c9b4;
  --accent:#a8552c;--accent-text:#8f4523;--accent-hover:#c06534;--accent-fg:#fffdf8;
  --accent-soft:rgba(168,85,44,.09);--accent-glow:rgba(168,85,44,.2);--accent-2:#c98b3d;
  --grad:linear-gradient(135deg,#a8552c,#c98b3d);
  --ok:#4f7a3f;--warn:#b07a1c;--danger:#a83232;--crit:#8a2222;--info:#a8552c;--info-soft:rgba(168,85,44,.09);
  --shadow:0 1px 2px rgba(63,52,42,.05);--sh-panel:0 2px 10px rgba(63,52,42,.07);
  --sh-lift:0 10px 26px rgba(63,52,42,.14);--glass:rgba(246,241,231,.88);--track:#e9dfcc;--mark:#f2d98a}
[data-style="warm"][data-theme="dark"]{
  --bg:#231d17;--surface:#2c251d;--surface-2:#352d24;--surface-3:#40372c;
  --border:#3d342a;--border-strong:#564a3c;--rule:#e8dcc8;
  --text:#f0e6d6;--text-2:#c2b39c;--text-3:#94856f;--faint:#4a4034;
  --accent:#e0965f;--accent-text:#eeb98a;--accent-hover:#eaa876;--accent-fg:#231d17;
  --accent-soft:rgba(224,150,95,.14);--accent-2:#d8b36a;--grad:linear-gradient(135deg,#e0965f,#d8b36a);
  --ok:#8fb46f;--warn:#e0b357;--danger:#e07a6f;--crit:#ef8f84;--info:#e0965f;--info-soft:rgba(224,150,95,.14);
  --shadow:none;--sh-panel:0 2px 10px rgba(0,0,0,.35);--sh-lift:0 10px 28px rgba(0,0,0,.5);
  --glass:rgba(35,29,23,.9);--track:#40372c;--mark:#6b5622}

/* ---- 高对比：无障碍优先，纯黑白 + 粗边框 ---- */
[data-style="contrast"]{--r-sm:3px;--r:5px;--r-lg:6px;--r-panel:6px;--r-hero:8px}
[data-style="contrast"][data-theme="light"],[data-style="contrast"]:not([data-theme="dark"]){
  --bg:#ffffff;--surface:#ffffff;--surface-2:#f0f0f0;--surface-3:#e0e0e0;
  --border:#000000;--border-strong:#000000;--rule:#000000;
  --text:#000000;--text-2:#1a1a1a;--text-3:#3d3d3d;--faint:#8a8a8a;
  --accent:#0033cc;--accent-text:#0033cc;--accent-hover:#0044ff;--accent-fg:#ffffff;
  --accent-soft:#dde5ff;--accent-glow:rgba(0,51,204,.3);--accent-2:#0033cc;--grad:var(--accent);
  --ok:#006622;--warn:#8a4b00;--danger:#cc0000;--crit:#990000;--info:#0033cc;--info-soft:#dde5ff;
  --shadow:none;--sh-panel:none;--sh-lift:none;--glass:#ffffff;--track:#d0d0d0;--mark:#ffff00}
[data-style="contrast"][data-theme="dark"]{
  --bg:#000000;--surface:#000000;--surface-2:#141414;--surface-3:#1f1f1f;
  --border:#ffffff;--border-strong:#ffffff;--rule:#ffffff;
  --text:#ffffff;--text-2:#e8e8e8;--text-3:#c4c4c4;--faint:#7a7a7a;
  --accent:#66b3ff;--accent-text:#8cc6ff;--accent-hover:#8cc6ff;--accent-fg:#000000;
  --accent-soft:#0d2438;--accent-2:#66b3ff;--grad:var(--accent);
  --ok:#5ade7f;--warn:#ffc64d;--danger:#ff6b6b;--crit:#ff8787;--info:#66b3ff;--info-soft:#0d2438;
  --shadow:none;--sh-panel:none;--sh-lift:none;--glass:#000000;--track:#2b2b2b;--mark:#665c00}
[data-style="contrast"] .card,[data-style="contrast"] .panel,[data-style="contrast"] .grid.g4,
[data-style="contrast"] .tablewrap{border:2px solid var(--rule);box-shadow:none}
[data-style="contrast"] .btn{border-width:2px;font-weight:700}
[data-style="contrast"] :focus-visible{outline:3px solid var(--accent);outline-offset:2px}

/* ---- 两套新字体 ---- */
[data-font="inter"]{--font:'Inter',-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;--display:var(--font)}
[data-font="inter"] body{letter-spacing:-.01em}
[data-font="mono-ui"]{--font:'Inter',-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;
  --display:'JetBrains Mono',ui-monospace,"SF Mono","PingFang SC",monospace}
[data-font="mono-ui"] .topbar h2,[data-font="mono-ui"] .card h3,[data-font="mono-ui"] .stat .v{letter-spacing:-.02em}

/* 登录页的品牌释义 */
.login-tag{margin:calc(-1 * var(--s3)) 0 var(--s5);font-size:12.5px;color:var(--text-3);line-height:1.5}
[data-style="editorial"] .login-tag{font-family:var(--display);font-size:14px;color:var(--text-2)}

/* ---------- 安全态势 ---------- */
.pst-dom{display:flex;flex-direction:column;gap:var(--s3)}
.pst-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:var(--s3) var(--s2)}
.pst-m{display:flex;flex-direction:column;gap:2px;min-width:0}
.pst-m b{font-family:var(--display);font-size:26px;font-weight:600;line-height:1.1;font-variant-numeric:tabular-nums}
.pst-m span{font-size:11.5px;color:var(--text-3);line-height:1.35}
.pst-gate{display:flex;flex-direction:column;gap:5px;padding-top:var(--s3);border-top:1px solid var(--border)}
.pst-gate-t{display:flex;justify-content:space-between;font-size:12.5px;color:var(--text-2)}
.pst-warn{font-size:11.5px;color:var(--warn)}
.pst-gaps{margin:0;padding-left:18px;font-size:12.5px;color:var(--text-2);line-height:1.6}
.pst-top{font-size:12.5px} .pst-top summary{cursor:pointer;color:var(--text-3);padding:4px 0}
.pst-f{display:flex;align-items:center;gap:8px;padding:5px 0;border-top:1px solid var(--border);font-size:12px}
.pst-f>span:nth-child(2){flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pst-chart{height:170px;margin:var(--s2) 0} .pst-chart svg{width:100%;height:100%}
.pst-legend{display:flex;gap:var(--s5);flex-wrap:wrap;font-size:12px;color:var(--text-2)}
.pst-legend span{display:flex;align-items:center;gap:6px}
.pst-legend i{width:14px;height:3px;border-radius:2px}
.pst-legend b{font-variant-numeric:tabular-nums;color:var(--text)}
[data-style="editorial"] .pst-m b{font-family:var(--display);font-weight:400;font-size:30px}

/* ---------- Security Context ---------- */
.ctx-kinds{display:flex;flex-wrap:wrap;gap:var(--s3)}
.ctx-kind{display:flex;flex-direction:column;gap:2px;padding:12px 18px;background:var(--surface-2);border-radius:var(--r);min-width:96px}
.ctx-kind b{font-family:var(--display);font-size:26px;font-weight:600;line-height:1.1;font-variant-numeric:tabular-nums}
.ctx-kind span{font-size:12px;color:var(--text-3)}
.ctx-changes .r2{align-items:center}
.ctx-jump{display:block;text-decoration:none;color:var(--text);transition:border-color var(--dur) var(--ease)}
.ctx-jump:hover{border-color:var(--accent);color:var(--text)}
.ctx-jump h3{margin-bottom:6px;border-bottom:none;padding-bottom:0}
.ctx-jump p{font-size:12.5px;color:var(--text-3);line-height:1.5}
[data-style="editorial"] .ctx-kind b{font-family:var(--display);font-weight:400;font-size:30px}
