/* ===== 设计令牌（2026-10-05 统一，参照 Ant Design 规范）=====
   纪律：色 / 圆角 / 阴影一律走变量，不再往模块里手写；
        间距只用 8 / 16 / 24，字号只用 12 / 14 / 16 / 20 / 24。
   改前普查：全站 15 种页宽、16 种字号、8 种圆角、6 种蓝 —— 都收敛到下面。 */
:root{
  /* 品牌色：全站唯一蓝（原 0066E8 / 0057FF / 165DFF / 2C6BE8 等收敛到此） */
  --primary:#0B47C7;
  --primary-hover:#0A3EAD;
  --primary-bg:#F0F7FF;
  /* 橙点缀（源自 v0，v3 起降级为点缀色：仅选中态 / 关键提示） */
  --accent:#FF6B35;
  /* 品牌辅助色（系统中心可改，旧默认青蓝；仅用于渐变/预览，不替代主色） */
  --brand-secondary:#00C2FF;
  /* 语义色 */
  --danger:#E94B4B;
  --success:#22A06B;
  --warning:#E9A23B;
  --info:#0B47C7;
  /* 文字三档 */
  --text:#1A1D26;
  --text-2:#4E6B99;
  --muted:#8A9BB5;
  /* 面与线（边框统一到 --border；原 DCE8F8 / E2EBF6 / EFF6FF 收敛） */
  --bg:#F5F8FC;
  --card:#FFFFFF;
  --border:#E6F0FF;
  /* 圆角三档 */
  --radius-sm:6px;   /* 小控件：按钮-sm / tab / 标签 */
  --radius:8px;      /* 卡片 / 输入框 */
  --radius-lg:12px;  /* 大容器 / 弹窗 / 顶栏 */
  /* 阴影两档 */
  --shadow:0 2px 8px rgba(0,82,196,.06);
  --shadow-lg:0 8px 24px rgba(0,82,196,.10);
  /* 字号五档（v3 唯一来源：新模块用 var(--fs-*) 或 .fs-* 工具类，别再手写 px） */
  --fs-12:12px;   /* 辅助 / 标签 / 表头 / 元信息 */
  --fs-14:14px;   /* 正文 / 列表项标题（默认） */
  --fs-16:16px;   /* 页面标题 / 卡片标题 */
  --fs-20:20px;   /* 区块大标题 */
  --fs-24:24px;   /* 数字大屏 KPI（仅经营类指标卡） */
  --fs-kpi:22px;  /* KPI 数字专用档：郭先生 2026-10-31 定「24 显得 low」，只给指标卡数字用 */
  /* 图标字号三档（emoji / 图标，非文字层级；不参与字号五档） */
  --icon-sm:24px; --icon-md:32px; --icon-lg:48px;
  /* 间距（8 的倍数） */
  --sp-1:8px; --sp-2:16px; --sp-3:24px;
  /* 页面内容区统一宽度（原来全站 15 种 max-width，收敛到这一档） */
  --page-max:1400px;
  /* 详情抽屉 / 详情弹窗宽度（v3 交互：列表点一条 → 右侧 560 抽屉） */
  --drawer:560px;
}
*{box-sizing:border-box;margin:0;padding:0;}
html,body{height:100%;}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC',sans-serif;background:var(--bg);color:var(--text);font-size:var(--fs-14);overflow:hidden;}

/* 登录页默认隐藏，登录后由JS控制 */
#loginPage{position:fixed;top:0;left:0;width:100%;height:100%;background:linear-gradient(135deg,#EFF6FF,#F5F8FC);display:flex;justify-content:center;align-items:center;z-index:9999;}
#loginPage.hidden{display:none;}
/* 2026-11-08 郭先生定：去掉浏览器自带的密码眼睛 —— 和自绘的 👁 重叠，且点它没反应 */
#loginPassword::-ms-reveal,#loginPassword::-ms-clear{display:none;}
#app{height:100%;}


/* 侧边栏：纯白（2026-10-17 v3 清爽整改：杀天空蓝渐变，改白底 + 主色浅底选中态） */
.sidebar{width:240px;height:100%;background:#fff;border-right:1px solid var(--border);overflow:hidden;float:left;flex-shrink:0;padding:8px 0;display:flex;flex-direction:column;}
/* 2026-10-17：左栏分两段 —— 上面业务组滚动，下面「我的待办/系统中心」钉在底部 */
#sidebarMenu{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;}
#sidebarFooter{flex:0 0 auto;border-top:1px solid var(--border);padding-top:4px;background:#fff;}
#sidebarFooter:empty{display:none;}
#sidebarFooter .gtitle{margin-top:3px;margin-bottom:3px;}
.logo{padding:16px 16px;display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--border);flex:0 0 auto;}.logo-icon{width:36px;height:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:var(--icon-sm);background:var(--primary-bg);border-radius:8px;}.logo-icon img{width:32px;height:32px;border-radius:6px;object-fit:cover;}.logo-text{flex:1;min-width:0;}.logo-name{color:var(--text) !important;font-size:var(--fs-16);font-weight:700;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.logo-slogan{color:var(--muted) !important;font-size:var(--fs-12);font-weight:400;line-height:1.3;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}


.gtitle{cursor:pointer;padding:11px 16px;margin:5px 12px;font-size:var(--fs-14);color:var(--text-2);font-weight:600;border-radius:8px;background:transparent;transition:background .15s ease,color .15s ease;user-select:none;}
.gtitle:hover{background:var(--primary-bg);color:var(--primary);}
.gtitle.active{background:var(--primary-bg);color:var(--primary);font-weight:700;}
/* 2026-10-31 知识库侧栏问题单：direct:true 的一级直开页（经营中心 / 我的待办 / 知识库）
   渲染成 .gtitle 后和组标题一模一样，又紧贴上一个组 → 看着像子项。
   差异化：上方一条分隔线 + 左侧主题色竖条，一眼区分「这是一页」而不是「这是一组」。 */
.gtitle.g-direct{position:relative;margin-top:14px;color:var(--text);}
.gtitle.g-direct::before{content:'';position:absolute;left:-6px;top:50%;transform:translateY(-50%);
  width:3px;height:16px;border-radius:2px;background:var(--primary);opacity:.45;transition:opacity .15s ease;}
.gtitle.g-direct.active::before{opacity:1;}
.gtitle.g-direct::after{content:'';position:absolute;left:12px;right:12px;top:-6px;height:1px;background:var(--border);}
/* 侧栏第一项（经营中心）上面不该有一条分隔线 */
#sidebarMenu > .gtitle.g-direct:first-child{margin-top:5px;}
#sidebarMenu > .gtitle.g-direct:first-child::after{display:none;}

/* ========== 二级菜单 ========== */
.gparent{display:flex;justify-content:space-between;align-items:center;}
.gparent .arrow{font-size:var(--fs-12);opacity:.7;transition:transform .25s ease;}
.gparent.open .arrow{transform:rotate(90deg);}
.gparent.open{background:var(--primary-bg);color:var(--primary);font-weight:700;}

.gsub{padding:2px 0 4px 0;}
.gtitle2{cursor:pointer;padding:8px 16px 8px 32px;margin:2px 12px 2px 18px;font-size:var(--fs-14);color:var(--text-2);font-weight:500;border-radius:8px;background:transparent;transition:background .15s ease,color .15s ease;user-select:none;}
.gtitle2:hover{background:var(--primary-bg);color:var(--primary);}
.gtitle2.active{background:var(--primary-bg);color:var(--primary);font-weight:600;}
.gtitle2.dev-item{color:var(--muted) !important;background:transparent !important;cursor:not-allowed;}
.gtitle2.dev-item:hover{background:transparent !important;}
.dev-tag{display:inline-block;font-size:var(--fs-12);color:#fff;background:#9AA5B1;padding:1px 5px;border-radius:8px;margin-left:4px;vertical-align:1px;}
.gbody{display:block;}
/* 组的补充说明：浅灰小字（v3 起白底侧栏，不再用半透明白）。
   用途（2026-10-14 入口收敛）：菜单项被收进「客户主线」后，告诉人原来那些去哪了 ——
   不让侧边栏显得"少了东西"、也不让人以为功能被删了。 */
.ghint{margin:-3px 14px 6px 20px;font-size:var(--fs-12);line-height:1.45;color:var(--muted);}
/* 组内小标题（2026-10-17）：把「内容工具 / 规划中」跟真功能分开，不另开一级组 */
.gsub-head{margin:8px 12px 2px 30px;padding-top:7px;font-size:var(--fs-12);font-weight:600;
  color:var(--muted);letter-spacing:.4px;border-top:1px dashed var(--border);}
.gbody.hidden{display:none !important;}
.mitem{padding:10px 24px 10px 32px;color:var(--text-2);cursor:pointer;font-size:var(--fs-14);border-left:3px solid transparent;background:transparent;transition:all .2s;}
.mitem:hover{background:var(--primary-bg);color:var(--primary);border-left-color:var(--primary);}
.mitem.active{background:var(--primary-bg);color:var(--primary);border-left-color:var(--primary);font-weight:600;}

/* 主内容区 */
.main{height:100%;overflow:hidden;padding:24px;background:var(--bg);display:flex;flex-direction:column;margin-left:240px;}

/* 顶栏 */
.topbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-shrink:0;background:#fff;padding:14px 20px;border-radius:var(--radius-lg);box-shadow:var(--shadow);}
.topbar h1{font-size:var(--fs-20);color:var(--text);}
/* 2026-11-08 郭先生定：顶栏放「阿明 Agent」入口；搜索收成一个 🔍 图标，点开展开 */
.aming-topbtn{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;
  border:1px solid #CDE0FA;border-radius:999px;background:linear-gradient(135deg,#EFF6FF,#F5FAFF);
  color:var(--primary);font-size:var(--fs-14);font-weight:600;cursor:pointer;white-space:nowrap;}
.aming-topbtn:hover{box-shadow:0 4px 12px rgba(0,87,255,.14);border-color:#B9D4F8;}
.gs-mini{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  border:1px solid var(--border);border-radius:999px;background:var(--bg);cursor:pointer;font-size:var(--icon-sm);}
.gs-mini:hover{border-color:#CDE0FA;background:#F3F8FF;}
@media (max-width:640px){ .aming-topbtn{padding:6px 9px;} .aming-topbtn-t{display:none;} }

/* 卡片 —— 通用面板（2026-10-05：删掉常驻的 text-align:center。
   它本为「统计卡」而写，却被 69 处当普通面板复用，把里面的列表/表单都居中了。
   统计卡请显式加 .stat-card。） */
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--sp-2);margin-bottom:var(--sp-3);}
.card{background:var(--card);padding:var(--sp-2);border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--border);transition:box-shadow .2s;}
.card:hover{box-shadow:var(--shadow-lg);}
.card.stat-card{text-align:center;padding:20px;}
.val{font-size:var(--fs-24);font-weight:700;color:var(--primary);}
.lbl{font-size:var(--fs-14);color:var(--muted);margin-top:6px;}

/* 页内 tab 条（2026-10-05）：**不要再单独做一张白卡**。
   原来「顶栏大标题 + tab 白卡 + 内容白卡」三层叠着，既「一块一块」又层级重。
   现在改成一条无底色的工具条，靠底部一条细线与内容分隔。 */
.tabbar{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap;align-items:center;}
.tabbar > .btn, .tabbar > button{flex-shrink:0;}
/* 2026-10-31 「← 返回总览」：不再独占一行（郭先生飞书）——
   并进页内 tab 条右端 / 页头操作槽；都没有才浮右上。 */
.back-to-overview{cursor:pointer;font-size:14px;line-height:1.4;padding:5px 12px;
  border-radius:var(--radius-sm);background:var(--card);color:var(--text-2);
  border:1px solid var(--border);white-space:nowrap;}
.back-to-overview:hover{color:var(--primary);border-color:var(--primary);}
.back-to-overview.mode-tabbar{margin-left:auto;align-self:center;}
.back-to-overview.mode-head{margin-left:auto;}
.back-to-overview.mode-float{position:absolute;top:8px;right:16px;box-shadow:var(--shadow);z-index:5;}

/* 工作台外壳（2026-10-05 统一）=====
   11 个工作台页共用一个外壳 = 页面**唯一**的白卡容器。
   原来这串内联样式在 6+ 个文件里各复制一份，且页内再画白卡 → 「卡套卡、一块一块、放不下几个」。
   现在统一用 .ws-body；页壳内部的 .card 不再叠阴影，只留一道细边并收紧内边距，提高内容密度。 */
.ws-body{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;background:#fff;
  border-radius:var(--radius-lg);padding:var(--sp-2);box-shadow:var(--shadow);box-sizing:border-box;}
.ws-body .card{box-shadow:none;border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px;}

/* 按钮 */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:10px 20px;border:none;border-radius:var(--radius);font-size:var(--fs-14);font-weight:500;cursor:pointer;transition:box-shadow .2s,transform .1s,background .2s;white-space:nowrap;}
.btn:active{transform:scale(.97);}
.btn:disabled{opacity:.5;cursor:not-allowed;}
/* 2026-10-04 排版整改：原来这里是 animation:breathe 2.4s infinite —— 全站每个主按钮永远在呼吸，
   视线到处在动，是「不稳」的来源之一。改成只在悬停时呼吸。 */
.btn-primary{background:var(--primary);color:#fff;}
.btn-primary:hover{background:var(--primary-hover);animation:breathe 2.4s infinite ease-in-out;box-shadow:0 0 0 4px rgba(0,87,255,.15);}
.btn-secondary{background:#fff;color:var(--text);border:1px solid var(--border);}
.btn-secondary:hover{border-color:var(--primary);color:var(--primary);}
.btn-danger{background:var(--danger);color:#fff;}
.btn-sm{padding:6px 12px;font-size:var(--fs-14);border-radius:var(--radius-sm);}
@keyframes breathe{0%,100%{box-shadow:0 0 0 0 rgba(30,107,255,0);}50%{box-shadow:0 0 14px 3px rgba(30,107,255,.30);}}

/* 表单 */
.form-group{margin-bottom:16px;}
/* 表单密集化（2026-10-05）：字段多于 3~4 个的表单卡改两列，避免单列字段被拉到 1400px 宽、右边全空。
   用法：给卡片加 class="card form-grid"，卡片头自动跨满两列。 */
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 16px;}
.form-grid > .h-card{grid-column:1 / -1;margin-bottom:12px;}
.form-grid > .form-group{min-width:0;}
@media (max-width:1100px){.form-grid{grid-template-columns:1fr;}}
.form-label{display:block;margin-bottom:6px;font-size:var(--fs-14);color:var(--muted);}
.required{color:var(--danger);margin-left:2px;}
.input,.select,.textarea{width:100%;padding:10px 14px;border:1px solid var(--border);border-radius:var(--radius);font-size:var(--fs-14);background:#fff;color:var(--text);}
.input:focus,.select:focus,.textarea:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgba(0,87,255,.10);}
.textarea{min-height:100px;resize:vertical;}

/* 弹窗 */
.modal-overlay{position:fixed;inset:0;background:rgba(30,60,110,.25);display:flex;align-items:center;justify-content:center;z-index:1000;}
.modal{background:#fff;border-radius:var(--radius-lg);width:min(560px,92vw);max-height:88vh;overflow-y:auto;box-shadow:0 24px 48px rgba(30,60,110,.16);}
.modal-head{padding:18px 24px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;font-weight:600;color:var(--text);}
.modal-body{padding:24px;}
.modal-foot{padding:16px 24px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:10px;}

/* Toast */
.toast{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1200;display:flex;flex-direction:column;gap:10px;align-items:center;}
.toast-item{background:#fff;border-radius:var(--radius);padding:14px 18px;box-shadow:var(--shadow);border-left:4px solid var(--success);animation:slideIn .3s;}
.toast-item.error{border-left-color:var(--danger);}
@keyframes slideIn{from{transform:translateX(20px);opacity:0;}to{transform:translateX(0);opacity:1;}}

/* 状态标签 */
.empty{padding:48px 20px;text-align:center;color:var(--muted);}
/* .empty 历史上被两种用法混用：① 空/加载占位；② 当**列表容器**用（先占位，再用 innerHTML 填列表）。
   填了内容后，它自带的 text-align:center 会一路继承，把整张列表也居中
   （知识资产 #knowledgeList、诊断报告 #diagnosisList 等都中招，看起来「排版很 low」）。
   下面把「非图标」的直接子元素还原为左对齐；占位态的居中不受影响。 */
.empty > *:not(.empty-icon){text-align:left;}
.empty-icon{font-size:var(--icon-lg);margin-bottom:12px;}
.status{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:var(--fs-12);font-weight:500;}
.status-pending{background:rgba(201,138,59,.12);color:#C98A3B;}
.status-processing{background:rgba(47,123,255,.12);color:#0066E8;}
.status-success{background:rgba(76,175,132,.12);color:#4CAF84;}
.status-danger{background:rgba(217,108,108,.12);color:#D96C6C;}
.status-muted{background:rgba(138,155,181,.12);color:#8A9BB5;}

/* 页内 tab 条 —— 全站唯一一套（2026-10-14 第三轮：删掉 .bw-tab/.ew-tab/.pf-tab/.sy-tab
   四个**线上零引用**的死类，它们只存在于 modules/_archived/ 里的已归档文件）。
   节点页原先各写一串内联样式（bm-tab/iwb-tab/fb-tab/co-tab/kr-tab/lib-tab/bd-tab…），
   现在统一换到这一类 + 外层 .tabbar。 */
.cw-tab{padding:8px 16px;border:none;border-radius:8px;background:transparent;color:var(--muted);font-size:var(--fs-14);font-weight:500;cursor:pointer;transition:all .2s;}
.cw-tab:hover{color:var(--primary);background:rgba(0,87,255,.06);}
.cw-tab.active{background:var(--primary);color:#fff;box-shadow:0 4px 12px rgba(0,87,255,.25);}

/* 全局洞察 —— 旧的 .dash-kpi 统计卡 / .kpi-* / .dash-card / .quick-btn 规则已删（2026-10-05）。
   它们与文件下方的 .dash-kpi(grid) / .dash-card 同名、且彼此不冲突 → 一起生效，
   导致「KPI 网格本身是白卡、格子里又是白卡」的卡套卡。统计卡请用 .dash-kpi > .k。 */

/* 全局搜索 */
.global-search-result .search-group-title{padding:8px 12px;font-size:var(--fs-12);color:#8A9BB5;background:#F5F8FC;}
.global-search-result .search-item{padding:8px 12px;font-size:var(--fs-14);color:#1A1D26;cursor:pointer;border-bottom:1px solid #EFF6FF;}
.global-search-result .search-item:hover{background:rgba(0,87,255,.06);color:#0066E8;}

/* 通知面板 */
.notif-item{padding:10px 12px;border-bottom:1px solid #EFF6FF;cursor:pointer;font-size:var(--fs-14);color:#1A1D26;}
.notif-item:hover{background:rgba(0,87,255,.06);}


/* ===== 卡片层级（2026-10-04 重写）=====
   原来这里用 [class*="card"] / [class*="box"] / [class*="table"] / [onclick] 这类通配属性选择器，
   给「所有 class 里含这些字样的元素」批量加白底+圆角+阴影，并在 :hover 时 translateY(-2px)。
   后果：①卡片套卡片时层层叠白底；②鼠标划过页面，几十个大容器同时上下位移 —— 这就是「不丝滑」的主因。
   现在只保留具名类，且 hover 一律只改阴影，绝不位移。 */
/* （2026-10-05）原来这里又定义了一遍 .card/.panel/.stat-card 的白底/圆角/阴影，
   与文件上方的 .card 冲突（后定义者胜），已合并到上方 .card 一处。
   .panel / .stat-card 全站零引用。 */
tr:hover {
    background: rgba(11,71,199,.04);
}
input:hover, select:hover, textarea:hover {
    border-color: #0066E8;
}


/* ===== 排版基线（2026-10-04 新增）=====
   第 18 行的 *{margin:0;padding:0} 把浏览器默认的标题/段落/列表间距全抹平了，
   但此后一直没有补回来 —— 于是模块里只能用内联 style 各自手写字号，
   全站凑出 14/15/16/17/18px × 500/600/700 至少 8 档组合，这就是「排版不统一」的根源。
   下面把基线补回来，新代码请优先用类，不要再手写 font-size。

   2026-10-05 注意：这里【不要】给 body 设 line-height。
   我一开始写了 body{line-height:1.6}，实测把「经营总览」整页推高了 48px
   （1366px 视口下 31px 滚动 → 79px），「知识资产」从 83px → 219px —— 全站每行文字都高 1/3。
   这个后台是密集型的，行高交给浏览器默认即可，只在确实需要的语义标签上收紧。 */
h1, h2, h3, h4 { margin: 0 0 .5em; line-height: 1.35; font-weight: 600; color: var(--text); }
h1 { font-size: var(--fs-20); }
h2 { font-size: var(--fs-16); }
h3 { font-size: var(--fs-16); }
h4 { font-size: var(--fs-14); }
p  { margin: 0 0 .6em; line-height: 1.6; }
ul, ol { margin: 0 0 .6em; padding-left: 1.4em; }
li { margin: .2em 0; line-height: 1.6; }

/* 标题层级工具类：全站统一的 4 档，替代散落的内联 font-size */
/* 三层标题（2026-10-05「多层标题治理」）：
   页内主标题 .h-page 16/600 ｜ 卡片小节标题 .h-card 14/600 灰(次要) ｜ 列表项标题 .h-item 14/600 正文色。
   顶栏 .topbar h1(20px) 是应用级标题，不在此列。
   改前卡片头与列表项都用 14px/600 深色、看起来一样重，层级塌陷。 */
.h-page    { font-size: var(--fs-16); font-weight: 600; line-height: 1.35; color: var(--text); }
.h-card    { font-size: var(--fs-14); font-weight: 600; line-height: 1.35; color: #5A6B8C; }
.h-item    { font-size: var(--fs-14); font-weight: 600; line-height: 1.45; color: var(--text); }
.h-card-sm { font-size: var(--fs-14); font-weight: 600; line-height: 1.35; color: #5A6B8C; }  /* 退役别名 → 同 .h-card */
.h-sub     { font-size: var(--fs-14); font-weight: 500; color: var(--muted); }

/* 字号 / 图标工具类（v3）：新模块和临时文案直接套类，不要再手写 font-size。
   文字用 .fs-*；emoji / 图标用 .icon-*（图标尺寸不参与字号五档）。 */
.fs-12 { font-size: var(--fs-12); }
.fs-14 { font-size: var(--fs-14); }
.fs-16 { font-size: var(--fs-16); }
.fs-20 { font-size: var(--fs-20); }
.fs-24 { font-size: var(--fs-24); }
.fs-kpi { font-size: var(--fs-kpi); }
.icon-sm { font-size: var(--icon-sm); line-height: 1; }
.icon-md { font-size: var(--icon-md); line-height: 1; }
.icon-lg { font-size: var(--icon-lg); line-height: 1; }



/* ===== 自适应（2026-10-05 新增）====================================
   整改前全站 @media 断点数量为 0。目标：1024px 以上的桌面/笔记本都正常用。
   实测基础：1366px 视口 → 内容区 1078px；1024px → 736px。
   原则：只压留白和图表高度，不动结构，避免影响现有排版。            */

/* 笔记本宽度：左右留白从 24px 收到 16px，多让出 16px 给内容 */
@media (max-width: 1440px) {
  .main { padding: 16px; }
}

/* 矮屏（768 高的笔记本，浏览器可视区往往只剩 660px 上下）：
   压低顶栏和图表，避免整页多出一条滚动条 */
@media (max-height: 820px) {
  .topbar { padding: 10px 16px; margin-bottom: 12px; }
  #contentTrendChart, #partnerTrendChart { height: 130px !important; }
}


/* ===== 经营总览（2026-10-05 重设计）=================================
   改动理由（真实数据下量出来的）：
   · 今日待办原来只显示一个数字 18，但它背后有 18 条带客户名/逾期标记/可跳转的清单，
     跟单最有用的信息被压成了一个数字 → 改成清单。
   · 6 个 KPI 里 3 个是 0，还和有用的平铺在一起 → 非 0 的排前面，0 的降级灰显（不删，避免遗漏）。
   · 两张趋势图 y 轴 0~40 vs 0~1 并排，视觉失衡 → 没数据的图不画。
   · 维度监控两张大卡里只有 2 行字、底部 200px 空白 → 有数据才建卡，高度随内容。 */

.dash-page{height:100%;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;
  padding:6px 16px 3px;max-width:var(--page-max);margin:0 auto;
  /* 2026-11-08 郭先生定：经营中心不要右侧下拉条 —— 内容压到一屏内，滚动条本身也隐藏 */
  scrollbar-width:none;-ms-overflow-style:none;}
.dash-page::-webkit-scrollbar{width:0;height:0;display:none;}
.dash-topbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;}
.dash-date{font-size:var(--fs-12);color:var(--muted);}

/* 第一屏：待办清单 + 需要你处理 */
/* 两栏等宽：分隔线正好落在下面「经营大盘」网格的中缝上（1.4:1 时会对不齐） */
.dash-hero{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:8px;margin-bottom:6px;align-items:stretch;}
.dash-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:10px 12px;box-shadow:var(--shadow);box-sizing:border-box;}
.dash-card > header{display:flex;align-items:center;gap:8px;margin-bottom:7px;}
.dash-card h2{font-size:var(--fs-16);font-weight:700;margin:0;color:var(--text);}
.dash-card header .dash-sub{font-size:var(--fs-12);color:var(--muted);}
.dash-card header .btn{margin-left:auto;}

/* 待办清单条目 */
.dash-todo-item{display:flex;align-items:flex-start;gap:10px;padding:6px 10px;
  border-radius:10px;background:#FAFCFF;border-left:3px solid var(--muted);
  margin-bottom:5px;cursor:pointer;transition:background .15s ease,box-shadow .15s ease;}
.dash-todo-item:hover{background:#F3F8FF;box-shadow:0 2px 10px rgba(0,82,196,.08);}
.dash-todo-item.overdue{border-left-color:#E94B4B;}
.dash-todo-item .t{flex:1;min-width:0;}
.dash-todo-item .t1{font-size:var(--fs-14);color:var(--text);line-height:1.45;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dash-todo-item .t2{font-size:var(--fs-12);color:var(--muted);margin-top:3px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dash-todo-item .t2 .od{color:#E94B4B;font-weight:600;}
.dash-todo-item .go{flex-shrink:0;font-size:var(--fs-12);color:var(--primary);align-self:center;}

/* 需要你处理：数字行 */
.dash-row{display:flex;align-items:center;gap:10px;padding:8px 11px;border-radius:10px;
  background:#FAFCFF;margin-bottom:6px;cursor:pointer;transition:background .15s ease;}
.dash-row:hover{background:#F3F8FF;}
.dash-row .n{font-size:var(--fs-20);font-weight:700;line-height:1;min-width:34px;text-align:right;}
.dash-row .l{flex:1;font-size:var(--fs-14);color:var(--text);}
.dash-row .a{font-size:var(--fs-12);color:var(--primary);}
/* 预警卡两张一行、各占一半（2026-10-05）：原来竖排占两行，把「需要你处理」整个框撑高 */
.dash-alert-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:8px;}
.dash-alert{background:#FFF6F6;border:1px solid #FFDCDC;border-radius:10px;
  padding:11px 12px;margin-bottom:8px;}
.dash-alert .a1{font-size:var(--fs-14);font-weight:600;color:#C0392B;line-height:1.45;
  display:flex;align-items:center;gap:8px;}
.dash-alert .a1 > span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dash-alert .a1 .btn{flex-shrink:0;margin:0;padding:4px 10px;font-size:var(--fs-12);}
.dash-alert .a2{font-size:var(--fs-12);color:var(--muted);margin-top:3px;}
.dash-clear{padding:22px 12px;text-align:center;font-size:var(--fs-14);color:var(--muted);}

/* 分区 */
.dash-block{margin-bottom:6px;}
.dash-h{font-size:var(--fs-14);font-weight:700;color:var(--text);margin:0 0 5px;
  display:flex;align-items:center;gap:6px;}

/* KPI */
/* 2026-10-31：固定 6 列（数字条 5 项 + 待办 1 格）。原来 auto-fit 在宽屏把每格拉得很散，
   郭先生说「看起来 low」。窄屏降级 3 列 / 2 列。 */
.dash-kpi{display:grid;grid-template-columns:repeat(var(--kpi-n,5),minmax(0,1fr));gap:10px;}
@media (max-width:1100px){ .dash-kpi{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:640px){ .dash-kpi{grid-template-columns:repeat(2,minmax(0,1fr));} }
.dash-kpi .k{background:#fff;border:1px solid var(--border);border-radius:12px;
  padding:10px 14px;cursor:pointer;transition:box-shadow .18s ease,border-color .18s ease;
  box-sizing:border-box;text-align:center;}
.dash-kpi .k:hover{box-shadow:0 4px 16px rgba(0,82,196,.10);border-color:#CDE0FA;}
/* 2026-10-31：24px → 22px（郭先生「48 很大，看起来 low」），数字列等宽对齐 */
.dash-kpi .k .n{font-size:var(--fs-kpi);font-weight:700;line-height:1.1;color:var(--text);
  font-variant-numeric:tabular-nums;}
.dash-kpi .k .l{font-size:var(--fs-12);color:var(--muted);margin-top:2px;}
.dash-kpi .k.zero{background:#FBFCFE;border-color:#EEF2F8;}
.dash-kpi .k.zero .n{font-size:var(--fs-16);color:#B9C4D4;font-weight:600;}
.dash-kpi .k.zero .l{color:#B9C4D4;}

/* 趋势 */
.dash-chart{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:11px 14px;box-shadow:var(--shadow);box-sizing:border-box;}
.dash-chart + .dash-chart{margin-top:10px;}
.dash-chart .ct{font-size:var(--fs-14);font-weight:600;color:var(--text);margin-bottom:4px;}

/* 维度（v1 小卡样式保留：别的页面可能还在用 .dash-dim） */
.dash-dim{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:9px 12px;box-sizing:border-box;cursor:pointer;transition:box-shadow .18s ease;}
.dash-dim:hover{box-shadow:0 4px 16px rgba(0,82,196,.10);}
.dash-dim .d1{font-size:var(--fs-14);font-weight:600;color:var(--text);margin-bottom:6px;}
.dash-dim .d2{font-size:var(--fs-12);color:var(--muted);line-height:1.5;}
.dash-dim .d2 b{color:var(--text);font-size:var(--fs-14);}
.dash-dim .d2 .k{color:var(--muted);}
/* 该维度全为 0：降级灰显，但仍然显示 —— 总览要「一眼看全所有维度」 */
.dash-dim.zero{background:#FBFCFE;border-color:#EEF2F8;}
.dash-dim.zero .d1{color:var(--muted);}
.dash-dim.zero .d2 b{color:#B9C4D4;}
.dash-none{font-size:var(--fs-12);color:var(--muted);padding:6px 2px;grid-column:1/-1;}

/* ===== 经营总览 v2（2026-10-17）：四条主线，每线一张卡 ===== */
.dash-scope{font-size:var(--fs-12);color:var(--muted);background:var(--bg);
  border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px 10px;}
.dash-dims{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;}
.dash-group-card{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:8px 12px 5px;box-sizing:border-box;box-shadow:var(--shadow);}
.dg-head{font-size:var(--fs-14);font-weight:600;color:var(--text);
  padding-bottom:6px;border-bottom:1px solid var(--border);}
.dg-body{padding-top:2px;}
.dim-row{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  padding:5px 0;border-bottom:1px dashed var(--border);cursor:pointer;}
.dim-row:last-child{border-bottom:none;}
.dim-row:hover{background:var(--bg);}
.dim-row .k{font-size:var(--fs-14);color:var(--text-2);min-width:68px;}
.dim-row .v{font-size:var(--fs-20);font-weight:700;color:var(--text);line-height:1.15;}
.dim-row .v em{font-size:var(--fs-12);font-weight:400;font-style:normal;color:var(--muted);}
.dim-row .s{flex-basis:100%;max-width:100%;font-size:var(--fs-12);color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* 趋势卡（第 8 块）：外壳和维度卡一致，图表撑满卡内 */
.dash-trend-card .dg-body{padding-top:6px;}
.dash-trend-card .dash-none{padding:40px 6px;text-align:center;}
.dash-trend-chart{width:100%;height:clamp(130px,18vh,200px);}
/* 没数据：不显示 0，显示「暂无数据」并降级 */
.dim-row.is-empty{cursor:default;}
.dim-row.is-empty .v{color:var(--muted);font-size:var(--fs-14);font-weight:500;}
/* 未接入：灰底 + 徽标，**绝不放数字** */
.dim-row.is-off{cursor:default;background:#FBFCFE;border-radius:var(--radius-sm);padding:7px 8px;}
.dim-row.is-off .k{color:var(--muted);}
.tag-off{font-size:var(--fs-12);font-weight:500;color:var(--muted);
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:1px 8px;}
.dash-row.is-high .n{color:var(--danger);}
/* 8 个块（7 个维度 + 趋势）固定 2 列 × 4 行，排满、不留半行空格（郭先生 2026-10-17 定） */
@media (max-width: 1100px) { .dash-dims{grid-template-columns:minmax(0,1fr);} }

/* 窄屏：两栏改上下堆叠
   2026-10-31：1280 → 1100。1280~1100 这段（含 125% 缩放的 1600 屏）两栏本来放得下，
   改成单栏后「客户状态 / 今天要处理」各占一整行，首屏反而多出 270px 要滚。 */
@media (max-width: 1100px) {
  .dash-hero{grid-template-columns:minmax(0,1fr);}
  .dash-page{padding:12px 12px 24px;}
}


/* ===== 经营中心 2026-10-31：一屏概览（郭先生定）======================
   目标：一进来先看到「数」，明细全部点进去。首屏顺序：
   一句话摘要 → 6 格数字 → 客户状态 + 今天要处理 → 经营看板 → 趋势 → 快捷入口。 */
.dash-brief{font-size:var(--fs-14);color:var(--text-2);line-height:1.5;
  margin:0 0 6px;padding:6px 12px;background:var(--primary-bg);border:1px solid var(--border);
  border-radius:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dash-brief b{color:var(--text);font-weight:600;}
#dashKpiStrip{margin-bottom:6px;}
#dashKpiStrip .k{padding:6px 14px;}
#dashKpiStrip .k .n{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
#dashKpiStrip .k .n .u{font-size:var(--fs-12);font-weight:400;color:var(--muted);margin-left:2px;}

/* 客户状态：三行，每行「状态 + 说明 + 前 3 个客户名」 */
.dash-state{display:flex;align-items:center;gap:8px;padding:7px 2px;
  border-bottom:1px dashed var(--border);cursor:pointer;}
.dash-state:last-child{border-bottom:none;}
.dash-state:hover{background:var(--bg);}
.dash-state .s-t{font-size:var(--fs-14);font-weight:600;color:var(--text);}
.dash-state .s-sub{font-size:var(--fs-12);font-weight:400;color:var(--muted);margin-left:6px;}
.dash-state .s-names{font-size:var(--fs-12);color:var(--text-2);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* 商家：没有客户名单 ⇒ 客户状态卡不显示，「今天要处理」占满整行 */
.dash-hero.single{grid-template-columns:minmax(0,1fr);}

/* 2026-11-08 郭先生定：客户状态不做三根竖柱（数据少时下半截全空）——
   改成三行横条，行高均分铺满卡片；名字最多 3 个，多的点进客户列表看。 */
#dashCustomerBlock{display:flex;flex-direction:column;}
#dashCustomerBody{flex:1;min-height:0;display:flex;}
.dash-states{display:flex;flex-direction:column;gap:6px;flex:1;min-height:0;width:100%;}
.dash-state-row{flex:1;display:flex;align-items:center;gap:10px;min-height:0;
  padding:6px 12px;background:#FAFCFF;border:1px solid var(--border);border-left:3px solid var(--muted);
  border-radius:10px;cursor:pointer;transition:box-shadow .15s ease;}
.dash-state-row:hover{box-shadow:0 2px 10px rgba(0,82,196,.10);}
.dash-state-row .s-t{flex:none;font-size:var(--fs-14);font-weight:600;color:var(--text-2);white-space:nowrap;}
.dash-state-row .s-names{flex:1;min-width:0;font-size:var(--fs-12);color:var(--muted);
  text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dash-state-row .s-n{flex:none;font-size:var(--fs-20);font-weight:700;line-height:1;
  min-width:2.6em;text-align:right;}
.dash-state-row .s-n em{font-style:normal;font-size:var(--fs-12);font-weight:400;color:var(--muted);margin-left:2px;}
.dash-state-row.ok{border-left-color:#2FA36B;}
.dash-state-row.ok .s-n{color:#1f7a3d;}
.dash-state-row.warn{border-left-color:#E8A33D;}
.dash-state-row.warn .s-n{color:#b26a00;}
.dash-state-row.risk{border-left-color:#E04B4B;}
.dash-state-row.risk .s-n{color:#c0392b;}

/* 经营看板：每个维度一张小卡，只摆数字 + 读法；说明收进 hover 提示 */
/* 2026-10-31：210px → 176px —— 1366/1280 宽时 5 张卡正好排一行（原来 1366 挤成两行、
   1280 只排 4 张，白吃一整行 130px，首屏被撑出竖向滚动条）。176 是最窄仍不截断标签的宽度
   （实测 1093 宽时仍是 4 列，标签无省略）。 */
.dash-mods{display:grid;grid-template-columns:repeat(auto-fit,minmax(176px,1fr));gap:8px;}
.dash-mod{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:8px 12px 6px;box-shadow:var(--shadow);box-sizing:border-box;cursor:pointer;
  transition:box-shadow .16s ease,border-color .16s ease;}
.dash-mod:hover{box-shadow:0 4px 16px rgba(0,82,196,.10);border-color:#CDE0FA;}
.dash-mod .m-head{display:flex;align-items:center;gap:6px;font-size:var(--fs-14);
  font-weight:600;color:var(--text);padding-bottom:5px;margin-bottom:2px;
  border-bottom:1px solid var(--border);}
.dash-mod .m-head .go{margin-left:auto;font-size:var(--fs-12);font-weight:400;color:var(--primary);}
.dash-mod .m-item{display:flex;align-items:baseline;gap:8px;padding:3px 2px;border-radius:6px;}
.dash-mod .m-item:hover{background:var(--bg);}
.dash-mod .m-item .k{flex:1;min-width:0;font-size:var(--fs-12);color:var(--text-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* 2026-10-31：20px → 16px（一列六张卡挤在一起太吵）；数字右对齐 + 单位固定宽度，
   竖着看每行数字是一条线 —— 郭先生说的「每个字长短不一样」就是这个。 */
.dash-mod .m-item .v{flex:none;display:inline-flex;align-items:baseline;justify-content:flex-end;
  min-width:4.4em;font-size:var(--fs-14);font-weight:700;color:var(--text);line-height:1.15;
  font-variant-numeric:tabular-nums;}
.dash-mod .m-item .v em{flex:none;width:2.2em;text-align:left;font-size:var(--fs-12);font-weight:400;
  font-style:normal;color:var(--muted);margin-left:2px;}
/* 值槽字号四行统一 14px（原来「系统健康 正常」这种两字值看着比数字还大）；
   非数字态（未接入 / 异常 / —）只降颜色和粗细，**不改字号** —— 改字号会让同一张卡里
   四行的基线又错开，等于刚修好的对齐又破了。 */
.dash-mod .m-item.is-empty .v{font-size:var(--fs-14);font-weight:500;color:var(--muted);}
.dash-mod .m-item.is-off{cursor:default;background:#FBFCFE;}
.dash-mod .m-item.is-off .k{color:var(--muted);}

/* 2026-10-31：趋势 + 战队并排一行（原来各占一行，首屏被撑出滚动条）。
   只有老板能拿到 team，战队块隐藏时趋势自动占满整行。
   align-items 由 start → stretch：郭先生要求「战队纵览高度和近 7 天趋势一样高」。 */
.dash-bottom{display:flex;gap:8px;align-items:stretch;margin-top:8px;}
.dash-bottom > .dash-trend-strip{flex:1.6 1 0;min-width:0;margin-top:0;}
.dash-bottom > .dash-teamline{flex:1 1 0;min-width:0;margin-top:0;}
@media (max-width:1100px){ .dash-bottom{flex-direction:column;} }
/* 趋势：默认一条细卡（和右边「战队纵览」等高），点「展开」在悬浮层看大图。
   2026-10-31 郭先生定：默认高度再收一截 —— 原来 clamp(72,9vh,100) 撑得比战队高一倍，
   页面因此多出一条竖向滚动条。 */
.dash-trend-strip{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:6px 12px 4px;box-shadow:var(--shadow);margin-top:8px;box-sizing:border-box;
  display:flex;flex-direction:column;justify-content:center;}
.dash-trend-strip .t-head{display:flex;align-items:center;gap:10px;
  font-size:var(--fs-14);font-weight:600;color:var(--text);}
.dash-trend-strip .t-head .dash-sub{font-size:var(--fs-12);font-weight:400;color:var(--muted);}
.dash-trend-strip .t-head .btn{margin-left:auto;}
/* 2026-11-08：矮版也要留出横轴标签的位置，否则只剩一条线看不懂 */
.dash-trend-strip .dash-trend-chart{height:clamp(56px,6vh,68px);margin-top:2px;}

/* 战队纵览：一行细条（只有老板能拿到 team） */
.dash-teamline{display:flex;align-items:center;gap:10px;margin-top:8px;padding:6px 12px;
  background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  font-size:var(--fs-14);color:var(--text);}
.dash-teamline .dash-sub{font-size:var(--fs-12);color:var(--muted);}

/* 快捷入口：一行文字链，不占卡片 */
.dash-quick{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin:8px 0 2px;font-size:var(--fs-12);color:var(--muted);}
.dash-quick a{color:var(--primary);cursor:pointer;text-decoration:none;}
.dash-quick a:hover{text-decoration:underline;}

/* ===== 内容创作（2026-10-05 重设计）=================================
   原来左右两栏靠内联 box-shadow 撑，右栏在选商家前是一句提示占着 700px 死空间，
   左栏还有一句「请先选择商家」在说同一件事。现在：右栏放「选择商家」主操作（可点卡片）。 */

.cc-wrap{display:grid;grid-template-columns:minmax(0,380px) minmax(0,1fr);
  gap:14px;height:100%;min-height:0;box-sizing:border-box;align-items:stretch;}
.cc-setup,.cc-output{background:#fff;border:1px solid var(--border);border-radius:var(--radius);
  padding:16px;box-shadow:var(--shadow);overflow-y:auto;overflow-x:hidden;box-sizing:border-box;min-height:0;}
/* 2026-11-08 郭先生定：生成页左栏项多，改成栏内滚动，生成按钮常驻栏底 —— 页面本身不再被撑成好几米 */
.cw-gen-shell{display:flex;flex-direction:column;overflow:hidden;min-height:0;}
.cw-gen-shell > .tabbar{flex:0 0 auto;}
.cw-gen-shell > .cw-gen-pane{flex:1 1 auto;min-height:0;box-sizing:border-box;overflow-y:auto;overflow-x:hidden;}
/* 2026-11-09：内容生成页不再有 tab 容器，生成表单直接铺满 shell */
#cwGenFormBox{height:100%;min-height:0;}
.cc-setup{display:flex;flex-direction:column;overflow:hidden;}
.cc-setup-body{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;margin-right:-6px;padding-right:6px;}
.cc-setup-foot{flex:0 0 auto;padding-top:10px;border-top:1px solid var(--border);}
.cc-field{margin-bottom:12px;}
.cc-label{font-size:var(--fs-14);font-weight:600;color:var(--text);}
.cc-req{color:#FF4D4F;}
.cc-platforms{display:flex;gap:10px;flex-wrap:wrap;border:1px solid var(--border);
  border-radius:10px;padding:10px 12px;min-height:44px;margin-top:6px;box-sizing:border-box;}
.cc-hint{color:var(--muted);font-size:var(--fs-12);}

.cc-idle-h{font-size:var(--fs-16);font-weight:700;color:var(--text);margin-bottom:6px;}
.cc-idle-s{font-size:var(--fs-14);color:var(--muted);margin-bottom:16px;}
.cc-merchants{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;}
.cc-merchant{border:1px solid var(--border);border-radius:12px;padding:14px 16px;
  cursor:pointer;background:#FAFCFF;box-sizing:border-box;
  transition:border-color .18s ease,background .18s ease,box-shadow .18s ease;}
.cc-merchant:hover{border-color:var(--primary);background:#F3F8FF;
  box-shadow:0 4px 14px rgba(0,82,196,.10);}
.cc-merchant .m1{font-size:var(--fs-14);font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cc-merchant .m2{font-size:var(--fs-12);color:var(--muted);margin-top:4px;}

.cc-ready{padding:6px 2px;}
.cc-ready .r1{font-size:var(--fs-16);font-weight:600;color:var(--text);margin-bottom:10px;}
.cc-ready .r2,.cc-ready .r3{font-size:var(--fs-14);color:var(--muted);line-height:1.9;}

@media (max-width: 1280px) {
  /* 窄屏：左右两栏改上下排，恢复整页滚动，别把下半截裁掉 */
  .cc-wrap{grid-template-columns:minmax(0,1fr);height:auto;}
  .cw-gen-shell{display:block;overflow:auto;}
  .cw-gen-shell > .cw-gen-pane{overflow:visible;}
  .cc-setup,.cc-output,.cc-setup-body{overflow:visible;max-height:none;}
}

.cc-sec-h{font-size:var(--fs-14);font-weight:600;color:var(--text);margin:18px 0 8px;
  padding-top:14px;border-top:1px solid var(--border);}
.cc-recent-list{display:flex;flex-direction:column;gap:8px;}
.cc-recent-item{background:#FAFCFF;border:1px solid var(--border);border-radius:10px;
  padding:10px 12px;box-sizing:border-box;}
.cc-recent-item .c1{font-size:var(--fs-12);color:var(--muted);margin-bottom:4px;}
.cc-recent-item .c2{font-size:var(--fs-14);color:var(--text);line-height:1.55;
  overflow:hidden;text-overflow:ellipsis;display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;}


/* 2026-10-31：这组是老版「趋势 + 维度并排」的遗留规则（`.dash-dims` 早就搬走了），
   写在后面反而把上面 `.dash-bottom` 的 align-items:stretch 盖回 start
   —— 这就是「战队纵览比趋势矮一截」的直接原因。删掉，别再叠第二份。 */


/* ========== 客户主线（2026-10-14 · 入口收敛）==========
   客户详情里唯一的那条纵轴：主状态线 + 交付刻度 + 按节点分组的入口 + 最近动态。
   设计约束（跟本文件一贯的规矩对齐）：
     · **一张卡装完**，里面只用分隔线分区 —— 不套卡（历史上"卡套卡"被专门整改过）。
     · **hover 不改 padding/尺寸**，只改颜色和阴影（改尺寸会让下方内容整体位移 = 抖）。
     · 颜色全走变量，不写死。
   节点行 `.cw-node` 的当前节点用 --primary-bg 淡蓝底 + 左侧竖条，不做大色块。 */
.cw-line{padding:16px 18px;}
.cw-line-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;}
.cw-line-now{font-size:var(--fs-12);color:var(--muted);}
.cw-line-now b{color:var(--primary);font-size:var(--fs-14);}

/* —— 主状态线：胶囊步骤条，用 › 连接 —— */
.cw-steps{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0;}
.cw-steps li{position:relative;font-size:var(--fs-12);color:var(--muted);background:#F2F5FA;
  padding:5px 12px;border-radius:999px;margin:3px 10px 3px 0;white-space:nowrap;cursor:pointer;}
.cw-steps li:hover{background:#E7EEF8;}
.cw-steps li.done{background:#E8F5EE;color:var(--success);}
.cw-steps li.now{background:var(--primary);color:#fff;font-weight:700;box-shadow:0 2px 8px rgba(0,87,255,.28);}
.cw-steps li.now::after{content:'';position:absolute;inset:0;border-radius:999px;
  border:2px solid rgba(11,71,199,.25);pointer-events:none;}
.cw-steps li + li::before{content:'›';position:absolute;left:-8px;top:50%;
  transform:translateY(-50%);color:#C7D2E0;font-size:var(--fs-14);}

/* —— 交付刻度（operating 内部走到哪一步）—— */
.cw-miles{margin-top:12px;padding-top:10px;border-top:1px solid var(--border);}
.cw-miles-head{font-size:var(--fs-12);color:#4E6B99;margin-bottom:4px;}
.cw-miles-head b{color:var(--text);}
.cw-mile{display:flex;align-items:baseline;gap:8px;padding:3px 6px;border-radius:6px;
  border-left:3px solid transparent;}
.cw-dot{width:8px;height:8px;border-radius:50%;background:#D6DEEA;flex:0 0 8px;
  position:relative;top:-1px;}
.cw-mile.done .cw-dot{background:var(--success);}
.cw-mile.unknown .cw-dot{background:var(--warning);}
.cw-mile.now{background:var(--primary-bg);border-left-color:var(--primary);}
.cw-mile.now .cw-dot{background:var(--primary);box-shadow:0 0 0 3px rgba(11,71,199,.15);}
.cw-mile-name{font-size:var(--fs-14);font-weight:600;color:var(--muted);min-width:92px;flex:0 0 92px;
  white-space:nowrap;}
.cw-mile.done .cw-mile-name{color:var(--text);}
.cw-mile.now .cw-mile-name{color:var(--primary);font-weight:700;}
.cw-mile-now{font-size:var(--fs-12);color:#fff;background:var(--primary);border-radius:999px;
  padding:1px 7px;flex:0 0 auto;white-space:nowrap;position:relative;top:-1px;}
.cw-mile-note{font-size:var(--fs-12);color:var(--muted);}
.cw-mile-unknown-note{font-size:var(--fs-12);color:var(--warning);margin-bottom:2px;padding-left:6px;}
.cw-miles-done{margin-left:8px;font-size:var(--fs-12);color:var(--success);}

/* —— 按节点分组的入口（唯一一套导航）—— */
.cw-nodes{margin-top:12px;padding-top:8px;border-top:1px solid var(--border);}
.cw-node{display:flex;align-items:center;gap:10px;padding:6px 8px 6px 6px;
  border-radius:var(--radius);border-left:3px solid transparent;
  transition:background .18s ease,border-color .18s ease;}
.cw-node:hover{background:#FAFCFF;}
.cw-node.now{background:var(--primary-bg);border-left-color:var(--primary);}
.cw-node-name{font-size:var(--fs-12);color:#4E6B99;font-weight:500;min-width:108px;flex:0 0 108px;}
.cw-node.now .cw-node-name{color:var(--primary);font-weight:700;}
.cw-node-acts{display:flex;flex-wrap:wrap;gap:6px;min-width:0;}
.cw-node-acts .btn{margin:0;}

/* —— 阶段抽屉（2026-10-14 郭先生定）——
   客户按阶段服务：**当前阶段默认展开，其余收成一行摘要**，点标题再展开（回去改）。
   目的：第一阶段东西最多，全展开；往后越走越少，最后只剩内容生成那一段。 */
.cw-stage{border-left:3px solid transparent;border-radius:var(--radius);margin:2px 0;}
.cw-stage.cur{background:var(--primary-bg);border-left-color:var(--primary);}
.cw-stage-head{display:flex;align-items:center;gap:8px;padding:7px 8px;
  border-radius:var(--radius);cursor:pointer;transition:background .18s ease;}
.cw-stage-head:hover{background:#FAFCFF;}
.cw-stage-mark{font-size:var(--fs-12);color:var(--muted);flex:0 0 12px;}
.cw-stage.cur .cw-stage-mark{color:var(--primary);}
.cw-stage-name{font-size:var(--fs-14);font-weight:600;color:var(--text);flex:0 0 auto;}
.cw-stage.cur .cw-stage-name{color:var(--primary);}
.cw-stage-now{font-size:var(--fs-12);color:#fff;background:var(--primary);border-radius:999px;
  padding:1px 7px;flex:0 0 auto;}
/* 摘要（这一段点开能拿到哪些入口）。跟阶段名之间加一道极淡的竖线做分隔 ——
   2026-10-14：原来两者都是小字、颜色也接近，读起来糊成一串。 */
.cw-stage-sum{font-size:var(--fs-12);color:var(--muted);flex:1 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  padding-left:10px;margin-left:2px;border-left:1px solid var(--border);}
.cw-stage-sum:empty{display:none;padding:0;margin:0;border:none;}
.cw-stage-arrow{font-size:var(--fs-12);color:var(--muted);flex:0 0 auto;}
.cw-stage-body{padding:2px 0 4px 12px;}

/* —— 最近动态 —— */
.cw-events{margin-top:10px;padding-top:8px;border-top:1px solid var(--border);}
.cw-events-head{font-size:var(--fs-12);color:#4E6B99;margin-bottom:4px;}
.cw-event{font-size:var(--fs-12);color:var(--muted);padding:2px 0;}

@media (max-width: 900px) {
  .cw-node{flex-direction:column;align-items:flex-start;gap:6px;}
  .cw-node-name{min-width:0;flex:none;}
}

/* ========== 打开客户就自动摆出来的「近况」（2026-10-14）==========
   一张卡一块（素材/稿子/发布/品牌档案/AI可见度/待办）—— 是**兄弟卡**，不套在主线卡里（不套卡）。
   卡右上角那个「… ›」是入口：要深入才点。 */
.cw-glance{display:grid;grid-template-columns:repeat(auto-fill,minmax(264px,1fr));gap:12px;}
.cw-gcard{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);
  padding:12px 14px;box-shadow:var(--shadow);transition:box-shadow .2s ease;min-width:0;}
.cw-gcard:hover{box-shadow:var(--shadow-lg);}
.cw-ghead{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:6px;}
.cw-gname{font-size:var(--fs-14);font-weight:600;color:var(--text);}
.cw-gcount{color:var(--primary);font-size:var(--fs-16);margin-left:5px;}
/* 0 的降噪：不删（总览要"一眼看全"），只是别跟有数据的抢视线 */
.cw-gcount.zero{color:var(--muted);font-weight:600;}
.cw-gcta{font-size:var(--fs-12);color:var(--primary);cursor:pointer;white-space:nowrap;flex:0 0 auto;}
.cw-gcta:hover{text-decoration:underline;}
.cw-gsub{font-size:var(--fs-12);color:var(--muted);margin:-2px 0 5px;}
.cw-gitem{font-size:var(--fs-12);color:var(--text);line-height:1.55;padding:2px 0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cw-gnote{color:var(--muted);margin-left:6px;font-size:var(--fs-12);}
.cw-gempty{font-size:var(--fs-12);color:var(--muted);}
.cw-glance-empty{padding:14px 16px;font-size:var(--fs-14);color:var(--muted);}


/* ========== 节点页版式（2026-10-14 · 第三轮排版整改）==========
   背景：客户主线上 22 个入口，点进去几乎每页都是「一张大白卡铺满 + 内容只占顶部一小条 +
   下面几百 px 死白」。不是某一页写坏了，是**没有一套共用的节点页版式** ——
   页级样式全是各模块 JS 模板里的内联字符串（光"白卡"那一串就复制了 25 处），于是各写各的。

   这一节把站内**已经好用的那一页**（《品牌档案》modules/brand_workshop.js）的形态抽出来推广：
     浅灰底 → 白卡只给「小节」，不再给「整页」。
     页头一行（.np-head，带当前客户 chip） / 分区（.np-sec） / 表单宽度档（.np-fields）
     / 列表（.np-list） / 空状态（.np-empty）。

   纪律（跟本文件一贯的规矩对齐）：
     · 颜色/圆角/阴影/间距**一律走变量**，不写死 #fff。
     · hover 只改颜色和阴影，**不改 padding/尺寸**（改尺寸会让下方内容整体位移 = 抖）。
     · **不套卡**：.np-page 之下只允许一层 .np-sec，.np-sec 里不再放白卡。

   ⚠️ 与 .ws-body 的关系：.ws-body 是 2026-10-05 定的工作台外壳，14 个模块仍在用，
      **本轮不动它**。节点页改用 .np-page 是**逐页替换** —— 换过的页走新版式，没换的保持原样，
      所以可以一页页上线、每页单独回滚。                                    */


/* —— 页外壳：浅灰底 + 内滚。内容少时底部露出的是灰底，不再是死白 —— */
.np-page{height:100%;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;
  background:var(--bg);padding:16px 16px 24px;}
.np-page > *{max-width:var(--page-max);margin-left:auto;margin-right:auto;}

/* —— .ws-body 的「去白」修饰（第三轮的关键一招）——
   治的就是「一张大白卡铺满、内容只占顶部一条、下面几百 px 死白」。
   保留 .ws-body 原有的 flex/滚动行为，只把它那层白底/阴影/内边距摘掉，
   让 .main 的 --bg 灰底透出来；白卡改由页内的 .np-sec 承担。
   用法：`class="ws-body np-flat"` —— **逐页加**，没加的页完全不受影响。 */
.ws-body.np-flat{background:transparent;box-shadow:none;padding:0;border-radius:0;}

/* —— 页头：← 返回 + 页名 + 当前客户 ——
   收掉原来那个浮在内容区最前面的蓝色「← 返回总览」胶囊（admin-v3.html 的 showBackToOverview）。
   当前客户 chip：从客户主线跳进来的页，一眼知道"我站在谁身上"。 */
.np-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px;}
.np-back{font-size:var(--fs-14);color:var(--primary);cursor:pointer;flex:0 0 auto;}
.np-back:hover{text-decoration:underline;}
.np-title{font-size:var(--fs-16);font-weight:600;color:var(--text);flex:0 0 auto;}
.np-cust{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-12);color:var(--primary);
  background:var(--primary-bg);border:1px solid #D8E6FF;border-radius:999px;padding:3px 10px;flex:0 0 auto;}
.np-head-acts{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap;}

/* —— 分区：白卡的唯一形态。一张 .np-sec = 一个小节 —— */
.np-sec{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);
  padding:14px 16px;margin-bottom:12px;box-shadow:var(--shadow);box-sizing:border-box;}
.np-sec:last-child{margin-bottom:0;}
.np-sec > header{display:flex;align-items:center;gap:8px;margin-bottom:10px;padding-bottom:8px;
  border-bottom:1px solid var(--border);}
.np-sec > header .h-card{flex:0 0 auto;}
.np-sec > header .np-sec-hint{font-size:var(--fs-12);color:var(--muted);flex:1 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.np-sec > header .np-sec-acts{margin-left:auto;display:flex;gap:8px;flex:0 0 auto;}

/* —— 表单宽度档：短字段不许被拉到 1400px —— */
.np-fields{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px 16px;}
.np-field{min-width:0;}
.np-field.w-sm{max-width:240px;}
.np-field.w-md{max-width:360px;}
.np-field.w-full{grid-column:1 / -1;}

/* —— 列表：一项一行、项间细线、右侧操作列对齐（原来操作按钮裸露、行间全靠留白）—— */
.np-list{display:flex;flex-direction:column;}
.np-item{display:flex;align-items:flex-start;gap:12px;padding:10px 2px;
  border-bottom:1px solid var(--border);transition:background .15s ease;}
.np-item:last-child{border-bottom:none;}
.np-item:hover{background:#FAFCFF;}
.np-item-main{flex:1 1 auto;min-width:0;}
.np-item-acts{flex:0 0 auto;display:flex;gap:6px;align-items:center;
  opacity:.55;transition:opacity .15s ease;}
.np-item:hover .np-item-acts{opacity:1;}

/* —— 空状态：收窄，不再飘在整页正中 —— */
.np-empty{padding:36px 16px;text-align:center;color:var(--muted);font-size:var(--fs-14);}
.np-empty .np-empty-icon{font-size:var(--icon-md);line-height:1;margin-bottom:8px;opacity:.7;}
/* 小节内的"这块没数据"——比整页空态轻 */
.np-none{color:#C0CAD8;font-size:var(--fs-14);padding:6px 0;}

/* —— 页头右侧的说明文字（一句话说清这页是干嘛的）—— */
.np-hint{font-size:var(--fs-12);color:var(--muted);flex:1 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* —— 小标签（chip）：坐标实体 / 关键词 / 关系 这类"一词一条"的密集展示 ——
   原来每个 chip 是一长串内联 style（`display:inline-block;margin:0 6px 6px 0;padding:4px 10px;…`）。 */
.np-chips{display:flex;flex-wrap:wrap;gap:6px;}
.np-chip{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-12);line-height:1.5;
  color:var(--text);background:var(--primary-bg);border:1px solid var(--border);
  border-radius:999px;padding:3px 10px;max-width:100%;}
.np-chip .t{color:var(--muted);font-size:var(--fs-12);}

/* —— 卡内子分组（一个大层里按类目再分）—— */
.np-group + .np-group{margin-top:12px;}
.np-group-h{font-size:var(--fs-12);font-weight:600;color:#5A6B8C;margin-bottom:6px;}
.np-group-h .n{color:var(--muted);font-weight:400;}

/* —— 徽标（公开级等）—— 原来是直接印英文 `[public]` / `[internal]` —— */
.np-badge{display:inline-flex;align-items:center;font-size:var(--fs-12);border-radius:999px;padding:1px 7px;}
.np-badge.public{background:rgba(34,160,107,.12);color:var(--success);}
.np-badge.anonymous{background:rgba(233,162,59,.14);color:#B77B1F;}
.np-badge.internal{background:rgba(138,155,181,.14);color:var(--muted);}

/* —— 小的数字条（一屏 4~6 个统计数）——
   别用 `repeat(4,1fr)`：在 1400px 里每个会被拉到 330px 宽，一个数字占一大块白（"控件尺寸失衡"）。
   钉住列宽、左对齐；放在 .np-sec 里时用浅色底 + 细边（白卡上白卡会看不见）。 */
.np-kpi{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,180px));gap:10px;}
.np-kpi .k{background:#FAFCFF;border:1px solid var(--border);border-radius:var(--radius);
  padding:12px 14px;box-sizing:border-box;}
.np-kpi .k .n{font-size:var(--fs-24);font-weight:700;line-height:1.1;color:var(--text);}
.np-kpi .k .l{font-size:var(--fs-12);color:var(--muted);margin-top:3px;}

/* —— 长纸条目（人生事件 / 品牌资产）：一条一段，比裸文字可读 —— */
.np-note{font-size:var(--fs-14);line-height:1.7;color:var(--text);padding:8px 10px;
  border-radius:var(--radius-sm);background:#FAFCFF;border:1px solid var(--border);}
.np-note + .np-note{margin-top:6px;}
.np-note .m{display:block;font-size:var(--fs-12);color:var(--muted);margin-top:3px;}

@media (max-width:900px){
  .np-page{padding:12px 12px 20px;}
  .np-fields{grid-template-columns:1fr;}
  .np-field,.np-field.w-sm,.np-field.w-md{max-width:none;}
}

/* ── 客户详情「🤖 AI 速览」（能力层 P2 · 2026-10-16）───────────────────────────
   一块一条能力（客户360 / 排期 / 发布记录 …），逐条摆着扫读会糊 ⇒ 第 2 条起加一条浅虚线。
   用相邻兄弟选择器，第一条自然没有分隔；**别在 JS 里拼样式串**（缝11 扫描器会判"裸拼 HTML"，
   那判据是对的 —— 样式就该待在 CSS 里）。 */
.cap-glance-item + .cap-glance-item{border-top:1px dashed var(--border);padding-top:10px;}
.cap-glance-title{font-size:var(--fs-12);font-weight:600;color:var(--primary,#165DFF);margin-bottom:4px;}
.cap-glance-head{font-size:var(--fs-14);color:var(--text);margin-bottom:3px;}
.cap-glance-body{font-size:var(--fs-14);line-height:1.75;color:#2C4A7C;white-space:pre-wrap;}
.cap-glance-body.is-empty{color:var(--muted);}
/* 分组折叠（2026-10-17 · 郭先生定「保留 10 块，分组折叠」）—— 档案 / 内容 / 素材 */
.cap-glance-group + .cap-glance-group{border-top:1px solid var(--border);}
.cap-glance-group-hd{display:flex;align-items:center;gap:6px;cursor:pointer;
  padding:9px 0 7px;font-size:var(--fs-14);font-weight:600;color:#3A4A5F;user-select:none;}
.cap-glance-caret{display:inline-block;color:var(--muted);font-size:var(--fs-12);transition:transform .15s;}
.cap-glance-group.is-open .cap-glance-caret{transform:rotate(90deg);}
.cap-glance-cnt{font-weight:400;font-size:var(--fs-12);color:var(--muted);
  background:#F0F6FF;border-radius:8px;padding:1px 7px;}
.cap-glance-group-bd{display:none;padding:2px 0 8px 16px;}
.cap-glance-group.is-open .cap-glance-group-bd{display:block;}

/* ============================================================
   客户详情 · 主线阶段盘 + 右侧常驻档案（2026-10-17）
   8 个 crm_stage 摆成 2 行 × 4 格；点一格，下面展开该段维度卡片。
   ============================================================ */
.cw-detail-head{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap;}
.cw-detail-title{font-size:var(--fs-16);font-weight:700;color:var(--text);}
.cw-head-stage{display:inline-block;font-size:var(--fs-12);font-weight:600;color:var(--primary);
  background:var(--primary-bg);border-radius:999px;padding:3px 10px;}
.cw-detail-grid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px;align-items:start;}
.cw-detail-main{min-width:0;}
.cw-detail-rail{min-width:0;position:sticky;top:0;display:flex;flex-direction:column;gap:12px;}

/* 阶段盘 */
.cw-board-wrap{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px 16px;}
.cw-board-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:10px;}
.cw-board-hint{font-size:var(--fs-12);color:var(--muted);}
.cw-board{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;}
.cw-board-box{background:#FBFCFE;border:1px solid var(--border);border-radius:var(--radius);
  padding:10px 12px;cursor:pointer;transition:border-color .15s,background .15s,box-shadow .15s;min-width:0;}
.cw-board-box:hover{border-color:#B9CBE6;background:#F7FAFF;}
/* 2026-10-17 郭先生定：只有「当前阶段」标蓝，其他阶段一律同一个颜色 */
.cw-board-box.now{background:var(--primary-bg);border-color:var(--primary);box-shadow:0 2px 8px rgba(11,71,199,.12);}
/* 点了另一段来看内容：只加一圈蓝边，不改底色，免得跟「当前阶段」抢 */
.cw-board-box.sel{outline:2px solid var(--primary);outline-offset:1px;}
.cw-board-top{display:flex;align-items:center;justify-content:space-between;gap:6px;}
.cw-board-name{font-size:var(--fs-14);font-weight:700;color:var(--text);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;}
.cw-board-box.now .cw-board-name{color:var(--primary);}
.cw-board-mark{font-size:var(--fs-12);color:var(--muted);flex:0 0 auto;}
.cw-board-box.now .cw-board-mark{color:var(--primary);font-weight:700;}
.cw-board-sum{font-size:var(--fs-12);color:var(--muted);line-height:1.5;margin-top:4px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

/* 当前段维度卡 */
.cw-stage-panel{margin-top:12px;background:var(--card);border:1px solid var(--border);
  border-radius:var(--radius-lg);padding:14px 16px;}
.cw-stage-panel-head{display:flex;align-items:baseline;gap:10px;margin-bottom:10px;}
.cw-stage-panel-hint{font-size:var(--fs-12);color:var(--muted);}

/* 贯穿全阶段：跟阶段无关、每段都要用的东西，单独一块，不跟阶段内容混 */
.cw-core-panel{margin-top:14px;background:var(--card);border:1px solid var(--border);
  border-radius:var(--radius-lg);padding:14px 16px;}
.cw-core-head{display:flex;align-items:baseline;gap:10px;margin-bottom:10px;}
.cw-core-hint{font-size:var(--fs-12);color:var(--muted);}

/* 默认收起的「更多：近况 / AI 速览」 */
.cw-more{margin-top:14px;background:var(--card);border:1px solid var(--border);
  border-radius:var(--radius-lg);padding:10px 16px;}
.cw-more > summary{cursor:pointer;font-size:var(--fs-14);font-weight:600;color:var(--text-2);}
.cw-more[open] > summary{margin-bottom:6px;}
.cw-dim-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;}
.cw-dim-card{border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;
  background:#FBFCFE;display:flex;flex-direction:column;gap:6px;min-width:0;}
.cw-dim-card.done{border-color:#BFE3CE;background:#F6FCF8;}
.cw-dim-card.now{border-color:var(--primary);background:var(--primary-bg);}
.cw-dim-head{display:flex;align-items:center;justify-content:space-between;gap:6px;
  font-size:var(--fs-14);font-weight:600;color:var(--text);}
.cw-dim-note{font-size:var(--fs-12);color:var(--text-2);line-height:1.65;flex:1 1 auto;
  word-break:break-word;}
.cw-dim-acts{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px;}

/* 右侧常驻卡 */
.cw-rail-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);
  padding:12px 14px;}
.cw-rail-info{font-size:var(--fs-12);color:var(--text-2);line-height:1.85;}
.cw-rail-info b{color:var(--text);font-weight:600;}
.cw-rail-links{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px;}
.cw-rail-links .btn{margin:0;}

@media (max-width:1100px){
  .cw-detail-grid{grid-template-columns:1fr;}
  .cw-detail-rail{position:static;}
  .cw-board{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media (max-width:640px){
  .cw-board{grid-template-columns:1fr;}
  .cw-dim-grid{grid-template-columns:1fr;}
}

/* AI 检测页：10 个 tab 分三组（2026-10-17）→ 收成 4 主 tab + 二级小 tab（2026-10-20） */
.geo-tabs{display:flex;flex-wrap:wrap;gap:8px 18px;margin-bottom:10px;}
.geo-tabgroup{display:flex;align-items:center;flex-wrap:wrap;gap:6px;}
.geo-tabgroup-name{font-size:var(--fs-12);color:var(--muted);font-weight:600;
  background:#F2F5FA;border-radius:8px;padding:2px 8px;margin-right:2px;white-space:nowrap;}
.geo-tabgroup .cw-tab{white-space:nowrap;}
.geo-maintabs{margin-bottom:2px;}
.geo-subtabs{margin:0 0 10px 6px;padding-left:12px;border-left:2px solid var(--border);}

/* 深度访谈 · 拆解结果页签（2026-10-18） */
.iw-res-tab{padding:4px 14px;border-radius:999px;font-size:var(--fs-14);cursor:pointer;color:var(--muted);background:var(--bg);border:1px solid var(--border);transition:all .15s;}
.iw-res-tab.active{background:var(--primary);color:#fff;border-color:var(--primary);}
.story-card textarea:focus,.story-card input:focus{outline:none;border-color:var(--primary);}

/* ==================== 手机端（≤768px）2026-11-02 ====================
   起因：飞书热点卡的「打开网页看全部」直接打开 admin-v3，手机上侧栏 240px +
   主区 margin-left:240px 把屏幕占死，看起来「打开以后什么都没有」。
   改法：侧栏变浮层抽屉（☰ 开 / 遮罩、菜单项关），主区占满宽，顶栏收窄。 */
.mobile-menu-btn{display:none;}
.sidebar-mask{display:none;}
@media (max-width:768px){
  .sidebar{position:fixed;left:-270px;top:0;bottom:0;width:260px;z-index:1200;
    transition:left .2s ease;box-shadow:var(--shadow-lg);}
  .sidebar.open{left:0;}
  .sidebar-mask.show{display:block;position:fixed;inset:0;background:rgba(20,35,60,.38);z-index:1100;}
  .main{margin-left:0;padding:10px;}
  .topbar{padding:9px 12px;gap:8px;margin-bottom:10px;flex-wrap:nowrap;}
  .topbar h1{font-size:var(--fs-16);flex:1 1 auto;min-width:0;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .topbar-right{gap:8px !important;flex-wrap:nowrap;flex:0 0 auto;}
  .global-search{display:none !important;}      /* 手机屏先收起来，搜索去侧栏 */
  #nickname,#meritBadge{display:none !important;}
  #avatar{width:28px;height:28px;font-size:14px;}
  .mobile-menu-btn{display:inline-flex;align-items:center;justify-content:center;
    width:36px;height:36px;flex:0 0 auto;border:1px solid var(--border);background:var(--card);
    border-radius:8px;font-size:var(--fs-20);color:var(--text);cursor:pointer;padding:0;}
  /* 常用栅格在手机上统一单列 / 双列，别横着撑破屏 */
  .dash-kpi{grid-template-columns:repeat(2,minmax(0,1fr)) !important;}
  .stat-grid,.kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr)) !important;}
  .form-grid{grid-template-columns:1fr !important;}
  .dash-bottom{flex-direction:column;}
  .card,.panel{padding:12px;}
  /* 宽表：手机上横向滚动，别整页被撑宽 */
  #dash-container table{display:block;overflow-x:auto;white-space:nowrap;}
  /* 直播/AI 客服这类左右两栏：手机上叠起来（原来内联 min-width:480px 直接撑破屏） */
  #dash-container [style*="min-width:480px"],
  #dash-container [style*="min-width:420px"],
  #dash-container [style*="min-width:320px"],
  #dash-container [style*="min-width:260px"]{min-width:0 !important;}
  #dash-container > div > div[style*="display:flex"]{flex-wrap:wrap;}
  /* 抽屉/弹窗铺满可用宽度 */
  .drawer,.modal{width:100% !important;max-width:100vw !important;}
}

/* ── 账号健康度八维（2026-11-06 · 账号池页顶部）───────────────────────────────
   一张 .ah-card = 一个主体（主体=租户，客户并回代运营）。
   8 格 = 8 维；有分显示分，没分灰显「未采集」，点「看原因」展开后端给的 unknown_reason。 */
.ah-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;}
.ah-card{border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px;
  background:#FAFCFF;box-sizing:border-box;}
.ah-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:4px;}
.ah-name{font-size:var(--fs-14);font-weight:600;color:var(--text);flex:1 1 auto;min-width:0;}
.ah-score{flex:0 0 auto;display:flex;align-items:baseline;gap:4px;}
.ah-total-num{font-size:var(--fs-24);font-weight:700;line-height:1;}
.ah-total-num.none{font-size:var(--fs-14);font-weight:400;color:var(--muted);}
.ah-total-num.green{color:var(--success);}
.ah-total-num.red{color:var(--danger);}
.ah-total-num.mid{color:var(--warning);}
.ah-total-unit{font-size:var(--fs-12);color:var(--muted);}
.ah-band{font-size:var(--fs-12);border-radius:999px;padding:1px 7px;margin-left:2px;}
.ah-band.green{background:rgba(34,160,107,.12);color:var(--success);}
.ah-band.red{background:rgba(233,75,75,.12);color:var(--danger);}
.ah-band.mid{background:rgba(233,162,59,.14);color:#B77B1F;}
.ah-band.insufficient,.ah-band.none{background:rgba(138,155,181,.14);color:var(--muted);}
.ah-cov{font-size:var(--fs-12);color:var(--muted);margin-bottom:8px;}
.ah-dims{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;}
.ah-dim{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:6px 8px;text-align:center;box-sizing:border-box;min-width:0;}
.ah-dim b{display:block;font-size:var(--fs-16);font-weight:700;color:var(--text);line-height:1.2;}
.ah-dim span{display:block;font-size:var(--fs-12);color:var(--muted);margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ah-dim.none{background:#F7F9FC;}
.ah-dim.none b{font-size:var(--fs-12);font-weight:400;color:#C0CAD8;}
.ah-more{font-size:var(--fs-12);color:var(--primary);cursor:pointer;margin-top:8px;}
.ah-more:hover{text-decoration:underline;}
.ah-why{margin-top:8px;border-top:1px dashed var(--border);padding-top:8px;}
.ah-why-row{font-size:var(--fs-12);color:var(--muted);line-height:1.6;}
.ah-why-row b{color:var(--text-2);margin-right:6px;}
.ah-acts{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;
  font-size:var(--fs-12);color:var(--muted);}
@media (max-width:900px){
  .ah-grid{grid-template-columns:1fr;}
  .ah-dims{grid-template-columns:repeat(2,1fr);}
}

/* 2026-11-08 经营中心：数字条固定 5 格（原来 6 格空一格；5 格用 auto-fit 会 4+1 换行） */
.dash-kpi.dash-kpi-5{grid-template-columns:repeat(var(--kpi-n,5),minmax(0,1fr));}
@media (max-width:1100px){ .dash-kpi.dash-kpi-5{grid-template-columns:repeat(3,minmax(0,1fr));} }
@media (max-width:640px){ .dash-kpi.dash-kpi-5{grid-template-columns:repeat(2,minmax(0,1fr));} }
