/* HGFAST AI Support OS · 管理后台专属样式
   令牌层与通用组件（.btn/.card/.input/.badge/.table/.sidebar/.nav/.kpi/.callout …）全部由
   shared.css 提供。本文件只补「管理后台」这一屏相对于通用组件的差异：不重复 shared.css
   已经做对的事，不引入调色板外的新颜色，不写死十六进制值——一律取 shared.css :root 的
   **新令牌名**（--canvas/--surface/--ink/--rule/--act…），不再引用 --panel/--line/--text
   这类过渡期别名（shared.css 注明那一整块迁完即删，删除前不要新增引用）。

   贯穿本文件的三条规格：
   ① **线型语法**：虚线 = 机器提出、尚未有人签字；实线 = 已经有人签了字（批准或拒绝）。
      管理端符合这条语义的只有「自动化审批队列」和「学习审批」两个队列。其余任何地方
      都不许出现虚线——包括空态占位框——否则这条安全语法会被稀释成纯装饰。
   ② **正常态不发光**：常驻不变的说明性徽章一律不着色（.badge-static），
      语义色只留给真正会变的状态。报警面积必须与真实异常量成正比。
   ③ **字号阶梯只有 11/12/13/14/15/18/26**，且 **11px 只给 ASCII/数字/等宽**，
      中文硬下限 12px；**中文永不进 mono**（mono 栈无 CJK，会回退成全角等宽）。 */
:root{
  /* 与 shared.css .card 的 padding 保持一致：卡片内做满幅出血时取它的负值，
     只在这一处定义，避免出血量和卡片内边距各改各的而对不齐 */
  --admin-card-pad:14px;
}

/* ── 侧栏导航 ───────────────────────────────────────────────────
   14 项导航的全部形态（28px 行高、图标列 mono 定宽居中不上色、hover 抬升面、
   激活态整格换成内容区画布色）已由 shared.css 的 .nav 规则给全，管理端无差异。
   ⚠ 这里曾给图标 span 单独上 --faint 色：那个值落在深色 chrome 上只有 3.1:1，
   而规格明确要求图标「不上色不放大」（信息量极低，上色只会制造 14 个抢眼点）。
   已整块删除，不要加回来。 */

/* ── 内容区页头 ─────────────────────────────────────────────────
   页头（eyebrow + h1 + 说明 + 右侧动作）与下方内容之间需要一条结构线才站得住；
   规格里层级由「面底阶梯 + 线宽分档」承担，没有阴影可用。--rule 是结构档。 */
.topbar{padding-bottom:var(--sp-3);border-bottom:1px solid var(--rule);margin-bottom:var(--sp-4)}
/* 页面副标题：中文，必须 ≥12px（原 11.5px 既破阶梯又破中文下限）。
   限宽是为了不让一行说明横穿 1440px 的整幅内容区。 */
.section-head p.muted,.topbar>div>.muted{margin:var(--sp-1) 0 0;font-size:12px;line-height:1.5;max-width:64ch}

/* ── 区块标题下缘 ───────────────────────────────────────────────
   --rule-2 是「分区」档，令牌注释里点名的用途就是 section-head 下缘。
   只给**页面级**的 section-head，卡片内首行的 section-head 走下面的标题条，
   两者不能叠加，故用 :not(.card) 把卡片这一支排除掉。 */
.section>.section-head,
.section>div:not(.card)>.section-head,
.section>div:not(.card)>div:not(.card)>.section-head{
  padding-bottom:var(--sp-2);
  border-bottom:1px solid var(--rule-2);
  margin-bottom:var(--sp-3);
}

/* ── 卡片标题条 ─────────────────────────────────────────────────
   管理端卡片是「浅底标题条 + 内分隔线 + 正文区」，不是正文里的一行粗体。
   DOM 不能动，所以用负外边距把已有的 h3 / .section-head 首子元素撑成整条标题带。
   --surface-2 的令牌用途正是「表头、卡片脚」，与表格表头同一档面色。 */
.card>h3:first-child,
.card>.section-head:first-child{
  margin:calc(-1 * var(--admin-card-pad)) calc(-1 * var(--admin-card-pad)) var(--sp-3);
  padding:8px 12px;
  background:var(--surface-2);
  border-bottom:1px solid var(--rule-2);
  border-radius:0;
}
/* 标题条内的标题保持阶梯里的 15px/600（原来压到 12px，那是 .badge/.muted 那一档，
   会让卡片标题和它自己的说明文字同重同大） */
.card>.section-head:first-child h2,
.card>.section-head:first-child h3{font-size:15px;font-weight:600}
.card>.section-head:first-child .eyebrow{margin-bottom:2px}
/* .stack / .team-card 是 grid 容器，行距由 gap 提供，标题条不再自带下外边距免得叠加 */
.card.stack>h3:first-child,
.card.stack>.section-head:first-child,
.card.team-card>.section-head:first-child{margin-bottom:0}

/* ── 卡片正文 ───────────────────────────────────────────────────
   13px 是规格的基准字号（原 12.5px 不在阶梯上）；浏览器默认 <p> 的 1em 上下边距
   会把标题条和正文顶开一大截，<pre> 同理。 */
.card>p{margin:0 0 var(--sp-3);font-size:13px;line-height:1.7;color:var(--ink-2)}
.card>p:last-child{margin-bottom:0}
.card>pre.code{margin:0}
.card>details{margin-top:var(--sp-3);font-size:12px}
.card>details>summary{cursor:pointer;color:var(--act);padding:var(--sp-1) 0}
.card>details>summary:hover{color:var(--act-hover)}
.card>details>pre.code{margin:var(--sp-2) 0 0}

/* ── 卡片内表格满幅 ─────────────────────────────────────────────
   表格贴着卡片左右边缘（标题条 → 表头行 → 数据行三段无缝）；
   .table-wrap 自带边框和圆角，套在 .card 里会变成「框中框 + 两侧留白」。 */
.card>.table-wrap{
  margin-left:calc(-1 * var(--admin-card-pad));
  margin-right:calc(-1 * var(--admin-card-pad));
  border:0;border-radius:0;background:transparent;
  border-top:1px solid var(--rule-2);
}
/* 紧跟标题条时：标题条已有下边线，这里去掉重复的一道并吃掉标题条的下边距 */
.card>h3:first-child+.table-wrap,
.card>.section-head:first-child+.table-wrap{margin-top:calc(-1 * var(--sp-3));border-top:0}
.card>.table-wrap:last-child{margin-bottom:calc(-1 * var(--admin-card-pad))}
/* 「加载更多」按钮隐藏时表格就是卡片最后一段，此时同样贴底；按钮显示后自动恢复内边距 */
.card>.table-wrap:has(+.hidden:last-child){margin-bottom:calc(-1 * var(--admin-card-pad))}

/* ── 表单区 ─────────────────────────────────────────────────────
   控件尺寸/描边/焦点环全部走 shared.css；这里只把栅格间距拉回 4px 刻度
   （规格的间距只有 4/8/12/16/24/32 六档，没有 10px）。 */
.form-grid{gap:var(--sp-3)}
.card.stack{gap:var(--sp-3)}
/* .error 的 min-height:18px 是 shared.css 刻意留的占位（消息出现时不跳版），不要收掉 */

/* ── 常驻说明徽章降噪 ───────────────────────────────────────────
   index.html 里写死在区块标题上的徽章（「高风险双门控」「Incident command」
   「A/B · 自动晋升 · 可回滚」…）是永不变化的说明文字，不是状态。让它们常年占着
   red/amber/green，等于把语义色的可信度花在零信息量的地方——正是「报警疲劳」的来源。
   新增 .badge-static 语义 class（只加不改，不动既有 class/id/data-tab）把它们统一退成
   安静标签，颜色留给真正会变的东西。.dot 用 currentColor，会跟着一起降下来。 */
.badge.badge-static{background:none;border-color:transparent;color:var(--ink-3);padding:0 2px;font-weight:400}

/* ── 客服账号表：在线状态不铺色块 ───────────────────────────────
   一张 20 行的表里 18 行「online」= 一整面绿墙，正是「正常态不发光」要消灭的东西。
   规格的容器级降噪落在这里：去掉**填充和描边**（面积），保留文字色——
   online/away/offline 的区分是真实状态信息，且徽章里已经写着状态词，
   不是「纯标签位」，不做到无色那一档。 */
#agentTable .badge{background:none;border-color:transparent;padding:0 2px}

/* ── 机器提出、等人签字：自动化审批队列 + 学习审批 ──────────────
   规格 §4.4 的线型语法在管理端的唯一落点。
     虚线 + 第二种纸（--stock-draft）+ 斜纹 = 机器产出物，尚未有人为它负责；
     实线                                = 已经有人签了字（批准 green / 拒绝 red 都算签字）。
   #learningList 的条目全是待审候选，因此恒为虚线——一旦被裁决就会从列表里消失。
   :has() 不是新依赖（shared.css 的 .kpi 数字上色已在用）；不支持时降级为
   「永远停在虚线」，方向保守、安全。 */
#approvalList>.card:not(.empty),
#learningList>.card:not(.empty){
  background-color:var(--stock-draft);
  background-image:var(--stock-hatch);
  border:1px dashed var(--ink-3);
  border-radius:0;
}
#approvalList>.card:has(.badge.green){
  background-color:var(--surface);background-image:none;
  border-style:solid;border-color:var(--ink);
}
#approvalList>.card:has(.badge.red){
  background-color:var(--surface);background-image:none;
  border-style:solid;border-color:var(--danger-line);
}
/* 机器卡内部的分区线同样是虚线；标题条不铺次级面，让斜纹连续穿过整张卡 */
#approvalList>.card>.section-head:first-child{background:transparent;border-bottom:1px dashed var(--ink-3)}
#approvalList>.card:has(.badge.green)>.section-head:first-child,
#approvalList>.card:has(.badge.red)>.section-head:first-child{border-bottom:1px solid var(--rule-2)}
/* 机器返回值块（request_json）落在第二种纸上会糊成一片，换回记录面；描边保持虚线 */
#approvalList>.card .code,
#learningList>.card .code{background:var(--surface)}
/* 人的动作区：上缘虚线收口，与 AI 草稿卡同形——一伸手，人的墨色就出现 */
#approvalList>.card .row-actions,
#learningList>.card .row-actions{border-top:1px dashed var(--ink-3);padding-top:10px}

/* ── 审计日志表 ─────────────────────────────────────────────────
   这张表整行都是需要逐字比对的机器 token（时间戳、动作枚举、target id、
   actor uuid、ip_hash、detail_json），按规格全部走 mono。
   11px 在这里是允许的：这几列没有中文，中文只出现在 <th> 里（12px，由 shared.css 给）。 */
#audit .section-head{justify-content:flex-start;gap:var(--sp-2)}
#audit .section-head h2{margin-right:auto}
#auditFilter{max-width:280px}
#auditBody td:first-child,
#auditBody td:nth-child(3),
#auditBody td:nth-child(4){font:11px/1.5 var(--font-mono);letter-spacing:.04em;color:var(--ink-3)}
#auditBody td:first-child{white-space:nowrap}
/* 动作枚举是这一行里唯一需要先被读到的东西：升到 12px 满墨，仍是 mono */
#auditBody td b{font:500 12px/1.45 var(--font-mono);letter-spacing:.04em;color:var(--ink)}
#auditBody small{display:block;margin-top:2px;font:11px/1.45 var(--font-mono);letter-spacing:.04em;color:var(--ink-3)}
#auditBody code{font:11px/1.5 var(--font-mono);letter-spacing:.04em;color:var(--ink-3);word-break:break-all}
#auditBody td:last-child{max-width:360px}

/* ── 运营总览 · 渠道分布 ────────────────────────────────────────
   规格不引图表库，图表位是占位。app.js 只输出「<b>渠道</b><span>数量</span>」的
   .callout 列表且不能改，因此降级为指标行（等同 .metric-line 的形态），
   不再顶着一堆色块。数值是机器给的可比对数字 → mono + tabular-nums。 */
#channelChart{gap:0}
#channelChart .callout{
  display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);
  padding:6px 2px;border:0;border-bottom:1px solid var(--rule-3);border-radius:0;
  background:transparent;color:var(--ink);font-size:13px;line-height:1.5;
}
#channelChart .callout:last-child{border-bottom:0}
#channelChart .callout b{font-weight:500;color:var(--ink-2)}
/* JS 在这个 span 上写了内联 float:right；父级是 flex 容器，flex item 的 float 被忽略，
   所以这里不需要（也无法用非 !important 规则）去覆盖它 */
#channelChart .callout span{font-family:var(--font-mono);letter-spacing:.04em;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
#channelChart .empty{padding:22px 12px}

/* ── KPI 网格：按各页真实卡片数给列数 ───────────────────────────
   仪表带形态（1px gap 当分隔线、去卡片边框、数字 26px mono、语义色只给数字）
   已由 shared.css 的 .kpis:has(> .kpi) 给全，这里只补列数：
   shared.css 的 9 列是运营总览的口径，其余四处分别是 4/6/6/2 张。
   ⚠ #channelCards 也是 .grid.kpis，但子元素是 .card 不带 .kpi，
   不会被仪表带规则卷进去（这正是 shared.css 必须写 :has(> .kpi) 的原因）。 */
#workforceKpis{grid-template-columns:repeat(4,minmax(0,1fr))}
#serviceKpis,#runtimeKpis{grid-template-columns:repeat(6,minmax(0,1fr))}
#channelCards{grid-template-columns:repeat(2,minmax(0,1fr))}
#runtimeMetricsNote{font-size:12px;color:var(--ink-2)}

/* ── 客户中心工具条 ─────────────────────────────────────────────
   列表工具条是卡片顶部的浅底带，与表头同一档面色；控件高度全部由 shared.css 给 28px。 */
.customer-toolbar{background:var(--surface-2)}

/* ── 模块占位 / 空态 ────────────────────────────────────────────
   ⚠ 这里**刻意不用虚线 + 斜纹**：那套语法在本规格里被指派给「机器产出、尚未签字」，
   拿去表示「没有数据」会把安全语义稀释成装饰，等于给整个产品的人机边界开一个后门。
   空态就用最安静的一档：次级面 + 分区线 + 三级墨。
   ⚠ 字体必须是 sans：这里的文案全是中文（「尚未生成日报」「从客户目录选择一个客户…」），
   中文落进 mono 栈会回退成全角等宽，行长与灰度全毁。
   只用于「整个模块为空」这一档；列表内部的小空态保持 shared.css 的安静样式不动。 */
.card.empty,
#customerDetail>.empty:only-child{
  display:grid;place-items:center;min-height:150px;padding:var(--sp-5);text-align:center;
  border:1px solid var(--rule-2);border-radius:0;box-shadow:none;
  background-color:var(--surface-2);background-image:none;
  font:12px/1.6 var(--font-sans);color:var(--ink-3);
}

/* ── 响应式：与 shared.css 的断点同节奏 ─────────────────────────
   上面按 id 写死的列数特异性高于 .kpis，不在这里跟着降列就会在窄屏卡死。 */
@media(max-width:1180px){
  #serviceKpis,#runtimeKpis{grid-template-columns:repeat(3,minmax(0,1fr))}
  #workforceKpis{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:980px){
  #serviceKpis,#runtimeKpis,#workforceKpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  #channelCards{grid-template-columns:1fr}
  #audit .section-head{flex-wrap:wrap}
  #auditFilter{max-width:none}
}
@media(max-width:620px){
  #serviceKpis,#runtimeKpis,#workforceKpis{grid-template-columns:1fr 1fr}
  .topbar{padding-bottom:var(--sp-2);margin-bottom:var(--sp-3)}
}
