/* 基础工具类（壳层统一提供，页面/组件不许各自再定义一遍）*/
.hidden { display: none !important; }

/* ============================================================
   IFAS 工作流模块 —— 共享壳层样式
   来源：DESIGN.md 实测 token（禁止硬编码，一律引用变量）
   ============================================================ */
:root {
  /* 品牌色 */
  --color-primary:          #263a97;
  --color-primary-deep:     #0e1343;
  --color-primary-action:   #4e67be;
  --color-primary-hover:    #4257a8;
  --color-primary-light:    #ecf0fe;
  --color-primary-subtle:   #e8f3ff;
  --color-primary-selected: rgba(120,160,255,.30);
  /* ↑ 侧栏选中块：**必须是半透明叠加**，不能是固定实色。
     侧栏是纵向渐变（顶部 #101a4f → 底部 #2c3b9c），固定实色在深色端对比够、
     在亮色端就消失（image-7 的「规则配置」块与底色只差 5 个色阶）。
     半透明叠加随底色自适应：顶部 →(52,74,150)（与真实系统实测 (50,72,153) 吻合），
     底部 →(67,89,187)，全程可辨。 */
  --color-sidebar-from:     #101a4f;   /* [实测] 侧栏渐变起点 */
  --color-sidebar-to:       #253793;   /* [实测] 侧栏渐变终点 */

  /* 中性色 */
  --color-bg-page:      #f6f7fa;
  --color-bg-surface:   #ffffff;
  --color-bg-subtle:    #f3f4f5;
  --color-bg-zebra:     #f6f7fa;   /* 曾用于表格斑马纹；按用户要求已移除（与表头同灰 → 显脏）。保留备用 */
  --color-border:       #c1c7ce;
  --color-border-light: #eaecf3;
  /* 表格行分隔用的**发丝线**：比 border-light 再轻一档（用户：间隔线有点深）。
     由 border-light 与白底 55:45 混出 ≈ rgb(243,245,248) —— 同一个中性蓝灰的浅一档，
     不是新色相。去掉斑马纹后整张表的结构全靠这条线，所以它值得单独一档。*/
  --color-border-hairline: color-mix(in oklab, var(--color-border-light) 55%, var(--color-bg-surface));
  --color-bg-placeholder: #c4c4c4;   /* 文档预览占位灰底 [实测] */

  /* 文字色 */
  --color-text-1: #191919;
  --color-text-2: #666666;
  --color-text-3: #8c8c8c;
  --color-text-4: #b2b2b2;

  /* 语义色 */
  --color-success:    #47a992;
  --color-success-bg: #e8f6f2;
  --color-danger:     #e02020;
  --color-danger-bg:  #fdf4f3;
  --color-warning:    #f69a18;
  --color-warning-bg: #fdf6e8;
  --color-info-bg:    #e8f3ff;
  --color-disabled:   #bec0c2;

  /* 标签描边与语义次色 [实测] 真实列表页状态标签采样 */
  --color-danger-border:  #f9dadc;
  --color-success-tag:    #019880;
  /* 图表系列色（唯一真源 · 2026-09-14 立）：同一语义在所有图形上必须同色。
     此前折线的「审核」取 --color-text-1、构成条取 --color-success-tag ⇒ 同屏同义两色，
     用户看不出构成条哪段是问答（S5 无系列色真源）。折线 / 柱 / 图例 / 堆叠条一律经
     --color-series-* 派生，页面不许直取语义色（check.mjs §6.23 机器守）。 */
  --color-series-a: var(--color-text-1);            /* 系列 A：审核 */
  --color-series-b: var(--color-primary-action);    /* 系列 B：问答 */
  --color-success-border: #b6e1da;
  --color-success-bg-2:   #eefaf6;
  --color-warning-gold:   #f7b502;
  --color-warning-orange: #fa6402;
  --color-warning-border: #f7e3b0;
  --color-warning-bg-2:   #fdf8e8;
  --color-tag-border:     #d9d9d9;

  /* 圆角 [实测] 真实列表页卡片圆角约 4px；radius-lg(8px) 仅留给弹窗 */
  --radius-card: 4px;

  /* 实体卡（卡片墙）[实测] 真实系统「可用专家」页 */
  --color-card-border:   #dfe3ec;   /* 卡轮廓 */
  --color-card-divider:  #e4e8f2;   /* 卡内分隔 */
  --color-card-hover:    #b9c6e8;   /* 悬停轮廓 */
  --color-desc:          #636364;   /* 卡描述正文 */
  --color-meta:          #8c939f;   /* 卡元信息 */
  --chip-bg:             #f3f5fc;   /* 行内胶囊底 */
  --chip-bg-hover:       #e6eafb;
  --chip-bg-active:      #dbe1f8;
  --color-link:          #4f68d7;   /* 行内动作蓝（实测，弱于主色） */
  --color-info-accent:   #5c70dc;   /* [实测] 信息条顶部 3px 主色条（审核详情） */
  /* 侧栏纵向渐变：11 段逐 10 分位采样。抽成令牌是为了让其它页与规范页引用它，而不是复述色标 */
  --sidebar-gradient: linear-gradient(180deg, var(--color-sidebar-from) 0%, #162060 10%, #1a2a72 20%, #21317f 30%, #26378d 40%, #293996 50%, #2d3d9e 60%, #3341a9 70%, #2f3ea3 80%, #2c3b9c 90%, #2c3b9c 100%);
  /* —— 以下三个由「应用详情」实测台账带来（参考图逐像素取色），不是推导值 —— */
  --color-bg-panel:      #f9f9f9;
  --color-bg-chip:       #f6f6f6;   /* 中性浅灰块（实测 image-12「对话」头部块底色）*/   /* 侧栏/会话栏底（实测）*/
  --color-primary-light-2:#eef3ff;  /* 列表选中项底（实测）*/
  --color-primary-soft:  #b9cbff;   /* 浅主色实底按钮（实测）*/
  --color-media-bg:      #1a1a1a;   /* 深色播放/画布面（视频、图纸预览） */
  --color-media-border:  #4a4a4a;
  --color-media-fg:      #d5d8f5;
  --color-media-muted:   #8c8c8c;
  --color-link-hover:    #3d53bb;
  --color-link-active:   #33479f;
  --shadow-card-hover:   0 2px 8px rgba(18,23,39,.06);
  --card-h: 171px;                  /* 卡固定高，防止行高跳动 */
  --tile-s: 36px;                   /* 图标块 */
  --sparkle: #e6eafc;

  /* 图标块渐变 12 组 [实测] 逐角采样 */
  --tile-1:  linear-gradient(135deg,#b6e9e9,#f0dae4);
  --tile-2:  linear-gradient(135deg,#64b438,#9ad85a);
  --tile-3:  linear-gradient(135deg,#5e4888,#545e92);
  --tile-4:  linear-gradient(135deg,#02b0af,#01c8ad);
  --tile-5:  linear-gradient(135deg,#557eb9,#1381c5);
  --tile-6:  linear-gradient(135deg,#827be6,#e36292);
  --tile-7:  linear-gradient(135deg,#904ea4,#c34ecc);
  --tile-8:  linear-gradient(135deg,#6cd8dc,#a59fcd);
  --tile-9:  linear-gradient(135deg,#19b48c,#7dc54d);
  --tile-10: linear-gradient(135deg,#41ec8a,#3af7c8);
  --tile-11: linear-gradient(135deg,#6875de,#7453ae);
  --tile-12: linear-gradient(135deg,#42b8fe,#0de6fe);

  /* 字号 */
  --font-size-h1:      18px;
  --font-size-metric:  40px;   /* 大数字（监控大屏的数字面板；此前全站缺这一档，页面只能拿 h1 硬凑） */
  --font-size-h2:      16px;
  --font-size-body:    14px;
  --font-size-caption: 13px;
  --font-size-small:   12px;

  /* 间距（8pt 网格，半档 4；DESIGN.md §5.2） */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  --space-7: 48px;
  --space-8: 64px;

  /* 语义间距（呼吸感）—— 组件引用这一层 */
  --pad-card:    24px;
  --gap-section: 24px;
  --gap-card:    16px;
  --pad-cell:    12px;

  /* 尺寸 */
  --radius:         6px;
  --radius-lg:      8px;
  --sidebar-width:  184px;
  --topbar-height:  48px;
  --control-height: 30px;   /* [实测] 筛选控件 逻辑123→153 */
  --row-height:     41px;   /* [实测] 真实列表数据行 41（此前写 42 与 AGENTS 数值节冲突 —— 一处尺寸只能一个真源） */
  --content-gutter: 16px;   /* [实测] 用户系统卡片左边距 200-侧栏184 */

  /* 阴影 */
  --shadow-modal:    0 8px 24px rgba(16,24,40,.16);
  --shadow-dropdown: 0 4px 12px rgba(16,24,40,.12);
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  height: 100%;
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC",
               "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
  font-size: var(--font-size-body);
  color: var(--color-text-1);
  background: var(--color-bg-page);
  -webkit-font-smoothing: antialiased;
}

button { font-family: inherit; cursor: pointer; }
input, textarea, select { font-family: inherit; }

/* 重置表单控件的 UA 默认间距 —— Chrome 对 button 默认 padding 1px 6px，
   非 8pt 网格值，会在 style-check 里被拦；此处统一归零，由各组件显式声明 */
button, input, select, textarea { padding: 0; margin: 0; }

/* ===================== 布局骨架 ===================== */
.ifas-app { display: flex; height: 100vh; overflow: hidden; }

/* ===================== 侧边栏 184px ===================== */
.ifas-sidebar {
  width: var(--sidebar-width);
  flex: 0 0 var(--sidebar-width);
  background: var(--sidebar-gradient);
  display: flex;
  flex-direction: column;
  color: #d5d8f5;
  user-select: none;
}

.ifas-sidebar__brand {
  flex: 0 0 auto;                     /* ⚠️ 同上 */
  display: flex;
  align-items: center;
  gap: var(--space-2);
  /* [实测] 品牌块高 48 = 顶栏高，两者共用同一条横向分割线 */
  height: var(--topbar-height);
  flex: 0 0 var(--topbar-height);
  padding: 0 var(--space-3);
  border-bottom: 1px solid rgba(255,255,255,.08);
}
.ifas-sidebar__mark { width: 34px; height: 34px; flex: 0 0 34px; display: block; }
.ifas-sidebar__brand-text { line-height: 1.2; min-width: 0; }
.ifas-sidebar__brand-name {
  color: #fff;
  font-size: 15px;
  font-weight: 700;
  letter-spacing: -.2px;
  white-space: nowrap;
}
.ifas-sidebar__brand-sub {
  color: #a9b3d8;
  font-size: var(--font-size-caption);
  letter-spacing: 6px;
  white-space: nowrap;
}

.ifas-sidebar__nav {
  flex: 1;
  overflow-y: auto;
  /* [实测] 选中块左内缩 20 / 右内缩 33（右侧留滚动条槽）；块圆角 6 */
  padding: var(--space-1) 33px var(--space-2) 20px;
  /* flex 列：块上下各有 2px 外边距用于撑出 36 槽位；块级流会把这 2px 折叠掉，
     所以菜单容器必须是 flex，否则节奏会塌成 34px（实测 36）。 */
  display: flex;
  flex-direction: column;
}
.ifas-sidebar__sub { display: flex; flex-direction: column; flex: 0 0 auto; }
.ifas-sidebar__nav::-webkit-scrollbar { width: 0; }
/* [实测] 分组边界比组内多 4px（一级项 pitch 36 → 跨组 40） */
.ifas-sidebar__item + .ifas-sidebar__sub { margin-top: var(--space-1); }
.ifas-sidebar__sub + .ifas-sidebar__item { margin-top: var(--space-1); }

.ifas-sidebar__item {
  display: flex;
  flex: 0 0 auto;                     /* ⚠️ 必须有：导航是 flex 列，缺了它窗口一矮就把菜单项压扁（image-7 形变根因）*/
  align-items: center;
  gap: var(--space-2);
  height: 32px;                       /* [实测] 选中块 32 高 */
  margin: 2px 0;                      /* +2×2 = 36 槽位节奏（真实列表页一级项 pitch 36） */
  padding: 0 var(--space-2);
  border-radius: 6px;
  font-size: var(--font-size-caption);
  color: #c9cfec;
  cursor: pointer;
  position: relative;
  transition: background .15s, color .15s;
}
.ifas-sidebar__item:hover { background: rgba(255,255,255,.06); color: #fff; }
.ifas-sidebar__icon { flex: 0 0 15px; display: grid; place-items: center; opacity: .9; }
.ifas-sidebar__label { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ifas-sidebar__caret { flex: 0 0 auto; opacity: .7; transition: transform .18s; }
.ifas-sidebar__item--collapsed .ifas-sidebar__caret { transform: rotate(-90deg); }
/* 一级（叶子）选中态 —— 叶子菜单没有二/三级可承担当前位置指示，由一级自己高亮。
   口径与二/三级一致（背景 = 主色选中 token + 左侧 3px 主色按钮 token 竖条） */
/* [实测] 真实系统选中态 = 浅蓝圆角块 + 白色字，**没有**左侧竖条 */
.ifas-sidebar__item--active { background: var(--color-primary-selected); color: #fff; font-weight: 500; }
.ifas-sidebar__item--active:hover { background: var(--color-primary-selected); color: #fff; }

/* 二级菜单 */
.ifas-sidebar__subitem {
  display: flex;
  flex: 0 0 auto;                     /* ⚠️ 同上，禁止被 flex 压缩 */
  align-items: center;
  height: 32px;                       /* [实测] 真实列表页二级项块高 32 */
  margin: 2px 0;                      /* +2×2 = 36 槽位节奏（实测二级项 pitch 36） */
  padding: 0 var(--space-2) 0 var(--space-4);
  border-radius: 6px;
  font-size: var(--font-size-caption);
  color: #b9c2e4;
  cursor: pointer;
  position: relative;
  transition: background .15s, color .15s;
}
.ifas-sidebar__subitem:hover { background: rgba(255,255,255,.06); color: #fff; }
.ifas-sidebar__subitem--active { background: var(--color-primary-selected); color: #fff; font-weight: 500; }
.ifas-sidebar__subitem--active:hover { background: var(--color-primary-selected); color: #fff; }

/* 三级菜单（在一级分组下、二级模块下的具体页面）
   缩进必须大于二级，否则视觉上无法区分层级 */
.ifas-sidebar__subsubitem {
  display: flex;
  flex: 0 0 auto;                     /* ⚠️ 同上 */
  align-items: center;
  height: 32px;
  margin: 2px 0;
  padding: 0 var(--space-2) 0 32px;
  border-radius: 6px;
  font-size: var(--font-size-caption);
  color: #a9b3d8;
  cursor: pointer;
  position: relative;
  transition: background .15s, color .15s;
}
.ifas-sidebar__subsubitem:hover { background: rgba(255,255,255,.06); color: #fff; }
.ifas-sidebar__subsubitem--active { background: var(--color-primary-selected); color: #fff; font-weight: 500; }
.ifas-sidebar__subsubitem--active:hover { background: var(--color-primary-selected); color: #fff; }

/* ===================== 主区 ===================== */
.ifas-main { flex: 1; display: flex; flex-direction: column; min-width: 0; }

/* 顶栏 55px */
.ifas-topbar {
  height: var(--topbar-height);
  flex: 0 0 var(--topbar-height);
  background: var(--color-bg-surface);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 var(--space-4);          /* [实测] 面包屑左起 16 */
  border-bottom: 1px solid var(--color-border-light);   /* [实测] 1px #eaecf3 */
}
.ifas-topbar__title {
  margin: 0;
  font-size: var(--font-size-caption);
  font-weight: 400;
  color: var(--color-text-3);
}
.ifas-topbar__right { display: flex; align-items: center; gap: var(--space-3); }

/* [实测] 真实系统顶栏图标 = 28px 圆形浅灰底钮，图标 15px slate 色 */
.ifas-icon-btn {
  width: 28px; height: 28px;
  display: grid; place-items: center;
  border: none; background: #f5f5f6;
  border-radius: 50%;
  color: var(--color-icon-slate, #4c5e70);
  transition: background .15s, color .15s;
}
.ifas-icon-btn:hover { background: #e6ebf2; color: #33455a; }

.ifas-topbar__divider {
  width: 1px; height: 20px;
  background: var(--color-border-light);
}

.ifas-user-chip { display: flex; align-items: center; gap: var(--space-2); cursor: pointer; }
.ifas-user-chip__avatar {
  width: 30px; height: 30px;
  border-radius: 50%;
  background: linear-gradient(140deg, #9aa8c9, #6b7ba8);
  display: grid; place-items: center;
  color: #fff; font-size: var(--font-size-small); font-weight: 600;
}
.ifas-user-chip__meta { line-height: 1.3; }
.ifas-user-chip__name { font-size: var(--font-size-body); color: var(--color-text-1); }
.ifas-user-chip__role { font-size: var(--font-size-small); color: var(--color-text-3); }

/* 内容区 */
.ifas-content {
  flex: 1;
  overflow: auto;
  padding: var(--space-4) var(--content-gutter);   /* [实测] 顶栏底46→卡片顶62 = 16 */
}
.ifas-card {
  background: var(--color-bg-surface);
  border: 1px solid var(--color-border-light);   /* [实测] 卡片有 1px #eaecf3 边框 */
  border-radius: var(--radius-card);              /* [实测] 真实列表页 4px，非 8px */
  padding: var(--space-4);
}

/* ===================== 按钮 ===================== */
.ifas-btn {
  height: 28px;   /* [实测] 用户系统按钮 逻辑79→107 */
  padding: 0 var(--space-4);
  border-radius: var(--radius);
  border: 1px solid transparent;
  font-size: var(--font-size-body);
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  white-space: nowrap;
  transition: background .15s, border-color .15s, color .15s;
}
.ifas-btn--primary { background: var(--color-primary-action); color: #fff; }
.ifas-btn--primary:hover { background: var(--color-primary-hover); }
.ifas-btn--primary:active { background: #3a4c94; }
.ifas-btn--primary:disabled { background: var(--color-disabled); cursor: not-allowed; }
.ifas-btn--secondary {
  background: var(--color-bg-surface);
  border-color: var(--color-border);
  color: var(--color-text-2);
}
.ifas-btn--secondary:hover { border-color: var(--color-primary); color: var(--color-primary); }
.ifas-btn--danger { color: var(--color-danger); background: transparent; }
.ifas-btn--danger:hover { background: var(--color-danger-bg); }
.ifas-btn:focus-visible { outline: 2px solid var(--color-primary-action); outline-offset: 2px; }

/* ===================== 表单控件 ===================== */
.ifas-field {
  height: var(--control-height);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: 0 var(--space-3);
  font-size: var(--font-size-body);
  color: var(--color-text-1);
  background: var(--color-bg-surface);
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
/* [实测 image-25] 占位符墨色 (145,147,153) ≈ #8c8c8c —— 原用 --color-text-4(#b2b2b2) 偏浅一档 */
.ifas-field::placeholder { color: var(--color-text-3); }
.ifas-field:hover { border-color: var(--color-text-4); }
.ifas-field:focus {
  border-color: var(--color-primary-action);
  box-shadow: 0 0 0 3px rgba(78,103,190,.12);
}
.ifas-field--select {
  appearance: none;
  padding-right: 28px;
  color: var(--color-text-4);
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%238c8c8c' stroke-width='1.4' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
}

/* ===================== 筛选区 ===================== */
.ifas-toolbar {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-5);
}
.ifas-filters {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-5);
}
.ifas-filters__input { width: 240px; }
.ifas-filters__select { width: 180px; }
.ifas-filters__spacer { flex: 1; }

/* ===================== 表格 ===================== */
.ifas-table {
  width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
  /* 列宽按声明值生效：内容下限之和 > 容器宽时表格撑开 → .ifas-table-wrap 横向滚动，
     操作列 sticky right:0 常驻可见。页面可用 --table-min-w 覆盖最小宽。 */
  min-width: var(--table-min-w, 100%);
}
.ifas-table th {
  height: 38px;                       /* [实测] 真实列表页表头 38 */
  padding: 0 var(--space-4);
  background: var(--color-bg-page);   /* [实测] #f6f7fa */
  font-size: var(--font-size-body);
  font-weight: 500;
  color: var(--color-text-1);
  text-align: left;
  white-space: nowrap;
}
.ifas-table td {
  height: 42px;                       /* [实测 image-1] 分隔线间距 42（三条一致）；原写 41 */
  padding: 0 var(--space-4);
  /* [用户授权偏离] 行分隔线用**发丝线**而非 border-light：
     真实系统实测就是 #eaecf3，但去掉斑马纹后这条线成了整表唯一的结构，
     原重量显得偏深、把行切得很硬。轻一档后行还在、但不抢内容。*/
  border-bottom: 1px solid var(--color-border-hairline);
  font-size: var(--font-size-body);
  /* [实测 image-1] 普通数据列的文字是**深色**（墨色 (39,57,73)，亮度 54）——
     与「审核编号 / 创建人 / 审核状态 / 最后审核人」同深。
     原来写 --color-text-2(#666，亮度 102)，十几行排下来就是一片「浓灰」，
     而真实系统里只有**标签**才有颜色（不通过=红、暂无结果=灰、操作=蓝链接）。
     → 次灰色留给副标题/占位符，表格正文回到正文色。*/
  color: var(--color-text-1);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* ⚠️ 斑马纹**去掉**了，这是对参考图的一次**有意偏离**，用户授权：
   真实系统确实有斑马纹（实测 #f6f7fa），但用户明确说它「脏」——它和表头是**同一个灰**，
   十行里近一半被灰带盖住，整张表像蒙了一层灰纱。
   去掉后：**表头成为唯一的浅色带**（结构反而更清楚），行靠 42px 行高 + 1px 分隔线 + 悬停区分。
   要恢复只需把这条规则加回来（令牌 --color-bg-zebra 仍保留）。*/
/* .ifas-table tbody tr:nth-child(even) { background: var(--color-bg-zebra); } —— 已按用户要求移除 */
.ifas-table tbody tr:hover { background: var(--color-primary-light); }
.ifas-table tbody tr:last-child td { border-bottom: none; }

/* 列表横向滚动 + 操作列固定右侧（列多时操作永远可见 ✓ 页面零改动 ✓）*/
.ifas-table-wrap { overflow-x: auto; overflow-y: hidden; }
.ifas-table-wrap::-webkit-scrollbar { height: 8px; }
.ifas-table-wrap::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: var(--radius-card); }
.ifas-table-wrap::-webkit-scrollbar-track { background: transparent; }
/* 操作列标准变体：图标型用 .col-action(68) ✓；文字型（如「查看 审核 重试」）用 --text(148) ✓ */
/* 操作列宽度：**只由 --col-action-w 一个变量决定**。
   ⚠️ 不要在这里直接写 width —— 下面的 sticky 兜底选择器 `th.col-action`(0,2,1)
      特异度高于 `.ifas-table .col-action--text`(0,2,0)，会把它覆盖掉（真实事故：操作列常年 108、
      内容 125，每次裁 25px，⋯ 被切）。 */
.col-action { --col-action-w: 108px; }              /* 图标型：3 个 26px 图标 */
.col-action--text { --col-action-w: 176px; }        /* 文字型：查看/审核/重试/⋯ + 3×12 间距 + 16 内边距 = 173 */
.ifas-table th.col-action,
.ifas-table td.col-action {
  position: sticky;
  right: 0;
  z-index: 2;                       /* 盖住滚动过来的单元格 */
  width: var(--col-action-w, 108px);
  min-width: var(--col-action-w, 108px);   /* 宽度来源见 .col-action / .col-action--text */
  background: var(--color-bg-surface);
  /* 左侧 1px 线 + 一层渐隐投影：横向滚动时视觉上「浮」在列表之上 */
  box-shadow: -1px 0 0 var(--color-border-light), -8px 0 8px -8px rgba(16,24,40,.16);
}
.ifas-table th.col-action { background: var(--color-bg-page); }
/* .ifas-table tbody tr:nth-child(even) td.col-action { background: var(--color-bg-zebra); } —— 同上，随斑马纹一起移除 */
.ifas-table tbody tr:hover td.col-action { background: var(--color-primary-light); }

.ifas-row-actions { display: flex; align-items: center; gap: var(--space-3); }

/* 行内文字动作（查看 / 编辑 / 删除 / 更多）—— 表格操作列与操作栏的唯一实现。
   ⚠️ 页面禁止再自造 .op-link / .action-link。 */
.ifas-action-link {
  display: inline-flex; align-items: center; gap: var(--space-1);
  padding: 0; border: none; background: none;
  font-family: inherit;
  font-size: var(--font-size-caption);
  color: var(--color-primary-action);
  white-space: nowrap; cursor: pointer;
  transition: color .15s;
}
.ifas-action-link:hover { color: var(--color-primary-hover); text-decoration: underline; }
.ifas-action-link--disabled,
.ifas-action-link:disabled { color: var(--color-text-4); cursor: not-allowed; }
.ifas-action-link--disabled:hover,
.ifas-action-link:disabled:hover { color: var(--color-text-4); text-decoration: none; }
.ifas-action-link--danger { color: var(--color-danger); }
.ifas-action-link--danger:hover { color: var(--color-danger); text-decoration: underline; }

/* 操作栏（页头按钮组 + 紧跟其左的文字入口）
   [实测] 参考图：链接紧跟按钮组左侧，间距靠 padding 0 8px，**不靠 flex:1 推到最右** */
.ifas-action-bar {
  display: flex; align-items: center; gap: var(--space-1);
  flex-wrap: wrap;
  margin-bottom: var(--space-4);
}
.ifas-action-bar .ifas-action-link { padding: 0 var(--space-2); }

/* 页内 Tab（分段控制器）—— 真实系统：灰色胶囊轨道 + 白色选中项
   ⚠️ 页面禁止再自造 .page-tabs / .wb-tabs */
.ifas-tabs {
  display: inline-flex; align-items: center;
  padding: var(--space-1);
  background: #e6e8ec;
  border-radius: var(--radius);
}
.ifas-tab {
  display: inline-flex; align-items: center;
  height: 30px; padding: 0 var(--space-4);
  border: none; background: transparent;
  border-radius: var(--radius-card);
  font-family: inherit;
  font-size: var(--font-size-caption);
  color: #324659;
  cursor: pointer; white-space: nowrap;
  transition: background .15s, color .15s;
}
.ifas-tab:hover { color: var(--color-primary-action); }
/* 选中态 tab 也要有 hover 反馈（T3 双路交叉抓到：静态说有 hover，实际被 --active 覆盖）*/
.ifas-tab--active:hover { border-color: var(--color-primary-action); }

.ifas-tab:disabled,
.ifas-tab--disabled { color: var(--color-text-4); cursor: not-allowed; background: transparent; }
.ifas-tab--active {
  background: var(--color-bg-surface);
  border: 1px solid var(--color-border-light);   /* [实测] 选中项 = 白底 + 1px 描边（不是纯色块）*/
  color: var(--color-primary-action);
  font-weight: 500;
}

/* 卡内 Tab 条 —— [实测 image-6] Tab 与内容之间必须有一条**通栏分隔线**，
   否则 Tab 行和下面的操作栏/表格糊成一块（用户：「tab 和列表都合在一起了」）。
   结构： .ifas-card > .ifas-tabsbar > .ifas-tabs */
.ifas-tabsbar {
  display: flex; align-items: center;
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--color-border-light);
  margin-bottom: var(--space-5);
}

/* ── 受控变体：页面需要「例外」时，改这里，不在页面里覆写 ────────────── */
.ifas-content--flush { padding: 0; }        /* 全出血工作台（规则模版三级级联等） */

/* 无壳模式容器（mount({chrome:false}) 渲染出来的最外层，例：审核详情）
   —— 它是壳层产物，定义放壳层；页面不得自己再写一遍 */
.ifas-page {
  display: flex; flex-direction: column;
  min-height: 100vh;
  padding: var(--space-4);
  gap: var(--space-4);
  background: var(--color-bg-page);
  box-sizing: border-box;
}
.ifas-card--roomy    { padding: var(--space-5); }   /* 文档 / 规范类宽松卡片 */
.ifas-act-btn {
  width: 26px; height: 26px;
  display: grid; place-items: center;
  border: none; background: transparent;
  border-radius: var(--radius);
  color: var(--color-text-3);
  transition: background .15s, color .15s;
}
.ifas-act-btn:hover { background: var(--color-primary-light); color: var(--color-primary-action); }

/* ===================== 开关 ===================== */
.ifas-switch {
  position: relative;
  display: inline-block;
  width: 40px; height: 20px;
  border-radius: 10px;
  background: var(--color-disabled);
  cursor: pointer;
  transition: background .2s;
}
.ifas-switch--on { background: var(--color-primary-action); }
.ifas-switch::after {
  content: "";
  position: absolute;
  top: 2px; left: 2px;
  width: 16px; height: 16px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 3px rgba(0,0,0,.2);
  transition: transform .2s;
}
.ifas-switch--on::after { transform: translateX(20px); }

/* 基础多选：此前各页面各写一份，2026-09-13 收进壳层（一处真源） */
.ifas-checkbox { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--font-size-small); color: var(--color-text-2); cursor: pointer; white-space: nowrap; }
.ifas-checkbox input { width: 14px; height: 14px; margin: 0; accent-color: var(--color-primary-action); cursor: pointer; }
.ifas-checkbox:hover { color: var(--color-text-1); }

/* ===================== 状态标签 ===================== */
/* [实测] 真实列表页每个状态标签都是「浅底 + 1px 同色系描边 + 深色字」，
   不加描边会明显比真实系统轻、发飘 —— 这是与系统差距最大的一处。 */
.ifas-tag {
  display: inline-flex;
  align-items: center;
  height: 22px;
  padding: 0 var(--space-2);
  border: 1px solid transparent;
  border-radius: var(--radius-card);
  font-size: var(--font-size-small);
  white-space: nowrap;
}
.ifas-tag--success { background: var(--color-success-bg-2); border-color: var(--color-success-border); color: var(--color-success-tag); }
.ifas-tag--danger  { background: var(--color-danger-bg);   border-color: var(--color-danger-border);  color: var(--color-danger); }
.ifas-tag--warning { background: var(--color-warning-bg-2); border-color: var(--color-warning-border); color: var(--color-warning-gold); }
.ifas-tag--info    { background: var(--color-primary-light); border-color: var(--color-primary-light); color: var(--color-primary-action); }
.ifas-tag--default { background: var(--color-bg-surface);  border-color: var(--color-tag-border);     color: var(--color-text-3); }

/* 状态点（带勾图标） */
.ifas-status {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  font-size: var(--font-size-caption);
  color: var(--color-success);
}
/* 语义变体：**图标着色、文字留正文色**。
   [实测] 报告类表格的状态是「⚠ 转人工」—— 黄色只在三角图标上，文字是深的；
   若连文字一起染成语义色，warning #f7b502 对白底只有 2.0:1，等于读不清。
   用于窄列（放不下 .ifas-tag 胶囊）的状态表达；宽列仍用 .ifas-tag。 */
.ifas-status--success { color: var(--color-text-1); }
.ifas-status--success svg { color: var(--color-success); }
.ifas-status--warning { color: var(--color-text-1); }
.ifas-status--warning svg { color: var(--color-warning-gold); }
.ifas-status--danger  { color: var(--color-text-1); }
.ifas-status--danger svg { color: var(--color-danger); }

/* ===================== 分页 ===================== */
.ifas-pagination {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);
  padding-top: var(--space-5);
  font-size: var(--font-size-caption);
  color: var(--color-text-3);
}
.ifas-pagination__total { margin-right: var(--space-2); }
.ifas-pagination__btn {
  min-width: 28px; height: 28px;
  padding: 0 var(--space-1);
  border: none; background: transparent;
  border-radius: var(--radius);
  font-size: var(--font-size-caption);
  color: var(--color-text-3);
  display: grid; place-items: center;
  transition: background .15s, color .15s;
}
.ifas-pagination__btn:hover { background: var(--color-primary-light); color: var(--color-primary-action); }
.ifas-pagination__btn--active { color: var(--color-primary-action); font-weight: 500; }
.ifas-pagination__size {
  height: 28px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: 0 var(--space-2);
  font-size: var(--font-size-caption);
  color: var(--color-text-2);
  background: var(--color-bg-surface);
  appearance: none;
  margin: 0 var(--space-1);
}

/* ===================== 弹窗 ===================== */
.ifas-modal-mask {
  position: fixed; inset: 0;
  background: rgba(16,24,40,.5);          /* [实测] 遮罩后白区降到 ~120 */
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding: 38px var(--space-5) var(--space-5);   /* [实测] 弹窗顶距 37.5 */
  overflow-y: auto;
  z-index: 50;
}
.ifas-modal-mask.hidden { display: none; }
.ifas-modal {
  width: 660px;                      /* [实测] 388 → 1048 */
  background: var(--color-bg-surface);
  border-radius: var(--radius-card); /* [实测] 4px，与卡片同档（原 8px） */
  box-shadow: var(--shadow-modal);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.ifas-modal__header {
  height: 56px;
  flex: 0 0 56px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 var(--space-4);
  /* [实测] 头部**没有**下边框：标题与表单之间不加线，靠间距分节 */
}
/* [实测 image-25] 标题墨高 15 → 字号 16（原 18 偏大）；与壳层 --font-size-h2 同档 */
.ifas-modal__title { margin: 0; font-size: var(--font-size-h2); font-weight: 600; color: var(--color-text-1); }
.ifas-modal__close {
  width: 28px; height: 28px;
  display: grid; place-items: center;
  border: none; background: transparent;
  border-radius: var(--radius);
  color: var(--color-text-3);
  font-size: var(--font-size-h2);
  line-height: 1;
}
.ifas-modal__close:hover { background: var(--color-bg-page); color: var(--color-text-1); }
.ifas-modal__body { padding: var(--space-4); overflow-y: auto; }
.ifas-modal__footer {
  flex: 0 0 56px;                    /* [实测] 分隔线 577 → 底 632.5 */
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2);               /* [实测] 取消右 964 → 确定左 972 */
  padding: 0 var(--space-4);
  border-top: 1px solid var(--color-border-light);
}

/* ===================== 表单行 ===================== */
.ifas-form-row { display: flex; align-items: flex-start; margin-bottom: var(--space-4); }
/* 整页表单变体（说明：`.ifas-form-label` 的 104px 是**弹窗**实测值；
   能力配置这种"整页表单"在真实系统里标签列 ≈400px 且**说明文字要换行**——
   照搬 104px + nowrap 会让长标签/长说明直接压到输入框上，用户 2026-09-13 报的就是这个） */
.ifas-form--page .ifas-form-label {
  flex: 0 0 400px; white-space: normal; text-align: left;
}
.ifas-form--page .ifas-form-control { max-width: 420px; }
.ifas-form-row.hidden { display: none; }
.ifas-form-label {
  flex: 0 0 104px;                   /* [实测] 弹窗左 388 + 内边距 16 + 104 = 控件左 508 ✓ */
  min-width: 0;
  padding-top: var(--space-2);
  padding-right: var(--space-3);
  text-align: right;
  font-size: var(--font-size-body);
  /* [实测 image-25] 字段名墨色 (44,60,77) —— 与弹窗标题 (43,43,43) **同级亮度**，
     是**深色**，不是次级灰。原来写成 --color-text-2(#666)，整列看起来是灰的。*/
  color: var(--color-text-1);
  line-height: 1.4;
  white-space: nowrap;
}
.ifas-form-label__req { color: var(--color-danger); margin-right: var(--space-1); }
.ifas-form-control { flex: 1; min-width: 0; }
.ifas-form-input,
.ifas-form-select,
.ifas-form-textarea {
  width: 100%;
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: 0 var(--space-3);
  font-size: var(--font-size-body);
  color: var(--color-text-1);
  background: var(--color-bg-surface);
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.ifas-form-input,
.ifas-form-select { height: var(--control-height); }
/* 单选下拉：自绘箭头（appearance 已重置，缺箭头会显得光秃 ✓ 与 .ifas-ms__caret 同一语汇）*/
.ifas-form-select {
  padding-right: var(--space-5);
  background-repeat: no-repeat;
  background-position: right var(--space-3) center;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M1 1l4 4 4-4' fill='none' stroke='%238b93a8' stroke-width='1.4' stroke-linecap='round'/></svg>");
}
.ifas-form-textarea { padding: var(--space-2) var(--space-3); min-height: 88px; line-height: 1.6; resize: vertical; }
.ifas-form-input::placeholder,
.ifas-form-textarea::placeholder { color: var(--color-text-4); }
.ifas-form-input:focus,
.ifas-form-select:focus,
.ifas-form-textarea:focus {
  border-color: var(--color-primary-action);
  box-shadow: 0 0 0 3px rgba(78,103,190,.12);
}
.ifas-form-select {
  appearance: none;
  padding-right: 28px;
  color: var(--color-text-4);
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%238c8c8c' stroke-width='1.4' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
}

/* 单选组 */
.ifas-radio-group { display: flex; align-items: center; gap: var(--space-5); padding-top: var(--space-2); flex-wrap: wrap; }
.ifas-radio { display: inline-flex; align-items: center; gap: var(--space-2); font-size: var(--font-size-body); color: var(--color-text-1); cursor: pointer; }
/* [实测 image-25 逐像素] 直径 14；**未选 1px 灰环 / 选中 4px 主色粗环、中间留 6px 空**
   —— 真实系统的选中态是「粗环中空」，不是「细环 + 大圆点」（原实现是后者，形状就不对）。*/
.ifas-radio input[type="radio"] {
  appearance: none;
  width: 14px; height: 14px;
  margin: 0;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  cursor: pointer;
  transition: border-color .15s, border-width .15s;
}
.ifas-radio input[type="radio"]:checked {
  border: 4px solid var(--color-primary-action);
}
.ifas-radio input[type="radio"]:focus-visible {
  outline: 2px solid var(--color-primary-action); outline-offset: 2px;
}
/* [实测 image-25] 「专家指令」那一行整行是灰的 (145,147,153) ≈ --color-text-3 ——
   真实系统里有禁用态，原来壳层缺这一态（禁用和可用长得一样，读不出差别）。*/
.ifas-radio:has(input:disabled) { color: var(--color-text-3); cursor: not-allowed; }
.ifas-radio input[type="radio"]:disabled { border-color: var(--color-border-light); cursor: not-allowed; }
.ifas-radio input[type="radio"]:disabled:checked { border-color: var(--color-text-4); }
.ifas-check:has(input:disabled) { color: var(--color-text-3); cursor: not-allowed; }
.ifas-check input[type="checkbox"]:disabled { background: var(--color-bg-page); border-color: var(--color-border-light); cursor: not-allowed; }
.ifas-check input[type="checkbox"]:disabled:checked { background: var(--color-text-4); border-color: var(--color-text-4); }

/* 多选框：真实系统截图里没有出现，**按单选的同族推导**（同 14px、同 1px 描边、
   同主色填充），并在台账登记为「无参考图·按壳层规范推导」。*/
.ifas-check { display: inline-flex; align-items: center; gap: var(--space-2); font-size: var(--font-size-body); color: var(--color-text-1); cursor: pointer; }
.ifas-check input[type="checkbox"] {
  appearance: none;
  width: 14px; height: 14px; margin: 0;
  border: 1px solid var(--color-border);
  border-radius: 2px;
  background: var(--color-bg-surface);
  position: relative; cursor: pointer;
  transition: background .15s, border-color .15s;
}
.ifas-check input[type="checkbox"]:hover { border-color: var(--color-primary-action); }
.ifas-check input[type="checkbox"]:checked {
  background: var(--color-primary-action);
  border-color: var(--color-primary-action);
}
.ifas-check input[type="checkbox"]:checked::after {
  content: "";
  position: absolute; left: 4px; top: 1px;
  width: 4px; height: 7px;
  border: solid var(--color-bg-surface);
  border-width: 0 1.5px 1.5px 0;
  transform: rotate(45deg);
}
.ifas-check input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--color-primary-action); outline-offset: 2px;
}

/* ===================== 轻提示 ===================== */
.ifas-toast {
  position: fixed;
  left: 50%;
  bottom: 40px;
  transform: translate(-50%, 12px);
  background: var(--color-text-1);
  color: #fff;
  font-size: var(--font-size-body);
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius);
  box-shadow: var(--shadow-dropdown);
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s, transform .2s;
  z-index: 99;
}
.ifas-toast.show { opacity: 1; transform: translate(-50%, 0); }

/* ===================== 页面头部（详情页）===================== */
.ifas-page-head {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-5);
}
.ifas-back-btn {
  width: 28px; height: 28px;
  display: grid; place-items: center;
  border: none; background: transparent;
  border-radius: var(--radius);
  color: var(--color-text-2);
}
.ifas-back-btn:hover { background: var(--color-bg-page); }
.ifas-page-title { margin: 0; font-size: var(--font-size-h1); font-weight: 600; color: var(--color-text-1); }

/* ===================== 筛选区补充控件 ===================== */
.ifas-filters__icon-btn {
  width: 32px; height: 32px;
  display: grid; place-items: center;
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  background: var(--color-bg-surface);
  color: var(--color-text-2);
  cursor: pointer;
}
.ifas-filters__icon-btn:hover { border-color: var(--color-primary); color: var(--color-primary); }

.ifas-filters__expand {
  border: none; background: transparent;
  font-size: var(--font-size-caption);
  color: var(--color-primary-action);
  cursor: pointer; white-space: nowrap;
}
.ifas-filters__expand:hover { color: var(--color-primary-hover); }

.ifas-pagination__ellipsis {
  min-width: 32px; height: 32px;
  display: grid; place-items: center;
  font-size: var(--font-size-caption);
  color: var(--color-text-3);
  user-select: none;
}

/* ===================== 多选下拉（可用范围·指定范围） ===================== */
.ifas-ms { position: relative; max-width: 560px; }
.ifas-ms__box {
  min-height: var(--control-height);
  display: flex; align-items: center; gap: var(--space-2);
  padding: var(--space-1) var(--space-3);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  background: var(--color-bg-surface);
  cursor: pointer;
}
.ifas-ms__box:hover { border-color: var(--color-primary-action); }
.ifas-ms__ph { flex: 1; color: var(--color-text-3); font-size: var(--font-size-caption); }
.ifas-ms__tags { flex: 1; display: flex; flex-wrap: wrap; gap: 4px; }
/* [实测 image-26] 胶囊填充取样 (233,236,242) = --color-border-light，**不是蓝色**；
   文字是深色。原来做成蓝底蓝字，与真实系统的多选字段明显不是一套。*/
.ifas-ms__tag {
  height: 22px; padding: 0 4px 0 8px;
  display: inline-flex; align-items: center; gap: 4px;
  background: var(--color-border-light);
  color: var(--color-text-1);
  border-radius: 3px;
  font-size: var(--font-size-small);
}
.ifas-ms__tag i {
  font-style: normal; cursor: pointer;
  width: 14px; height: 14px;
  display: grid; place-items: center;
  border-radius: 2px; font-size: 10px;
}
.ifas-ms__tag i { color: var(--color-text-3); }
.ifas-ms__tag i:hover { background: var(--color-border); color: var(--color-text-1); }
.ifas-ms__caret { flex: 0 0 auto; font-size: 10px; color: var(--color-text-3); }
.ifas-ms__pop {
  position: absolute; top: calc(100% + 4px); left: 0; z-index: 40;
  width: 100%; max-height: 220px; overflow-y: auto;
  background: var(--color-bg-surface);
  border: 1px solid var(--color-border-light);
  border-radius: var(--radius);
  box-shadow: var(--shadow-dropdown);
  padding: var(--space-1) 0;
}
.ifas-ms__pop.hidden { display: none; }
.ifas-ms__opt {
  min-height: 32px; padding: 0 var(--space-3);
  display: flex; align-items: center; gap: var(--space-2);
  font-size: var(--font-size-caption); color: var(--color-text-1);
  cursor: pointer;
}
.ifas-ms__opt:hover { background: var(--color-primary-light); }
.ifas-ms__opt input { accent-color: var(--color-primary-action); margin: 0; }

/* 问号提示 */
.ifas-hint {
  width: 14px; height: 14px;
  display: inline-grid; place-items: center;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  font-size: 10px; color: var(--color-text-3);
  cursor: help;
}
.ifas-hint:hover { border-color: var(--color-primary-action); color: var(--color-primary-action); }

/* 指定范围明细区 */
.scope-detail.hidden { display: none; }
.scope-detail .kv-row__label { flex: 0 0 100px; }

/* ============================================================
   列表行（.ifas-row）—— **列表项的唯一来源**
   ------------------------------------------------------------
   为什么不画线：DESIGN.md §4.7「无边框、无阴影，靠明度差区分」。
   35 条列表项各画 1px border = 满屏线（用户实测反对）。
   层级靠「浅灰底块（--color-bg-page）vs 白卡（--color-bg-surface）」明度差。
   硬规：① 禁常驻背景色（默认 transparent；铺灰底＝一屏灰块，很脏）
         ② 禁常驻边框（禁「每条一圈线」）
         ③ 项间必须留间隔 ≥8px（禁 margin:0 贴死）
   可点击性**不靠底色/线条暗示** —— 客户知道列表项能点，仅 hover 给极浅反馈。
   ============================================================ */
.ifas-row {
  display: flex; align-items: center; gap: var(--space-2);
  min-height: 36px; padding: var(--space-2) var(--space-3);
  border: 1px solid transparent;          /* 占位：选中时才显色，避免布局抖动 */
  border-radius: var(--radius);
  background: transparent;                /* ← 禁常驻背景色：铺灰底＝一屏灰块，显脏 */
  cursor: pointer;
  margin-bottom: var(--space-2);          /* 列表项之间的间隔（禁贴死）*/
  transition: background .15s, border-color .15s;
}
.ifas-row:last-child { margin-bottom: 0; }
.ifas-row:hover { background: var(--color-bg-subtle); }
.ifas-row--on { background: var(--color-primary-light); border-color: var(--color-primary-action); }
/* 展开态：**不加底**！展开只表示"明细可见"，靠箭头旋转 + 缩进表达。
   ⚠️ 曾把展开当选中套 --on → 每条展开的规则一大块底色，很脏。 */
.ifas-row--open { background: transparent; }

/* ── 列表列宽节奏（SSOT）—— **页面禁止重定义** ✗（各页只写自己独有的列）────────────
   语义列：名称 180 · 范围 92 · 状态 130 · 启用 84 · 创建人 112 · 时间 156 · 操作 68
   描述列**不设宽**（吸收剩余 ✓）；截断统一 .cell-ellipsis ✓ */
/* 弹性列：能伸（吸收剩余）但有下限（内容不被压扁）。
   下限之和 > 容器宽时表格撑开 → 横向滚动 + 操作列贴右（原注释「不要写 min-width」是在
   **没有滚动容器**的前提下写的，现在滚动与固定列都在，min-width 反而成了正解）。 */
/* 名称列 = 这一行的身份。原来名称与描述同粗同色，十行下来是一张均匀的密网，
   眼睛找不到「这一行是谁」。只加**字重**（不换色、不加链接）——
   换色会造出「可点」的假象，而这些单元格目前并不可点。*/
.col-name   { width: auto; min-width: 240px; font-weight: 600; }
.col-scope  { width: 108px; }  /* [实测] 内边距 8→16 后补回 16：列宽含内边距 */
.col-status { width: 130px; }
.col-enable { width: 84px; }
.col-owner  { width: 200px; }   /* [实测] 头像 22 + 姓名 / 账号（「梁敏馨 / dg-liangminxin」约 196）*/
.col-time   { width: 188px; }  /* 同上 */   /* [实测] 19 位时间戳 143.1px + 左右内边距 16 = 159.1；156 会截断成「2026-09-07 16:57:…」（8 个列表页同时中招）*/
.col-action { width: var(--col-action-w, 108px); }   /* 宽度见「操作列」变量块；文字型用 .col-action--text 覆盖 */
.col-desc   { width: auto; min-width: 316px; }   /* [实测] 技能库/助理专家最长描述需 ~290，260 会裁 13~30px */
/* 描述 = 辅助说明，用壳层早就定义好的 --color-desc（卡片描述同款）。
   这一档灰是**规则允许**的：次要灰只给「标签 / 占位符 / 辅助说明」，描述正是第三种；
   与上一轮「整行正文被绑成灰」是两件事 —— 那里的错是**正文**用了次要色。*/
.ifas-table td.col-desc { color: var(--color-desc); }
.cell-ellipsis { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* [实测 image-1] 单元格内边距约 **16**（操作列左内边距 16.5）——
   原来写 8，只有真实系统的一半，于是列与列的文字几乎贴在一起、整张表发闷。
   ⚠️ table-layout:fixed 下**声明的列宽包含内边距**（box-sizing:border-box）：
      8→16 会让每个单元格的可用文字宽度少 16px，可能把原本不截断的列挤到出省略号。
      所以这一改必须配「逐页截断计数」的排查（见 实测/<页>.md 与 决策记录.md）。*/
.ifas-table th, .ifas-table td { padding-left: var(--space-4); padding-right: var(--space-4); }

/* ═══════════════════════════════════════════════════════════════════
   实体卡 / 卡片墙  ——  卡片墙类页面（应用中心、可用专家…）的唯一实现
   来源：真实系统「可用专家」页逐像素实测。**页面禁止再自造 .app-card / .ic-N**
   ═══════════════════════════════════════════════════════════════════ */

/* 网格：宽屏 5 列，按断点降列；行高锁死 --card-h，行高不会随描述行数跳动 */
.ifas-cards {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  grid-auto-rows: minmax(var(--card-h), auto);   /* 171 是实测最小值；文案偏长时让卡片长高，而不是把内容溢出到下一行（几何门禁 R2/R4） */
  gap: var(--space-3);              /* [实测] 横纵同为 12 */
  margin-top: var(--space-4);
}
@media (max-width: 1660px) { .ifas-cards { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 1340px) { .ifas-cards { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 1080px) { .ifas-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px)  { .ifas-cards { grid-template-columns: minmax(0, 1fr); } }

.ifas-entity {
  position: relative;
  display: flex;
  flex-direction: column;
  cursor: pointer;                     /* 卡片可点进应用（原来没有手型，看不出能点）*/
  min-height: var(--card-h);           /* 最少 171；标题折两行时自然增高（同排由 grid 拉平）*/
  overflow: hidden;
  padding: var(--space-4) 20px 14px;   /* [实测] 上 16 / 左右 20 / 下 14 */
  background: var(--color-bg-surface);
  border: 1px solid var(--color-card-border);
  border-radius: var(--radius-card);
  transition: border-color .15s, box-shadow .15s;
}
.ifas-entity:hover {
  border-color: var(--color-card-hover);
  box-shadow: var(--shadow-card-hover);
}

/* 右上角星芒（真实系统固有装饰，随卡走） */
.ifas-entity__sparkle {
  position: absolute; top: 14px; right: 42px;
  width: 44px; height: 24px; pointer-events: none;
}

.ifas-entity__head {
  display: flex; align-items: center;
  min-height: 40px;                    /* [实测] 头部行 40，图标块居中；标题折两行时随内容长高 */
}
.ifas-tile {
  width: var(--tile-s); height: var(--tile-s); flex: 0 0 var(--tile-s);
  margin-right: var(--space-3);
  display: grid; place-items: center;
  border-radius: var(--radius-card);
  color: #fff; font-size: 18px; font-weight: 600;
  text-shadow: 0 1px 1px rgba(0,0,0,.08);
}
.ifas-tile--1  { background: var(--tile-1); }
.ifas-tile--2  { background: var(--tile-2); }
.ifas-tile--3  { background: var(--tile-3); }
.ifas-tile--4  { background: var(--tile-4); }
.ifas-tile--5  { background: var(--tile-5); }
.ifas-tile--6  { background: var(--tile-6); }
.ifas-tile--7  { background: var(--tile-7); }
.ifas-tile--8  { background: var(--tile-8); }
.ifas-tile--9  { background: var(--tile-9); }
.ifas-tile--10 { background: var(--tile-10); }
.ifas-tile--11 { background: var(--tile-11); }
.ifas-tile--12 { background: var(--tile-12); }

/* 卡片标题：超长时**折两行**而不是切字（卡高固定 171，两行块高度不变） */
.ifas-entity__title {
  flex: 1 1 auto; min-width: 0;
  font-size: var(--font-size-h2);     /* 16 */
  font-weight: 600; line-height: 22px;
  color: var(--color-text-1);
  /* 超长标题**折两行**而不是切字（最长「采购方招标文件撰写与评审专家」需 224，单行只有 199）*/
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  white-space: normal; overflow: hidden;
}
.ifas-entity__desc {
  margin-top: 14px; height: 44px; flex: 0 0 44px;
  font-size: var(--font-size-small);  /* 12 */
  line-height: 22px;
  color: var(--color-desc);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; word-break: break-word;
}
.ifas-entity__foot {
  margin-top: auto; flex: 0 0 auto;
  display: flex; align-items: center; gap: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--color-card-divider);
}
.ifas-entity__meta {
  flex: 1 1 auto; min-width: 0;
  font-size: var(--font-size-caption);  /* 13 */
  color: var(--color-meta);
  /* 与标题一致：折两行不切字（实测最长 meta 需 231，单行只有 199）*/
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  white-space: normal; overflow: hidden;
}

/* 行内动作胶囊（使用专家 / 使用…） */
.ifas-chip {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 3px;
  height: 24px; padding: 0 7px;
  border: none; border-radius: var(--radius-card);
  background: var(--chip-bg);
  color: var(--color-link);
  font-size: var(--font-size-caption);
  transition: background .15s, color .15s;
}
.ifas-chip svg { flex: 0 0 13px; width: 13px; height: 13px; }
.ifas-chip:hover  { background: var(--chip-bg-hover);  color: var(--color-link-hover); }
.ifas-chip:active { background: var(--chip-bg-active); color: var(--color-link-active); }

/* 卡片墙空态 */
/* 文档纸张 —— 预览区没有真实文件时用它：白纸 + 文本骨架 + 文件名标注。
   ✗ 不要再用整块灰底 + 居中一行字（那是「没做完」的观感） */
.ifas-docpage {
  width: 100%; max-width: 900px; min-height: 100%;
  display: flex; flex-direction: column; gap: 10px;
  padding: 40px 56px;
  background: var(--color-bg-surface);
  border: 1px solid var(--color-border-light);
  border-radius: var(--radius-card);
  box-shadow: 0 1px 3px rgba(16,24,40,.06);
}
.ifas-docpage__name {
  font-size: var(--font-size-small);
  color: var(--color-text-3);
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--color-border-light);
  margin-bottom: var(--space-3);
}
.ifas-docpage__bar {
  height: 10px; border-radius: 2px;
  background: var(--color-border-light);   /* #eaecf3：比 bg-page 明显，骨架才读得出来 */
}
.ifas-docpage__bar--title { height: 18px; width: 46%; margin: var(--space-4) auto var(--space-5); }
.ifas-docpage__bar--short { width: 62%; }

/* 上传 / 拖拽区 —— 弹窗里选文件用（原先各页自造 .uploader） */
.ifas-upload {
  min-height: calc(var(--space-8) * 3);
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: var(--space-3);
  padding: var(--space-5);
  text-align: center;
  cursor: pointer;
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-card);
  background: var(--color-bg-page);
  transition: border-color .15s, background .15s;
}
.ifas-upload:hover { border-color: var(--color-primary-action); background: var(--color-primary-light); }
.ifas-upload__title { font-size: var(--font-size-body); color: var(--color-text-1); }
.ifas-upload__desc {
  max-width: 420px;
  font-size: var(--font-size-small);
  line-height: 1.7;
  color: var(--color-text-3);
}

/* 输入类通用 hover（实测：input/select/textarea 全站无 hover 反馈）*/
/* ⚠️ 这里**不能**用 :where() —— 零特异度会被组件自身基础规则压过（实测：组件编辑/审核详情的 input 仍无 hover）*/
input:not([type=checkbox]):not([type=radio]):hover, select:hover, textarea:hover { border-color: var(--color-border); }

.ifas-switch:hover { filter: brightness(.96); }

/* 全量缺口检测：可点元素光标兜底（组件没写 cursor 时也能看出能点）*/
:where([data-act],[data-conv],[data-more],[data-mode],[data-range],[data-use],[data-tab],[data-att],
       .ifas-chip,.ifas-switch,.ifas-action-link,.detail-subtab,.record-entry):not(:disabled) { cursor: pointer; }

/* 通用聚焦反馈：页面自有 input/select/textarea 也要有可见的焦点（边框转主色）*/
input:not([type=checkbox]):not([type=radio]):focus, select:focus, textarea:focus { border-color: var(--color-primary-action); }

/* ⚠️ 文本输入类**一律不要 outline 环**：浏览器认为「文本输入需要键盘」，
   所以鼠标点击也会命中 :focus-visible —— 抑制规则对它无效，会出现"点一下就一圈蓝"。
   它们靠自己的 border-color 变化表达焦点即可。 */
input:focus, textarea:focus, select:focus,
input:focus-visible, textarea:focus-visible, select:focus-visible { outline: none; }

/* 交互三态：这几个控件原先没有 hover 反馈（实测缺口） */
.ifas-pagination__size:hover { border-color: var(--color-border); color: var(--color-text-1); }
.ifas-filters__icon-btn:hover { background: var(--color-bg-subtle); color: var(--color-text-1); }
.ifas-form-input:hover, .ifas-form-textarea:hover { border-color: var(--color-border); }
.ifas-form-input:focus, .ifas-form-textarea:focus { border-color: var(--color-primary-action); }

/* ============================================================
   交互三态兜底：**一处定义，全站生效**
   实测：壳层原有 focus 规则 8 条 / disabled 9 条，覆盖不到全部控件，17 页大量控件靠浏览器默认。
   这里用 :where() 零特异度兜底（不覆盖组件自己的细化样式），组件要更精细的再单独写。
   ============================================================ */
:where(button, a[href], [tabindex]):not([tabindex="-1"]):focus-visible,
:where(.ifas-icon-btn, .ifas-act-btn, .ifas-chip, .ifas-field, .ifas-back-btn,
       .ifas-pagination__btn, .ifas-pagination__size, .ifas-row, .ifas-entity,
       .ifas-upload, .ifas-switch, .ifas-radio):focus-visible {
  outline: 2px solid var(--color-primary-action);
  outline-offset: 1px;
}
/* 鼠标点击不显示焦点环，键盘导航才显示 */
:where(button, .ifas-btn, .ifas-icon-btn, .ifas-tab, .ifas-chip):focus:not(:focus-visible) { outline: none; }

:where(button, input, select, textarea, .ifas-icon-btn, .ifas-act-btn, .ifas-chip,
       .ifas-field, .ifas-switch, .ifas-upload):disabled,
:where(.ifas-icon-btn, .ifas-act-btn, .ifas-chip, .ifas-tab)[aria-disabled="true"] {
  opacity: .45;
  cursor: not-allowed;
  pointer-events: none;
}

/* 通用空态（表格/列表/级联都可用）—— 原先只有 .ifas-cards__empty，各页只能自造 */
.ifas-empty {
  padding: var(--space-6) 0;
  text-align: center;
  font-size: var(--font-size-caption);
  color: var(--color-text-3);
}
.ifas-empty--box {
  border: 1px dashed var(--color-card-border);
  border-radius: var(--radius-card);
}
.ifas-cards__empty {
  grid-column: 1 / -1;
  display: grid; place-items: center;
  min-height: var(--card-h);
  border: 1px dashed var(--color-card-border);
  border-radius: var(--radius-card);
  color: var(--color-meta);
  font-size: var(--font-size-caption);
}

/* ============================================================
   大屏令牌（1920×1080 深色投屏）· 供**已归档**的投屏版（归档/平台运营大屏.html）使用
   当前主导航与页面清单里没有该页；保留这套令牌，是为了归档页仍能直接双击打开
   ------------------------------------------------------------
   为什么放在文件末尾：这是叠加在浅色壳层之上的一层主题，
   单独成节便于整体撤回；上面的浅色令牌一个字都没有改动。
   色相统一取自品牌主色 #263a97（靛蓝 h≈268），派生值一律 oklch，
   不手写灰调、不复用浅色页面的灰阶。
   ============================================================ */
:root {
  --screen-bg:            oklch(0.17 0.045 268);
  --screen-bg-deep:       oklch(0.13 0.040 268);
  --screen-panel:         oklch(0.225 0.050 268 / 0.62);
  --screen-panel-solid:   oklch(0.225 0.050 268);
  --screen-border:        oklch(0.40 0.055 268 / 0.55);
  --screen-border-strong: oklch(0.58 0.075 268 / 0.85);
  --screen-grid:          oklch(0.45 0.050 268 / 0.20);
  --screen-fg:            oklch(0.97 0.010 268);
  --screen-fg-2:          oklch(0.82 0.022 268);
  --screen-fg-3:          oklch(0.68 0.028 268);
  --screen-accent:        oklch(0.74 0.145 268);
  --screen-accent-deep:   oklch(0.60 0.130 268);
  --screen-ok:            oklch(0.82 0.140 168);
  --screen-warn:          oklch(0.84 0.150 80);
  --screen-bad:           oklch(0.70 0.190 25);
  --screen-info:          oklch(0.80 0.100 230);
  --screen-alt:           oklch(0.80 0.120 320);   /* 第 5 序列（问答会话）：与四个填充色都不同，且不与白色派生线争视线 */
  --screen-shadow:        0 10px 30px oklch(0.10 0.030 268 / 0.55);
  --screen-glow:          0 0 22px oklch(0.74 0.145 268 / 0.28);
  --screen-font:          "PingFang SC", "Microsoft YaHei", -apple-system, system-ui, sans-serif;
  --screen-font-num:      "DIN Alternate", "SF Mono", ui-monospace, Menlo, Consolas, monospace;
  --screen-fs-title:      26px;
  --screen-fs-h2:         19px;
  --screen-fs-body:       15px;
  --screen-fs-cap:        13px;
  --screen-fs-num-xl:     60px;
  --screen-fs-num:        34px;
}

/* ============================================================
   语音输入（语音转文字）· 全站共用控件
   行为在 语音输入.js：它把输入框包进 .ifas-voice-wrap 并挂一颗按钮
   ============================================================ */
.ifas-voice-wrap { position: relative; display: block; flex: 1 1 auto; min-width: 0; }
.ifas-voice-wrap > textarea,
.ifas-voice-wrap > input { width: 100%; padding-right: 42px; }
.ifas-voice-btn {
  position: absolute; right: 6px; bottom: 6px;
  width: 28px; height: 28px; padding: 0;
  display: grid; place-items: center;
  background: var(--color-bg-surface); color: var(--color-text-2);
  border: 1px solid var(--color-border); border-radius: var(--radius);
  cursor: pointer;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.ifas-voice-btn:hover { background: var(--color-primary-light); color: var(--color-text-1); border-color: var(--color-card-hover); }
.ifas-voice-btn:focus-visible { outline: 2px solid var(--color-primary-action); outline-offset: 2px; }
.ifas-voice-btn[aria-pressed="true"] {
  background: var(--color-danger-bg); color: var(--color-danger);
  border-color: var(--color-danger-border);
}
.ifas-voice-btn svg { width: 15px; height: 15px; }
.ifas-voice-tip {
  position: absolute; right: 0; top: calc(100% + 4px); z-index: 20;
  display: none; padding: 2px 8px;
  background: var(--color-bg-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius-card);
  font-size: var(--font-size-small); color: var(--color-text-2); white-space: nowrap;
}

/* ============================================================
   运行时"收壳"状态：IFAS_SHELL.setChrome(false)
   ------------------------------------------------------------
   用途：应用式界面（编辑模版 / 使用模版）要真正的全屏，需要临时收掉侧栏与顶栏。
   实现：只切一个 class，**不改 DOM 结构**（页面用不到、也不该动壳层的节点）。
   页面责任：给出一个「返回」，否则用户回不来（真实事故：用户原话「返回是必要操作」）。
   ============================================================ */
.ifas-app--nochrome .ifas-sidebar,
.ifas-app--nochrome .ifas-topbar { display: none; }
.ifas-app--nochrome .ifas-main { width: 100%; }
/* 收壳后内容区变成撑满的列容器：应用式界面（内容不高时）也占满整屏，不会只占上半屏 */
.ifas-app--nochrome .ifas-content { display: flex; flex-direction: column; min-height: 0; }
.ifas-app--nochrome .ifas-content > * { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }

/* ============================================================
   变更说明（悬浮小点 + 黄色说明卡）
   ------------------------------------------------------------
   真源：变更记录.js；默认隐藏，?review=1 打开。
   黄色是"便签"语义 —— 用令牌**混出浅便签黄**，刻意不用 --color-warning-gold 原色：
   那支原色已被监控大屏的「异常」结果线占用，同屏用原色会被误读成"异常"。
   ============================================================ */
.chg-dot {
  position: absolute; right: -7px; top: -7px; z-index: 30;
  width: 18px; height: 18px; padding: 0;
  display: grid; place-items: center;
  border-radius: 50%; cursor: pointer;
  background: color-mix(in oklab, var(--color-warning-gold) 26%, var(--color-bg-surface));
  color: color-mix(in oklab, var(--color-warning) 62%, var(--color-text-1));
  border: 1px solid var(--color-warning);
  font-family: inherit; font-size: 10px; font-weight: 700; line-height: 1;
  box-shadow: 0 1px 2px color-mix(in oklab, var(--color-text-1) 18%, transparent);
  opacity: 0.72;
  transition: opacity 0.15s, transform 0.15s;
}
.chg-dot:hover, .chg-dot:focus-visible {
  opacity: 1; transform: scale(1.08);
  outline: 2px solid var(--color-warning); outline-offset: 1px;
}
.chg-pop {
  position: fixed; z-index: 60; width: 340px; max-width: 92vw; padding: var(--space-4);
  background: color-mix(in oklab, var(--color-warning-gold) 16%, var(--color-bg-surface));
  border: 1px solid color-mix(in oklab, var(--color-warning) 55%, var(--color-bg-surface));
  border-radius: var(--radius-card);
  box-shadow: 0 8px 24px color-mix(in oklab, var(--color-text-1) 18%, transparent);
}
.chg-pop__head { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.chg-pop__id { font-size: var(--font-size-small); color: var(--color-text-3); font-variant-numeric: tabular-nums; }
.chg-pop__tag {
  padding: 1px 6px; border-radius: 3px; font-size: var(--font-size-small);
  background: color-mix(in oklab, var(--color-warning) 22%, var(--color-bg-surface));
  color: color-mix(in oklab, var(--color-warning) 72%, var(--color-text-1));
}
.chg-pop__x {
  margin-left: auto; appearance: none; border: 0; background: transparent; cursor: pointer;
  color: var(--color-text-3); font-family: inherit; font-size: var(--font-size-body); line-height: 1;
}
.chg-pop__x:hover { color: var(--color-text-1); }
.chg-pop__title { margin: 0 0 var(--space-2); font-size: var(--font-size-body); font-weight: 600; color: var(--color-text-1); }
.chg-pop__desc { margin: 0 0 var(--space-3); font-size: var(--font-size-small); line-height: 1.8; color: var(--color-text-2); }
.chg-pop__meta { margin: 0; display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px var(--space-3); font-size: var(--font-size-small); }
.chg-pop__meta dt { color: var(--color-text-3); }
.chg-pop__meta dd { margin: 0; color: var(--color-text-2); }
.chg-pop__meta b { color: var(--color-text-1); }
.chg-chips {
  position: fixed; right: var(--space-5); bottom: var(--space-5); z-index: 50;
  display: flex; align-items: center; gap: var(--space-2);
}
.chg-chip {
  text-decoration: none;
  display: inline-flex; align-items: center; gap: var(--space-1);
  height: 28px; padding: 0 var(--space-3); cursor: pointer;
  background: color-mix(in oklab, var(--color-warning-gold) 26%, var(--color-bg-surface));
  border: 1px solid var(--color-warning); border-radius: 14px;
  font-family: inherit; font-size: var(--font-size-small);
  color: color-mix(in oklab, var(--color-warning) 72%, var(--color-text-1));
}
.chg-chip:hover { background: color-mix(in oklab, var(--color-warning-gold) 40%, var(--color-bg-surface)); }
.chg-chip b { font-weight: 600; }

/* 顶栏「变更记录」入口：小按钮 + 条数徽标 */
.ifas-chgnav { height: 28px; padding: 0 var(--space-3); gap: var(--space-1); }
.ifas-chgnav__n {
  display: inline-grid; place-items: center; min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: 8px;
  background: var(--color-primary-light); color: var(--color-primary-action);
  font-size: var(--font-size-small); font-weight: 600;
}

/* ============================================================
   预览工具条入口按钮（「解析结果」/「在线编辑」这类"看得见的操作"）
   ------------------------------------------------------------
   为什么在壳层：审核详情与附件解析都在用，页面不许自造按钮（硬规矩 2）。
   形态：描边 + 图标 + 文字（对齐真实系统：一眼看得出能点，不是一枚小图标）。
   ============================================================ */
.ifas-pvbtn {
  display: inline-flex; align-items: center; gap: var(--space-1);
  height: 22px; padding: 0 var(--space-1);
  background: transparent; color: var(--color-primary-action);
  border: 0; border-radius: 3px;
  font-family: inherit; font-size: var(--font-size-body); line-height: 1;
  white-space: nowrap; cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.ifas-pvbtn:hover { background: var(--color-primary-light); }
.ifas-pvbtn:focus-visible { outline: 2px solid var(--color-primary-action); outline-offset: 1px; }
.ifas-pvbtn svg { width: 15px; height: 15px; display: block; }

/* ============================================================
   模型多选组件（能力配置 · 模型配置）—— 对齐真实系统 image-61
   ============================================================ */
.ifas-mp { position: relative; }
.ifas-mp__field {
  width: 100%; height: 30px; display: flex; align-items: center; gap: var(--space-2);
  padding: 0 var(--space-3); text-align: left; cursor: pointer;
  background: var(--color-bg-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius); color: var(--color-text-1); font-size: var(--font-size-body);
}
.ifas-mp__field[aria-expanded="true"] { border-color: var(--color-primary-action); }
.ifas-mp__text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ifas-mp__text b { font-weight: 600; }
.ifas-mp__caret { flex: 0 0 auto; color: var(--color-text-3); }
.ifas-mp__panel {
  position: absolute; z-index: 40; left: 0; right: 0; top: calc(100% + 4px);
  background: var(--color-bg-surface); border-radius: var(--radius-card);
  box-shadow: 0 6px 24px color-mix(in oklab, var(--color-text-1) 20%, transparent);
  overflow: hidden;
}
.ifas-mp__search { position: relative; padding: var(--space-3) var(--space-3) var(--space-2); }
.ifas-mp__search input { width: 100%; height: 30px; padding-right: var(--space-6); }
.ifas-mp__search svg { position: absolute; right: var(--space-5); top: 50%; transform: translateY(-30%); color: var(--color-text-3); }
.ifas-mp__list { max-height: 260px; overflow-y: auto; padding: 0 var(--space-2) var(--space-2); }
.ifas-mp__row {
  display: flex; align-items: center; gap: var(--space-2);
  height: 44px; padding: 0 var(--space-2); border-radius: var(--radius);
}
.ifas-mp__row:hover { background: var(--color-bg-subtle); }
.ifas-mp__row.is-def { background: var(--color-primary-light); }
.ifas-mp__check {
  flex: 0 0 18px; width: 18px; height: 18px; display: grid; place-items: center;
  border: 1px solid var(--color-border); border-radius: 50%; background: transparent;
  color: var(--color-primary-action); cursor: pointer;
}
.ifas-mp__check.is-on { border-color: var(--color-primary-action); }
.ifas-mp__name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--color-text-1); font-size: var(--font-size-body); }
.ifas-mp__vendor { flex: 0 0 auto; color: var(--color-text-3); font-size: var(--font-size-small); }
.ifas-mp__star {
  flex: 0 0 auto; width: 24px; height: 24px; display: grid; place-items: center;
  border: 0; background: transparent; cursor: pointer; font-size: var(--font-size-body);
  color: var(--color-border);
}
.ifas-mp__star:hover { color: var(--color-warning-gold); }
.ifas-mp__star.is-on { color: var(--color-warning-gold); }
.ifas-mp__del {
  flex: 0 0 auto; width: 24px; height: 24px; display: grid; place-items: center;
  border: 0; background: transparent; cursor: pointer; color: var(--color-text-3);
}
.ifas-mp__del:hover:not(:disabled) { color: var(--color-danger); }
.ifas-mp__del:disabled { color: var(--color-border); cursor: not-allowed; }
.ifas-mp__add {
  width: 100%; height: 40px; border: 0; border-top: 1px solid var(--color-border-light);
  background: transparent; cursor: pointer; color: var(--color-primary-action);
  font-family: inherit; font-size: var(--font-size-body);
}
.ifas-mp__add:hover { background: var(--color-primary-light); }

/* 默认模型标记：**文字徽标**（不用 ★ —— 图标看不出"默认"的意思，用户 2026-09-13 反馈） */
.ifas-mp__badge { flex: 0 0 auto; }
/* 非默认行的「设为默认」：文字按钮，悬停变主色（行内不抢视觉） */
.ifas-mp__setdef {
  flex: 0 0 auto; height: 22px; padding: 0 var(--space-2);
  border: 0; background: transparent; border-radius: var(--radius);
  font-family: inherit; font-size: var(--font-size-small); line-height: 1;
  color: var(--color-text-3); cursor: pointer; white-space: nowrap;
}
.ifas-mp__setdef:hover { background: var(--color-primary-light); color: var(--color-primary-action); }
.ifas-mp__setdef:focus-visible { outline: 2px solid var(--color-primary-action); outline-offset: 1px; }

/* ============================================================
   告警条（page-level alert）—— 对齐真实系统 image-63：
   浅黄底 + 左侧警示三角 + 主文案 + 右侧操作链接 + 可关闭。
   令牌全部取自壳层（--color-warning-bg / --color-warning-border / --color-warning-gold）。
   ============================================================ */
