  .admin-login {
    max-width: 400px;
    margin: 80px auto;
    padding: 30px;
    background: var(--bg-card);
    border: 1.5px solid var(--ink);
  }
  /* ════════════════════════════════════════════════════════════════
     后台主框架：左侧分组导航 + 右侧内容（2026-07-30 从顶部横排 Tab 改过来）
     ────────────────────────────────────────────────────────────────
     14 个 Tab 横排时会换成两行、还挤成一片，看不出哪些功能是一类的。
     改成左栏竖排 + 业务分组后，右栏也能拿到整片宽度放表格。
     ⚠️ `.tabs` / `.tab` / `.tab-pane` 这些 class 名**刻意保留** ——
     06-main.js 的切换逻辑按它们工作，换名字会静默失效（点了没反应）。
     ════════════════════════════════════════════════════════════════ */
  .admin-shell {
    display: flex;
    align-items: flex-start;
    gap: 22px;
  }
  .admin-side {
    flex: 0 0 178px;
    position: sticky;           /* 内容区滚很长时导航跟着走，不用滚回顶部换 Tab */
    top: 14px;
    display: flex;
    flex-direction: column;
    gap: 14px;
  }
  .admin-main {
    flex: 1;
    min-width: 0;               /* 没有它，宽表格会把左栏挤没 */
  }
  .tabs {
    display: flex;
    flex-direction: column;     /* 竖排 */
    align-items: stretch;
    gap: 1px;
    border-bottom: none;        /* 竖排没有"底部下划线"这回事 */
    margin-bottom: 0;
  }
  /* 分组小标题：把 14 项按业务归成 4 组，一眼看出哪些是一类 */
  .side-group {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    letter-spacing: 0.12em;
    color: var(--muted);
    text-transform: uppercase;
    padding: 12px 10px 4px;
    border-top: 1px solid var(--border);
    margin-top: 6px;
  }
  .side-group:first-child { border-top: none; margin-top: 0; padding-top: 2px; }
  .tab {
    white-space: nowrap;        /* 「AI 回复」这类短词绝不折行 */
    text-align: left;
    padding: 7px 10px;
    background: transparent;
    border: none;
    border-left: 2px solid transparent;   /* 选中标记从底部下划线改成左侧竖条 */
    border-radius: 0 4px 4px 0;
    cursor: pointer;
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    letter-spacing: 0.04em;
    color: var(--muted);
    transition: .12s;
  }
  .tab:hover { color: var(--ink); background: var(--bg-accent); }
  .tab.active {
    color: var(--ink);
    background: var(--bg-accent);
    border-left-color: var(--accent-2);
    font-weight: 600;
  }
  /* 外链型条目（博主管理是独立页）：长得和 Tab 一样，但点了是开新窗口 */
  .tab-link { display: block; text-decoration: none; }
  .tab-ext { font-size: 10px; opacity: .55; }
  /* 侧栏底部的概览数字：两列紧凑排，别把侧栏拉得太高 */
  .admin-side .stats-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 5px;
    margin: 0;
    padding-top: 12px;
    border-top: 1px solid var(--border);
  }
  .admin-side .stats-grid .stat-card { padding: 6px 8px; }
  .admin-side .stats-grid .label { font-size: 9.5px; letter-spacing: .04em; }
  .admin-side .stats-grid .val { font-size: 16px; }
  /* 窄屏：分栏退回上下排，导航横着滑（后台以电脑为主，这里只求不坏） */
  @media (max-width: 860px) {
    .admin-shell { flex-direction: column; }
    .admin-side { position: static; flex: none; width: 100%; }
    .tabs { flex-direction: row; flex-wrap: nowrap; overflow-x: auto; gap: 2px; }
    .side-group { display: none; }
    .tab { border-left: none; border-bottom: 2px solid transparent; border-radius: 4px 4px 0 0; }
    .tab.active { border-left: none; border-bottom-color: var(--accent-2); }
    .admin-side .stats-grid { grid-template-columns: repeat(3, 1fr); }
  }
  .tab-pane { display: none; }
  .tab-pane.active { display: block; }

  table.data-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12.5px;
  }
  .data-table thead th {
    background: var(--ink);
    color: var(--bg);
    padding: 8px 12px;
    text-align: left;
    font-weight: 500;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  .data-table tbody td {
    padding: 8px 12px;
    border-top: 1px solid var(--border);
    vertical-align: top;
  }
  .data-table tbody tr:hover { background: var(--bg-accent); }
  .data-table tbody tr.schema-detail:hover { background: var(--bg-card); }
  .data-table pre {
    margin: 0;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--ink-2);
    white-space: pre-wrap;
    word-break: break-all;
    max-width: 600px;
  }
  .schema-detail td { background: var(--bg-card); padding: 14px 16px; }
  .alias-list {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 10px;
  }
  .alias-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 4px 3px 10px;
    background: var(--bg);
    border: 1px solid var(--border-strong);
    font-size: 12px;
  }
  .alias-chip button.alias-remove {
    border: none;
    background: transparent;
    color: var(--muted);
    cursor: pointer;
    font-size: 14px;
    line-height: 1;
    padding: 0 4px;
  }
  .alias-chip button.alias-remove:hover { color: var(--err); }
  .alias-chip.wildcard {
    background: #eaf4ee;
    border-color: var(--ok);
    font-family: 'JetBrains Mono', monospace;
  }
  .alias-chip.wildcard > span:first-child::before {
    content: '🔍 ';
    font-size: 10px;
    opacity: 0.7;
  }
  .alias-chip .alias-text {
    cursor: pointer;
    border-radius: 2px;
    padding: 1px 2px;
  }
  .alias-chip .alias-text:hover {
    background: rgba(0,0,0,0.06);
  }
  .alias-edit-input {
    padding: 2px 6px;
    border: 1px solid var(--accent);
    background: #fff;
    border-radius: 3px;
    font-size: 12.5px;
    font-family: inherit;
    min-width: 120px;
    margin: 0 4px;
  }
  .alias-add-form {
    display: flex;
    gap: 8px;
    align-items: center;
  }
  .alias-add-form input {
    flex: 1;
    max-width: 320px;
    padding: 6px 8px;
    border: 1px solid var(--border-strong);
    background: var(--bg);
    font-size: 12.5px;
  }
  .alias-add-hint {
    margin-top: 4px;
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.02em;
  }

  /* 手动说明队列 */
  .tab-badge {
    display: inline-block;
    margin-left: 4px;
    background: var(--accent-2);
    color: white;
    font-size: 10px;
    padding: 0 6px;
    border-radius: 8px;
    line-height: 16px;
    min-width: 14px;
    text-align: center;
  }
  .tab-badge:empty { display: none; }

  .notes-toolbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 14px;
    margin-bottom: 12px;
    flex-wrap: wrap;
  }
  .notes-status-switch {
    display: inline-flex;
    border: 1px solid var(--border-strong);
  }
  .notes-status-btn {
    border: none;
    background: var(--bg-card);
    padding: 6px 14px;
    cursor: pointer;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11.5px;
    color: var(--muted);
    border-right: 1px solid var(--border);
  }
  .notes-status-btn:last-child { border-right: none; }
  .notes-status-btn.active { background: var(--ink); color: var(--bg); }
  .notes-status-btn span {
    display: inline-block;
    margin-left: 4px;
    background: rgba(0,0,0,0.12);
    padding: 0 5px;
    border-radius: 2px;
    font-size: 10px;
  }
  .notes-status-btn.active span { background: rgba(255,255,255,0.18); }

  .notes-list { display: flex; flex-direction: column; gap: 12px; }
  .notes-empty {
    padding: 40px 20px;
    text-align: center;
    color: var(--muted);
    border: 1px dashed var(--border);
    background: var(--bg);
  }
  .note-card {
    border: 1px solid var(--border);
    background: var(--bg-card);
  }
  .note-card.status-pending   { border-left: 3px solid var(--warn); }
  .note-card.status-processed { border-left: 3px solid var(--ok); opacity: 0.9; }
  .note-card.status-dismissed { border-left: 3px solid var(--muted); opacity: 0.75; }
  .note-card-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 10px 14px;
    background: var(--bg);
    border-bottom: 1px dashed var(--border);
    flex-wrap: wrap;
    gap: 8px;
  }
  .note-head-left { display: flex; align-items: center; gap: 10px; }
  .note-proj { font-size: 12px; color: var(--ink-2); }
  .note-status-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    padding: 1px 6px;
    background: var(--ink);
    color: var(--bg);
    letter-spacing: 0.05em;
    text-transform: uppercase;
  }
  .note-card.status-processed .note-status-tag { background: var(--ok); }
  .note-card.status-dismissed .note-status-tag { background: var(--muted); }
  .note-time { font-size: 11px; color: var(--muted); }

  .note-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 8px; }
  .note-row { display: flex; gap: 12px; align-items: flex-start; }
  .note-row-label {
    flex: 0 0 72px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.05em;
    text-transform: uppercase;
    padding-top: 2px;
  }
  .note-header {
    font-size: 13px;
    font-weight: 600;
    color: var(--ink);
  }
  .note-note {
    flex: 1;
    white-space: pre-wrap;
    font-size: 13px;
    color: var(--ink-2);
    background: var(--bg);
    padding: 6px 10px;
    border: 1px solid var(--border);
  }
  .note-ai { flex: 1; display: flex; flex-direction: column; gap: 4px; }
  .note-suggest { font-size: 13px; color: var(--accent); font-weight: 500; }
  .note-conf {
    display: inline-block;
    margin-left: 6px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    padding: 1px 5px;
    background: var(--muted);
    color: white;
    letter-spacing: 0.05em;
  }
  .note-conf.conf-high   { background: var(--ok); }
  .note-conf.conf-medium { background: var(--accent); }
  .note-conf.conf-low    { background: var(--warn); }
  .note-explain { font-size: 12px; color: var(--muted); font-style: italic; }

  .note-actions {
    border-top: 1px solid var(--border);
    padding: 10px 14px 14px;
    background: var(--bg);
    display: flex;
    flex-direction: column;
    gap: 12px;
  }
  .note-action-title {
    font-size: 10.5px;
    color: var(--muted);
    letter-spacing: 0.05em;
    text-transform: uppercase;
    margin-bottom: 6px;
  }
  .note-action-row {
    display: flex;
    gap: 6px;
    align-items: center;
    flex-wrap: wrap;
    margin-bottom: 4px;
  }
  .note-action-row input[type="text"], .note-action-row select {
    flex: 1;
    min-width: 180px;
    padding: 6px 8px;
    border: 1px solid var(--border-strong);
    background: var(--bg);
    font-size: 12.5px;
  }
  .note-action-row select { min-width: 260px; }
  .note-merge-label {
    font-size: 11.5px;
    color: var(--ink-2);
    display: inline-flex;
    gap: 4px;
    align-items: center;
    cursor: pointer;
    white-space: nowrap;
  }

  /* 弹层：admin.html 也引了 styles.css（第 7 行），遮罩/外框/头部/关闭按钮的完整规则都在那边，
   * 这里以前整套抄了一遍（注释误写成"原本没引 modal 规则"），主样式表改了后台不跟着变。
   * 现在只保留后台真正需要的差异：
   * 1) 后台的字段治理/时间线等弹层内容很长，要限高 + 让内容区自己滚（主应用弹层不限高）；
   * 2) 后台信息密度更高，头部/内容内边距比主应用略紧；
   * 3) 头部字体：主样式表只给了 .modal-head .title，这里让右上角 × 也用同一套字体（后台独有）。
   * 各弹层的宽度写在 admin.html 的行内 style 上，这里不再重复给 max-width。 */
  .modal {
    max-height: calc(100vh - 80px);
    display: flex; flex-direction: column;
  }
  .modal-head {
    padding: 12px 18px;
    font-family: 'Fraunces', serif; font-weight: 500;
  }
  .modal-body { padding: 16px 18px; overflow-y: auto; }

  .gov-impact {
    background: var(--bg);
    border: 1px solid var(--border);
    padding: 10px 12px;
    margin-bottom: 14px;
  }
  .gov-impact-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));
    gap: 10px;
  }
  .gov-impact-label {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10px;
    color: var(--muted);
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
  .gov-impact-val {
    font-family: 'Fraunces', serif;
    font-size: 20px;
    font-weight: 500;
  }
  .gov-impact-val.warn { color: var(--warn); }
  .gov-impact-refs { margin-top: 10px; }
  .gov-impact-refs summary { cursor: pointer; font-size: 11.5px; color: var(--muted); }
  .gov-impact-refs ul { margin: 6px 0 0; padding-left: 18px; }

  .gov-section {
    padding: 12px;
    border: 1px solid var(--border);
    margin-bottom: 12px;
    background: var(--bg-card);
  }
  .gov-section.gov-danger { border-color: var(--err); background: #fdf3f2; }
  .gov-section-title {
    font-family: 'Fraunces', serif;
    font-weight: 500;
    font-size: 14px;
    margin-bottom: 4px;
  }
  .gov-section-hint {
    font-size: 11.5px;
    color: var(--muted);
    margin-bottom: 10px;
    line-height: 1.5;
  }
  .gov-row {
    display: flex; gap: 6px; align-items: center; flex-wrap: wrap;
    margin-bottom: 6px;
  }
  .gov-row input[type="text"], .gov-row select {
    flex: 1; min-width: 200px; padding: 6px 8px;
    border: 1px solid var(--border-strong); background: var(--bg);
    font-size: 12.5px;
  }
  .gov-checkboxes { font-size: 11.5px; color: var(--ink-2); gap: 14px; }
  .gov-checkboxes label { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; white-space: nowrap; }

  /* ===== 待确认别名：已有别名 + 模糊推荐 ===== */
  #aliasTable td { vertical-align: top; padding-top: 8px; padding-bottom: 8px; }
  .al-field-key { font-family: 'JetBrains Mono', monospace; font-size: 12.5px; color: var(--ink); }
  .al-field-label { font-size: 11px; color: var(--muted); margin-top: 1px; }
  .al-field-dead { font-size: 11px; color: var(--err); margin-top: 1px; }
  .al-existing { margin-top: 5px; display: flex; flex-wrap: wrap; gap: 3px; align-items: center; max-width: 320px; }
  .al-existing-k { font-size: 10px; color: var(--muted); margin-right: 2px; }
  .al-chip {
    display: inline-block; font-size: 11px; padding: 1px 6px; border-radius: 3px;
    background: var(--bg-accent); border: 1px solid var(--border); color: var(--ink-2);
    max-width: 130px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom;
  }
  .al-chip.more { background: transparent; border-style: dashed; color: var(--muted); }
  /* 推荐区 */
  .al-reco { margin-top: 6px; display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
  .al-reco-k { font-size: 10px; color: var(--muted); margin-right: 2px; }
  .al-reco-chip {
    cursor: pointer; font-size: 11px; padding: 1px 7px; border-radius: 10px;
    border: 1px solid var(--border-strong); background: var(--bg); color: var(--ink-2);
    display: inline-flex; align-items: center; gap: 4px;
  }
  .al-reco-chip:hover { border-color: var(--accent); color: var(--accent); }
  .al-reco-chip .pct { font-family: 'JetBrains Mono', monospace; font-size: 9.5px; color: var(--muted); }
  .al-reco-chip.cur { background: #eaf4ee; border-color: var(--ok); color: var(--ok); cursor: default; }
  .al-reco-chip.cur .pct { color: var(--ok); }
  .al-badge { font-size: 10px; padding: 1px 6px; border-radius: 3px; white-space: nowrap; }
  .al-badge.ok { background: #eaf4ee; color: var(--ok); border: 1px solid var(--ok); }
  .al-badge.warn { background: #fdf0e6; color: var(--accent-2); border: 1px solid var(--accent-2); }

  /* 用户角色分配下拉 */
  .role-select {
    font-size: 12px; padding: 2px 6px; border: 1px solid var(--border-strong);
    background: var(--bg); cursor: pointer;
  }

  /* ===== 回收站 ===== */
  .trash-group { margin-bottom: 22px; }
  .trash-group h3 {
    font-size: 13px; font-weight: 600; margin: 0 0 8px;
    display: flex; align-items: center; gap: 8px;
  }
  .trash-group h3 .cnt { color: var(--muted); font-weight: 400; font-size: 11.5px; }
  .trash-empty { color: var(--muted); font-size: 12px; padding: 6px 0; }
  .trash-restore {
    font-size: 11px; padding: 2px 10px; background: transparent;
    border: 1px solid var(--ok); color: var(--ok); cursor: pointer;
  }
  .trash-restore:hover { background: var(--ok); color: #fff; }
  .trash-purge {
    font-size: 11px; padding: 2px 10px; background: transparent;
    border: 1px solid var(--err); color: var(--err); cursor: pointer; margin-left: 6px;
  }
  .trash-purge:hover { background: var(--err); color: #fff; }

  /* ════════════════════ 数据分析 Tab ════════════════════ */
  .an-toolbar {
    display: flex; justify-content: space-between; align-items: center;
    gap: 12px; flex-wrap: wrap; margin-bottom: 14px;
  }
  .an-filters { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
  .an-fl {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: 12px; color: var(--muted);
  }
  .an-fl select, .an-mini-select {
    padding: 5px 9px; border: 1px solid var(--border-strong);
    background: var(--bg); font-size: 12.5px; color: var(--ink);
  }
  .an-note { color: var(--muted); font-size: 11px; font-weight: 400; }

  /* 指标说明折叠面板 */
  .an-gloss { margin-bottom: 14px; border: 1px solid var(--border); background: var(--bg); }
  .an-gloss > summary {
    cursor: pointer; padding: 9px 12px; font-size: 12.5px; color: var(--accent);
    font-weight: 600; list-style: none; user-select: none;
  }
  .an-gloss > summary::-webkit-details-marker { display: none; }
  .an-gloss[open] > summary { border-bottom: 1px solid var(--border); }
  .an-gloss-body {
    padding: 12px; display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 14px;
  }
  .an-gloss-title {
    font-family: 'JetBrains Mono', monospace; font-size: 10.5px; color: var(--muted);
    letter-spacing: 0.05em; text-transform: uppercase; margin-bottom: 6px;
    border-bottom: 1px solid var(--border); padding-bottom: 4px;
  }
  .an-gloss-row { display: grid; grid-template-columns: 96px 1fr; gap: 8px; padding: 3px 0; font-size: 12px; }
  .an-gloss-k { color: var(--ink); font-weight: 600; }
  .an-gloss-v { color: var(--ink-2); line-height: 1.5; }
  .an-stat[title], .an-kpi[title], .data-table th[title] { cursor: help; }

  .an-kpis {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
    gap: 8px; margin-bottom: 14px;
  }
  .an-kpi { padding: 10px 12px; background: var(--bg); border: 1px solid var(--border); }
  .an-kpi-l {
    font-family: 'JetBrains Mono', monospace; font-size: 9.5px; color: var(--muted);
    letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 5px;
  }
  .an-kpi-v { font-family: 'Fraunces', serif; font-size: 22px; font-weight: 500; }

  .an-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 12px; }
  @media (max-width: 860px) { .an-grid2 { grid-template-columns: 1fr; } }
  .an-card { background: var(--bg-card); border: 1px solid var(--border); padding: 14px; margin-bottom: 12px; }
  .an-card-t {
    font-family: 'Fraunces', serif; font-size: 14px; font-weight: 500;
    margin-bottom: 12px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  }

  /* 漏斗 */
  .an-funnel { display: flex; flex-direction: column; gap: 7px; }
  .an-funnel-row { display: grid; grid-template-columns: 72px 1fr 44px; align-items: center; gap: 8px; }
  .an-funnel-label { font-size: 12px; color: var(--ink-2); text-align: right; }
  .an-funnel-track { position: relative; background: var(--bg); border: 1px solid var(--border); height: 26px; }
  .an-funnel-bar { height: 100%; background: var(--accent); transition: width .3s; min-width: 2px; }
  .an-funnel-val {
    position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
    font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--ink);
  }
  .an-funnel-conv { font-family: 'JetBrains Mono', monospace; font-size: 11.5px; color: var(--muted); text-align: right; }
  .an-funnel-conv.ok { color: var(--ok); }
  .an-funnel-conv.warn { color: var(--warn); }
  .an-funnel-conv.err { color: var(--err); font-weight: 600; }

  /* SVG 轴 / 图例 */
  .an-axis { font-family: 'JetBrains Mono', monospace; font-size: 9px; fill: var(--muted); }
  .an-legend { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 8px; }
  .an-leg { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; color: var(--ink-2); }
  .an-leg i { width: 10px; height: 10px; display: inline-block; border-radius: 2px; }

  /* 漏斗形 SVG 文字 */
  .an-fn-band { transition: opacity .15s; }
  .an-fn-band:hover { opacity: 0.85; }
  .an-fn-label { font-size: 12px; fill: var(--ink-2); }
  .an-fn-val { font-size: 13px; font-weight: 700; fill: #fff;
    paint-order: stroke; stroke: rgba(26,26,26,0.35); stroke-width: 2.4px; stroke-linejoin: round; }
  .an-fn-conv { font-family: 'JetBrains Mono', monospace; font-size: 11.5px; font-weight: 600; }

  /* 每日趋势：透明热区 + 悬停明细浮层 */
  .an-dayhit { fill: transparent; cursor: pointer; }
  .an-dayhit:hover { fill: rgba(30,74,95,0.07); }
  .an-tip-pop {
    position: fixed; z-index: 300; display: none; min-width: 132px;
    background: var(--bg-card); border: 1px solid var(--ink);
    box-shadow: 3px 3px 0 rgba(26,26,26,0.22); padding: 8px 10px; pointer-events: none;
    font-size: 12px;
  }
  .an-tt-date { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--muted);
    margin-bottom: 5px; padding-bottom: 4px; border-bottom: 1px solid var(--border); }
  .an-tt-row { display: flex; align-items: center; gap: 6px; padding: 1.5px 0; }
  .an-tt-row i { width: 9px; height: 9px; border-radius: 2px; flex: 0 0 auto; }
  .an-tt-row span { flex: 1; color: var(--ink-2); }
  .an-tt-row b { font-family: 'JetBrains Mono', monospace; color: var(--ink); }
  .an-tt-total { margin-top: 5px; padding-top: 4px; border-top: 1px solid var(--border);
    font-size: 11.5px; color: var(--ink); text-align: right; }

  /* 分类横条 */
  .an-catbars { display: flex; flex-direction: column; gap: 6px; }
  .an-catbar-row { display: grid; grid-template-columns: 70px 1fr 40px; align-items: center; gap: 8px; }
  .an-catbar-label { font-size: 12px; color: var(--ink-2); }
  .an-catbar-track { background: var(--bg); border: 1px solid var(--border); height: 16px; }
  .an-catbar-bar { height: 100%; min-width: 2px; }
  .an-catbar-val { font-size: 11.5px; color: var(--muted); text-align: right; }

  /* 质量指标 */
  .an-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 10px; }
  .an-stat { padding: 8px 4px; }
  .an-stat-l { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
  .an-stat-v { font-family: 'Fraunces', serif; font-size: 20px; font-weight: 500; }
  .an-stat-s { font-size: 10.5px; color: var(--muted); margin-top: 2px; }

  /* 问题洞察 */
  .an-insights { display: flex; flex-direction: column; gap: 8px; }
  .an-insight { display: flex; gap: 10px; padding: 10px 12px; border: 1px solid var(--border); border-left-width: 3px; background: var(--bg); }
  .an-insight.err { border-left-color: var(--err); }
  .an-insight.warn { border-left-color: var(--warn); }
  .an-insight.info { border-left-color: var(--accent); }
  .an-insight.ok { border-left-color: var(--ok); }
  .an-ins-icon {
    flex: 0 0 20px; width: 20px; height: 20px; border-radius: 50%; color: #fff;
    display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700;
  }
  .an-insight.err .an-ins-icon { background: var(--err); }
  .an-insight.warn .an-ins-icon { background: var(--warn); }
  .an-insight.info .an-ins-icon { background: var(--accent); }
  .an-insight.ok .an-ins-icon { background: var(--ok); }
  .an-ins-title { font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 8px; }
  .an-ins-metric {
    font-family: 'JetBrains Mono', monospace; font-size: 11px; padding: 1px 6px;
    background: var(--bg-accent); border: 1px solid var(--border-strong);
  }
  .an-ins-detail { font-size: 12px; color: var(--ink-2); margin-top: 3px; line-height: 1.5; }

  /* 表格里的徽章 / 状态 */
  .an-rolebadge {
    font-size: 9px; background: var(--accent); color: #fff; padding: 0 4px; border-radius: 2px;
  }
  .an-status { font-size: 11px; padding: 1px 7px; border-radius: 2px; white-space: nowrap; }
  .an-status-draft { background: var(--bg-accent); color: var(--ink-2); }
  .an-status-in_progress { background: #e7eef0; color: var(--accent); }
  .an-status-completed { background: #eaf4ee; color: var(--ok); }
  .an-del { font-size: 10px; color: var(--err); border: 1px solid var(--err); padding: 0 4px; border-radius: 2px; }
  .an-proj-row { cursor: pointer; }
  .an-proj-row:hover { background: var(--bg-accent); }

  /* 项目时间线弹窗 */
  .tl-head {
    display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
    padding-bottom: 10px; margin-bottom: 12px; border-bottom: 1px solid var(--border);
  }
  .tl-sum { font-size: 12px; color: var(--muted); }
  .tl-list { display: flex; flex-direction: column; }
  .tl-item {
    display: grid; grid-template-columns: 14px 84px 1fr; align-items: start;
    gap: 8px; padding: 7px 0; position: relative;
  }
  .tl-item + .tl-item { border-top: 1px dashed var(--border); }
  .tl-dot { width: 10px; height: 10px; border-radius: 50%; margin-top: 3px; }
  .tl-time { font-size: 11px; color: var(--muted); }
  .tl-main { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; }
  .tl-label { font-size: 12.5px; font-weight: 600; color: var(--ink); }
  .tl-detail { font-size: 12px; color: var(--ink-2); }
  .tl-actor { font-size: 11px; color: var(--muted); margin-left: auto; }

  /* ════════════════════ 达人群发 Tab ════════════════════ */
  .vw-warn {
    background: var(--bg-accent); border: 1px solid var(--border-strong); border-left: 3px solid var(--warn);
    padding: 9px 12px; font-size: 12px; color: var(--ink-2); margin-bottom: 12px; line-height: 1.6;
  }
  .vw-warn code { font-family: 'JetBrains Mono', monospace; font-size: 11px; }
  .vw-toolbar {
    display: flex; justify-content: space-between; align-items: center;
    gap: 12px; flex-wrap: wrap; margin-bottom: 12px;
  }
  .vw-status { font-size: 11.5px; color: var(--ink-2); display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
  .vw-tools { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  .vw-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 4px; }
  .vw-dot.ok { background: var(--ok); }
  .vw-dot.bad { background: var(--err); }

  .vw-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; align-items: start; }
  @media (max-width: 920px) { .vw-grid { grid-template-columns: 1fr; } }

  .vw-groups { max-height: 560px; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; }
  .vw-group { border: 1px solid var(--border); background: var(--bg); padding: 9px 11px; cursor: pointer; }
  .vw-group:hover { background: var(--bg-accent); }
  .vw-group.sel { border-color: var(--accent); box-shadow: inset 3px 0 0 var(--accent); background: var(--bg-accent); }
  .vw-group-head { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
  .vw-group-name { font-size: 13px; font-weight: 600; color: var(--ink); }
  .vw-group-n { font-size: 11px; color: var(--muted); flex: 0 0 auto; }
  .vw-group-id { font-size: 10.5px; color: var(--muted); margin: 2px 0 6px; word-break: break-all; }
  .vw-tals { display: flex; flex-direction: column; gap: 2px; }
  .vw-tal { display: flex; align-items: baseline; gap: 6px; font-size: 11.5px; flex-wrap: wrap; }
  .vw-tal-name { color: var(--ink-2); font-weight: 500; }
  .vw-tal-nick { color: var(--muted); font-size: 11px; }
  .vw-tal-id { font-family: 'JetBrains Mono', monospace; font-size: 10.5px; color: var(--muted); }
  .vw-inactive { font-size: 10px; color: var(--muted); border: 1px solid var(--border); padding: 0 4px; }
  .vw-unbound { font-size: 10px; color: #fff; background: var(--accent-2); border-radius: 2px; padding: 0 5px; font-weight: 600; margin-left: 4px; vertical-align: middle; }
  .vw-group-unbound { border-left: 3px solid var(--accent-2); }

  .vw-compose-card { position: sticky; top: 12px; }
  .vw-target { font-size: 12.5px; color: var(--ink-2); margin-bottom: 10px; }
  .vw-field { margin-bottom: 12px; }
  .vw-label { font-size: 11.5px; color: var(--muted); margin-bottom: 5px; }
  .vw-field select { padding: 6px 9px; border: 1px solid var(--border-strong); background: var(--bg); font-size: 12.5px; min-width: 180px; }
  .vw-field textarea {
    width: 100%; box-sizing: border-box; border: 1px solid var(--border-strong); background: var(--bg);
    padding: 8px 10px; font-size: 13px; line-height: 1.5; resize: vertical; font-family: inherit;
  }
  .vw-picks { display: flex; flex-wrap: wrap; gap: 6px 14px; }
  .vw-pick { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--ink-2); cursor: pointer; }
  .vw-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }

  .vw-err { color: var(--err); font-size: 12px; padding: 8px 10px; border: 1px solid var(--err); background: #fbeeee; margin-bottom: 8px; }
  .vw-ok { color: var(--ok); font-size: 12px; padding: 8px 10px; border: 1px solid var(--ok); background: #eef5ec; margin-top: 10px; }
  .vw-ok code, .vw-err code { font-family: 'JetBrains Mono', monospace; font-size: 11px; word-break: break-all; }

  .vw-confirm > div { font-size: 12.5px; margin-bottom: 6px; color: var(--ink-2); }
  .vw-ck { display: inline-block; min-width: 38px; color: var(--muted); font-size: 11px; }
  .vw-msg-prev {
    margin: 4px 0 0; background: var(--bg); border: 1px solid var(--border); padding: 8px 10px;
    font-family: inherit; font-size: 12.5px; white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow: auto;
  }

/* ── 群聊记录：左侧群列表 + 右侧聊天气泡 ─────────────────────── */
.vwc-wrap { display: grid; grid-template-columns: 260px 1fr; gap: 12px; align-items: stretch; height: 560px; }
.vwc-left { display: flex; flex-direction: column; min-height: 0; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
.vwc-search { border: none; border-bottom: 1px solid var(--border); background: var(--bg); padding: 8px 10px; font-size: 12.5px; font-family: inherit; }
.vwc-search:focus { outline: none; background: var(--bg-card); }
.vwc-groups { flex: 1; overflow-y: auto; }
.vwc-hint { padding: 16px; font-size: 12.5px; }
.vwc-group { padding: 9px 12px; border-bottom: 1px solid var(--border); cursor: pointer; }
.vwc-group:hover { background: var(--bg-accent); }
.vwc-group.sel { background: var(--bg-accent); box-shadow: inset 3px 0 0 var(--accent-2, #d97533); }
.vwc-g-name { font-size: 13px; font-weight: 600; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vwc-g-meta { display: flex; justify-content: space-between; margin-top: 3px; font-size: 11px; color: var(--muted); }
.vwc-g-time { color: var(--muted); }

.vwc-right { display: flex; flex-direction: column; min-height: 0; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; background: var(--bg); }
.vwc-chat-head { flex: 0 0 auto; padding: 9px 14px; border-bottom: 1px solid var(--border); background: var(--bg-card);
  font-size: 13.5px; font-weight: 700; color: var(--ink); display: flex; align-items: center; gap: 10px; }
.vwc-cnt { font-size: 11px; font-weight: 400; color: var(--muted); }
.vwc-chat-head .vwc-cnt:last-child { margin-left: auto; }
.vwc-msgs { flex: 1; overflow-y: auto; padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; }
/* 一条消息：昱AI(self) 靠右、群成员(other) 靠左 */
.vwc-row { display: flex; flex-direction: column; max-width: 72%; }
.vwc-row.other { align-self: flex-start; align-items: flex-start; }
.vwc-row.self { align-self: flex-end; align-items: flex-end; }
.vwc-meta { font-size: 10.5px; color: var(--muted); margin-bottom: 3px; padding: 0 4px; }
.vwc-t { color: var(--muted); }
.vwc-bubble { font-size: 13px; line-height: 1.6; padding: 8px 12px; border-radius: 12px; white-space: pre-wrap; word-break: break-word; }
.vwc-row.other .vwc-bubble { background: var(--bg-card); border: 1px solid var(--border); color: var(--ink); border-top-left-radius: 3px; }
.vwc-row.self .vwc-bubble { background: #d6ebd3; border: 1px solid #b0d3ab; color: #1c3a17; border-top-right-radius: 3px; }
.vwc-row.atbot .vwc-bubble { box-shadow: 0 0 0 2px #f0b866; }
.vwc-media { color: var(--muted); font-style: italic; }
.vwc-staff { font-size: 9.5px; background: var(--bg-accent); border: 1px solid var(--border); border-radius: 3px; padding: 0 3px; color: var(--ink-2); }
.vwc-atbot { font-size: 9.5px; background: #f0b866; color: #5a3a00; border-radius: 3px; padding: 0 4px; font-weight: 700; }
@media (max-width: 860px) {
  .vwc-wrap { grid-template-columns: 1fr; height: auto; }
  .vwc-left { max-height: 220px; }
  .vwc-right { height: 420px; }
}

/* ── 询单分析 Tab ───────────────────────────────────────────── */
/* 企微联系人选择器（绑定商务用，点选不手打） */
.wxp-bar { display: flex; gap: 8px; align-items: center; }
.wxp-bar input { flex: 1; min-width: 0; border: 1px solid var(--border-strong); background: var(--bg);
  padding: 7px 10px; font-size: 13px; font-family: inherit; }
.wxp-bar input:focus { border-color: var(--accent); background: #fff; outline: none; }
.wxp-hint { font-size: 11.5px; color: var(--muted); margin: 8px 0 6px; }
.wxp-list { max-height: 46vh; overflow-y: auto; border: 1px solid var(--border); }
.wxp-row { display: flex; align-items: center; gap: 10px; padding: 8px 10px; cursor: pointer;
  border-bottom: 1px solid var(--border); }
.wxp-row:last-child { border-bottom: none; }
.wxp-row:hover { background: var(--bg-accent); }
.wxp-row.on { background: var(--bg-accent); }
.wxp-ava { width: 30px; height: 30px; border-radius: 50%; flex: none; object-fit: cover; background: var(--border); }
.wxp-ava.fb { display: flex; align-items: center; justify-content: center; font-size: 13px; color: var(--ink-2); }
.wxp-txt { min-width: 0; flex: 1; }
.wxp-name { font-size: 13px; color: var(--ink); }
.wxp-name b { color: var(--accent); font-size: 11px; }
.wxp-sub { font-size: 11px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wxp-empty, .wxp-err { padding: 22px 12px; text-align: center; font-size: 12.5px; color: var(--muted); }
.wxp-err { color: var(--err); }
.wxp-err a { color: var(--accent); }
.wxp-foot { margin-top: 10px; display: flex; justify-content: flex-end; }

/* 经纪人别名（达人群发 Tab；弹窗列表复用上面的 wxp-*） */
.vwba-row { display: flex; align-items: flex-start; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.vwba-row:last-child { border-bottom: none; }
.vwba-broker { flex: none; min-width: 88px; font-size: 13px; font-weight: 600; color: var(--ink);
  padding-top: 3px; white-space: nowrap; }
.vwba-names { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.vwba-chip { display: inline-flex; align-items: center; gap: 2px; font-size: 12px; color: var(--ink);
  background: var(--bg-accent); border: 1px solid var(--border); padding: 2px 4px 2px 9px; }
.vwba-x { border: none; background: none; cursor: pointer; color: var(--muted); font-size: 13px;
  line-height: 1; padding: 2px 5px; }
.vwba-x:hover { color: var(--err); }
.vwba-del { flex: none; }

/* 「AI 回复」Tab：建议 vs 实发对照列表 */
.airep-item { padding: 9px 0; border-bottom: 1px solid var(--border); }
.airep-item:last-child { border-bottom: none; }
.airep-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.airep-badge { display: inline-block; font-size: 10.5px; font-weight: 700; padding: 1px 7px; border-radius: 3px; }
.airep-badge.asis { color: #fff; background: var(--accent); }
.airep-badge.edited { color: #7a4c00; background: #ffd479; }
.airep-badge.custom { color: #fff; background: var(--err); }
.airep-badge.ignored { color: var(--ink-2); background: var(--border); }
.airep-line { font-size: 12.5px; line-height: 1.6; margin: 2px 0; word-break: break-word; }
.airep-k { color: var(--muted); font-size: 11.5px; }
.airep-final { background: var(--bg-accent); padding: 2px 6px; border-left: 3px solid var(--accent-2, #d97533); }
.airep-days.active { border-color: var(--accent); color: var(--accent); font-weight: 700; }

.iqa-toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }
.iqa-toolbar select { padding: 5px 8px; border: 1px solid var(--border-strong); background: var(--bg); font-size: 12.5px; }
.iqa-kpis { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-bottom: 16px; }
.iqa-kpi { border: 1px solid var(--border); background: var(--bg-card); padding: 12px 14px; }
.iqa-kpi-v { font-size: 22px; font-weight: 700; color: var(--accent); line-height: 1.1; }
.iqa-kpi-l { font-size: 12px; color: var(--ink); margin-top: 4px; }
.iqa-kpi-s { font-size: 10.5px; color: var(--muted); margin-top: 2px; }
.iqa-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 14px; }
.iqa-card { border: 1px solid var(--border); background: var(--bg-card); padding: 12px 14px; }
.iqa-card h4 { margin: 0 0 10px; font-size: 13px; color: var(--ink); }
.iqa-bars { display: flex; flex-direction: column; gap: 6px; }
.iqa-bar-row { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.iqa-bar-name { width: 90px; flex: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ink-2); }
.iqa-bar-track { flex: 1; height: 12px; background: var(--bg-accent); border-radius: 2px; overflow: hidden; }
.iqa-bar-fill { display: block; height: 100%; background: var(--accent); }
.iqa-bar-val { width: 92px; flex: none; text-align: right; color: var(--muted); font-size: 11px; }
.iqa-funnel { display: flex; flex-direction: column; gap: 6px; }
.iqa-fn-row { display: flex; align-items: center; gap: 8px; }
.iqa-fn-stage { width: 64px; flex: none; font-size: 12px; color: var(--ink-2); }
.iqa-fn-bar { background: var(--accent); color: #fff; font-size: 12px; padding: 4px 8px; border-radius: 2px; min-width: 28px; text-align: right; }
.iqa-fn-conv { width: 44px; flex: none; font-size: 11.5px; text-align: right; }
.iqa-table { width: 100%; margin-top: 4px; }
.iqa-table th, .iqa-table td { font-size: 12px; padding: 5px 8px; }
.iqa-table td:first-child { max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 900px) { .iqa-kpis { grid-template-columns: repeat(2, 1fr); } .iqa-2col { grid-template-columns: 1fr; } }

/* 卡片接单分析（复用 iqa-*，补：时间窗条 / 每日堆叠柱 / 状态 pill / 明细折叠） */
#csRoot .iqa-kpis { grid-template-columns: repeat(auto-fit, minmax(108px, 1fr)); }
.cs-win-bar { display: inline-flex; gap: 4px; flex-wrap: wrap; }
/* 这份数据是缓存的还是刚算的。跟紧挨着的「刷新」按钮(.btn.ghost.xs)对齐：
   同 11.5px、同透明底、同 5px 10px 内边距，只是边框用弱一档的 --border 表示"不可点"。
   不用绿色标肯定值（约束 11）。后台无深色主题，只需对齐浅色。 */
.cs-freshness { font-size: 11.5px; padding: 5px 10px; background: transparent;
  border: 1px solid var(--border); color: var(--muted); white-space: nowrap;
  display: inline-flex; align-items: center; }
.cs-win.active { background: var(--accent); color: #fff; border-color: var(--accent); }
.cs-daily { display: flex; align-items: flex-end; gap: 6px; height: 108px; padding-top: 6px; overflow-x: auto; }
.cs-day { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 20px; }
.cs-day-col { display: flex; flex-direction: column; justify-content: flex-end; width: 18px; height: 80px;
  background: var(--bg); border-radius: 2px; overflow: hidden; }
.cs-seg { width: 100%; display: block; }
.cs-day-lbl { font-size: 10px; color: var(--muted); white-space: nowrap; }
.cs-status { font-size: 11.5px; font-weight: 500; }
.cs-detail > summary { cursor: pointer; font-size: 13px; font-weight: 500; color: var(--ink); }
.cs-detail > summary a { font-size: 12px; font-weight: 400; }
/* 卡片链接点击 / 打开 IP（2026-09-11）：沿用 .iqa-table 的 12px 表格；小计行与属地分布同 muted 小字 */
.cs-sub { font-size: 12px; color: var(--ink-2); margin: 10px 0 6px; line-height: 1.8; }
.cs-chip { display: inline-block; margin: 0 4px 2px 0; padding: 0 7px; border: 1px solid var(--border);
  background: var(--bg-card); font-size: 11.5px; color: var(--ink-2); white-space: nowrap; }
.cs-chip b { font-family: 'JetBrains Mono', monospace; font-weight: 600; color: var(--ink); }
.iqa-table td.num, .iqa-table th.num { text-align: right; white-space: nowrap; }
.iqa-table td.mono { font-family: 'JetBrains Mono', monospace; font-size: 11.5px; white-space: nowrap; }
.iqa-table td.cs-url { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 好友推荐 Tab（复用 iqa-*/cs-win-bar，补：双色日柱 / 线索筛选条 / 就地编辑列） */
#shRoot .iqa-kpis { grid-template-columns: repeat(auto-fit, minmax(108px, 1fr)); }
.sh-win.active { background: var(--accent); color: #fff; border-color: var(--accent); }
.sh-daily { display: flex; align-items: flex-end; gap: 7px; height: 108px; padding-top: 6px; overflow-x: auto; }
.sh-day { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 22px; }
.sh-day-col { display: flex; align-items: flex-end; justify-content: center; gap: 2px; height: 80px; }
.sh-bar { width: 8px; display: block; border-radius: 2px 2px 0 0; min-height: 2px; }
.sh-day-lbl { font-size: 10px; color: var(--muted); white-space: nowrap; }
.sh-chk { font-size: 12px; color: var(--muted); display: inline-flex; align-items: center; gap: 4px; cursor: pointer; }
/* 新线索群推送设置条 */
.sh-notify { display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  padding: 9px 12px; margin-bottom: 14px; background: var(--bg);
  border: 1px solid var(--border); border-radius: 8px; }
.sh-notify .sh-chk { color: var(--ink); font-size: 12.5px; }
.sh-notify select { padding: 5px 9px; border: 1px solid var(--border-strong);
  background: var(--bg-card); color: var(--ink); font-size: 12.5px; border-radius: 6px;
  max-width: 300px; }
.sh-roomq { width: 130px; padding: 5px 9px; border: 1px solid var(--border-strong);
  background: var(--bg-card); color: var(--ink); font-size: 12.5px; border-radius: 6px; }
.sh-cur-room { font-size: 12.5px; color: var(--muted); }
.sh-cur-room b { color: var(--ink); }
.sh-filter { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 8px 0 10px; }
.sh-filter select, .sh-filter input { padding: 5px 9px; border: 1px solid var(--border-strong);
  background: var(--bg-card); color: var(--ink); font-size: 12.5px; border-radius: 6px; }
.sh-filter input { min-width: 190px; }
/* 列一多表就比卡片宽（备注列被挤到标题竖排、整张表溢出到卡片外面）。
   统一包一层横向滚动容器：表按自然宽度排，容器里滑，绝不撑破卡片。 */
.sh-tblwrap { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; }
.sh-tblwrap > table { min-width: 100%; }
.sh-lead-table td { white-space: nowrap; }
/* 项目列：可点的项目名 + 「看分享页」按钮 + 截止倒计时小字
   （倒计时由服务端按北京时间算好，前端只上色） */
.sh-proj-row { display: flex; align-items: center; gap: 6px; }
.sh-proj-n { background: none; border: none; padding: 0; font: inherit; font-weight: 500;
  color: var(--accent); cursor: pointer; text-align: left; max-width: 190px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sh-proj-n:hover { text-decoration: underline; }
/* 分享页查看弹窗：上面一条真实链接，下面 iframe 就是好友看到的页面 */
.sh-view-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.sh-view-link { flex: 1; min-width: 220px; font-size: 11.5px; background: var(--bg);
  border: 1px solid var(--border); padding: 5px 8px; word-break: break-all; }
.sh-view-note { font-size: 11.5px; margin-bottom: 10px; line-height: 1.6; }
.sh-viewframe { display: block; width: 100%; height: min(68vh, 660px);
  border: 1px solid var(--border); background: #f3f5f9; }
.sh-ddl { display: inline-block; margin-top: 2px; font-size: 11px; color: var(--muted); }
/* 阈值按本业务真实尺度：DDL 常只有几小时 → 6 小时内转橙、2 小时内/已截止转红
   （见 share.py _DDL_URGENT_SEC/_DDL_SOON_SEC；用通用的"3天/24小时"会全红等于没标） */
.sh-ddl.soon { color: var(--accent-2, #d97533); font-weight: 600; }
.sh-ddl.urgent, .sh-ddl.over { color: var(--err); font-weight: 600; }
/* 手机号/备注：点一下复制、双击就改，别做多步弹窗（用户偏好） */
.sh-phone { cursor: pointer; font-variant-numeric: tabular-nums; }
.sh-phone:hover { color: var(--accent); text-decoration: underline; }
.sh-remark { cursor: text; max-width: 200px; overflow: hidden; text-overflow: ellipsis; }
/* 经纪人：双击改派；专属链接：点一下复制 */
.sh-broker { cursor: cell; }
.sh-broker:hover { color: var(--accent); }
.sh-bklink { cursor: pointer; font-size: 11.5px; max-width: 340px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.sh-bklink:hover { color: var(--accent); text-decoration: underline; }
.sh-st { padding: 3px 6px; border: 1px solid var(--border-strong); background: var(--bg-card);
  color: var(--ink); font-size: 12px; border-radius: 5px; }
/* UA 很长，列内截断，悬停 title 看全 */
.sh-ua { max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: 11px; color: var(--muted); }


/* ===== 消息通知 Tab（复用 --bg-card/--ink/--muted/--border/--accent/--err；避开绿色标肯定值） ===== */
.notif-root { padding: 4px 2px; }
.notif-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 12px; }
.notif-sel, .notif-q { padding: 6px 10px; border: 1px solid var(--border-strong); border-radius: 8px;
  background: var(--bg-card); color: var(--ink); font-size: 13px; }
.notif-q { min-width: 180px; flex: 0 1 220px; }
.notif-stat { margin-left: auto; font-size: 12.5px; color: var(--muted); }
.notif-list { display: flex; flex-direction: column; gap: 8px; }
.notif-empty { padding: 28px; text-align: center; color: var(--muted); font-size: 13px; }
.notif-empty.err { color: var(--err); }
.notif-item { display: flex; gap: 11px; padding: 11px 13px; border: 1px solid var(--border);
  border-left: 3px solid var(--border-strong); border-radius: 10px; background: var(--bg-card); }
.notif-item.nt-accept { border-left-color: var(--accent); }
.notif-item.nt-decline { border-left-color: var(--err); }
.notif-item.nt-reply { border-left-color: #4b83c4; }
.notif-ico { font-size: 20px; line-height: 1.2; flex: none; }
.notif-main { flex: 1 1 auto; min-width: 0; }
.notif-head { display: flex; align-items: center; gap: 8px; margin-bottom: 3px; }
.notif-title { font-weight: 700; font-size: 13.5px; color: var(--ink); }
.notif-push { font-size: 11px; padding: 1px 7px; border-radius: 999px; border: 1px solid var(--border-strong);
  color: var(--muted); white-space: nowrap; }
.notif-push.np-sent { color: var(--accent); border-color: var(--accent); }
.notif-push.np-failed { color: var(--err); border-color: var(--err); }
.notif-push.np-skipped { color: var(--muted); }
.notif-push.np-pending { color: #b9820a; border-color: #e6c07a; }
.notif-body { font-size: 12.8px; color: var(--ink); line-height: 1.55; white-space: normal;
  word-break: break-word; }
.notif-err { margin-top: 4px; font-size: 11.5px; color: var(--err); }
.notif-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-top: 6px; font-size: 11.5px; color: var(--muted); }
/* 正文里的网址：让人一眼看出可点（后台是审计视图，正文要跟真实私信逐字一致） */
.notif-link { color: var(--accent); text-decoration: none; word-break: break-all; }
.notif-link:hover { text-decoration: underline; }
/* 一键进群：存量通知正文里没有链接，靠这个按钮也能进 */
.notif-chat {
  margin-left: auto; flex: none; text-decoration: none;
  font-size: 11.5px; line-height: 1; padding: 4px 9px; border-radius: 6px;
  border: 1px solid var(--border-strong); background: var(--bg-card); color: var(--ink-2);
}
.notif-chat:hover { border-color: var(--accent); color: var(--accent); }
.notif-stat .np-sent { color: var(--accent); }
.notif-stat .np-failed { color: var(--err); }
.notif-stat .np-skipped { color: var(--muted); }
.notif-stat .np-pending { color: #b9820a; }


/* 发版后提示刷新的浮条（frontend/js/shared/version-check.js）。
   固定右下角、不遮挡操作区；刻意做得克制——它只是提示，不是警报。 */
#verUpdateBar { position: fixed; right: 18px; bottom: 18px; z-index: 9999;
  display: flex; align-items: center; gap: 10px; padding: 10px 12px 10px 14px;
  border: 1px solid var(--border-strong); border-radius: 10px; background: var(--bg-card);
  box-shadow: 0 6px 20px -8px rgba(0,0,0,.28); font-size: 13px; color: var(--ink); }
#verUpdateBar .vu-txt { white-space: nowrap; }
#verUpdateBar .vu-btn { padding: 5px 12px; border: none; border-radius: 7px;
  background: var(--accent); color: #fff; font-size: 12.5px; font-weight: 700;
  cursor: pointer; white-space: nowrap; font-family: inherit; }
#verUpdateBar .vu-x { border: none; background: transparent; color: var(--muted);
  cursor: pointer; font-size: 13px; padding: 2px 4px; line-height: 1; }
@media (max-width: 640px) {
  #verUpdateBar { left: 12px; right: 12px; bottom: 12px; justify-content: space-between; }
  #verUpdateBar .vu-txt { white-space: normal; }
}

/* ── 更新日志（后台专用时间线）─────────────────────────────── */
.chlog-form { border: 1px solid var(--border-strong); background: var(--bg-card); padding: 12px; margin-bottom: 16px; }
.chlog-form-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 8px; }
.chlog-in { border: 1px solid var(--border-strong); background: var(--bg); padding: 6px 9px;
  font-size: 12.5px; font-family: inherit; box-sizing: border-box; }
.chlog-in:focus { border-color: var(--accent); outline: none; }
.chlog-ta { width: 100%; min-height: 96px; line-height: 1.7; resize: vertical; margin-bottom: 8px; }

/* 时间线：左侧一条竖线，按日期分组 */
.chlog-tl { position: relative; padding-left: 14px; }
.chlog-tl::before { content: ''; position: absolute; left: 3px; top: 6px; bottom: 6px;
  width: 1px; background: var(--border); }
.chlog-day { margin-bottom: 18px; }
.chlog-day-h { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.chlog-dot { position: absolute; left: 0; width: 7px; height: 7px; border-radius: 50%;
  background: var(--accent); margin-top: 5px; }
.chlog-date { font-size: 12px; color: var(--ink-2); font-weight: 700; }
.chlog-items { display: flex; flex-direction: column; gap: 8px; }
.chlog-item { border: 1px solid var(--border); background: var(--bg-card); padding: 9px 11px; }
.chlog-item-h { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.chlog-cat { font-size: 10.5px; font-weight: 700; padding: 1px 7px; border-radius: 3px; flex: none; }
.chlog-feat { color: #fff; background: var(--accent); }
.chlog-impr { color: #7a4c00; background: #ffd479; }
.chlog-fix  { color: #fff; background: var(--err); }
.chlog-ops  { color: var(--ink-2); background: var(--border); }
.chlog-ver { font-size: 11px; color: var(--muted); flex: none; }
.chlog-title { font-size: 13px; font-weight: 600; color: var(--ink); flex: 1 1 auto; min-width: 120px; }
.chlog-acts { display: flex; gap: 4px; flex: none; }
.chlog-body { margin-top: 6px; }
.chlog-line { font-size: 12.5px; line-height: 1.75; color: var(--ink-2);
  padding-left: 11px; position: relative; word-break: break-word; white-space: pre-wrap; }
.chlog-line::before { content: '·'; position: absolute; left: 2px; color: var(--muted); }
.chlog-meta { margin-top: 6px; font-size: 10.5px; color: var(--muted); }

/* 群聊记录里的图片缩略图 + 大图浮层（与商务端同款观感） */
.vwc-msg-img { max-width: 200px; max-height: 200px; border-radius: 6px; display: block;
  border: 1px solid var(--border); background: var(--bg); cursor: zoom-in; object-fit: cover; }
.vwc-msg-img:hover { border-color: var(--accent); }
.vwc-imgviewer { position: fixed; inset: 0; z-index: 9999; background: rgba(0,0,0,.82);
  display: flex; align-items: center; justify-content: center; cursor: zoom-out; padding: 24px; }
.vwc-imgviewer img { max-width: 94vw; max-height: 94vh; object-fit: contain; }

/* ════════ 催办 · AI 开关（2026-08-05）════════
   这两块都会让系统在没人看着时真发消息/真花钱，所以"当前是开是关"必须一眼可见。 */
.ap-sec { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px;
  padding: 16px 18px; margin-bottom: 16px; }
.ap-sec-t { font-size: 15px; font-weight: 700; color: var(--ink); margin-bottom: 6px; }
.ap-sec-note { font-size: 12.5px; color: var(--muted); line-height: 1.7; margin-bottom: 12px; }
.ap-row { display: flex; align-items: center; gap: 10px; margin: 10px 0; font-size: 13px; }
.ap-row.ap-col { flex-direction: column; align-items: stretch; gap: 5px; }
.ap-row input[type=number] { width: 78px; padding: 5px 8px; border: 1px solid var(--border-strong);
  background: var(--bg); font-size: 13px; }
.ap-row textarea { width: 100%; padding: 9px 11px; border: 1px solid var(--border-strong);
  background: var(--bg); font: inherit; font-size: 13px; line-height: 1.7; resize: vertical; }
/* 开关：拨动式，比复选框更像"总闸" */
.ap-switch { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; user-select: none; }
.ap-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.ap-slider { width: 40px; height: 22px; border-radius: 999px; background: var(--border-strong);
  position: relative; transition: background .18s; flex: none; }
.ap-slider::after { content: ''; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px;
  border-radius: 50%; background: #fff; transition: transform .18s; }
.ap-switch input:checked + .ap-slider { background: var(--accent); }
.ap-switch input:checked + .ap-slider::after { transform: translateX(18px); }
.ap-switch input:focus-visible + .ap-slider { outline: 2px solid var(--accent); outline-offset: 2px; }
.ap-label { font-size: 13px; font-weight: 600; color: var(--ink-2); }
/* 命中预览：开之前就看清会发给谁 */
.ap-preview { margin: 12px 0; padding: 10px 12px; background: var(--bg); border-radius: 6px;
  border-left: 3px solid var(--accent); font-size: 12.5px; }
.ap-preview-empty { border-left-color: var(--border-strong); color: var(--muted); }
.ap-preview-t { margin-bottom: 6px; color: var(--ink-2); }
.ap-preview-row { display: flex; gap: 10px; padding: 3px 0; align-items: baseline; flex-wrap: wrap; }
.ap-pv-name { font-weight: 600; color: var(--ink); }
.ap-pv-proj { color: var(--ink-2); }
.ap-pv-ddl { color: var(--muted); font-size: 11.5px; }
.ap-actions { display: flex; align-items: center; gap: 10px; margin-top: 12px; flex-wrap: wrap; }
.ap-log { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.ap-log th, .ap-log td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--border); }
.ap-log th { color: var(--muted); font-weight: 600; font-size: 11.5px; }
.ap-bad { color: var(--err); cursor: help; }

/* ── 催办效果统计（2026-08-30 事故后加）。沿用本页既有的 .ap-* 风格：
      卡片底 var(--bg-card)、表头 muted 小字、分隔线 var(--border)。 ── */
.ap-stats { margin: 10px 0 4px; }
/* 与本页 .ap-log 同款：朴素无外框，只靠行分隔线 */
.ap-st-tb { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.ap-st-tb th { text-align: left; padding: 6px 8px; font-size: 11.5px; font-weight: 600;
  color: var(--muted); border-bottom: 1px solid var(--border); white-space: nowrap; }
.ap-st-tb td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
.ap-st-tb tbody tr:last-child td { border-bottom: none; }
.ap-st-tb tbody tr:last-child { background: var(--bg-accent); }   /* 「全部」那行压个底色区分 */
.ap-st-tb td:first-child { font-weight: 600; color: var(--ink-2); white-space: nowrap; }
.ap-st-good { color: var(--ok, #426b2f); }
.ap-st-low { color: var(--muted); }

/* 近 14 天发出量迷你柱图 */
.ap-spark { display: flex; align-items: flex-end; gap: 3px; height: 40px; margin: 10px 0 4px;
  padding: 0 2px; position: relative; }
.ap-spark i { flex: 1; min-width: 4px; background: var(--accent); opacity: .78; border-radius: 2px 2px 0 0;
  cursor: help; transition: opacity .12s; }
.ap-spark i:hover { opacity: 1; }
.ap-spark-cap { position: absolute; right: 0; top: -14px; font-size: 10.5px; color: var(--muted); }
.ap-st-note { font-size: 11.5px; color: var(--muted); line-height: 1.75; margin-top: 10px;
  background: var(--bg); border-left: 3px solid var(--border-strong); padding: 7px 10px; }
.ap-st-note b { color: var(--ink-2); }

/* 催办明细：搜索条 + 分页。输入框沿用本页 .ap-row input 的边框与圆角 */
.ap-log-bar { display: flex; align-items: center; gap: 8px; margin: 8px 0 6px; flex-wrap: wrap; }
/* 圆角与字号对齐本页既有的 .ap-row input（直角、13px）—— 页面里所有输入框长一样 */
.ap-log-q { flex: 1; min-width: 180px; max-width: 300px; padding: 5px 9px; font-size: 13px;
  border: 1px solid var(--border-strong); background: var(--bg); color: var(--ink); }
.ap-log-q:focus { outline: none; border-color: var(--accent); }
.ap-log-st { padding: 5px 8px; font-size: 13px; border: 1px solid var(--border-strong);
  background: var(--bg); color: var(--ink); }
.ap-log td.ap-room { max-width: 150px; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; color: var(--muted); font-size: 11.5px; }
.ap-log td:nth-child(2), .ap-log td:nth-child(3) { max-width: 170px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.ap-dim { color: var(--muted); font-size: 11px; }
.ap-pager { display: flex; align-items: center; justify-content: center; gap: 12px; margin-top: 10px; }

@media (max-width: 768px), (max-height: 500px) {
  .ap-st-tb { font-size: 11.5px; }
  .ap-st-tb th, .ap-st-tb td { padding: 5px 6px; }
  .ap-log-q { max-width: none; }
  /* 窄屏藏掉「群」列，它最长且最不常看 */
  .ap-log th:nth-child(4), .ap-log td:nth-child(4) { display: none; }
}

/* ===== 客户分析 Tab（复用 iqa-*/cs-win-bar；补：口径提示条 + 横向条形榜 + 痛点列表） ===== */
#cuRoot .iqa-kpis { grid-template-columns: repeat(auto-fit, minmax(108px, 1fr)); }
.cu-win.active { background: var(--accent); color: #fff; border-color: var(--accent); }
/* 口径提示：这块必须显眼——不标口径的话「客户/品牌」「多选品类」一定会被读错 */
.cu-note { padding: 10px 13px; margin-bottom: 14px; font-size: 12px; line-height: 1.85;
  background: var(--bg-accent); border: 1px dashed var(--border-strong); border-radius: 8px;
  color: var(--muted); }
.cu-note b { color: var(--ink); }
.cu-bars { display: flex; flex-direction: column; gap: 6px; padding: 4px 0; }
.cu-bar-row { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.cu-bar-nm { flex: 0 0 116px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--ink); }
.cu-bar-track { flex: 1 1 auto; height: 12px; background: var(--bg); border: 1px solid var(--border); }
.cu-bar-fill { display: block; height: 100%; background: var(--accent); }
.cu-bar-v { flex: 0 0 66px; text-align: right; color: var(--muted);
  font-family: 'JetBrains Mono', monospace; font-size: 11px; }
.cu-pain { margin: 4px 0 0; padding-left: 18px; font-size: 12.5px; line-height: 1.9; color: var(--ink); }

/* ========== 全站悬停提示（js/shared/tooltip.js 接管原生 title）==========
   原生 title 要等 1~2 秒才出来且样式不可控，全站 290+ 处都吃这个亏。
   这里只负责长相；"立刻出现/离开消失"的行为在那个 js 里。 */
.tt-pop {
  position: fixed; z-index: 9999; left: 0; top: 0;
  max-width: 340px; padding: 7px 10px;
  font-size: 12.5px; line-height: 1.65; color: var(--ink, #1a1a1a);
  background: var(--bg-card, #fbf8f1);
  border: 1px solid var(--border-strong, #b8a986); border-radius: 8px;
  box-shadow: 0 6px 20px rgba(0, 0, 0, .13);
  /* title 里原本靠 \n 分行的提示（返点差异说明那类）要继续分行；长词也得断得掉 */
  white-space: pre-line; word-break: break-word;
  opacity: 0; visibility: hidden; pointer-events: none;   /* 不吃鼠标，否则会挡住下面的元素 */
  transition: opacity .09s ease;
}
.tt-pop.tt-on { opacity: 1; visibility: visible; }

/* ── 飞书一键登录（与商务前端 styles.css 同款；后台不引那份，故复制一份）── */
.lark-btn{display:flex;align-items:center;justify-content:center;gap:8px;
  background:#3370FF;color:#fff;border:1px solid #3370FF;font-weight:600;
  padding:10px 14px;border-radius:8px;cursor:pointer;transition:.12s}
.lark-btn:hover:not(:disabled){background:#245bdb;border-color:#245bdb;color:#fff}
.lark-ico{width:17px;height:17px;flex:none;background:no-repeat center/contain;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M4.3 5.6c-.5-.4-.3-1.2.4-1.2h13.1c.5 0 .9.3 1 .8l1.5 5.2c-3 1-6.2.3-8.6-1.7L4.3 5.6z'/%3E%3Cpath d='M3.2 9.4c-.4-.5 0-1.2.6-1.1l6.3 1.1c2.9 2.4 6.8 3.1 10.3 1.9l.6 2.1c-5 3.6-11.9 2.6-15.7-2.3l-2.1-1.7z'/%3E%3Cpath d='M2.6 14.6c-.5-.3-.3-1.1.3-1.1l4.4.2c4.4 4 11 4.4 15.9 1l-3.6 4.4c-1 1.2-2.7 1.5-4.1.8l-12.9-5.3z'/%3E%3C/svg%3E")}
.lark-or{display:flex;align-items:center;gap:10px;margin:14px 0 2px;
  font-size:11.5px;color:var(--muted)}
.lark-or::before,.lark-or::after{content:'';flex:1;height:1px;background:var(--border)}

/* ── 登录安全面板（用户管理页底部）────────────────────────────── */
.ls-sec{margin-top:26px;padding-top:18px;border-top:2px solid var(--border-strong)}
.ls-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.ls-head h3{margin:0;font-size:16px;font-weight:500}
.ls-days{padding:4px 8px;border:1px solid var(--border-strong);background:var(--bg);font-size:12px}
.ls-kpis{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.ls-kpi{flex:1;min-width:96px;border:1px solid var(--border);background:var(--bg-card);
  padding:9px 12px;text-align:center}
.ls-kpi b{display:block;font-size:20px;font-weight:800;line-height:1.25;color:var(--ink)}
.ls-kpi span{font-size:11px;color:var(--muted)}
.ls-kpi-bad b{color:var(--err)}
.ls-kpi-bad{border-color:#e5a3a3;background:#fff5f5}
.ls-policy{font-size:12px;line-height:1.8;color:var(--ink-2);background:var(--bg-accent);
  border:1px solid var(--border);padding:9px 12px;margin-bottom:12px}
.ls-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.ls-card{border:1px solid var(--border);background:var(--bg-card);padding:10px 12px}
.ls-t{font-size:12.5px;font-weight:700;margin-bottom:7px;color:var(--ink)}
.ls-tb{width:100%;border-collapse:collapse;font-size:12px}
.ls-tb th{text-align:left;font-weight:600;color:var(--muted);font-size:11px;
  padding:4px 6px;border-bottom:1px solid var(--border)}
.ls-tb td{padding:4px 6px;border-bottom:1px solid var(--border);vertical-align:top}
.ls-num{text-align:right;font-family:'JetBrains Mono',monospace}
.ls-hot{color:var(--err);font-weight:800}
.ls-dim{color:var(--muted);font-size:11px}
.ls-ua{max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ls-empty{color:var(--muted);text-align:center;padding:14px 0;font-size:12px}
.ls-scroll{max-height:320px;overflow:auto}
.ls-tag{font-size:10px;color:#8a5a00;background:#fef3c7;border:1px solid #f4dfa0;
  border-radius:5px;padding:0 4px;white-space:nowrap}
.ls-badge{font-size:10.5px;color:var(--muted)}
.ls-badge-bad{font-size:10.5px;color:#8b2c2c;background:#fdeaea;border:1px solid #f0c4c4;
  border-radius:5px;padding:0 5px;white-space:nowrap}
.ls-blocked td{background:#fffafa}
@media (max-width:768px),(max-height:500px){
  .ls-grid{grid-template-columns:1fr}
  .ls-ua{display:none}          /* 手机上 UA 太长，藏掉；点开明细仍可悬停看 */
  .ls-tb th:last-child,.ls-tb td:last-child{display:none}
}

/* ── 卡片接单分析：真·漏斗 + 响应时效 ──────────────────────────────
   独立一套 cs-fn-*，不动 iqa-fn-*（询单分析还在用那套左对齐条形）。 */
.cs-funnel{display:flex;flex-direction:column;padding:4px 0 2px}
/* 每层是「梯形 | 留存」两列。留存单列占位、不再压在梯形上（以前 absolute right:0，
   梯形宽到 100% 时会把"86% 留存"盖掉半个字）。梯形列恒为 1fr，
   所有层共用同一条中轴，上下沿才对得齐。 */
.cs-fn-row,.cs-fn-gap{display:grid;grid-template-columns:1fr 58px;align-items:center}
/* 梯形本体铺满整列，形状全由内联 clip-path 决定：
   上沿 = 本层占比，下沿 = 下一层占比 —— 见 11-cardsub.js::_csFunnel。
   这里**不要**再写死 clip-path 或 min-width，否则又会各层各画各的、接不上。 */
.cs-fn-seg{background:var(--accent);color:#fff;text-align:center;padding:10px;transition:.15s}
.cs-fn-seg b{display:block;font-size:17px;font-weight:800;line-height:1.15;
  font-family:'JetBrains Mono',monospace}
.cs-fn-seg span{display:block;font-size:11px;opacity:.85;margin-top:1px}
.cs-fn-dim .cs-fn-seg{opacity:.42}
/* 层间的转化率：漏斗要看的就是"这一步掉了多少"。i 是占位，撑住第二列保持对齐 */
.cs-fn-gap{text-align:center;line-height:1;padding:3px 0}
.cs-fn-conv{font-size:11.5px;font-weight:700;color:var(--muted)}
.cs-fn-ok{color:var(--ok)} .cs-fn-warn{color:var(--warn)} .cs-fn-bad{color:var(--err)}
.cs-fn-side{font-size:10.5px;color:var(--muted);white-space:nowrap;text-align:right}

.cs-rd{padding:2px 0}

/* ── 博主响应力榜 ─────────────────────────────────────────────────────
   入口按钮沿用 .btn.ghost.xs；表格沿用 .data-table（12.5px、深色表头）；
   搜索框对齐本后台其它输入框（直角、13px、--border-strong）。
   分级配色**不用绿色标"好"**（约束 11）：好=品牌深蓝，差=橙/红，中间态用灰。 */
.kr-entry { margin-top: 10px; width: 100%; justify-content: center; }
.kr-collapsed { display: none; }
.kr-note { font-size: 11.5px; color: var(--muted); line-height: 1.7; margin-bottom: 10px; }
.kr-note b { color: var(--ink-2); font-weight: 600; }

/* 分级卡片：既是概览也是筛选器，点一下筛该档 */
.kr-tiles { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
.kr-tile { display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
  padding: 8px 12px; min-width: 96px; cursor: pointer; text-align: left;
  border: 1px solid var(--border); background: var(--bg-card); font: inherit; }
.kr-tile:hover { border-color: var(--border-strong); }
.kr-tile.on { border-color: var(--accent); box-shadow: inset 0 -2px 0 var(--accent); }
.kr-tile-n { font-size: 19px; font-weight: 700; line-height: 1.1; color: var(--ink);
  font-family: 'JetBrains Mono', monospace; }
.kr-tile-l { font-size: 11.5px; color: var(--ink-2); }

.kr-bar { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
.kr-q { flex: 1; min-width: 180px; max-width: 260px; padding: 5px 9px; font-size: 13px;
  border: 1px solid var(--border-strong); background: var(--bg); color: var(--ink); }
.kr-q:focus { outline: none; border-color: var(--accent); }

/* 表头可点排序：给出手势与当前列高亮，别让人猜哪里能点 */
.kr-table th.kr-th { cursor: pointer; user-select: none; white-space: nowrap;
  text-align: right; }
.kr-table th.kr-th.l { text-align: left; }
.kr-table th.kr-th:hover { background: var(--accent); }
.kr-table th.kr-th.on { background: var(--accent); }
.kr-table tbody td { text-align: right; white-space: nowrap; }
.kr-table tbody td.l { text-align: left; }
.kr-name { display: inline-block; max-width: 160px; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; vertical-align: bottom; }
.kr-plat { font-size: 10.5px; color: var(--muted); margin-left: 5px; }
.kr-dim { color: var(--muted); font-size: 11.5px; }
.kr-sub { color: var(--muted); font-size: 10.5px; margin-left: 3px; }
.kr-good { color: var(--accent); }
.kr-bad { color: var(--err); }
.kr-none { color: var(--muted); }
.kr-more { font-size: 11.5px; color: var(--muted); padding: 8px 2px; }

/* 分数条：数字之外再给个长度，一眼看出梯度。
   轨道必须是**定宽**的：填充块写的是百分比，若直接放进 shrink-to-fit 的 flex 容器里，
   百分比没有确定基准，条会和数字叠在一起（第一版就这样）。 */
.kr-score { display: inline-flex; align-items: center; gap: 7px; }
.kr-score .kr-track { display: block; width: 46px; height: 6px; flex: none;
  background: var(--border); }
.kr-score .kr-track i { display: block; height: 100%; min-width: 2px; background: var(--accent); }
.kr-score b { font-family: 'JetBrains Mono', monospace; font-size: 12.5px;
  min-width: 26px; text-align: right; }
.kr-table td.kr-sc { min-width: 168px; }

.kr-tier { font-size: 10.5px; padding: 1px 5px; margin-left: 6px; white-space: nowrap;
  border: 1px solid transparent; }
.kr-t-ace { color: var(--accent); border-color: var(--accent); }
.kr-t-solid { color: var(--ink-2); border-color: var(--border-strong); }
.kr-t-watch { color: var(--warn); border-color: var(--warn); }
.kr-t-risk { color: var(--err); border-color: var(--err); }
.kr-t-few { color: var(--muted); border-color: var(--border); }

@media (max-width: 768px), (max-height: 500px) {
  .kr-tiles { gap: 6px; }
  .kr-tile { min-width: 78px; padding: 6px 9px; }
  .kr-tile-n { font-size: 16px; }
  .kr-table { display: block; overflow-x: auto; }
}
.cs-rd-head{font-size:11.5px;color:var(--muted);margin-bottom:8px}
.cs-rd-row{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.cs-rd-lb{flex:0 0 66px;font-size:12px;color:var(--ink-2)}
.cs-rd-bar{flex:1;height:14px;background:var(--bg);border:1px solid var(--border);
  border-radius:3px;overflow:hidden}
.cs-rd-bar i{display:block;height:100%;background:var(--accent)}
.cs-rd-n{flex:0 0 34px;text-align:right;font-size:12px;
  font-family:'JetBrains Mono',monospace;color:var(--ink)}
.cs-rd-cum{flex:0 0 46px;text-align:right;font-size:11px;color:var(--muted);cursor:help}
.cs-rd-tip{margin-top:9px;font-size:11.5px;line-height:1.75;color:var(--ink-2);
  background:var(--bg-accent);border:1px solid var(--border);padding:7px 10px}
@media (max-width:768px),(max-height:500px){
  .cs-top2{grid-template-columns:1fr}    /* 手机上漏斗与时效改上下排 */
  .cs-fn-side{display:none}              /* 窄屏放不下，藏掉不挤压漏斗 */
}

/* ===== 企微新通道 · 测试台（2026-09-12，19-wecom.js）=====
   沿用米色卡片 + .data-table；「通过」用品牌深蓝不用绿色（约束 11），失败用 --err，发送类标橙提醒撤不回。 */
#wecomRoot .muted { color: var(--muted); font-size: 11.5px; }
#wecomRoot .mono { font-size: 11.5px; }
.wc-ok { color: var(--accent); font-weight: 600; }
.wc-bad { color: var(--err); }
.wc-warn { color: var(--warn); font-size: 12px; font-weight: 600; }
.wc-status { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13px;
  padding: 10px 14px; margin-bottom: 12px; background: var(--bg-card); border: 1px solid var(--border); }
.wc-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: none; }
.wc-dot.ok { background: var(--accent); }
.wc-dot.bad { background: var(--err); }
.wc-sep { width: 1px; height: 14px; background: var(--border-strong); margin: 0 4px; }
.wc-card { background: var(--bg-card); border: 1px solid var(--border); padding: 12px 14px; margin-bottom: 12px; }
.wc-card-h { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; font-size: 13.5px; }
.wc-table { font-size: 12px; }
.wc-table td { white-space: nowrap; }
.wc-table td.num, .wc-table th.num { text-align: right; }
.wc-table td.wc-note { white-space: normal; max-width: 460px; color: var(--ink-2); }
.wc-table td[title] { max-width: 260px; overflow: hidden; text-overflow: ellipsis; }
.wc-tag { display: inline-block; font-size: 10.5px; padding: 0 5px; line-height: 17px; margin-left: 4px;
  border: 1px solid var(--border-strong); color: var(--ink-2); white-space: nowrap; vertical-align: 1px; }
.wc-tag.send { color: var(--warn); border-color: var(--warn); }
.wc-tag.ext { color: var(--accent-2); border-color: var(--accent-2); }

/* ② 会话 + 消息：左列表右消息，定高各自滚动 */
.wc-split { display: grid; grid-template-columns: 300px 1fr; height: 480px; border: 1px solid var(--border); background: var(--bg); }
.wc-convs { display: flex; flex-direction: column; border-right: 1px solid var(--border); min-height: 0; }
.wc-conv-bar { display: flex; gap: 6px; padding: 8px; border-bottom: 1px solid var(--border); }
.wc-conv-bar input { flex: 1; min-width: 0; padding: 4px 8px; font-size: 12.5px; border: 1px solid var(--border-strong); background: var(--bg-card); }
.wc-conv-list { flex: 1; overflow-y: auto; }
.wc-conv { padding: 7px 10px; border-bottom: 1px solid var(--border); cursor: pointer; border-left: 3px solid transparent; }
.wc-conv:hover { background: var(--bg-accent); }
.wc-conv.on { background: var(--bg-accent); border-left-color: var(--accent); }
.wc-conv-n { font-size: 12.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.wc-conv-n .muted { margin-left: 4px; }
.wc-conv-s { font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.wc-unread { display: inline-block; min-width: 16px; padding: 0 4px; margin-left: 4px; font-size: 10px; line-height: 16px;
  text-align: center; border-radius: 8px; background: var(--err); color: #fff; }
.wc-msgs { display: flex; flex-direction: column; min-height: 0; min-width: 0; }
.wc-msg-head { padding: 8px 12px; border-bottom: 1px solid var(--border); font-size: 12.5px; }
.wc-msg-list { flex: 1; overflow-y: auto; }
.wc-msg { padding: 6px 12px; border-bottom: 1px dashed var(--border); }
.wc-msg-meta { display: flex; align-items: center; gap: 8px; font-size: 11.5px; }
.wc-msg-meta b { font-weight: 600; color: var(--ink); }
.wc-msg-meta .wc-q { margin-left: auto; opacity: .45; }
.wc-msg:hover .wc-q { opacity: 1; }
.wc-msg-c { font-size: 13px; white-space: pre-wrap; word-break: break-word; margin-top: 2px; }
.wc-more { text-align: center; padding: 8px; }
.wc-media { margin-top: 4px; }
.wc-media img { max-width: 260px; max-height: 260px; border: 1px solid var(--border); display: block; }

/* ③④ 子页签 + 表单 */
.wc-subtabs { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
.wc-subtab { padding: 4px 11px; font-size: 12.5px; border: 1px solid var(--border-strong); background: var(--bg);
  color: var(--ink-2); cursor: pointer; font-family: inherit; }
.wc-subtab:hover { border-color: var(--accent); }
.wc-subtab.on { background: var(--accent); border-color: var(--accent); color: #fff; }
.wc-form { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: flex-end; font-size: 12.5px; }
.wc-form label { display: flex; flex-direction: column; gap: 3px; color: var(--ink-2); min-width: 220px; }
.wc-form label:has(> input[type=checkbox]) { flex-direction: row; align-items: center; min-width: 0; }
.wc-form .wide { flex-basis: 100%; }
.wc-form input:not([type=checkbox]), .wc-form select, .wc-form textarea { padding: 5px 8px; font-size: 13px;
  border: 1px solid var(--border-strong); background: var(--bg); color: var(--ink); }
.wc-form input:focus, .wc-form select:focus, .wc-form textarea:focus { border-color: var(--accent); }
.wc-form textarea { resize: vertical; font-family: inherit; }
.wc-target { flex-basis: 100%; font-size: 12.5px; padding: 6px 10px; background: var(--bg-accent); border: 1px solid var(--border); }
.wc-lbl { color: var(--ink-2); margin-bottom: 4px; }
.wc-members { display: flex; flex-wrap: wrap; gap: 6px; }
.wc-form label.wc-mem { flex-direction: row; align-items: center; gap: 4px; min-width: 0; padding: 3px 8px;
  border: 1px solid var(--border); background: var(--bg); cursor: pointer; }
.wc-quote { padding: 6px 10px; border-left: 3px solid var(--accent); background: var(--bg); font-size: 12.5px; }
.wc-result { margin-top: 10px; font-size: 12.5px; overflow-x: auto; }
.wc-result:empty { display: none; }
.wc-kv th { text-align: left; font-weight: 500; color: var(--ink-2); width: 180px; white-space: nowrap; vertical-align: top;
  padding: 6px 12px; border-top: 1px solid var(--border); }
.wc-kv td { white-space: normal !important; word-break: break-all; max-width: none !important; }
.wc-key { display: block; font-size: 10.5px; color: var(--muted); font-family: 'JetBrains Mono', monospace; }
.wc-pre { margin: 6px 0 0; padding: 8px 10px; background: var(--bg); border: 1px solid var(--border); font-size: 11px;
  font-family: 'JetBrains Mono', monospace; white-space: pre-wrap; word-break: break-all; max-height: 360px; overflow: auto; }
.wc-raw summary { cursor: pointer; font-size: 13.5px; }
.wc-raw[open] summary { margin-bottom: 10px; }

@media (max-width: 768px) {
  .wc-split { grid-template-columns: 1fr; height: auto; }
  .wc-convs { max-height: 260px; border-right: none; border-bottom: 1px solid var(--border); }
  .wc-msg-list { max-height: 420px; }
  .wc-form label { min-width: 0; flex: 1 1 100%; }
  #wcCheckTable { display: block; overflow-x: auto; }
}

/* ── 暂不考虑原因分析（2026-09-15，11-cardsub.js::_csDeclineBlock）──
   沿用 iqa-card / iqa-table；横条与响应时效分布（cs-rd-*）同一套视觉，品牌蓝不用绿色。 */
.cs-dc-sum{font-size:12.5px;color:var(--ink-2);line-height:1.8;margin-bottom:10px}
.cs-dc-sum b{color:var(--ink);font-family:'JetBrains Mono',monospace}
.cs-dc-sum .muted{font-size:11px}
/* 右边原话表格列多且不换行，1fr 1fr 会被它的最小内容宽度撑开、把左栏挤到横条宽度为 0（截图验出来的） → minmax(0,…) */
.cs-dc-top{margin-bottom:6px;grid-template-columns:minmax(0,1fr) minmax(0,1.35fr)}
.cs-dc-sub{font-size:12px;font-weight:600;color:var(--ink);margin-bottom:8px}
.cs-dc-row{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.cs-dc-lb{flex:0 0 172px;font-size:12px;color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cs-dc-bar{flex:1;min-width:60px;height:14px;background:var(--bg);border:1px solid var(--border);border-radius:3px;overflow:hidden}
.cs-dc-bar i{display:block;height:100%;background:var(--accent)}
.cs-dc-n{flex:0 0 30px;text-align:right;font-size:12px;font-family:'JetBrains Mono',monospace;color:var(--ink)}
.cs-dc-pct{flex:0 0 46px;text-align:right;font-size:11px;color:var(--muted)}
.cs-dc-notes-h{display:flex;align-items:center;gap:6px}
.cs-dc-notes-h input{margin-left:auto;width:170px;padding:3px 8px;font-size:12px;font-weight:400;
  border:1px solid var(--border-strong);background:var(--bg);color:var(--ink)}
.cs-dc-notes-h input:focus{outline:none;border-color:var(--accent)}
.cs-dc-notes{max-height:260px;overflow:auto;min-width:0}
.cs-dc-notes .iqa-table td{white-space:nowrap;max-width:110px;overflow:hidden;text-overflow:ellipsis}
.cs-dc-notes .iqa-table td.cs-dc-quote{max-width:220px;color:var(--ink);font-weight:600}
.cs-dc-tabs{display:flex;gap:6px;margin:12px 0 6px;flex-wrap:wrap}
.cs-dc-tab.active{background:var(--accent);color:#fff;border-color:var(--accent)}
.cs-dc-cross td.cs-dc-z{color:var(--border-strong)}
/* 发卡明细：多了「暂不考虑原因」一列后短列被挤成两行 → 一律不换行、长的省略，宽度不够整表横向滚动 */
.cs-detail{overflow-x:auto}
.cs-detail .iqa-table th,.cs-detail .iqa-table td{white-space:nowrap}
.cs-detail .iqa-table td{max-width:200px;overflow:hidden;text-overflow:ellipsis}
.iqa-table td.cs-dc-reason{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ── 卡片接单：榜单只放前 10 +「查看全部」浮层（2026-09-15）──
   表头和数字一律不换行：之前窄栏里「发卡」「未响应」竖着排、「6分31秒」折成两行（用户截图）。 */
#csRoot .iqa-card{overflow-x:auto}
.cs-stat th{white-space:nowrap}
.cs-stat td.num,.cs-stat td.cs-nowrap{white-space:nowrap}
.cs-more-row{text-align:center;padding:8px 0 2px}
.cs-more-bar{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.cs-more-bar input{flex:0 0 260px;padding:5px 9px;font-size:13px;border:1px solid var(--border-strong);background:var(--bg);color:var(--ink)}
.cs-more-bar input:focus{outline:none;border-color:var(--accent)}
#csMoreBody{max-height:66vh;overflow:auto}
#csMoreBody .iqa-table thead th{position:sticky;top:0;z-index:1}
#csMoreBody .iqa-table td:first-child{max-width:320px}
.cs-th-sort{cursor:pointer;user-select:none}
.cs-th-sort:hover,.cs-th-sort.on{background:var(--accent)!important}

/* ═══ 商机洞察（20-insights.js）═══ */
.ins-bar { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.ins-bar .active { background: var(--accent); color: #fff; border-color: var(--accent); }
.ins-bar .cs-win-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; min-width: 0; }
.ins-sep { display: inline-block; width: 1px; height: 16px; background: var(--border); margin: 0 4px; vertical-align: middle; }
.ins-status { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; font-size: 12px; color: var(--ink); padding: 8px 12px;
  border: 1px solid var(--border); background: var(--bg-card); margin-bottom: 8px; }
.ins-status b { color: var(--accent); }
.ins-status-btns { margin-left: auto; display: inline-flex; gap: 6px; }
.ins-run { color: var(--accent); font-weight: 600; }
.ins-auto { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; }
.ins-note { font-size: 11.5px; color: var(--muted); line-height: 1.6; margin: 0 0 10px; }
#insRoot .iqa-kpis { grid-template-columns: repeat(6, 1fr); }
@media (max-width: 900px) { #insRoot .iqa-kpis { grid-template-columns: repeat(3, 1fr); } }
.ins-sec { border: 1px solid var(--border); background: var(--bg-card); padding: 12px 14px; margin-top: 12px; min-width: 0; }
.ins-sec-t { font-size: 13px; font-weight: 700; color: var(--ink); margin-bottom: 8px; }
.ins-sec-t .muted { font-weight: 400; font-size: 11.5px; margin-left: 8px; }
.ins-sub-t { font-size: 12px; font-weight: 600; color: var(--ink-2); margin: 10px 0 4px; }
.ins-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; align-items: start; }
.ins-grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; align-items: start; }
.ins-grid2 .ins-sec, .ins-grid3 .ins-sec { margin-top: 12px; }
@media (max-width: 1100px) { .ins-grid3 { grid-template-columns: 1fr 1fr; } }
@media (max-width: 768px), (max-height: 500px) { .ins-grid2, .ins-grid3 { grid-template-columns: 1fr; } .ins-status-btns { margin-left: 0; } }
/* 走势：单色细柱，4px 圆头贴基线，柱间留白；数字只标在柱顶，悬停看其余 */
.ins-trend { display: flex; align-items: flex-end; gap: 6px; height: 150px; padding: 6px 2px 0; border-bottom: 1px solid var(--border); }
.ins-col { flex: 1 1 0; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; min-width: 0; }
.ins-col-v { font-size: 11px; color: var(--ink-2); line-height: 1; margin-bottom: 3px; }
.ins-col-bar { width: 60%; max-width: 28px; background: var(--accent); border-radius: 4px 4px 0 0; transition: height .2s; }
.ins-col-l { font-size: 10.5px; color: var(--muted); margin-top: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.ins-click { cursor: pointer; }
.ins-click:hover .ins-bar-label { color: var(--accent); }
.ins-details > summary { cursor: pointer; font-size: 13px; font-weight: 700; color: var(--ink); }
.ins-details > summary .muted { font-weight: 400; font-size: 11.5px; margin-left: 8px; }
.ins-sample { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; padding: 10px 0; border-top: 1px dashed var(--border); font-size: 12px; }
.ins-sample-h { margin-bottom: 4px; }
.ins-sample-txt { white-space: pre-wrap; color: var(--ink-2); line-height: 1.5; max-height: 260px; overflow: auto; background: var(--bg); padding: 8px; border: 1px solid var(--border); }
.ins-sample-r div { margin: 2px 0; line-height: 1.5; }
.ins-kv-l { display: inline-block; min-width: 64px; color: var(--muted); }
.ins-detail-tbl td { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ins-summary-coverage { margin: 0 0 12px; font-size: 12px; color: var(--muted); line-height: 1.6; }
.ins-summary-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 24px; font-size: 12px; line-height: 1.7; }
.ins-summary-grid b { color: var(--ink); }
.ins-summary-grid p { margin: 3px 0 0; color: var(--ink-2); overflow-wrap: anywhere; }
.ins-type-legend { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; align-items: center; font-size: 11px; }
.ins-type-chip { display: inline-block; padding: 2px 6px; margin: 1px 4px 1px 0; font-size: 11px; border-radius: 4px; }
.ins-crm-chip { background: #e7f0ef; color: #345956; padding: 2px 6px; border-radius: 4px; }
.ins-ai-chip { background: #fff0df; color: #855021; padding: 2px 6px; border-radius: 4px; }
.ins-ai-text { color: #855021; font-size: 10.5px; }
.ins-bar-fill.ins-type-fill { display: flex; background: transparent; overflow: hidden; }
.ins-type-fill i { display: block; height: 100%; }
.ins-type-crm { background: #82aaa5; }
.ins-type-ai { background: #eab47b; }
.ins-evidence { padding: 4px 6px; background: var(--bg); color: var(--ink-2); overflow-wrap: anywhere; }
.ins-evidence b { color: #855021; }
.ins-profile { margin-bottom: 16px; font-size: 12px; }
.ins-profile > p { margin: 0 0 12px; }
.ins-profile .ins-grid2 > div { min-width: 0; overflow: auto; }
.ins-profile .muted { margin: 4px 0 8px; }
.ins-share-cell { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ins-party { white-space: nowrap; }
.ins-table-scroll { max-width: 100%; overflow-x: auto; }
.ins-table-scroll > table { min-width: 900px; }
[data-theme="dark"] .ins-crm-chip { background: #293b39; color: #c0dbd6; }
[data-theme="dark"] .ins-ai-chip { background: #433629; color: #f1c38f; }
[data-theme="dark"] .ins-ai-text, [data-theme="dark"] .ins-evidence b { color: #f1c38f; }
@media (max-width: 768px), (max-height: 500px) {
  .ins-summary-grid { grid-template-columns: 1fr; gap: 10px; }
}
@media (max-width: 768px), (max-height: 500px) { .ins-sample { grid-template-columns: 1fr; } }

/* 图形、数字、口径各自占位；不再借用客户分析的固定宽度 flex 行。 */
.ins-bars { margin-top: 10px; }
.ins-bar-row, .ins-bar-heading { display: grid; grid-template-columns: minmax(84px, 110px) minmax(0, 1fr) 48px; align-items: center; gap: 10px; }
.ins-bars-share .ins-bar-row, .ins-bars-share .ins-bar-heading { grid-template-columns: minmax(84px, 110px) minmax(0, 1fr) 48px 54px; }
.ins-bar-heading { color: var(--muted); font-size: 11px; margin-bottom: 5px; }
.ins-bar-heading > span:nth-last-child(-n+2) { text-align: right; }
.ins-bar-axis { display: flex; justify-content: space-between; font-variant-numeric: tabular-nums; }
.ins-bar-row { width: 100%; min-height: 29px; padding: 4px 0; border: 0; background: transparent; color: var(--ink); font: inherit; font-size: 12px; text-align: left; }
.ins-bar-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ins-bar-label small { display: block; color: var(--muted); font-size: 11px; margin-top: 2px; }
.ins-bar-track { display: block; height: 8px; background: var(--bg); border-radius: 3px; overflow: hidden; }
.ins-bar-fill { display: block; height: 100%; background: var(--accent); border-radius: 3px; }
.ins-bar-count, .ins-bar-share { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.ins-bar-count { font-weight: 600; }
.ins-bar-share { color: var(--ink-2); }
.ins-card-head { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: 6px 12px; }
.ins-card-head h3, .ins-trend-toolbar h3 { margin: 0; font-size: 14px; font-weight: 650; }
.ins-coverage { font-size: 11.5px; color: var(--ink-2); white-space: nowrap; }
.ins-coverage b { color: var(--ink); font-variant-numeric: tabular-nums; }
.ins-coverage > span { margin-left: 8px; color: var(--muted); }
.ins-card-takeaway { margin: 8px 0 12px; font-size: 12px; color: var(--ink-2); line-height: 1.7; }
.ins-card-takeaway b { color: var(--accent); }
.ins-card-takeaway > span { margin-left: 12px; color: var(--muted); }
.ins-card-foot { margin: 10px 0 0; font-size: 11.5px; line-height: 1.6; color: var(--muted); }
.ins-budget-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); }
.ins-budget-meta span { display: block; font-size: 11px; color: var(--muted); }
.ins-budget-meta b { display: block; margin-top: 2px; font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums; }
.ins-location-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: start; }
.ins-location h4 { font-size: 12px; margin: 0 0 6px; color: var(--ink-2); }
.ins-location h4 .muted { font-weight: 400; margin-left: 8px; }
.ins-location-grid > div + div { padding-left: 24px; border-left: 1px solid var(--border); }
.ins-location-group + .ins-location-group { margin-top: 16px; }
.ins-inline-details { margin-top: 12px; font-size: 12px; color: var(--ink-2); }
.ins-inline-details > summary { cursor: pointer; width: fit-content; padding: 4px 0; color: var(--accent); }
.ins-inline-details[open] > summary { margin-bottom: 6px; }
.ins-period-partial .ins-col-bar { opacity: .5; border: 1px dashed var(--accent); background: var(--bg-accent); }
.ins-col-l > span { display: block; font-size: 10px; color: var(--warn); }
.ins-type-trend { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }
.ins-trend-toolbar { display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: 10px; }
.ins-trend-toolbar p { margin: 4px 0 0; color: var(--muted); font-size: 11.5px; }
.ins-mode-switch { display: inline-flex; padding: 2px; gap: 2px; border: 1px solid var(--border); border-radius: 5px; background: var(--bg); }
.ins-trend-mode { border: 0; border-radius: 3px; padding: 5px 10px; background: transparent; color: var(--ink-2); font-size: 12px; cursor: pointer; }
.ins-trend-mode.active { background: var(--bg-card); color: var(--accent); font-weight: 600; box-shadow: 0 1px 3px #00000014; }
.ins-trend-context { margin: 10px 0 14px; font-size: 11.5px; color: var(--ink-2); line-height: 1.6; }
.ins-type-trend-head, .ins-type-trend-axis, .ins-type-trend-row { display: grid; grid-template-columns: 104px minmax(0, 1fr) 76px 116px; align-items: center; gap: 12px; }
.ins-type-trend-head { padding: 0 0 8px; color: var(--muted); font-size: 11px; }
.ins-type-trend-head > span:nth-last-child(-n+2) { text-align: right; }
.ins-type-trend-head small, .ins-trend-total small, .ins-trend-recent small { display: block; font-size: 11px; font-weight: 400; color: var(--muted); margin-top: 2px; }
.ins-time-axis { position: relative; height: 32px; font-size: 10px; color: var(--muted); }
.ins-time-axis > span { position: absolute; top: 0; text-align: center; transform: translateX(-50%); white-space: nowrap; }
.ins-time-axis > .ins-axis-first { transform: none; }
.ins-time-axis > .ins-axis-last { transform: translateX(-100%); }
.ins-time-axis small { display: block; font-size: 10px; color: var(--warn); }
.ins-type-trend-row { min-height: 61px; border-top: 1px solid var(--border); }
.ins-mobile-axis { display: none; }
.ins-trend-name { border: 0; background: transparent; color: var(--ink); font: inherit; font-size: 12px; text-align: left; padding: 8px 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; }
.ins-trend-name:hover { color: var(--accent); }
.ins-line-chart { display: block; width: 100%; height: 54px; overflow: visible; }
.ins-chart-grid { stroke: var(--border); stroke-width: .5; stroke-dasharray: 2 4; }
.ins-line { stroke: var(--accent); stroke-width: 1.75; }
.ins-line-partial { stroke-dasharray: 4 4; opacity: .65; }
.ins-line-point { fill: var(--accent); stroke: var(--bg-card); stroke-width: 1; cursor: pointer; }
.ins-point-partial { fill: var(--bg-card); stroke: var(--accent); stroke-width: 1.5; }
.ins-partial-band { fill: var(--bg-accent); opacity: .65; }
.ins-trend-total, .ins-trend-recent { text-align: right; font-size: 12px; font-variant-numeric: tabular-nums; }
.ins-trend-total b, .ins-trend-recent b { font-weight: 600; }
.ins-chart-tip { position: fixed; z-index: 120; max-width: min(360px, calc(100vw - 16px)); padding: 9px 12px; border: 1px solid var(--border-strong); border-radius: 6px; background: var(--bg-card); color: var(--ink); box-shadow: 0 4px 18px #00000018; font-size: 12px; line-height: 1.6; pointer-events: none; }
.ins-data-scroll { max-width: 100%; overflow: auto; }
.ins-data-table { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.ins-data-table caption { text-align: left; padding: 8px 0; color: var(--muted); }
.ins-data-table th, .ins-data-table td { padding: 7px 10px; text-align: right; border-bottom: 1px solid var(--border); white-space: nowrap; }
.ins-data-table th:first-child { text-align: left; }
.ins-data-table thead th { background: var(--bg); font-weight: 500; }
.ins-data-table th small { display: block; font-weight: 400; color: var(--warn); }
.ins-bar-row:focus-visible, .ins-trend-name:focus-visible, .ins-trend-mode:focus-visible, .ins-inline-details summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 3px; }
.ins-line-point:focus, .ins-line-point:hover { stroke: var(--accent-2); stroke-width: 2; }
@media (max-width: 900px) {
  .ins-type-trend-head, .ins-type-trend-axis, .ins-type-trend-row { grid-template-columns: 88px minmax(0, 1fr) 58px 96px; gap: 8px; }
}
@media (max-width: 768px), (max-height: 500px) {
  .admin-main:has(#tab-insights.active) { width: 100%; }
  .ins-col-l { visibility: hidden; height: 28px; }
  .ins-labeled-col .ins-col-l { visibility: visible; max-width: none; overflow: visible; }
  .ins-location-grid { grid-template-columns: 1fr; gap: 16px; }
  .ins-location-grid > div + div { padding: 16px 0 0; border-left: 0; border-top: 1px solid var(--border); }
  .ins-card-takeaway > span { display: block; margin-left: 0; }
  .ins-type-trend-head, .ins-type-trend-axis { display: none; }
  .ins-type-trend-row { grid-template-columns: minmax(0, 1fr) 65px 120px; gap: 8px; padding: 8px 0; }
  .ins-trend-name { grid-column: 1; grid-row: 1; min-height: 40px; }
  .ins-trend-total { grid-column: 2; grid-row: 1; }
  .ins-trend-recent { grid-column: 3; grid-row: 1; }
  .ins-line-chart { grid-column: 1 / -1; grid-row: 2; height: 64px; }
  .ins-mobile-axis { display: block; grid-column: 1 / -1; grid-row: 3; }
  .ins-trend-total::before { content: '累计'; display: block; font-size: 10px; color: var(--muted); }
  .ins-trend-recent::before { content: '最近完整期'; display: block; font-size: 10px; color: var(--muted); }
  .ins-trend-scale { display: block; }
  .ins-trend-mode { min-height: 40px; }
}
@media (max-width: 600px), (max-height: 500px) {
  .ins-bar-row, .ins-bars-share .ins-bar-row, .ins-bar-heading, .ins-bars-share .ins-bar-heading { grid-template-columns: minmax(0, 1fr) 48px 54px; gap: 4px 8px; }
  .ins-bar-row { padding: 6px 0; }
  .ins-bar-label { grid-column: 1; grid-row: 1; }
  .ins-bar-track { grid-column: 1 / -1; grid-row: 2; }
  .ins-bar-count { grid-column: 2; grid-row: 1; }
  .ins-bar-share { grid-column: 3; grid-row: 1; }
  .ins-bar-heading > span:first-child { grid-column: 1; grid-row: 1; }
  .ins-bar-heading > span:nth-child(3) { grid-column: 2; grid-row: 1; }
  .ins-bar-heading > span:nth-child(4) { grid-column: 3; grid-row: 1; }
  .ins-bar-axis { grid-column: 1 / -1; grid-row: 2; }
}
