  * { box-sizing: border-box; margin: 0; padding: 0; }
  :root {
    --primary:#2563eb; --primary-2:#3b82f6; --primary-soft:#eff6ff; --accent:#0ea5e9;
    --bg:#f1f5f9; --surface:#ffffff; --panel:#ffffff;
    --line:#e2e8f0; --line-2:#cbd5e1;
    --muted:#64748b; --text:#0f172a; --text-2:#334155;
    --good:#16a34a; --good-soft:#dcfce7; --warn:#d97706; --warn-soft:#fef3c7; --danger:#dc2626; --danger-soft:#fee2e2;
    --mono: "SF Mono", "JetBrains Mono", "Cascadia Code", Consolas, Menlo, monospace;
  }
  body { font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif; color:var(--text); min-height:100vh;
    background:linear-gradient(180deg,#f8fafc,#f1f5f9 60%,#eef2f7); }
  @keyframes fadeUp { from{opacity:0; transform:translateY(8px);} to{opacity:1; transform:none;} }
  ::-webkit-scrollbar { width:10px; height:10px; }
  ::-webkit-scrollbar-thumb { background:#cbd5e1; border-radius:8px; }
  ::-webkit-scrollbar-thumb:hover { background:#94a3b8; }
  ::-webkit-scrollbar-track { background:transparent; }
  header { background:var(--surface); border-bottom:1px solid var(--line); box-shadow:0 1px 3px rgba(15,23,42,.06);
    color:var(--text); padding:14px 22px; display:flex; align-items:center; justify-content:space-between; position:relative; }
  header h1 { font-size:20px; font-weight:800; letter-spacing:1px; color:var(--text); display:flex; align-items:center; gap:11px; }
  header h1::before { content:""; width:11px; height:11px; border-radius:50%;
    background:linear-gradient(135deg,#2563eb,#0ea5e9); box-shadow:0 0 0 4px rgba(37,99,235,.12); }
  .ver { font-size:12px; font-weight:600; color:#fff; background:var(--primary); padding:2px 10px; border-radius:999px; letter-spacing:.5px; }
  .ver-lg { font-size:13px; padding:3px 12px; }
  /* 品牌小标语（v2.90）：登录页与头部「归藏阁」下方一行小字 */
  .brand { display:flex; flex-direction:column; gap:2px; min-width:0; }
  .brand-motto { margin:0; font-size:12px; color:var(--muted); letter-spacing:.6px; line-height:1.4; padding-left:22px; }
  #login p.brand-motto { text-align:center; padding-left:0; margin:0 0 14px; font-size:12.5px; }
  header .who { font-size:13px; color:var(--muted); }
  header .who b { font-weight:600; color:var(--primary); }
  .layout { display:flex; min-height:calc(100vh - 61px); }
  nav { width:200px; background:var(--panel); border-right:1px solid var(--line); padding:18px 12px; }
  nav button { position:relative; display:block; width:100%; text-align:left; border:1px solid transparent; background:transparent;
    padding:11px 14px; border-radius:9px; font-size:14px; color:var(--text-2); cursor:pointer; margin-bottom:6px; transition:.15s; }
  nav button:hover { background:var(--primary-soft); color:var(--primary); }
  nav button.active { background:var(--primary-soft); color:var(--primary); border-color:rgba(37,99,235,.25);
    box-shadow:inset 0 0 0 1px rgba(37,99,235,.10); }
  nav button.active::before { content:""; position:absolute; left:0; top:8px; bottom:8px; width:3px; border-radius:2px;
    background:linear-gradient(180deg,#2563eb,#0ea5e9); }
  /* 客户管理下拉菜单 */
  .nav-drop { position:relative; }
  .nav-drop-btn { position:relative; display:block; width:100%; text-align:left; border:1px solid transparent; background:transparent;
    padding:11px 14px; border-radius:9px; font-size:14px; color:var(--text-2); cursor:pointer; margin-bottom:6px; transition:.15s; }
  .nav-drop-btn:hover { background:var(--primary-soft); color:var(--primary); }
  .nav-drop-btn.active { background:var(--primary-soft); color:var(--primary); border-color:rgba(37,99,235,.25);
    box-shadow:inset 0 0 0 1px rgba(37,99,235,.10); }
  .nav-drop-btn.active::before { content:""; position:absolute; left:0; top:8px; bottom:8px; width:3px; border-radius:2px;
    background:linear-gradient(180deg,#2563eb,#0ea5e9); }
  .nav-caret { float:right; font-size:11px; opacity:.7; transition:transform .18s; }
  .nav-drop-btn[aria-expanded="true"] .nav-caret { transform:rotate(180deg); }
  .nav-drop-menu { position:absolute; left:0; right:0; top:calc(100% - 4px); z-index:60; background:var(--panel);
    border:1px solid var(--line); border-radius:10px; box-shadow:0 10px 28px rgba(15,23,42,.13); padding:6px; }
  .nav-drop-menu button { display:block; width:100%; text-align:left; border:0; background:transparent; cursor:pointer;
    padding:9px 12px; border-radius:8px; font-size:13px; color:var(--text-2); transition:.15s; }
  .nav-drop-menu button:hover { background:var(--primary-soft); color:var(--primary); }
  .nav-drop-menu button.active { background:var(--primary-soft); color:var(--primary); font-weight:600; }
  .nav-drop-menu button + button { margin-top:2px; }
  main { flex:1; padding:22px; overflow:auto; display:flex; flex-direction:column; }
  main > section { flex:0 0 auto; }   /* 各标签页按内容高度排布，不让长页面被弹性压缩 */
  /* 页脚已下线：原「琅琊阁」pill 入口已迁入导航「资源上传」下拉（第222次） */
  .card { background:var(--surface); border:1px solid var(--line); border-radius:14px; padding:18px; margin-bottom:18px;
    box-shadow:0 1px 3px rgba(15,23,42,.05); animation:fadeUp .35s ease both; }
  .card:hover { border-color:var(--line-2); }
  .stat-link { cursor:pointer; text-decoration:underline; color:var(--primary); }
  .stat-link:hover { color:#1d4ed8; }
  h2 { font-size:17px; font-weight:700; color:var(--text); margin-bottom:14px; display:flex; align-items:center; gap:10px;
    border-left:3px solid var(--primary); padding-left:12px; }
  h2 .btn { margin-left:auto; }
  .h2-actions { margin-left:auto; display:flex; align-items:center; gap:8px; font-weight:400; }
  .h2-actions .btn { margin-left:0; }
  .h2-actions .muted-tip { font-size:12px; }
  /* ---------- 事项摘要 ---------- */
  .summ-charts { display:grid; grid-template-columns:repeat(auto-fit,minmax(270px,1fr)); gap:16px; }
  .summ-chart-box { border:1px solid var(--line); border-radius:10px; padding:12px 14px; background:#fff; }
  .summ-chart-title { font-size:13px; font-weight:600; color:var(--text-2); margin-bottom:10px; }
  .summ-kpis { display:grid; grid-template-columns:repeat(auto-fit,minmax(132px,1fr)); gap:12px; }
  .summ-kpi { border:1px solid var(--line); border-radius:10px; padding:12px 14px; background:linear-gradient(180deg,#fff,#f8fafc); }
  .summ-kpi .k { font-size:12px; color:var(--muted); }
  .summ-kpi .v { font-size:22px; font-weight:700; color:var(--text); margin-top:4px; }
  .summ-kpi.warn .v { color:#dc2626; }
  .summ-kpi.ok .v { color:#16a34a; }
  .summ-text { white-space:pre-wrap; background:#f8fafc; border:1px solid var(--line); border-radius:10px; padding:14px 16px; font-size:13px; line-height:1.95; color:var(--text-2); }
  .summ-list { display:flex; flex-direction:column; gap:8px; margin-top:12px; }
  .summ-row { display:flex; gap:10px; align-items:flex-start; border:1px solid var(--line); border-radius:9px; padding:9px 12px; background:#fff; }
  .summ-row.od { border-color:rgba(220,38,38,.35); background:rgba(220,38,38,.04); }
  .summ-row .d { min-width:94px; font-weight:600; color:var(--text); font-size:13px; }
  .summ-row .c { flex:1; font-size:13px; color:var(--text-2); }
  .summ-row .m { font-size:12px; color:var(--muted); margin-top:2px; }
  .summ-month-label { font-size:13px; color:var(--muted); font-weight:600; min-width:78px; text-align:center; }
  /* ---------- 事项监控 ---------- */
  .mon-kpis { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:12px; }
  tr.mon-od td { background:rgba(220,38,38,.06); }
  tr.mon-od td:first-child { box-shadow:inset 3px 0 0 #dc2626; }
  .od-flag { display:inline-block; background:#dc2626; color:#fff; border-radius:6px; padding:1px 7px; font-size:11.5px; font-weight:600; }
  .od-flag.soft { background:#f59e0b; }
  /* v2.42：原 .mon-user-bar（「按登记人统计」的超期占比条）随该卡片一起下线，
     超期对比改由合并看板的「完成率」细进度条（.wl-rate）承担 */
  @media (max-width:860px){
    .summ-charts { grid-template-columns:1fr; }
    .summ-row { flex-direction:column; gap:4px; }
    /* v1.87：竖排后 .c 仍是 flex item，min-width:auto + 缺 overflow-wrap
       → 长英文串/长编号（如 ProjectCollaboration…2026）把整行顶出屏幕。
       摘要文本 .summ-text 同理（pre-wrap 只保空白，不负责断长词）。 */
    .summ-row .d, .summ-row .c { min-width:0; }
    .summ-row .c { overflow-wrap:anywhere; word-break:break-word; }
    .summ-text { overflow-wrap:anywhere; word-break:break-word; }
  }
  table { width:100%; border-collapse:collapse; font-size:13px; }
  th,td { text-align:left; padding:10px 12px; border-bottom:1px solid var(--line); vertical-align:top; color:var(--text-2); }
  th { color:var(--muted); font-weight:600; background:#f8fafc; letter-spacing:.5px; }
  tbody tr:hover { background:var(--primary-soft); }
  /* ---- 每日事项表格：固定列宽 + 文字换行排版 ---- */
  .tbl-tasks { table-layout:fixed; }
  .tbl-tasks col.c-date{width:11%} .tbl-tasks col.c-type{width:10%} .tbl-tasks col.c-user{width:9%}
  .tbl-tasks col.c-content{width:32%} .tbl-tasks col.c-due{width:13%} .tbl-tasks col.c-status{width:11%} .tbl-tasks col.c-act{width:14%}
  .tbl-tasks tr { height:auto; }
  .tbl-tasks th { white-space:nowrap; font-size:12px; }
  .tbl-tasks td { line-height:1.65; word-break:break-word; overflow-wrap:anywhere; height:auto; overflow:visible; }
  .tbl-tasks .c-date .d, .tbl-tasks .td-due .d { white-space:nowrap; font-variant-numeric:tabular-nums; }
  .tbl-tasks .c-date .t, .tbl-tasks .td-due .t { color:var(--muted); font-size:12px; white-space:nowrap; font-variant-numeric:tabular-nums; }
  .tbl-tasks td.td-content { color:var(--text); }
  .tbl-tasks td.td-due { font-variant-numeric:tabular-nums; }
  .tbl-tasks td.td-proj { color:var(--muted); }
  .tbl-tasks .proj-link { color:var(--primary); text-decoration:none; cursor:pointer; font-weight:600; }
  .tbl-tasks .proj-link:hover { text-decoration:underline; }
  .tbl-tasks .tag { max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; vertical-align:middle; }
  .tbl-tasks td.td-act .row-actions { white-space:normal; flex-wrap:wrap; align-items:flex-start; gap:6px; }
  /* 每日事项（个人账户）：去掉「登记人」列、新增「关联项目」列后重新分配列宽 */
  .tbl-tasks.t6 col.c-date{width:10%} .tbl-tasks.t6 col.c-disp{width:8%} .tbl-tasks.t6 col.c-type{width:8.5%}
  .tbl-tasks.t6 col.c-content{width:30%} .tbl-tasks.t6 col.c-proj{width:8.5%} .tbl-tasks.t6 col.c-due{width:10.5%}
  .tbl-tasks.t6 col.c-status{width:9%} .tbl-tasks.t6 col.c-act{width:15%}
  /* ---- 每日事项：置顶显示（浅蓝底 + 📌 标记 + 高亮按钮） ---- */
  .tbl-tasks tr.pinned { background:#dbeafe; }
  .tbl-tasks tr.pinned:hover { background:#bfdbfe; }
  .tbl-tasks tr.pinned td { color:#1e3a8a; }
  .tbl-tasks tr.pinned .pin-mark { margin-right:5px; font-size:13px; vertical-align:baseline; cursor:help; }
  /* 分组标题行（v1.88）：工具条「分组」下拉打开后，每组第一行；整行可点折叠 */
  .tbl-tasks tr.tbl-grp > td { background:#eef2f7; border-top:1px solid var(--line); border-bottom:1px solid var(--line);
    padding:7px 12px; font-size:13px; font-weight:700; color:#334155; cursor:pointer; }
  .tbl-tasks tr.tbl-grp.folded > td { border-bottom-style:dashed; }
  .tbl-tasks tr.tbl-grp:hover > td { background:#e2e8f0; }
  .tbl-tasks tr.tbl-grp .grp-tgl { width:20px; height:20px; min-width:0; padding:0; margin:0 7px 0 0; border:1px solid var(--line-2);
    border-radius:5px; background:#fff; color:#475569; font-size:11px; line-height:1; cursor:pointer; vertical-align:middle; }
  .tbl-tasks tr.tbl-grp .grp-ico { margin-right:5px; }
  .tbl-tasks tr.tbl-grp .grp-name { overflow-wrap:anywhere; }
  .tbl-tasks tr.tbl-grp .grp-cnt { margin-left:8px; font-weight:600; font-size:12px; color:var(--muted); }
  .btn.sm.pin-on { background:#dbeafe; color:#1d4ed8; border-color:rgba(37,99,235,.35); }
  .btn.sm.pin-on:hover { background:#bfdbfe; }
  /* 新增/编辑弹窗里的「置顶显示」勾选行 */
  .pin-field { margin-top:2px; }
  .pin-check { display:flex; align-items:flex-start; flex-wrap:wrap; gap:2px 8px; font-size:13px; font-weight:600; color:var(--text); cursor:pointer; margin:0; }
  .pin-check input { width:15px; height:15px; accent-color:var(--primary); margin:2px 0 0; flex:0 0 auto; }
  .pin-hint { flex:1 1 100%; margin-left:23px; font-weight:400; color:var(--muted); font-size:12px; line-height:1.55; }
  /* ---- 每日事项「点列式」要点（pts- 前缀，命名空间独立，不影响其他模块）---- */
  .pts-head { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; margin:0 0 6px; }
  .pts-head > label { margin:0; }
  .pts-count { margin-left:auto; font-size:11.5px; color:var(--muted); font-weight:600; }
  .pts-count b { color:var(--primary); }
  .pts-list { border:1px solid var(--line); border-radius:11px; padding:10px 10px 4px; background:#fcfdff; }
  .pts-thead { display:flex; gap:8px; padding:0 40px 6px 53px; font-size:11px; color:var(--muted); font-weight:600; }
  .pts-thead .th-text { flex:1 1 auto; }
  .pts-thead .th-owner { flex:0 0 128px; }
  .pts-thead .th-due { flex:0 0 186px; }
  .pts-row { display:flex; align-items:flex-start; gap:8px; margin-bottom:8px; }
  .pts-ck { flex:0 0 15px; width:15px; height:15px; margin:11px 0 0; accent-color:var(--primary); cursor:pointer; }
  .pts-no { flex:0 0 22px; height:22px; border-radius:50%; background:var(--primary-soft); color:var(--primary);
    font-size:12px; font-weight:800; display:flex; align-items:center; justify-content:center; margin-top:8px; cursor:pointer; }
  .pts-row.is-done .pts-no { background:var(--good-soft); color:var(--good); }
  .pts-cell { min-width:0; }
  .pts-cell.c-text { flex:1 1 auto; }
  .pts-cell.c-owner { flex:0 0 128px; }
  .pts-cell.c-due { flex:0 0 186px; }
  .pts-cell textarea { min-height:38px; padding:8px 10px; line-height:1.5; resize:none; overflow:hidden; }
  .pts-row.is-done .pts-cell.c-text textarea { color:var(--muted); text-decoration:line-through; }
  .pts-del { flex:0 0 32px; height:38px; border:1px solid var(--line); background:#fff; color:var(--muted);
    border-radius:9px; font-size:15px; line-height:1; cursor:pointer; transition:.15s; }
  .pts-del:hover { background:var(--danger-soft); color:var(--danger); border-color:rgba(220,38,38,.35); }
  .pts-foot { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:4px 0 8px; }
  .pts-foot .muted-tip { flex:1 1 240px; margin:0; }
  .pts-hint { background:var(--primary-soft); border:1px solid rgba(37,99,235,.18); border-radius:10px;
    padding:8px 11px; font-size:11.5px; color:#1e40af; line-height:1.65; margin:6px 0 0; }
  .pts-acts { display:flex; justify-content:flex-end; gap:8px; flex-wrap:wrap; margin-top:14px; }
  /* 列表「内容」列：方案 B（单行摘要 + 悬浮/点击展开） */
  .pts-sum { display:block; }
  .pts-sum-1 { display:flex; align-items:flex-start; gap:6px; min-width:0; }
  .pts-sum-1 .t { flex:1 1 auto; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .pts-sum-1 .t.t-single { white-space:normal; overflow:visible; text-overflow:clip; display:block; }
  .pts-sum-1 .pts-badge { flex:0 0 auto; font-size:10.5px; font-weight:700; padding:0 6px;
    border-radius:999px; background:var(--primary-soft); color:var(--primary); border:1px solid rgba(37,99,235,.25); }
  .pts-sum-1 .pts-prog { flex:0 0 auto; font-size:10.5px; font-weight:700; color:var(--good); }
  .pts-sum-2 { display:block; margin-top:1px; font-size:11px; color:var(--muted);
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .pts-more { color:var(--primary); cursor:pointer; }
  .pts-more:hover { text-decoration:underline; }
  /* 弹窗内智能识别面板（第120次） */
  .smart-mini { background:var(--primary-soft); border:1px solid rgba(37,99,235,.18); border-radius:12px; padding:10px 12px; margin-bottom:14px; }
  .smart-mini-bar { display:flex; align-items:center; gap:8px; margin-bottom:8px; flex-wrap:wrap; }
  .smart-mini-t { font-weight:700; color:var(--primary); font-size:13px; }
  .smart-mini #smartMiniInput { width:100%; border:1px solid var(--border); border-radius:8px; padding:8px 10px; font:inherit; resize:vertical; background:#fff; box-sizing:border-box; }
  .smart-mini .voice-live { margin-top:8px; }
  /* 新增/编辑事项：「事项内容」自由文本域（智能识别会把完整语句写入此处） */
  /* 「事项内容」核心字段强调（第187次优化） */
  .f-content-block { margin-top:12px; background:var(--primary-soft); border:1px solid #bfdbfe; border-radius:12px; padding:12px 14px 14px; }
  .f-content-block > label { display:block; font-weight:700; color:var(--primary); font-size:14px; margin-bottom:7px; }
  #f-content { width:100%; box-sizing:border-box; border:1.5px solid var(--primary); border-radius:10px; padding:12px 14px;
    font:inherit; font-size:15px; line-height:1.7; resize:vertical; background:#fff; color:var(--text); min-height:120px;
    box-shadow:0 0 0 4px rgba(37,99,235,.08); }
  #f-content:focus { outline:none; border-color:var(--primary); box-shadow:0 0 0 5px rgba(37,99,235,.16); }
  /* 悬浮浮层：挂 body、fixed 定位，避免被表格横向滚动容器裁掉 */
  #pts-pop { position:fixed; z-index:80; display:none; width:400px; max-width:92vw; background:#fff;
    border:1px solid var(--line-2); border-radius:12px; box-shadow:0 16px 40px rgba(15,23,42,.22); padding:11px 12px; }
  #pts-pop.show { display:block; }
  #pts-pop .pop-h { font-size:12px; color:var(--muted); font-weight:600; margin-bottom:7px; }
  #pts-pop .pop-h b { color:var(--text); }
  .pts-li { display:flex; align-items:flex-start; gap:8px; padding:5px 0; border-top:1px dashed var(--line); }
  .pts-li:first-of-type { border-top:none; }
  .pts-li input { flex:0 0 15px; width:15px; height:15px; margin:3px 0 0; accent-color:var(--primary); cursor:pointer; }
  .pts-li .li-t { flex:1 1 auto; font-size:12.5px; line-height:1.5; min-width:0; overflow-wrap:anywhere; }
  .pts-li .li-m { flex:0 0 auto; font-size:11px; color:var(--muted); white-space:nowrap; }
  .pts-li.done .li-t { color:var(--muted); text-decoration:line-through; }
  .pts-li .li-m .od { color:var(--danger); font-weight:700; }
  /* ---- 每日事项「指派给我」：只读要点 + 列表标记 ---- */
  .pts-li.ro { cursor:default; }
  .pts-li.ro .li-ck { flex:0 0 15px; width:15px; text-align:center; font-size:12px; line-height:1.55; color:var(--line-2); }
  .pts-li.ro.done .li-ck { color:var(--good); font-weight:700; }
  .pts-li .li-me { flex:0 0 auto; align-self:center; font-size:10.5px; font-weight:700; padding:1px 7px;
    border-radius:999px; background:var(--primary-soft); color:var(--primary); border:1px solid rgba(37,99,235,.25); white-space:nowrap; }
  .assign-badge { display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-weight:700;
    padding:1px 7px; margin-right:6px; border-radius:999px; vertical-align:middle; white-space:nowrap;
    background:var(--primary-soft); color:var(--primary); border:1px solid rgba(37,99,235,.25); }
  .assign-badge .ab-dot { width:6px; height:6px; border-radius:50%; background:var(--primary); }
  .tbl-tasks tr.is-assigned > td { background:rgba(239,246,255,.55); }
  .tbl-tasks tr.is-assigned:hover > td { background:rgba(219,234,254,.72); }
  .status-ro { display:inline-block; font-size:12px; font-weight:600; padding:2px 9px; border-radius:999px; white-space:nowrap; }
  .status-ro.done  { background:var(--good-soft); color:#15803d; }
  .status-ro.doing { background:#dbeafe; color:#1d4ed8; }
  .status-ro.todo  { background:var(--warn-soft); color:var(--warn); }
  /* 只读详情弹窗（指派给我） */
  .ro-grid { display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:9px 14px;
    border:1px solid var(--line); border-radius:11px; padding:12px 14px; background:#fcfdff; }
  .ro-cell { display:flex; flex-direction:column; gap:2px; min-width:0; }
  .ro-cell .ro-k { font-size:11.5px; color:var(--muted); }
  .ro-cell .ro-v { font-size:13px; color:var(--text); overflow-wrap:anywhere; }
  .ro-text { border:1px solid var(--line); border-radius:9px; padding:9px 11px; background:#fcfdff;
    font-size:13px; line-height:1.65; white-space:pre-wrap; overflow-wrap:anywhere; }
  @media (max-width:560px){ .ro-grid { grid-template-columns:1fr 1fr; } }
  .remind-item .ri-by { font-weight:700; color:#b91c1c; }
  /* 受指派人反馈页（v2.38） */
  .fb-pt { border:1px solid var(--line); border-radius:11px; padding:10px 12px; margin-bottom:9px; background:#fff; }
  .fb-pt.ro { background:#fcfdff; }
  .fb-pt-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
  .fb-pt-head .li-t { flex:1 1 auto; font-size:13px; line-height:1.5; font-weight:600; min-width:0; overflow-wrap:anywhere; }
  .fb-pt-head .li-ck { flex:0 0 auto; font-size:12px; color:var(--line-2); }
  .fb-pt.ro .li-ck.done, .fb-pt.ro .li-ck { color:var(--good); font-weight:700; }
  .fb-done-lbl { flex:0 0 auto; display:inline-flex; align-items:center; gap:5px; font-size:12.5px; color:var(--text); cursor:pointer; user-select:none; }
  .fb-done-lbl input { width:15px; height:15px; accent-color:var(--primary); cursor:pointer; }
  .fb-field { margin-top:8px; }
  .fb-field > label, .fb-fu > label { display:block; font-size:11.5px; color:var(--muted); margin-bottom:3px; }
  .fb-note, .fb-fu-text { width:100%; box-sizing:border-box; border:1px solid var(--line); border-radius:8px; padding:7px 9px; font-size:13px; font-family:inherit; resize:vertical; }
  .fb-fu { margin-top:8px; border-top:1px dashed var(--line); padding-top:8px; }
  .fb-fu-row { display:flex; gap:8px; margin-top:6px; }
  .fb-fu-row input { flex:1 1 0; min-width:0; box-sizing:border-box; border:1px solid var(--line); border-radius:8px; padding:7px 9px; font-size:13px; }
  .fb-fu-row .fb-fu-owner { flex:0 0 40%; }
  .fb-complete-chk { display:inline-flex; align-items:center; gap:6px; font-size:12.5px; color:var(--text); margin-right:auto; cursor:pointer; }
  .fb-complete-chk input { width:15px; height:15px; accent-color:var(--primary); }
  .fb-complete-chk input:disabled { cursor:not-allowed; }
  .pts-mon-1 { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .pts-mon-2 { font-size:11px; color:var(--muted); margin-top:1px; }
  @media (max-width:700px){
    .pts-thead { display:none; }
    .pts-row { flex-wrap:wrap; padding-bottom:6px; border-bottom:1px dashed var(--line); }
    .pts-cell.c-text { flex:1 1 calc(100% - 62px); }
    .pts-cell.c-owner { flex:1 1 calc(50% - 20px); }
    .pts-cell.c-due { flex:1 1 calc(50% - 34px); }
  }
  /* ===== 新增/编辑事项弹窗：响应式专项优化（PC 与手机互不影响） =====
     手机端（≤560px）：智能识别面板、事项内容、要点拆分为触控友好布局 */
  @media (max-width:560px){
    .smart-mini { padding:12px 12px; }
    .smart-mini-bar { gap:6px; }
    .smart-mini-bar .btn { flex:1 1 auto; min-height:38px; }
    .smart-mini #smartMiniInput { font-size:15px; line-height:1.6; }
    #f-content { min-height:120px; font-size:16px; line-height:1.7; }
    .f-content-block { padding:10px 12px 12px; }
    .pts-acts { gap:8px; }
    .pts-acts .btn { flex:1 1 auto; min-height:44px; }
    .pts-foot .btn { min-height:42px; }
    .pts-del { height:42px; }
  }
  /* 电脑端（≥1024px）：保持宽屏观感，不与手机端规则冲突 */
  @media (min-width:1024px){
    .modal.xwide .box { padding:26px 28px; }
    .smart-mini { padding:12px 14px; }
    .form3, .form2 { gap:14px; }
  }
  /* ---- 导出 Excel：勾选列 / 导出工具条 / 导出弹窗 ---- */
  col.c-chk { width:42px; }
  th.chk, td.chk { text-align:center; padding-left:8px; padding-right:8px; }
  .sel-chk, .sel-all { width:15px; height:15px; cursor:pointer; accent-color:var(--primary); vertical-align:middle; }
  .proj-top { display:flex; align-items:flex-start; gap:8px; }
  .proj-sel { flex:0 0 auto; margin-top:3px; }
  .proj-body { flex:1; min-width:0; display:flex; flex-direction:column; gap:10px; }
  .proj-toolbar { display:flex; flex-wrap:wrap; gap:10px; align-items:center; margin:6px 0 2px; }
  .sel-all-wrap { display:inline-flex; align-items:center; gap:4px; white-space:nowrap; font-size:13px; color:var(--text-2); }
  .task-tools .muted-tip.tt-sel, .exp-bar .muted-tip { margin-left:0; }
  .exp-bar { margin-bottom:8px; }
  .exp-radios { display:flex; flex-direction:column; gap:9px; margin:6px 0 14px; }
  .exp-radios label { display:flex; align-items:center; gap:8px; font-size:14px; color:var(--text); cursor:pointer; }
  .exp-radios label.dis { color:var(--muted); cursor:not-allowed; }
  .exp-radios input { width:15px; height:15px; accent-color:var(--primary); flex:0 0 auto; }
  .exp-fields { display:grid; grid-template-columns:repeat(auto-fill,minmax(136px,1fr)); gap:9px 14px; margin:6px 0 14px; }
  .exp-fields label { display:flex; align-items:center; gap:7px; font-size:13px; color:var(--text); cursor:pointer; }
  .exp-fields input { width:15px; height:15px; accent-color:var(--primary); flex:0 0 auto; }
  .exp-file-tip { background:#f8fafc; border:1px dashed var(--line-2); border-radius:8px;
    padding:9px 11px; font-size:12.5px; color:var(--text-2); word-break:break-all; line-height:1.7; }
  @media (max-width:860px){ .exp-fields { grid-template-columns:repeat(2,1fr); } }

  /* 每日事项：搜索 + 排序工具条 */
  .task-tools { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:10px; }
  .tt-search { position:relative; flex:1 1 240px; max-width:380px; min-width:170px; }
  .tt-search input { padding-right:30px; }
  .tt-clear { position:absolute; right:5px; top:50%; transform:translateY(-50%); border:0; background:transparent;
    color:var(--muted); font-size:16px; line-height:1; padding:3px 7px; border-radius:6px; cursor:pointer; }
  .tt-clear:hover { background:rgba(0,0,0,.06); color:var(--text); }
  .task-tools select { width:auto; min-width:132px; flex:0 0 auto; }
  .task-tools .btn { flex:0 0 auto; white-space:nowrap; }
  .task-tools .muted-tip { margin-left:auto; }
  /* 每日事项：列表⇄月历切换 + 双日期轴分段按钮 */
  .tt-view, .tt-axis { display:inline-flex; gap:4px; flex:0 0 auto; }
  .tt-view .seg, .tt-axis .seg { border:1px solid var(--line); background:var(--bg); color:var(--text); }
  .tt-view .seg.on, .tt-axis .seg.on { background:var(--primary); color:#fff; border-color:var(--primary); }
  .tt-axis[hidden] { display:none; }
  .tt-hide { display:none !important; }
  mark.hl { background:#ffe58f; color:#1f2328; border-radius:2px; padding:0 1px; }
  @media (max-width:860px){
    .task-tools { gap:6px; }
    .tt-search { flex:1 1 100%; max-width:none; }
    .task-tools .muted-tip { margin-left:0; flex:1 1 100%; }
  }
  @media (max-width:860px){
    .cust-stat { margin-left:0; flex:1 1 100%; }
    .prov-head .cnt, .city-head .cnt { flex:1 1 100%; margin-left:0; text-align:left; }
  }
  /* 事项监控（全员）：8 列明细表 */
  .tbl-mon { table-layout:fixed; }
  .tbl-mon col.m-user{width:10%} .tbl-mon col.m-date{width:11%} .tbl-mon col.m-type{width:9%}
  .tbl-mon col.m-content{width:26%} .tbl-mon col.m-due{width:13%} .tbl-mon col.m-status{width:10%}
  .tbl-mon col.m-od{width:14%} .tbl-mon col.m-act{width:11%}
  .tbl-mon th { white-space:nowrap; font-size:12px; }
  .tbl-mon td { line-height:1.6; word-break:break-word; overflow-wrap:anywhere; }
  .tbl-mon td.m-content { color:var(--text); }
  .tbl-mon .due-d, .tbl-mon .due-t { white-space:nowrap; font-variant-numeric:tabular-nums; }
  .tbl-mon .due-t { color:var(--muted); font-size:12px; }
  .tbl-mon td.m-act .row-actions { white-space:nowrap; }
  /* ---- 全员事项明细 · 月历视图（v2.41：取代原 9 列分页表格） ---- */
  .moncal-wrap { border:1px solid var(--line); border-radius:12px; background:#fff; padding:10px 12px 12px; }
  .moncal-bar { display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin-bottom:10px; }
  .moncal-bar .moncal-title { font-size:15px; font-weight:800; color:var(--text); letter-spacing:.3px; padding:0 2px; }
  .moncal-bar .moncal-ym { font-size:14px; font-weight:700; color:var(--text); padding:0 4px; font-variant-numeric:tabular-nums; }
  .moncal-bar select { width:auto; min-width:124px; flex:0 0 auto; }
  .moncal-sp { flex:1 1 auto; }
  .moncal-lbl { display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--muted); white-space:nowrap; }
  .moncal-dow { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); background:#fbfcfe; border:1px solid var(--line); border-bottom:0; border-radius:10px 10px 0 0; }
  .moncal-dow span { text-align:center; font-size:11.5px; color:var(--muted); padding:5px 0; }
  .moncal-dow span.wk { color:#dc2626; }
  .moncal-grid { border:1px solid var(--line); border-radius:0 0 10px 10px; overflow:hidden; }
  .moncal-week { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); border-bottom:1px solid var(--line); }
  .moncal-week:last-child { border-bottom:0; }
  .moncal-day { position:relative; min-width:0; min-height:92px; padding:3px 4px 5px; border-left:1px solid var(--line); background:#fff; cursor:pointer; transition:background .15s; }
  .moncal-day:first-child { border-left:0; }
  .moncal-day.wkend { background:#fdfdff; }
  .moncal-day.out { background:#fcfcfd; cursor:default; }
  .moncal-day.today { background:#eff6ff; }
  .moncal-day.sel { background:#eff6ff; box-shadow:inset 0 0 0 2px var(--primary); }
  .moncal-day:hover:not(.out) { background:#f8fafc; }
  .moncal-day.sel:hover { background:#eff6ff; }
  .moncal-dnum { display:flex; align-items:center; justify-content:space-between; gap:4px; font-size:12px; line-height:19px; color:var(--text-2); }
  .moncal-day.out .moncal-dnum { color:var(--muted); }
  .moncal-day.today .moncal-dnum b { background:var(--primary); color:#fff; border-radius:999px; padding:0 7px; }
  .moncal-dcnt { font-size:10.5px; color:var(--muted); font-variant-numeric:tabular-nums; }
  .moncal-chip, .moncal-more { display:block; width:100%; text-align:left; font-family:inherit; cursor:pointer; }
  .moncal-chip { border:0; border-left:3px solid #94a3b8; background:#f1f5f9; color:#334155; border-radius:4px;
    padding:1px 5px; margin-top:2px; font-size:11px; line-height:1.4; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .moncal-chip:hover { filter:brightness(.95); }
  .moncal-chip.s-doing { border-left-color:#2563eb; background:#eff6ff; color:#1e3a8a; }
  .moncal-chip.s-done  { border-left-color:#16a34a; background:#dcfce7; color:#14532d; }
  .moncal-chip.s-od    { border-left-color:#dc2626; background:#fee2e2; color:#7f1d1d; }
  .moncal-more { border:0; background:transparent; color:var(--primary); font-size:10.5px; padding:1px 5px; margin-top:1px; border-radius:4px; }
  .moncal-more:hover { background:var(--primary-soft); }
  .moncal-foot { display:flex; align-items:center; gap:6px 16px; flex-wrap:wrap; margin-top:10px; font-size:11.5px; color:var(--muted); }
  .moncal-foot i { display:inline-block; width:11px; height:11px; border-radius:3px; margin-right:4px; vertical-align:-1px; border:1px solid rgba(15,23,42,.08); }
  .moncal-foot i.lg-todo { background:#f1f5f9; } .moncal-foot i.lg-doing { background:#eff6ff; }
  .moncal-foot i.lg-done { background:#dcfce7; } .moncal-foot i.lg-od { background:#fee2e2; }
  .moncal-tray { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:10px; padding:8px 10px;
    border:1px dashed var(--line-2); border-radius:9px; font-size:12px; color:var(--muted); }
  .moncal-daypanel { margin-top:14px; border-top:1px dashed var(--line); padding-top:12px; }
  .moncal-ph { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:9px; }
  .moncal-ph .moncal-ph-t { font-size:14.5px; font-weight:800; color:var(--text); }
  .mon-ev { display:flex; gap:10px; align-items:flex-start; padding:9px 11px; margin-bottom:8px; background:#fff;
    border:1px solid var(--line); border-left:3px solid #94a3b8; border-radius:0 9px 9px 0; }
  .mon-ev.s-doing { border-left-color:#2563eb; } .mon-ev.s-done { border-left-color:#16a34a; }
  .mon-ev.s-od { border-left-color:#dc2626; background:#fffafa; }
  .mon-ev-main { flex:1 1 auto; min-width:0; }
  .mon-ev-h { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:11.5px; color:var(--muted); }
  .mon-ev-h b { font-size:13px; font-weight:700; color:var(--text); }
  .mon-ev-c { margin-top:4px; font-size:13px; line-height:1.6; color:var(--text); word-break:break-word; }
  .mon-ev-m { margin-top:4px; font-size:11.5px; color:var(--muted); }
  .mon-ev-act { flex:0 0 auto; }
  /* v2.78：月历明细里的状态下拉 —— 作用域限定，不影响列表视图那条 */
  .mon-ev .status-select { max-width:104px; padding:2px 20px 2px 9px; font-size:11.5px; }
  /* ===== v2.92：月历「要点截止」—— 要点按**自己的 due** 独立上日历 =====
   * 视觉口径：格内「◆ 前缀 + 左侧虚线」与事项小条区分；明细卡片左侧也是虚线，
   * 但颜色仍跟事项一致（超期/临期红 · 已完成绿 · 其余蓝），避免一张日历两套色语言。 */
  .moncal-chip.pt-chip { border-left-style:dashed; font-weight:600; }
  .moncal-sec { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; margin:0 0 7px;
    font-size:12.5px; font-weight:800; color:#334155; }
  .moncal-sec span { font-weight:400; font-size:11.5px; color:var(--muted); }
  .moncal-sec.sub { margin-top:12px; padding-top:10px; border-top:1px dashed var(--line); }
  .mon-ev.pt-ev { border-left-style:dashed; background:#fbfcff; }
  .mon-ev.pt-ev.s-od { background:#fffafa; }
  .mon-ev.pt-ev .pt-t { flex:1 1 auto; min-width:0; font-size:13px; font-weight:700; color:var(--text);
    line-height:1.45; overflow-wrap:anywhere; }
  .mon-ev.pt-ev .mon-ev-m { line-height:1.6; overflow-wrap:anywhere; }
  .mon-pt-ck { flex:0 0 auto; width:15px; height:15px; margin:0; cursor:pointer; accent-color:var(--primary); }
  .moncal-foot i.lg-pt { background:#fff; border:1px dashed #94a3b8; }
  @media (max-width:860px) {
    .moncal-day { min-height:74px; padding:2px 3px 4px; }
    .moncal-chip { font-size:10px; padding:1px 3px; }
    .moncal-dcnt { display:none; }
    .moncal-bar select { min-width:96px; }
    .moncal-bar .moncal-title { display:none; }
    .mon-ev { flex-direction:column; gap:6px; }
    .mon-ev-act { width:100%; }
  }
  /* ---- 工作量与事项统计（v2.42：原「按登记人统计」+「工作量比对看板（全员）」合并为一块） ---- */
  .wl-hint { font-size:11.5px; line-height:1.7; color:var(--muted); margin:-2px 0 9px; overflow-wrap:anywhere; }
  .wl-tbl { table-layout:auto; }
  .wl-tbl th { white-space:nowrap; font-size:12px; }
  .wl-tbl th.wl-grp { text-align:center; font-size:11.5px; letter-spacing:.5px; border-bottom:1px solid var(--line); }
  .wl-tbl th.wl-grp.g-entries { color:#1d4ed8; }
  .wl-tbl th.wl-grp.g-cust { color:#0f766e; }
  .wl-tbl td { font-variant-numeric:tabular-nums; }
  .wl-tbl td.wl-name { font-weight:700; white-space:nowrap; }
  .wl-tbl .wl-zero { color:#cbd5e1; }
  .wl-rate { display:flex; align-items:center; gap:7px; min-width:108px; }
  .wl-rate .v { flex:0 0 38px; font-weight:700; text-align:right; }
  .wl-rate .bar { flex:1 1 auto; height:7px; border-radius:5px; background:rgba(15,23,42,.08); overflow:hidden; min-width:46px; }
  .wl-rate .bar > i { display:block; height:100%; background:#2563eb; }
  .wl-rate.wl-r-ok  .bar > i { background:#16a34a; }
  .wl-rate.wl-r-low .bar > i { background:#dc2626; }
  .wl-tbl tr.wl-sum td { background:#f8fafc; font-weight:700; border-top:2px solid var(--line); }
  @media (max-width:860px) {
    .wl-rate { min-width:0; }
    .wl-rate .v { flex:0 0 auto; }
    .wl-tbl tr.wl-sum td { background:#eef2f7; }
  }
  .btn { background:linear-gradient(90deg,#2563eb,#3b82f6); color:#fff; font-weight:700; border:none; padding:8px 14px; border-radius:9px;
    font-size:13px; cursor:pointer; box-shadow:0 2px 6px rgba(37,99,235,.25); transition:.15s; }
  .btn:hover { filter:brightness(1.05); box-shadow:0 4px 12px rgba(37,99,235,.35); }
  .btn.gray { background:#f1f5f9; color:var(--text-2); box-shadow:none; border:1px solid var(--line); }
  .btn.gray:hover { background:#e2e8f0; color:var(--text); }
  .btn.red { background:linear-gradient(90deg,#ef4444,#dc2626); color:#fff; box-shadow:0 2px 6px rgba(220,38,38,.25); }
  .btn.red:hover { filter:brightness(1.05); box-shadow:0 4px 12px rgba(220,38,38,.35); }
  .btn.sm { padding:5px 10px; font-size:12px; }
  /* 按钮组 + 下拉菜单 */
  .btn-group { position:relative; display:inline-flex; margin-left:auto; }
  .btn-group > .btn { margin-left:0; border-radius:0; }
  .btn-group > .btn:first-of-type { border-radius:8px 0 0 8px; }
  .btn-group > .btn:last-of-type { border-radius:0 8px 8px 0; }
  .btn-more { box-shadow:inset 1px 0 0 rgba(255,255,255,.35); }
  .btn-menu { position:absolute; right:0; top:calc(100% + 6px); z-index:60; min-width:206px; background:#ffffff; border:1px solid var(--line-2);
    border-radius:10px; box-shadow:0 12px 30px rgba(15,23,42,.15); padding:4px; }
  .btn-menu button { display:block; width:100%; margin:0; text-align:left; background:none; border:none; padding:9px 12px; font-size:13px;
    color:var(--text-2); border-radius:7px; cursor:pointer; }
  .btn-menu button:hover { background:var(--primary-soft); color:var(--primary); }
  input,select,textarea { width:100%; padding:9px 11px; border:1px solid var(--line-2); border-radius:9px; font-size:13px; font-family:inherit;
    background:#ffffff; color:var(--text); transition:border-color .15s, box-shadow .15s; }
  input:focus,select:focus,textarea:focus { outline:none; border-color:var(--primary); box-shadow:0 0 0 3px rgba(37,99,235,.15); }
  option { background:#ffffff; color:var(--text); }
  /* 只读字段（系统自动填，禁止修改）：浅灰底 + 不可点击光标，禁用聚焦高亮 */
  input[readonly] { background:#f8fafc; color:var(--text-2); cursor:not-allowed; }
  input[readonly]:focus { outline:none; border-color:var(--line-2); box-shadow:none; }
  label { display:block; font-size:12px; color:var(--muted); margin:10px 0 4px; }
  label .req { color:var(--danger); margin-left:2px; }
  .form3 { display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px; }
  .form2 { display:grid; grid-template-columns:1fr 1fr; gap:12px; }
  .form4 { display:grid; grid-template-columns:1fr 1fr 1fr 1fr; gap:12px; }
  /* 行政区划级联下拉：input + datalist，统一 ▾ 外观，可输入可选择 */
  .combo { position:relative; }
  .combo input { padding-right:26px; width:100%; box-sizing:border-box; }
  .combo::after { content:"▾"; position:absolute; right:8px; top:50%; transform:translateY(-50%); color:var(--muted); font-size:11px; pointer-events:none; }
  .combo input:disabled { background:#f8fafc; color:var(--muted); cursor:not-allowed; }
  .combo input:disabled + .combo-caret,
  .combo:has(input:disabled)::after { opacity:.5; }
  /* 关联项目：可手动输入的模糊搜索选择器（v1.97） */
  .pjp { position:relative; }
  .pjp input.pjp-in { padding-right:52px; width:100%; box-sizing:border-box; }
  .pjp::after { content:"▾"; position:absolute; right:8px; top:50%; transform:translateY(-50%); color:var(--muted); font-size:11px; pointer-events:none; }
  .pjp-clear { position:absolute; right:25px; top:50%; transform:translateY(-50%); width:18px; height:18px; line-height:16px; text-align:center;
    border:0; border-radius:50%; background:#e2e8f0; color:#475569; font-size:13px; cursor:pointer; padding:0; display:none; }
  .pjp-clear:hover { background:#cbd5e1; }
  .pjp.has-val .pjp-clear { display:block; }
  .pjp-list { position:absolute; z-index:60; left:0; right:0; top:calc(100% + 4px); max-height:300px; overflow-y:auto;
    background:#fff; border:1px solid var(--line); border-radius:10px; box-shadow:0 10px 26px rgba(15,23,42,.16); padding:4px; }
  .pjp-list.up { top:auto; bottom:calc(100% + 4px); }
  .pjp-list[hidden] { display:none; }
  .pjp-item { display:flex; align-items:baseline; gap:8px; padding:7px 9px; border-radius:7px; cursor:pointer; font-size:13px; color:var(--text); }
  .pjp-item:hover, .pjp-item.on { background:var(--primary-soft); }
  .pjp-item .nm { flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .pjp-item .mt { flex:0 0 auto; font-size:11px; color:var(--muted); }
  .pjp-item.none { color:var(--muted); font-style:italic; }
  .pjp-empty { padding:10px; font-size:12px; color:var(--muted); text-align:center; }
  .pca-tip { font-size:11px; color:var(--muted); margin-top:2px; min-height:14px; }
  .pca-tip.miss { color:#b45309; }
  /* 客户管理 · 按「省份 → 城市」分组折叠 */
  .cust-toolbar { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:12px; padding:10px 12px; background:#f8fafc; border:1px solid var(--line); border-radius:10px; }
  .cust-search { flex:1; min-width:170px; padding:7px 10px; border:1px solid var(--line); border-radius:8px; font-size:13px; color:var(--text); background:#fff; }
  .cust-search:focus { outline:none; border-color:#2563eb; box-shadow:0 0 0 3px rgba(37,99,235,.12); }
  .cust-stat { font-size:12px; color:var(--muted); margin-left:auto; }
  .cust-sel { padding:7px 10px; border:1px solid var(--line); border-radius:8px; font-size:13px; background:#fff; color:var(--text); min-width:120px; }
  .cust-sel:focus { outline:none; border-color:#2563eb; box-shadow:0 0 0 3px rgba(37,99,235,.12); }
  /* ===== 客户管理 · 按城市归整的两级导航 ===== */
  .cust-toolbar { display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-bottom:12px; }
  .cust-search { flex:1 1 240px; min-width:0; }
  .cust-sel { flex:0 0 auto; max-width:200px; }
  .cust-stat { flex:0 0 auto; font-size:12px; color:var(--muted); white-space:nowrap; }

  /* 一级：城市大卡片 */
  .city-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:14px; }
  .city-card { position:relative; border:1px solid var(--line); border-radius:14px; background:#fff; padding:16px 18px; cursor:pointer;
    display:flex; flex-direction:column; gap:5px; transition:border-color .12s, box-shadow .12s, transform .12s; }
  .city-card:hover { border-color:var(--primary-2); box-shadow:0 4px 14px rgba(37,99,235,.12); transform:translateY(-1px); }
  .city-card .city-name { font-size:17px; font-weight:800; color:#1e40af; padding-right:18px; }
  .city-card .city-prov { font-size:12px; color:var(--muted); }
  .city-card .city-meta { display:flex; gap:14px; margin-top:4px; font-size:12px; color:var(--text-2); }
  .city-card .city-meta b { color:var(--primary); font-size:14px; margin-left:2px; }
  .city-card .city-arrow { position:absolute; right:14px; top:50%; transform:translateY(-50%); color:var(--muted); font-size:20px; line-height:1; }

  /* 二级：客户摘要卡片 */
  .cust-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:14px; }
  .cust-card { border:1px solid var(--line); border-radius:14px; background:#fff; padding:14px 16px; cursor:pointer;
    display:flex; flex-direction:column; gap:7px; transition:border-color .12s, box-shadow .12s, transform .12s; }
  .cust-card:hover { border-color:var(--primary-2); box-shadow:0 3px 12px rgba(37,99,235,.1); transform:translateY(-1px); }
  .cust-card .uc-name { font-size:15px; font-weight:800; color:#1e40af; line-height:1.4; min-width:0; overflow-wrap:anywhere; word-break:break-word; }
  .cust-card .uc-loc { font-size:12px; color:var(--muted); overflow-wrap:anywhere; word-break:break-word; }
  .cust-card .uc-count { font-size:12px; color:var(--text-2); }
  .cust-card .uc-count b { color:var(--primary); }

  .cust-back { display:inline-flex; align-items:center; gap:6px; margin-bottom:10px; font-size:13px; color:var(--primary); cursor:pointer;
    background:none; border:none; padding:0; font-family:inherit; }
  .cust-back:hover { text-decoration:underline; }
  .cust-crumb { font-size:12px; color:var(--muted); }
  .cust-crumb a { color:var(--primary); cursor:pointer; }
  .cust-crumb a:hover { text-decoration:underline; }
  @media (max-width:560px){ .city-grid,.cust-grid { grid-template-columns:1fr; } }
  .prov-group { margin-bottom:10px; border:1px solid var(--line); border-radius:10px; overflow:hidden; background:#fff; }
  .prov-head { display:flex; align-items:center; gap:8px; width:100%; padding:10px 12px; background:linear-gradient(90deg,#eff6ff,#f8fafc); border:none; cursor:pointer; font-size:14px; font-weight:600; color:#1e40af; text-align:left; font-family:inherit; }
  .prov-head:hover { background:#dbeafe; }
  .prov-head .caret { display:inline-block; font-size:11px; color:var(--muted); width:14px; text-align:center; }
  .city-head .caret { display:inline-block; font-size:11px; color:var(--muted); width:14px; text-align:center; }
  .prov-body { padding:8px 10px 10px; }
  .city-group { margin:0 0 8px; border:1px solid var(--line); border-radius:8px; overflow:hidden; }
  .city-group:last-child { margin-bottom:0; }
  .city-head { display:flex; align-items:center; gap:8px; width:100%; padding:8px 12px; background:#fff; border:none; cursor:pointer; font-size:13px; color:var(--text); text-align:left; font-family:inherit; }
  .city-head:hover { background:#f1f5f9; }
  .city-head .cname { font-weight:600; }
  .city-head .cnt { font-size:12px; color:var(--muted); margin-left:auto; }
  .city-body { padding:8px 10px 10px; background:#fbfcfe; border-top:1px solid var(--line); }
  .city-body .card { margin-bottom:10px; }
  .city-body .card:last-child { margin-bottom:0; }
  .city-body .proj-card { margin-bottom:10px; }
  .city-body .proj-card:last-child { margin-bottom:0; }
  /* 项目列表方案A：左省导航 + 右城市卡片网格（主从布局） */
  .proj-md { display:flex; gap:14px; align-items:flex-start; margin-top:12px; }
  .proj-md-nav { flex:0 0 210px; position:sticky; top:12px; background:#fff; border:1px solid var(--line); border-radius:12px; padding:12px 10px; max-height:72vh; overflow:auto; }
  .proj-md-nav-h { font-size:13px; color:var(--muted); margin:2px 4px 10px; }
  .proj-md-provs { display:flex; flex-direction:column; gap:4px; }
  .proj-prov-item { display:flex; align-items:center; justify-content:space-between; gap:8px; width:100%; padding:9px 10px; border:none; background:transparent; border-radius:9px; cursor:pointer; font-size:13px; color:var(--text); text-align:left; font-family:inherit; }
  .proj-prov-item:hover { background:#f1f5f9; }
  .proj-prov-item.active { background:var(--primary-soft); color:var(--primary); font-weight:600; }
  .proj-prov-item .cnt { font-size:12px; color:var(--muted); background:#eef2f7; border-radius:10px; padding:1px 8px; }
  .proj-prov-item.active .cnt { color:var(--primary); background:#dbeafe; }
  .proj-md-main { flex:1 1 auto; min-width:0; }
  .proj-md-main-h { display:flex; align-items:baseline; justify-content:space-between; margin-bottom:12px; }
  .proj-md-main-h > span:first-child { font-size:15px; font-weight:600; color:var(--text); }
  .proj-md-hint { font-size:13px; color:var(--muted); }
  .proj-md-cities { display:grid; grid-template-columns:repeat(auto-fill, minmax(min(280px,100%),1fr)); gap:12px; }
  .city-card { border:1px solid var(--line); border-radius:12px; background:#fff; padding:12px 14px; cursor:pointer; transition:border-color .15s, box-shadow .15s, transform .15s; }
  .city-card:hover { border-color:var(--primary-2); box-shadow:0 6px 18px rgba(37,99,235,.10); }
  .city-card.open { border-color:var(--primary-2); }
  .city-card-h { display:flex; align-items:center; gap:8px; }
  .city-card-h .cname { font-size:14px; font-weight:600; color:var(--text); }
  .city-card-h .cnt { font-size:12px; color:var(--primary); background:var(--primary-soft); border-radius:10px; padding:1px 9px; margin-left:auto; }
  .city-card-samples { margin-top:8px; display:flex; flex-direction:column; gap:3px; }
  .city-card-samples .samp { font-size:12px; color:var(--muted); margin:0; line-height:1.5; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .city-card-samples .samp.more { color:var(--primary); }
  .city-card-body { margin-top:10px; padding-top:10px; border-top:1px dashed var(--line); display:none; }
  @media (max-width:760px){ .proj-md { flex-direction:column; } .proj-md-nav { flex:none; width:100%; position:static; max-height:none; } .proj-md-cities { grid-template-columns:minmax(0,1fr); } }
  /* 第三级：区 / 县（含县级市） */
  .dist-group { margin:0 0 6px; border:1px solid var(--line); border-radius:8px; overflow:hidden; background:#fff; }
  .dist-group:last-child { margin-bottom:0; }
  .dist-head { display:flex; align-items:center; gap:8px; width:100%; padding:7px 12px; background:#f8fafc;
    border:none; border-left:3px solid #93b4f7; cursor:pointer; font-size:13px; color:var(--text); text-align:left; font-family:inherit; }
  .dist-head:hover { background:#eef4fe; }
  .dist-head .caret { display:inline-block; font-size:10px; color:var(--muted); width:14px; text-align:center; }
  .dist-head .dname { font-weight:600; }
  .dist-head .cnt { font-size:12px; color:var(--muted); margin-left:auto; }
  .dist-body { padding:8px 10px 4px; background:#fff; border-top:1px solid var(--line); }
  .dist-body .card { margin-bottom:10px; padding:11px 12px; }
  .dist-body .card:last-child { margin-bottom:0; }
  .grp-empty { padding:18px; text-align:center; color:var(--muted); font-size:13px; }
  /* 资源汇聚 · 城市两级导航（对齐客户管理）：词条摘要卡 */
  .res-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:14px; margin-top:6px; }
  .res-sum-card { border:1px solid var(--line); border-radius:14px; background:#fff; padding:13px 15px; display:flex; flex-direction:column; gap:7px; cursor:pointer;
    transition:border-color .12s, box-shadow .12s; min-width:0; }
  .res-sum-card:hover { border-color:var(--primary-2); box-shadow:0 2px 10px rgba(37,99,235,.09); }
  .res-sum-card .sc-name { font-size:15px; font-weight:800; color:#1e40af; line-height:1.4; overflow-wrap:anywhere; word-break:break-word; }
  .res-sum-card .sc-line { display:flex; gap:5px; flex-wrap:wrap; }
  .res-sum-card .sc-meta { font-size:12px; color:var(--muted); overflow-wrap:anywhere; word-break:break-word; }
  .res-sum-card .sc-meta b { color:var(--text-2); }
  .res-sum-card .tag { font-size:12px; }
  /* 项目摘要卡：底部动作行（打开详情 / 编辑 / 删除），与基地学校词条卡对齐但保留项目级操作 */
  .proj-sum-card { gap:8px; }
  .proj-sum-card .proj-status { font-weight:600; }
  .proj-sum-acts { display:flex; gap:6px; flex-wrap:wrap; margin-top:2px; }
  .proj-sum-acts .btn { font-size:11px; padding:3px 9px; }
  .proj-prov-card .city-arrow, .proj-city-card .city-arrow { font-size:22px; }
  /* 资源汇聚 · 分组词条头部（名称 + 类型 + 状态 + 操作） */
  .res-item-head { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:8px; }
  .res-item-head .res-item-name { font-size:15px; color:#1e40af; }
  .res-item-head .row-actions { margin-left:auto; }
  .res-item-head + .table-wrap table td, .res-item-head + .table-wrap table th { padding:6px 8px; font-size:13px; }
  /* 资源汇聚 · 数据看板（.res-board 前缀隔离，不影响其他页面） */
  .res-board { margin-bottom:14px; }
  /* KPI 用 flex 自适应：6 个→6 列、3 个→3 列，均能撑满整行不留空 */
  .res-board .res-kpis { display:flex; flex-wrap:wrap; gap:10px; margin-bottom:12px; }
  .res-kpi { background:#f8fafc; border:1px solid var(--line); border-radius:11px; padding:11px 13px;
    display:flex; flex-direction:column; gap:3px; min-width:0; flex:1 1 150px; }
  .res-kpi .kpi-ico { font-size:15px; line-height:1; }
  .res-kpi .kpi-val { font-size:21px; font-weight:700; color:var(--text); line-height:1.2; word-break:break-all; }
  .res-kpi .kpi-val .unit { font-size:12px; font-weight:500; color:var(--muted); margin-left:2px; }
  .res-kpi .kpi-lab { font-size:12px; color:var(--muted); }
  .res-board .res-charts { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
  .res-board .res-charts .mini { display:flex; flex-direction:column; }
  /* 图表个数为奇数时，最后一个占满整行（避免右侧留大片空白） */
  .res-board .res-charts .mini:last-child:nth-child(odd) { grid-column:1/-1; }
  .fw { grid-column:1/-1; }

  /* ===== SOP 流程修改器 ===== */
  .sop-layout { display:grid; grid-template-columns:280px 1fr; gap:16px; margin-top:12px; align-items:start; }
  .sop-list { border:1px solid var(--line); border-radius:12px; background:var(--panel); padding:10px; max-height:70vh; overflow:auto; }
  .sop-list-h { font-size:13px; color:var(--muted); margin:2px 4px 8px; }
  .sop-li { border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:8px; cursor:pointer; background:#fff; }
  .sop-li:hover { border-color:var(--primary); }
  .sop-li.active { border-color:var(--primary); background:var(--primary-soft); }
  .sop-li-t { font-weight:600; }
  .sop-li-m { font-size:12px; color:var(--muted); margin-top:2px; }
  .sop-editor { border:1px solid var(--line); border-radius:12px; background:#fff; padding:16px; }
  .sop-field { margin-bottom:12px; }
  .sop-field > label { display:block; font-size:12px; color:var(--muted); margin-bottom:4px; }
  .sop-field input, .sop-field textarea, .sop-field select { width:100%; box-sizing:border-box; }
  .sop-field textarea { min-height:96px; resize:vertical; }
  .sop-stages { margin-top:8px; }
  .sop-stage { border:1px solid var(--line); border-radius:12px; padding:12px; margin-bottom:12px; background:var(--panel); }
  .sop-stage-h { display:flex; align-items:center; gap:8px; margin-bottom:8px; }
  .sop-stage-h .si-idx { font-weight:700; color:var(--primary); }
  .sop-stage-h .si-name { flex:1; font-weight:600; }
  .sop-row2 { display:grid; grid-template-columns:90px 1fr 130px; gap:8px; margin-bottom:8px; }
  .sop-foot { display:flex; gap:10px; flex-wrap:wrap; margin-top:14px; padding-top:12px; border-top:1px dashed var(--line); }
  .sop-pub-list { max-height:50vh; overflow:auto; border:1px solid var(--line); border-radius:10px; padding:2px 12px;
    display:grid; grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); gap:0 18px; }
  .sop-pub-item { display:flex; align-items:center; gap:8px; padding:8px 4px; border-bottom:1px solid var(--line);
    cursor:pointer; font-size:14px; color:var(--text); margin:0; }
  /* 全局 input{width:100%;padding:9px 11px} 会把弹窗里的复选框撑满整行、把名字挤成竖排——这里强制还原原生小方块 */
  .sop-pub-item input[type=checkbox] { width:15px; height:15px; padding:0; margin:0; flex:0 0 auto; accent-color:var(--primary); cursor:pointer; }
  .pub-all { display:inline-flex; align-items:center; gap:6px; cursor:pointer; font-weight:600; font-size:13px; color:var(--text); margin:0; }
  .pub-all input[type=checkbox] { width:15px; height:15px; padding:0; margin:0; accent-color:var(--primary); cursor:pointer; vertical-align:-2px; }

  /* ===== 项目工作站 ===== */
  .proj-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(min(320px,100%),1fr)); gap:14px; margin-top:12px; }
  /* v2.84 方案A 同款（与 v2.83 问卷卡口径一致）：三段式「头(标题+状态) / 元信息小标签 / 底栏按钮」，
     根除标题挤状态胶囊、元信息糊成一坨、按钮平铺拥挤三类问题 */
  .proj-card { border:1px solid var(--line); border-radius:14px; background:#fff; padding:0; cursor:pointer;
    transition:box-shadow .15s, border-color .15s, transform .15s; display:flex; flex-direction:column; gap:0; min-width:0; }
  .proj-card:hover { border-color:var(--primary-2); box-shadow:0 8px 22px rgba(37,99,235,.13); transform:translateY(-2px); }
  .proj-top { display:flex; align-items:flex-start; gap:8px; padding:14px 15px 0; }
  .proj-head { display:flex; align-items:flex-start; gap:10px; flex-wrap:nowrap; }
  .proj-name { font-size:15px; font-weight:800; color:var(--text); line-height:1.45; flex:1 1 auto; min-width:0;
    overflow-wrap:anywhere; word-break:break-word;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
  .proj-status { flex:0 0 auto; font-size:12px; font-weight:700; padding:3px 9px; border-radius:999px; white-space:nowrap; }
  .proj-status.s-洽谈中 { background:#f3e8ff; color:#7c3aed; }
  .proj-status.s-筹备中 { background:var(--primary-soft); color:var(--primary); }
  .proj-status.s-实施中 { background:var(--warn-soft); color:var(--warn); }
  .proj-status.s-缴款中 { background:#ccfbf1; color:#0f766e; }
  .proj-status.s-已结项 { background:var(--good-soft); color:var(--good); }
  .proj-status.s-已取消 { background:#e5e7eb; color:#6b7280; }   /* v2.12：已取消——灰阶，与进行中/已结项明显区分 */
  /* v2.00：详情栏「项目状态」徽标升级为下拉直改（有权限者）；沿用徽标配色，只补边框/光标/焦点 */
  .proj-status.sel { border:1px solid transparent; cursor:pointer; max-width:100%; padding:3px 4px 3px 9px; }
  .proj-status.sel:hover { border-color:var(--line-2); }
  .proj-status.sel:focus { outline:none; border-color:var(--primary); box-shadow:0 0 0 2px rgba(37,99,235,.15); }
  .proj-status.sel:disabled { opacity:.6; cursor:default; }
  .proj-meta { display:flex; flex-wrap:wrap; gap:6px; }   /* v2.84：元信息改小标签后自然折行，不再糊成一片 */
  .proj-meta b { color:var(--text-2); font-weight:600; }
  .pj-chip { background:#f1f5f9; border:1px solid var(--line); border-radius:999px; padding:3px 10px; font-size:11.5px;
    color:var(--muted); display:inline-flex; align-items:center; gap:5px; max-width:100%; }
  .pj-chip b { color:var(--text-2); font-weight:700; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .proj-bar-wrap { height:8px; background:#eef2f7; border-radius:999px; overflow:hidden; }
  .proj-bar-in { height:100%; background:linear-gradient(90deg,#2563eb,#0ea5e9); border-radius:999px; transition:width .3s; }
  .proj-prog { display:flex; align-items:center; justify-content:space-between; font-size:12px; color:var(--muted); }
  .proj-prog b { color:var(--primary); font-size:13px; }
  .proj-dots { display:flex; gap:4px; flex-wrap:wrap; }
  .proj-dot { width:22px; height:22px; border-radius:7px; display:flex; align-items:center; justify-content:center;
    font-size:11px; background:#f1f5f9; color:var(--muted); border:1px solid var(--line); }
  .proj-dot.doing { background:var(--warn-soft); color:var(--warn); border-color:#fcd34d; }
  .proj-dot.done { background:var(--good-soft); color:var(--good); border-color:#86efac; }
  .proj-dot.skip { background:#f1f5f9; color:#94a3b8; text-decoration:line-through; }
  .proj-warn { font-size:12px; color:var(--danger); font-weight:600; }
  /* v2.84：按钮收「常用 3 + ⋯ 更多」，独立成底栏（浅底 + 顶边分隔线 + 底部圆角），与 v2.83 问卷卡底栏同款 */
  .proj-acts { display:flex; gap:6px; justify-content:flex-end; align-items:center; flex-wrap:wrap;
    margin-top:12px; padding:11px 14px; background:#f8fafc; border-top:1px solid var(--line); border-radius:0 0 13px 13px; }
  .proj-more { position:relative; }
  .proj-menu { position:absolute; right:0; bottom:calc(100% + 6px); background:#fff; border:1px solid var(--line);
    border-radius:10px; box-shadow:0 12px 30px rgba(15,23,42,.16); padding:6px; min-width:126px; display:none; z-index:30; }
  .proj-menu.on { display:block; }
  .proj-menu button { display:block; width:100%; text-align:left; background:none; border:0; padding:8px 10px; border-radius:7px;
    font-size:12.5px; color:var(--text-2); cursor:pointer; font-family:inherit; }
  .proj-menu button:hover { background:var(--primary-soft); color:var(--primary); }
  .proj-menu button.danger { color:var(--danger); }
  .proj-menu button.danger:hover { background:var(--danger-soft); color:var(--danger); }
  /* ===== 项目列表：多维筛选 + 类型分布 ===== */
  .proj-filters { display:flex; flex-wrap:wrap; gap:8px 10px; align-items:flex-end; margin:10px 0 4px; }
  .proj-filters .pf { display:flex; flex-direction:column; gap:3px; }
  .proj-filters .pf label { font-size:11.5px; color:var(--muted); }
  .proj-filters .pf select { min-width:104px; padding:6px 8px; border:1px solid var(--line); border-radius:8px; background:#fff; font-size:13px; }
  .proj-filters .pf-count { align-self:center; font-size:12.5px; color:var(--muted); margin-left:4px; }
  .proj-filters .pf-count b { color:var(--primary); }
  .proj-types { margin:6px 0 2px; }
  .pt-card { border:1px solid var(--line); border-radius:12px; background:#fff; padding:12px 14px; }
  .pt-card h4 { font-size:13.5px; margin-bottom:8px; }
  .pt-card .muted-tip { color:var(--muted); font-weight:400; font-size:12px; }
  /* 仪表盘「项目工作站统计」：KPI + 四维分布卡片网格 */
  .projstat-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; margin-top:12px; }
  .projstat-grid .pt-card { margin:0; }
  /* 项目区域分布：参考客户管理「中国地图」形式，自绘省/市 SVG 地图 */
  .proj-region-card { display:flex; flex-direction:column; }
  .proj-region-map-wrap { position:relative; width:100%; aspect-ratio:1000 / 720; margin:6px 0 0; }
  .proj-region-map-wrap .chart-map { width:100%; height:100%; }
  .proj-region-foot { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:8px; }
  .proj-region-legend { display:inline-flex; align-items:center; gap:6px; font-size:11px; color:var(--muted); }
  .proj-region-legend .bar { width:92px; height:9px; border-radius:5px; background:linear-gradient(90deg,#bfdbfe,#1e40af); display:inline-block; }
  .geo-tip-sub { color:#cbd5e1; font-size:11px; }
  @media (max-width:680px){ .projstat-grid { grid-template-columns:1fr; } }
  /* ===== 项目工作站：新建 / 编辑项目表单（三段式分组 + 两列栅格） ===== */
  .pf-sec { margin:0; }
  .pf-sec > h4 { display:flex; align-items:center; gap:7px; font-size:13px; font-weight:800; color:var(--text);
    margin:16px 0 10px; padding-left:9px; border-left:3px solid var(--primary); line-height:1.35; }
  .pf-sec:first-of-type > h4 { margin-top:2px; }
  .pf-sec > h4 .pf-sec-tip { font-size:11.5px; font-weight:500; color:var(--muted); }
  .pf-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px 14px; }
  .pf-grid > .full { grid-column:1/-1; }
  .pf-f { min-width:0; }
  .pf-f > label { font-size:12px; color:var(--muted); display:block; margin-bottom:4px; line-height:1.4; }
  .pf-f > label .rq { color:var(--danger); margin-left:2px; font-weight:700; }
  .pf-f input, .pf-f select, .pf-f textarea { width:100%; min-width:0; box-sizing:border-box; }
  .pf-f textarea { resize:vertical; line-height:1.6; }
  .pf-hint { font-size:11.5px; color:var(--muted); margin-top:3px; line-height:1.5; }
  /* 项目所属区域：省 → 市 → 区/县（县级市）三级联动 */
  .pf-region3 { display:flex; gap:8px; flex-wrap:wrap; align-items:stretch; }
  .pf-region3 select { flex:1 1 30%; min-width:110px; }
  @media (max-width:600px){ .pf-region3 { gap:6px; } .pf-region3 select { flex:1 1 100%; } }
  /* 金额/百分比带单位 */
  .pf-unit { position:relative; }
  .pf-unit input { padding-right:38px; }
  .pf-unit > .u { position:absolute; right:10px; top:50%; transform:translateY(-50%); font-size:12px; color:var(--muted); pointer-events:none; }
  /* 日期区间 */
  .pf-range { display:flex; align-items:center; gap:8px; }
  .pf-range input { flex:1 1 0; min-width:0; }
  .pf-range .sp { flex:0 0 auto; color:var(--muted); }
  /* 单选组 */
  .pf-radio { display:flex; align-items:center; gap:16px; flex-wrap:wrap; padding-top:4px; }
  .pf-radio label { display:inline-flex; align-items:center; gap:5px; font-size:13px; color:var(--text-2); margin:0; cursor:pointer; }
  .pf-radio input { width:15px; height:15px; accent-color:var(--primary); margin:0; flex:0 0 auto; }
  /* 字数统计 */
  .pf-count { text-align:right; font-size:11px; color:var(--muted); margin-top:3px; }
  .pf-count.over { color:var(--danger); font-weight:700; }
  /* 附件 */
  .pf-files { display:flex; flex-direction:column; gap:6px; margin-top:8px; }
  .pf-file { display:flex; align-items:center; gap:8px; font-size:12.5px; background:#f8fafc;
    border:1px solid var(--line); border-radius:8px; padding:5px 9px; min-width:0; }
  .pf-file a { color:var(--primary); text-decoration:none; min-width:0; }
  .pf-file a:hover { text-decoration:underline; }
  .pf-file .sz { color:var(--muted); font-size:11.5px; flex:0 0 auto; }
  .pf-file .x { margin-left:auto; border:none; background:transparent; color:#cbd5e1; cursor:pointer; font-size:15px; padding:0 3px; flex:0 0 auto; }
  .pf-file .x:hover { color:var(--danger); }
  .pf-empty { font-size:12px; color:var(--muted); }
  .pf-acts { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
  /* 卡片上的扩展标签 */
  .proj-tags { display:flex; flex-wrap:wrap; gap:5px; }
  .proj-tag { font-size:11.5px; padding:2px 8px; border-radius:999px; background:#eef2f7; color:var(--text-2); white-space:nowrap; }
  .proj-tag.t-nature { background:var(--primary-soft); color:var(--primary); }
  .proj-tag.t-contract { background:var(--good-soft); color:var(--good); }
  .proj-tag.t-contract.off { background:#f1f5f9; color:var(--muted); }
  @media (max-width:600px){ .pf-grid { grid-template-columns:minmax(0,1fr); } .pf-range { flex-wrap:wrap; } }
  /* ===== 项目工作台 2.0：左右布局 + SOP 卡片网格 ===== */
  .wb2-layout { display:grid; grid-template-columns:minmax(0,300px) minmax(0,1fr); min-height:0; flex:1; }
  .wb2-sidebar { border-right:1px solid var(--line); background:#fbfcfe; display:flex; flex-direction:column; min-height:0; }
  .wb2-side-head { padding:14px 16px; border-bottom:1px solid var(--line); display:flex; align-items:center; justify-content:space-between; background:#f8fafc; }
  .wb2-side-head h3 { margin:0; font-size:15px; }
  .wb2-side-body { padding:14px 16px 18px; overflow:auto; flex:1; }
  .wb2-row { display:flex; flex-direction:column; gap:4px; padding:8px 0; border-bottom:1px dashed #e2e8f0; }
  .wb2-row:last-child { border-bottom:none; }
  .wb2-lb { font-size:11.5px; color:var(--muted); }
  .wb2-v { font-size:13.5px; color:var(--text); font-weight:600; }
  .wb2-progress { display:flex; flex-direction:column; gap:5px; }
  .wb2-progress .wb2-bar { height:8px; background:var(--primary); border-radius:4px; }
  .wb2-progress span { font-size:11.5px; color:var(--muted); }
  .wb2-remark .wb2-v { font-weight:400; color:var(--text-2); line-height:1.6; }
  .wb2-grp { font-size:11.5px; font-weight:800; color:var(--primary); letter-spacing:.4px; margin:12px 0 2px; padding-bottom:4px; border-bottom:1px solid var(--line-2); }
  .wb2-grp:first-child { margin-top:0; }
  .wb2-file { display:block; color:var(--primary); text-decoration:none; font-weight:500; overflow-wrap:anywhere; word-break:break-word; }
  .wb2-file:hover { text-decoration:underline; }
  .wb2-main { display:flex; flex-direction:column; min-height:0; overflow:auto; background:#fff; }
  .wb2-notice { display:flex; align-items:center; gap:8px; background:#fff7ed; border:1px solid #fed7aa; border-radius:10px; padding:10px 14px; margin:14px 18px 0; color:#9a3412; font-size:12.5px; font-weight:600; }
  .wb2-notice .n-ico { flex:0 0 auto; }
  .wb2-main-head { padding:14px 18px 10px; display:flex; align-items:center; justify-content:space-between; }
  .wb2-title { font-size:15px; font-weight:800; }
  .wb2-stats { display:flex; gap:10px; padding:0 18px 12px; flex-wrap:wrap; }
  .wb2-stats > div { background:#f8fafc; border:1px solid var(--line); border-radius:10px; padding:8px 12px; min-width:80px; text-align:center; }
  .wb2-stats b { display:block; font-size:18px; color:var(--text); }
  .wb2-stats span { font-size:11px; color:var(--muted); }
  .wb2-stats .wb2-rate b { color:var(--primary); }
  .wb2-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:12px; padding:0 18px 18px; }
  .sop-card { border:1px solid var(--line); border-radius:12px; padding:12px; background:#fff; cursor:pointer; transition:border-color .12s,box-shadow .12s; position:relative; display:flex; flex-direction:column; gap:8px; }
  .sop-card:hover { border-color:var(--primary-2); box-shadow:0 2px 8px rgba(37,99,235,.08); }
  .sop-card.active { border-color:var(--primary); background:var(--primary-soft); box-shadow:0 0 0 2px rgba(37,99,235,.13); }
  .sop-card.locked { background:#f8fafc; }
  .sop-add-tile { border:2px dashed var(--line); border-radius:12px; background:transparent; color:#94a3b8;
    min-height:130px; cursor:pointer; font-size:14px; display:flex; align-items:center; justify-content:center;
    transition:border-color .12s,color .12s,background .12s; }
  .sop-add-tile:hover { border-color:var(--primary); color:var(--primary); background:var(--primary-soft); }
  .sc-top { display:flex; align-items:center; justify-content:space-between; }
  .sc-ico { font-size:16px; }
  .sc-status { font-size:10.5px; font-weight:700; padding:2px 8px; border-radius:999px; }
  .sc-status.todo { background:#f1f5f9; color:var(--muted); }
  .sc-status.doing { background:var(--warn-soft); color:var(--warn); }
  .sc-status.done { background:var(--good-soft); color:var(--good); }
  .sc-status.skip { background:#f1f5f9; color:#94a3b8; }
  .sc-name { font-size:14px; font-weight:700; color:var(--text); }
  .sc-lock { display:flex; align-items:center; gap:4px; font-size:11.5px; color:#ea580c; font-weight:600; }
  .sc-cnt { font-size:11.5px; color:var(--muted); margin-top:auto; }
  .sc-cnt.sc-mute { color:#cbd5e1; }
  .sc-open { margin-top:4px; width:100%; border:none; background:var(--primary); color:#fff; border-radius:8px; padding:7px 0; font-size:12px; cursor:pointer; font-weight:600; }
  .sop-card:hover .sc-open { background:#2563eb; }
  .sc-open.disabled { background:#eef2ff; color:#6366f1; cursor:pointer; }
  /* ===== 三阶段 SOP：阶段分组 + 版块工具 + 附件 ===== */
  .sop-phases { padding:0 18px 18px; display:flex; flex-direction:column; gap:14px; }
  .sop-phase { border:1px solid var(--line); border-radius:14px; background:#fbfdff; }
  .sop-phase-head { display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px dashed var(--line);
    background:linear-gradient(90deg,#eff6ff,#f8fbff); border-radius:14px 14px 0 0; }
  .sop-phase-head .sph-ico { font-size:14px; }
  .sop-phase-head .sph-name { font-size:13.5px; font-weight:800; color:var(--primary); letter-spacing:.5px; }
  .sop-phase-head .sph-cnt { font-size:11.5px; color:var(--muted); }
  .sop-phase-head .sph-add { margin-left:auto; }
  .sop-phase .wb2-grid { padding:12px; }
  .sc-par { font-size:10.5px; font-weight:700; color:#7c3aed; background:#f3e8ff; border-radius:999px; padding:2px 7px; margin-left:auto; margin-right:6px; }
  .sc-owner { font-size:11.5px; color:var(--text-2); }
  .sc-owner .sc-mute { color:#cbd5e1; }
  .sc-tools { display:flex; gap:4px; }
  .sc-tools .sct { flex:1; border:1px solid var(--line); background:#fff; border-radius:7px; padding:3px 0; font-size:12px;
    cursor:pointer; color:var(--text-2); line-height:1.3; }
  .sc-tools .sct:hover:not(:disabled) { border-color:var(--primary-2); color:var(--primary); background:var(--primary-soft); }
  .sc-tools .sct:disabled { opacity:.35; cursor:not-allowed; }
  .sc-tools .sct.on { border-color:#a78bfa; color:#7c3aed; background:#f5f3ff; font-weight:700; }
  .sc-tools .sct.danger:hover { border-color:#fca5a5; color:#dc2626; background:#fef2f2; }
  .stg-files-wrap { margin-top:10px; border-top:1px dashed var(--line); padding-top:8px; }
  .stg-files-wrap .sf-head { font-size:12.5px; font-weight:700; color:var(--text-2); margin-bottom:6px; }
  .stg-files { display:flex; flex-direction:column; gap:4px; }
  .stg-file { display:flex; align-items:center; gap:8px; background:#f8fafc; border:1px solid var(--line); border-radius:8px; padding:5px 9px; font-size:12.5px; }
  .stg-file a { color:var(--primary); text-decoration:none; word-break:break-all; }
  .stg-file .sf-size { color:var(--muted); font-size:11px; }
  .stg-file .sf-x { margin-left:auto; border:none; background:transparent; color:#cbd5e1; cursor:pointer; font-size:14px; }
  .stg-file .sf-x:hover { color:#dc2626; }
  .stg-file-add { display:flex; align-items:center; gap:8px; margin-top:6px; }
  .wb2-panel { padding:0 18px 18px; }
  .wb2-panel .wb-panel { display:block; }
  /* 项目工作站：环节操作窗（点环节卡片弹出，只装该环节） */
  .stw-head { display:flex; align-items:center; justify-content:space-between; gap:10px 14px; padding:13px 18px; border-bottom:1px solid var(--line); background:linear-gradient(180deg,#f8fafc,#fff); flex:0 0 auto; }
  .stw-titles { min-width:0; }
  .stw-proj { font-size:12.5px; color:var(--muted); margin-bottom:2px; }
  .stw-stage { display:flex; align-items:center; gap:8px; font-weight:700; font-size:16px; }
  .stw-stage .sc-ico { font-size:18px; }
  .stw-acts { flex:0 0 auto; }
  .stw-acts .wb-close { margin-left:8px; }
  .stw-body { flex:1 1 auto; overflow-y:auto; padding:16px 18px; }
  @media (max-width:680px){
    .stw-head { flex-direction:column; align-items:flex-start; gap:8px; }
    .stw-acts { width:100%; }
    .stw-acts .btn { width:100%; }
  }
  /* ===== v2.46 环节操作窗「分区标签」 =====
     背景：预算提交环节一个弹窗里堆了 预算表(15 科目) + 环节信息 + 要点/流转 + 关联事项 + 计划安排，
     正文实测 6221px ≈ 7.75 屏，只能一路往下滚。这里把内容切成若干「分区」，一次只看一块，
     标签吸顶常驻；切分区只切 hidden（不重渲染 → 已输入内容与已展开状态都不丢）。 */
  .stw-tabs { display:flex; gap:6px; flex-wrap:wrap; position:sticky; top:0; z-index:6;
    background:#fff; margin:-16px -18px 12px; padding:10px 18px; border-bottom:1px solid var(--line); }
  .stw-tabs .stwt { display:inline-flex; align-items:center; gap:6px; border:1px solid var(--line); background:#fff;
    color:var(--text-2); border-radius:9px; padding:6px 11px; font-size:12.5px; font-weight:600; cursor:pointer; white-space:nowrap; }
  .stw-tabs .stwt:hover { border-color:var(--primary-2); color:var(--primary); background:#f8fbff; }
  .stw-tabs .stwt.on { border-color:var(--primary); background:var(--primary-soft); color:var(--primary); }
  .stw-tabs .stwt .n { font-size:11px; font-weight:700; color:var(--muted); background:#f1f5f9; border-radius:999px; padding:1px 6px; }
  .stw-tabs .stwt.on .n { color:var(--primary); background:#dbeafe; }
  /* 分区容器：本身是一行两列网格（与原 .wb-panel 同款），整体跨满所有列；
     .blk = 块级铺满整宽（预算表 / 关键材料这类「大表」用它，正是半宽 bug 的修法） */
  .stw-sec { grid-column:1/-1; display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:14px; }
  .stw-sec.blk { display:block; }
  .stw-sec[hidden] { display:none; }
  /* 预算闸门提示条也是网格直接子项，原本只占半宽，一并整行撑开 */
  .wb-panel > .wb-lock { grid-column:1/-1; }
  @media (max-width:900px){ .stw-sec { grid-template-columns:minmax(0,1fr); } }
  @media (max-width:680px){ .stw-tabs .stwt { font-size:12px; padding:5px 9px; } }
  @media (max-width:900px){
    .wb2-layout { grid-template-columns:minmax(0,1fr); }
    .wb2-sidebar { border-right:none; border-bottom:1px solid var(--line); max-height:320px; }
    .wb2-grid { grid-template-columns:repeat(auto-fill,minmax(140px,1fr)); }
  }
  @media (max-width:560px){
    .wb2-grid { grid-template-columns:repeat(2,1fr); }
  }
  /* ===== 预算闸门：支出类阶段锁定 ===== */
  .wb-lock { display:flex; align-items:center; gap:6px; background:var(--warn-soft); color:var(--warn); border:1px solid #fcd34d;
    border-radius:10px; padding:9px 12px; font-size:13px; font-weight:600; margin-bottom:12px; line-height:1.5; }
  .sop-node.locked { position:relative; }
  .sop-node .n-lock { margin-left:auto; font-size:12px; filter:grayscale(.2); }
  .sop-node.locked .n-name { color:var(--muted); }

  /* ===== 预算模板面板（预算提交阶段） ===== */
  .bdg-wrap { display:flex; flex-direction:column; gap:14px; }
  .bdg-bar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
  .bdg-bar .sp { flex:1; }
  .bdg-tip { font-size:12.5px; color:var(--muted); line-height:1.6; }
  .bdg-ov { display:grid; grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:10px 14px; background:var(--card); border:1px solid var(--line); border-radius:12px; padding:14px 16px; }
  .bdg-ov .of { display:flex; flex-direction:column; gap:4px; }
  .bdg-ov .of label { font-size:12px; color:var(--muted); font-weight:600; }
  .bdg-ov .of input { padding:7px 9px; border:1px solid var(--line); border-radius:8px; font-size:13.5px; }
  .bdg-sec { background:var(--card); border:1px solid var(--line); border-radius:12px; overflow:hidden; }
  .bdg-sec > .bs-head { display:flex; align-items:center; gap:10px; padding:11px 14px; background:linear-gradient(180deg,#f8fafc,#fff); border-bottom:1px solid var(--line); }
  .bdg-sec .bs-no { font-weight:800; color:var(--brand); font-size:14px; white-space:nowrap; }
  .bdg-sec .bs-name { font-weight:700; font-size:14px; color:var(--text); }
  .bdg-sec .bs-sub { margin-left:auto; font-weight:800; color:var(--ok); font-size:14px; white-space:nowrap; }
  .bdg-sec .bs-body { padding:8px 12px 12px; }
  .bdg-tbl { width:100%; border-collapse:collapse; font-size:13px; }
  .bdg-tbl th { text-align:left; color:var(--muted); font-weight:600; font-size:12px; padding:6px 6px; border-bottom:1px solid var(--line); white-space:nowrap; }
  .bdg-tbl td { padding:4px 4px; border-bottom:1px solid #f1f5f9; vertical-align:middle; }
  .bdg-tbl input { width:100%; padding:6px 7px; border:1px solid var(--line); border-radius:7px; font-size:13px; min-width:56px; }
  .bdg-tbl input.num { text-align:right; }
  .bdg-tbl .bdg-del { border:none; background:#fee2e2; color:#dc2626; border-radius:6px; width:26px; height:26px; cursor:pointer; font-size:15px; line-height:1; }
  .bdg-add { margin-top:8px; }
  .bdg-sum { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:10px 16px; background:linear-gradient(180deg,#eef2ff,#f8fafc); border:1px solid #c7d2fe; border-radius:12px; padding:14px 16px; }
  .bdg-sum .sm { display:flex; flex-direction:column; gap:3px; }
  .bdg-sum .sm label { font-size:12px; color:#475569; font-weight:600; }
  .bdg-sum .sm b { font-size:16px; color:#1e3a8a; font-variant-numeric:tabular-nums; }
  .bdg-sum .sm.warn b { color:#b91c1c; }
  /* v2.46 预算科目可折叠：15 个科目全展开时合计 3861px，收起后只留「科目 + 项数 + 小计」 */
  .bdg-sec > .bs-head { cursor:pointer; user-select:none; }
  .bdg-sec > .bs-head:hover { background:#f1f5f9; }
  .bdg-sec .bs-cnt { font-size:11.5px; font-weight:600; color:var(--muted); background:#f1f5f9;
    border-radius:999px; padding:1px 7px; white-space:nowrap; }
  .bdg-sec .bs-cnt.zero { color:#cbd5e1; background:#f8fafc; }
  .bdg-sec .bs-caret { flex:0 0 auto; color:var(--muted); font-size:11px; margin-left:2px; transition:transform .15s; }
  .bdg-sec.fold .bs-caret { transform:rotate(-90deg); }
  .bdg-sec.fold > .bs-body { display:none; }
  .bdg-upfile { display:none; }
  @media (max-width:560px){
    .bdg-ov { grid-template-columns:1fr 1fr; }
    .bdg-tbl { font-size:12px; }
    .bdg-tbl input { padding:5px 5px; }
  }

  /* 项目工作台弹窗（加宽） */
  .modal.wide .box { width:1080px; max-width:96vw; padding:0; overflow:hidden; display:flex; flex-direction:column; max-height:92vh; }
  .wb-head { padding:16px 20px 14px; border-bottom:1px solid var(--line); background:linear-gradient(180deg,#f8fafc,#fff); flex:0 0 auto; }
  .wb-head-top { display:flex; align-items:flex-start; gap:8px 12px; flex-wrap:wrap; }
  .wb-title { font-size:17px; font-weight:800; color:var(--text); flex:1 1 240px; min-width:0; line-height:1.45;
    overflow-wrap:anywhere; word-break:break-word; }
  .wb-sub { font-size:12.5px; color:var(--muted); margin-top:5px; display:flex; flex-wrap:wrap; gap:4px 14px;
    overflow-wrap:anywhere; word-break:break-word; }
  .wb-sub > span { min-width:0; }
  .wb-close { border:none; background:#f1f5f9; color:var(--muted); width:30px; height:30px; border-radius:8px; font-size:17px; cursor:pointer; flex:0 0 auto; }
  .wb-close:hover { background:#e2e8f0; color:var(--text); }
  .wb-kpi { display:flex; gap:10px; margin-top:12px; flex-wrap:wrap; }
  .wb-kpi .k { flex:1 1 96px; min-width:0; background:#f8fafc; border:1px solid var(--line); border-radius:10px; padding:8px 10px; }
  .wb-kpi .k .t { font-size:11.5px; color:var(--muted); }
  .wb-kpi .k .v { font-size:16px; font-weight:800; color:var(--text); margin-top:2px; overflow-wrap:anywhere; }
  .wb-kpi .k .v.money { color:var(--primary); }
  .wb-kpi .k .v.warn { color:var(--danger); }
  /* SOP 流程条：空间不足自动换行，不再靠横向滚动才能看到后面的阶段 */
  .sop-flow { display:flex; flex-wrap:wrap; gap:6px; padding:12px 20px; background:#fff; border-bottom:1px solid var(--line); }
  .sop-node { flex:1 1 96px; min-width:0; max-width:100%; border:1px solid var(--line); border-radius:11px; background:#fff;
    padding:7px 9px; cursor:pointer; text-align:left; transition:border-color .12s, background .12s; position:relative; }
  .sop-node:hover { border-color:var(--primary-2); background:#f8fbff; }
  .sop-node.active { border-color:var(--primary); background:var(--primary-soft); box-shadow:0 0 0 2px rgba(37,99,235,.13); }
  .sop-node .n-top { display:flex; align-items:center; gap:5px; font-size:12.5px; font-weight:700; color:var(--text); min-width:0; }
  .sop-node .n-ico { font-size:14px; flex:0 0 auto; }
  .sop-node .n-name { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .sop-node .n-st { flex:0 0 auto; font-size:10.5px; font-weight:700; padding:1px 6px; border-radius:999px; white-space:nowrap; }
  .sop-node .n-st.todo { background:#f1f5f9; color:var(--muted); }
  .sop-node .n-st.doing { background:var(--warn-soft); color:var(--warn); }
  .sop-node .n-st.done { background:var(--good-soft); color:var(--good); }
  .sop-node .n-st.skip { background:#f1f5f9; color:#94a3b8; }
  .sop-node .n-cnt { margin-left:auto; flex:0 0 auto; font-size:10.5px; color:var(--muted); white-space:nowrap; }
  .sop-node .n-sub { display:flex; align-items:center; gap:5px; margin-top:5px; min-width:0;
    font-size:11px; color:var(--muted); white-space:nowrap; overflow:hidden; }
  /* 阶段面板 */
  .wb-body { padding:16px 20px 22px; overflow:auto; flex:1; background:#fbfcfe; }
  .wb-body h4 { font-size:13.5px; font-weight:800; color:var(--text); margin:0 0 9px; display:flex; align-items:center; gap:7px; flex-wrap:wrap; }
  .wb-body h4 .cnt { font-size:11.5px; font-weight:600; color:var(--muted); }
  /* 固定两列（阶段信息/明细行整行，检查清单与流转记录各占一半）；
     minmax(0,1fr) 是关键：允许列收缩，长文本才会换行而不是把网格撑破 */
  .wb-panel { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:14px; }
  .wb-col { background:#fff; border:1px solid var(--line); border-radius:12px; padding:13px 14px; min-width:0; }
  .wb-col.full { grid-column:1/-1; }
  .stg-form { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(150px,100%),1fr)); gap:10px; }
  .stg-form label { font-size:12px; color:var(--muted); display:block; margin-bottom:4px; }
  .stg-form input, .stg-form select, .stg-form textarea { width:100%; min-width:0; }
  /* 检查清单 */
  .chk-list { display:flex; flex-direction:column; gap:5px; max-height:340px; overflow:auto; }
  .chk-item { display:flex; align-items:flex-start; gap:8px; padding:6px 8px; border-radius:8px; border:1px solid transparent; }
  .chk-item:hover { background:#f8fafc; border-color:var(--line); }
  .chk-item input { width:15px; height:15px; accent-color:var(--primary); margin:2px 0 0; flex:0 0 auto; cursor:pointer; }
  .chk-item .ci-t { flex:1 1 auto; min-width:0; font-size:13px; color:var(--text-2); line-height:1.55;
    overflow-wrap:anywhere; word-break:break-word; cursor:pointer; }
  .chk-item.done .ci-t { color:var(--muted); text-decoration:line-through; }
  .chk-item .ci-by { font-size:11px; color:var(--muted); flex:0 0 auto; }
  .chk-item .ci-x { border:none; background:transparent; color:#cbd5e1; cursor:pointer; font-size:14px; padding:0 3px; flex:0 0 auto; }
  .chk-item .ci-x:hover { color:var(--danger); }
  .chk-add { display:flex; gap:6px; margin-top:9px; flex-wrap:wrap; }
  .chk-add input { flex:1 1 160px; min-width:0; }
  .chk-add .btn { flex:0 0 auto; }
  /* 明细行表格：外层可横向滚动，窄屏不再把列挤成一条线 */
  .row-scroll { overflow-x:auto; margin:0 -2px; padding:0 2px; }
  .row-tbl { width:100%; min-width:600px; border-collapse:collapse; font-size:12.5px; table-layout:fixed; }
  .row-tbl th { text-align:left; font-size:11.5px; color:var(--muted); font-weight:600; padding:6px 7px; border-bottom:1px solid var(--line); white-space:nowrap; }
  .row-tbl td { padding:6px 7px; border-bottom:1px solid #f1f5f9; color:var(--text-2); vertical-align:middle; overflow:hidden; }
  .row-tbl td.num { text-align:right; font-family:var(--mono); white-space:nowrap; }
  .row-tbl tr:hover td { background:#f8fafc; }
  .row-tbl .empty { color:var(--muted); text-align:center; padding:16px 0; }
  .row-tbl input, .row-tbl select { width:100%; min-width:0; padding:4px 6px; font-size:12px; }
  .row-tbl input.num { text-align:right; }
  .row-tbl td .row-del { white-space:nowrap; }
  /* 流转记录 */
  .log-list { display:flex; flex-direction:column; gap:7px; max-height:220px; overflow:auto; }
  .log-item { border-left:3px solid var(--primary-2); background:#f8fafc; border-radius:0 8px 8px 0; padding:7px 10px; min-width:0; }
  .log-item .lg-m { font-size:11px; color:var(--muted); display:flex; gap:8px; flex-wrap:wrap; }
  .log-item .lg-t { font-size:13px; color:var(--text-2); margin-top:2px; line-height:1.6;
    overflow-wrap:anywhere; word-break:break-word; }
  .log-item .lg-x { border:none; background:transparent; color:#cbd5e1; cursor:pointer; font-size:13px; margin-left:auto; flex:0 0 auto; }
  .log-item .lg-x:hover { color:var(--danger); }
  .log-add { display:flex; gap:6px; margin-top:9px; flex-wrap:wrap; }
  .log-add input { flex:1 1 160px; min-width:0; }
  .log-add .btn { flex:0 0 auto; }
  .plan-zone { margin-bottom:12px; }
  .plan-zone-t { font-size:12px; color:#64748b; margin-bottom:6px; }
  .plan-card { border:1px solid #e2e8f0; border-radius:10px; padding:10px 12px; background:#f8fafc; margin-bottom:8px; display:flex; flex-direction:column; gap:8px; }
  .plan-card-h { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
  .plan-badge { background:#eef2ff; color:#4338ca; border-radius:6px; padding:2px 8px; font-size:12px; font-weight:600; }
  .plan-proj { font-weight:600; color:#1e293b; }
  .plan-meta { font-size:12px; color:#64748b; }
  .plan-card-acts { display:flex; gap:8px; }
  .plan-edit-area { max-height:60vh; overflow:auto; padding:4px 2px; }
  .plan-cols-h, .plan-row { display:grid; grid-template-columns:1.6fr .8fr 1fr 1fr .8fr 28px; gap:6px; align-items:center; }
  .plan-cols-h { font-size:12px; color:#64748b; padding:4px 2px; }
  .plan-row { padding:4px 2px; border-bottom:1px dashed #eef2f7; }
  .plan-row input, .plan-row select { width:100%; min-width:0; }
  .plan-grp { font-weight:600; color:#475569; margin:10px 0 4px; font-size:13px; border-left:3px solid #6366f1; padding-left:6px; }
  .plan-del { border:none; background:#fee2e2; color:#b91c1c; border-radius:6px; cursor:pointer; height:28px; }
  .plan-foot { gap:10px; align-items:center; margin-top:10px; }
  .plan-add { margin-top:8px; }
  .plan-card2 { border:1px solid #e2e8f0; border-radius:12px; padding:12px 14px; background:#fff; margin-bottom:12px; }
  .pc2-h { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:10px; }
  .pc2-name { font-size:15px; font-weight:700; color:#0f172a; }
  .pc2-phase { font-size:12px; color:#4f46e5; background:#eef2ff; border-radius:12px; padding:2px 10px; }
  .pc2-sop { font-size:11px; color:#64748b; background:#f1f5f9; border-radius:12px; padding:2px 8px; }
  .pc2-sop.custom { color:#b45309; background:#fef3c7; }
  .pc2-del { margin-left:auto; border:none; background:#fee2e2; color:#b91c1c; width:26px; height:26px; border-radius:8px; cursor:pointer; font-size:16px; line-height:1; }
  .pc2-del:hover { background:#fecaca; }
  .pc2-body { display:grid; grid-template-columns:1fr 1fr; gap:16px; }
  .pc2-col { min-width:0; }
  .pc2-t { font-size:13px; font-weight:600; color:#334155; margin-bottom:6px; }
  .pc2-list { display:flex; flex-direction:column; gap:4px; }
  .pc2-item { display:flex; align-items:center; gap:6px; }
  .pc2-item.is-done .pc2-txt { text-decoration:line-through; color:#94a3b8; }
  .pc2-done { flex:0 0 auto; width:16px; height:16px; }
  .pc2-txt { flex:1 1 auto; min-width:0; border:1px solid #e2e8f0; border-radius:6px; padding:4px 8px; font-size:13px; }
  .pc2-x { flex:0 0 auto; border:none; background:transparent; color:#cbd5e1; cursor:pointer; font-size:15px; line-height:1; }
  .pc2-x:hover { color:#ef4444; }
  .pc2-up, .pl-up { flex:0 0 auto; border:1px solid #cbd5e1; background:#f8fafc; color:#475569; border-radius:6px; padding:3px 8px; font-size:11px; cursor:pointer; white-space:nowrap; }
  .pc2-up:hover, .pl-up:hover { border-color:#2563eb; color:#2563eb; background:#eff6ff; }
  .pc2-file, .pl-file { flex:0 1 auto; min-width:0; max-width:120px; font-size:11px; color:#2563eb; text-decoration:none; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .pc2-file:hover, .pl-file:hover { text-decoration:underline; }
  .pc2-add { display:flex; gap:6px; margin-top:6px; }
  .pc2-add-in { flex:1 1 auto; min-width:0; border:1px dashed #cbd5e1; border-radius:6px; padding:4px 8px; font-size:13px; }
  .pc2-add-btn { flex:0 0 auto; border:1px solid #cbd5e1; background:#f8fafc; border-radius:6px; padding:4px 10px; cursor:pointer; color:#475569; }
  .pc2-foot { display:flex; gap:14px; align-items:flex-end; flex-wrap:wrap; margin-top:12px; padding-top:10px; border-top:1px dashed #eef2f7; }
  .pc2-fld { display:flex; flex-direction:column; gap:3px; font-size:12px; color:#64748b; }
  .pc2-fld input, .pc2-fld select { font-size:13px; }
  @media (max-width:680px){ .pc2-body { grid-template-columns:1fr; } }
  /* 关联每日事项（方案③）：条目可点开、环节标签 */
  .wb-ent { cursor:pointer; }
  .wb-ent:hover { background:#eef4fb; }
  .ent-tag { font-size:11px; padding:1px 7px; border-radius:9px; margin-left:2px; }
  .ent-tag.stage { background:#E1F5EE; color:#0F6E56; }
  .ent-tag.proj { background:#EDEBE4; color:#5F5E5A; }
  /* 计划安排（同步到工作台环节面板） */
  .wb-plan-arr { background:#fbfdff; border:1px solid #e6eefb; }
  .wb-plan-none { color:var(--muted); font-size:13px; padding:10px 6px; line-height:1.6; }
  .plan-2col { display:grid; grid-template-columns:1fr 1fr; gap:18px; margin-top:8px; }
  .plan-col { min-width:0; }
  .plan-col-t { font-size:13px; font-weight:600; color:#334155; margin-bottom:6px; padding-bottom:4px; border-bottom:2px solid #eef2f7; }
  .plan-list { display:flex; flex-direction:column; gap:5px; }
  .pl-item { display:flex; align-items:center; gap:6px; }
  .pl-item.done .pl-txt { text-decoration:line-through; color:#94a3b8; }
  .pl-item input[type=checkbox] { flex:0 0 auto; width:15px; height:15px; }
  .pl-txt { flex:1 1 auto; min-width:0; border:1px solid #e2e8f0; border-radius:6px; padding:4px 8px; font-size:13px; }
  .pl-txt:focus { border-color:#6366f1; outline:none; }
  .pl-x { flex:0 0 auto; border:none; background:transparent; color:#cbd5e1; cursor:pointer; font-size:15px; line-height:1; }
  .pl-x:hover { color:#ef4444; }
  .plan-add { display:flex; gap:6px; margin-top:8px; }
  .plan-add input { flex:1 1 auto; min-width:0; border:1px dashed #cbd5e1; border-radius:6px; padding:4px 8px; font-size:13px; }
  .plan-add .btn { flex:0 0 auto; }
  .wb-plan-tip { margin-top:10px; font-size:12px; color:#64748b; background:#f1f5f9; border-radius:6px; padding:6px 9px; }
  @media (max-width:680px){ .plan-2col { grid-template-columns:1fr; } }
  .wb-empty { color:var(--muted); font-size:13px; text-align:center; padding:14px 0; line-height:1.6; }
  @media (max-width:900px){
    .wb-panel { grid-template-columns:minmax(0,1fr); }
    .proj-grid { grid-template-columns:minmax(0,1fr); }
    /* v2.84 手机端：卡片单列后按钮左对齐、不换行，元信息小标签同样自动折行 */
    .proj-acts { justify-content:flex-start; }
    .proj-acts .btn { flex:0 0 auto; white-space:nowrap; }
    .proj-menu { min-width:120px; }
  }
  @media (max-width:560px){
    .wb-head, .sop-flow, .wb-body { padding-left:12px; padding-right:12px; }
    .wb-title { font-size:15.5px; }
    .sop-node { flex:1 1 46%; }
    .wb-kpi .k { flex:1 1 calc(50% - 5px); }
    .chk-add input, .log-add input { flex:1 1 100%; }
    .chk-add .btn, .log-add .btn { flex:1 1 100%; }
    /* 明细行：手机上表格变卡片，字段竖排，彻底避免横向挤压 */
    .row-scroll { overflow-x:visible; }
    .row-tbl { min-width:0; table-layout:auto; }
    .row-tbl thead { display:none; }
    .row-tbl tbody, .row-tbl tr, .row-tbl td { display:block; width:100%; }
    .row-tbl tr { border:1px solid var(--line); border-radius:10px; padding:8px 10px; margin-bottom:8px; background:#fff; }
    .row-tbl tr:hover td { background:transparent; }
    .row-tbl td { display:flex; align-items:center; gap:8px; border:none; padding:3px 0; overflow:visible; }
    .row-tbl td::before { content:attr(data-lb); flex:0 0 58px; font-size:11.5px; color:var(--muted); }
    .row-tbl td:last-child { justify-content:flex-end; }
    .row-tbl td:last-child::before { content:none; }
  }

  .modal { position:fixed; inset:0; background:rgba(15,23,42,.45); backdrop-filter:blur(3px); display:none; align-items:center; justify-content:center; z-index:50; }
  .modal.show { display:flex; }
  /* v3.12b 热修：自动弹出的「待办提醒」用 peek 变体 —— 透明无遮罩 + 遮罩层不吃点击（pointer-events:none），
     弹窗本体仍可正常操作；这样提醒照常可见，但页面任何按钮都不会再被它吞掉点击。
     背景：v3.12 上线后用户反馈「点最近编辑/最新创建没反应」，根因正是这层全屏遮罩拦下了点击。 */
  .modal.peek { background:transparent; backdrop-filter:none; pointer-events:none; }
  .modal.peek .box { pointer-events:auto; width:560px; max-width:92vw; max-height:76vh; box-shadow:0 20px 56px rgba(15,23,42,.3); }
  /* 所有弹窗统一做文字适应：长中文/长英文/长数字串一律在容器内换行，不撑破弹窗 */
  .modal .box { background:#ffffff; border:1px solid var(--line-2); border-radius:16px; padding:22px;
    width:600px; max-width:94vw; max-height:90vh; overflow:auto; box-shadow:0 24px 60px rgba(15,23,42,.25);
    overflow-wrap:anywhere; word-break:break-word; }
  .modal .box h3, .modal .box p, .modal .box label, .modal .box div { overflow-wrap:anywhere; word-break:break-word; }
  .modal .box h3 { line-height:1.5; }
  .modal .box h3 { margin-bottom:12px; font-size:16px; color:var(--text); }
  /* 客户 / 单位详情弹窗（orgCardHTML）：自适应更宽的展示，标题栏与操作栏固定、联系人表格内部滚动 */
  .modal.org-detail .box { width:920px; max-width:96vw; max-height:92vh; padding:0; overflow:hidden; position:relative; display:flex; flex-direction:column; }
  .org-d { display:flex; flex-direction:column; min-height:0; width:100%; }
  .org-d-head { flex:0 0 auto; display:flex; align-items:flex-start; gap:10px; padding:16px 18px 12px; border-bottom:1px solid var(--line); }
  .org-d-title { min-width:0; flex:1 1 auto; }
  .org-d-title b { font-size:16px; color:var(--text); line-height:1.4; overflow-wrap:anywhere; word-break:break-word; }
  .org-d-tags { display:flex; gap:5px; flex-wrap:wrap; margin-top:6px; }
  .org-d-sub { flex:0 0 auto; padding:9px 18px; font-size:13px; color:var(--muted); border-bottom:1px solid var(--line); overflow-wrap:anywhere; word-break:break-word; }
  .org-d-actions { flex:0 0 auto; display:flex; gap:6px; flex-wrap:wrap; padding:10px 18px; border-bottom:1px solid var(--line); }
  .org-d-body { flex:1 1 auto; min-height:0; overflow:auto; padding:12px 18px 16px; }
  .org-d-count { font-size:12.5px; color:var(--muted); margin-bottom:8px; }
  .org-d-foot { flex:0 0 auto; padding:10px 18px 14px; border-top:1px solid var(--line); text-align:right; }
  .org-d-x { flex:0 0 auto; width:30px; height:30px; border:1px solid transparent; background:transparent; font-size:22px; line-height:1; color:var(--muted); border-radius:8px; cursor:pointer; }
  .org-d-x:hover { background:var(--surface-2,#f1f5f9); color:var(--text); border-color:var(--line); }
  /* 项目详情弹窗（点击项目卡片弹出：仅查看信息；选中由卡片复选框负责，不再进工作台/选中） */
  .pd-body { flex:1 1 auto; min-height:0; overflow:auto; padding:14px 20px 18px; }
  .pd-foot { flex:0 0 auto; display:flex; gap:8px; flex-wrap:wrap; justify-content:flex-end; padding:12px 18px 14px; border-top:1px solid var(--line); }
  .pd-foot .btn { min-width:84px; }

  /* 功能权限弹窗（成员管理用） */
  .ms-toolbar { display:flex; align-items:center; gap:8px; margin:6px 0 12px; flex-wrap:wrap; }
  .ms-toolbar .ms-count { margin-left:auto; font-size:13px; color:var(--muted); }
  .ms-toolbar .ms-count b { color:var(--text); font-weight:700; }
  .ms-groups { display:flex; flex-direction:column; gap:10px; max-height:60vh; overflow-y:auto; padding-right:2px; }
  .ms-group { border:1px solid var(--line); border-radius:10px; padding:8px 10px; background:#fafbff; }
  .ms-gtitle { font-size:12px; color:var(--muted); margin-bottom:6px; letter-spacing:.05em; }
  .ms-items { display:flex; flex-wrap:wrap; gap:6px 8px; }
  .ms-item { display:inline-flex; align-items:center; gap:6px; padding:5px 10px; border:1px solid var(--line-2);
    border-radius:8px; background:#fff; cursor:pointer; font-size:13px; user-select:none; transition:border-color .12s, background .12s; }
  .ms-item input { accent-color:var(--primary); margin:0; }
  /* v1.86：全局 input,select,textarea{width:100%} 会把复选框也撑成 ~31px 宽，
     导致「功能权限」弹窗里的模块名只剩 ~21px、竖排成 3 行（电脑端与手机端都存在，属同源 bug）。
     与 exam-root / insight-root / fu-opt 的处理方式保持一致，显式复位。 */
  .ms-item input[type=checkbox] { width:auto; height:auto; padding:0; margin:0; flex:0 0 auto; }
  .ms-item:hover { border-color:var(--primary); }
  .ms-item.admin-only { border-style:dashed; }
  .ms-tag { font-size:11px; padding:1px 6px; border-radius:999px; background:#fef3c7; color:#92400e; border:1px solid rgba(180,83,9,.3); }
  /* 可见模块列表（在成员列表表格里） */
  .mod-cell { display:flex; flex-direction:column; gap:4px; }
  .mod-meta { font-size:12.5px; color:var(--muted); }
  .mod-meta b { color:var(--text); font-weight:700; }
  .custom-dot { display:inline-block; margin-left:4px; padding:1px 6px; border-radius:999px;
    background:var(--primary-soft); color:var(--primary); font-size:11px; border:1px solid rgba(37,99,235,.25); }
  .mod-tags { display:flex; flex-wrap:wrap; gap:4px; }
  .mod-tag { display:inline-block; padding:2px 7px; border-radius:999px; font-size:11px;
    background:#eef2ff; color:#3730a3; border:1px solid rgba(55,48,163,.18); }
  .mod-tag.admin-only { background:#fef3c7; color:#92400e; border-color:rgba(180,83,9,.25); }
  .tag { display:inline-block; padding:2px 9px; border-radius:999px; font-size:12px; background:var(--primary-soft); color:var(--primary); border:1px solid rgba(37,99,235,.25); }
  .tag.done { background:var(--good-soft); color:var(--good); border-color:rgba(22,163,74,.3); }
  .tag.todo { background:var(--warn-soft); color:#b45309; border-color:rgba(217,119,6,.3); }
  .status-select { border:1px solid var(--line-2); background:#ffffff; font-size:12px; padding:4px 22px 4px 10px; border-radius:999px;
    cursor:pointer; color:var(--text); outline:none; appearance:none; -webkit-appearance:none; -moz-appearance:none;
    background-position:right 7px center; background-repeat:no-repeat; background-size:10px;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23475569' d='M0 1l5 4 5-4z'/%3E%3C/svg%3E"); }
  .status-select:hover { border-color:var(--primary); }
  .status-select option { font-size:13px; }
  /* 事项状态三态配色：未开始=橙 / 进行中=蓝（新增，与未开始一眼区分）/ 已完成=绿 */
  .status-select.done  { background-color:var(--good-soft); color:var(--good); border-color:rgba(22,163,74,.4); }
  .status-select.doing { background-color:#dbeafe; color:#1d4ed8; border-color:rgba(29,78,216,.38); }
  .status-select.todo  { background-color:var(--warn-soft); color:#b45309; border-color:rgba(217,119,6,.4); }
  .row-actions { display:flex; gap:6px; }

  /* 事项完成 → 后续跟进（v1.74）：弹窗选择卡 / 双向关联徽章 / 跳转高亮 */
  .fu-hd { background:var(--primary-soft); border:1px solid #bfdbfe; border-radius:10px; padding:10px 12px;
    font-size:13px; color:var(--text-2); margin-bottom:12px; }
  .fu-hd b { color:var(--text); }
  .fu-choice { display:flex; gap:10px; flex-wrap:wrap; margin-bottom:14px; }
  .fu-opt { display:inline-flex; align-items:center; gap:8px; padding:9px 14px; border:1px solid var(--line-2);
    border-radius:10px; background:#fff; font-size:13px; cursor:pointer; color:var(--text); }
  .fu-opt.sel { border-color:var(--primary); background:var(--primary-soft); color:var(--primary); font-weight:600; }
  .fu-opt input[type=radio] { width:auto; height:auto; padding:0; margin:0; flex:0 0 auto; cursor:pointer; }
  .fu-block { border:1px solid var(--line); border-radius:12px; padding:12px; margin-bottom:14px; background:#f8fafc; }
  .fu-block .fw { margin-top:10px; }
  .fu-block .fw:first-child { margin-top:0; }
  .fu-note { font-size:12.5px; color:var(--muted); line-height:1.75; margin-top:10px; }
  .fu-acts { display:flex; justify-content:flex-end; gap:10px; }
  .fu-badge { display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-weight:700; line-height:1.5;
    margin-right:6px; padding:1px 8px; border-radius:999px; white-space:nowrap; vertical-align:middle; }
  .fu-badge.fu-next { background:var(--good-soft); color:#15803d; cursor:pointer; }
  .fu-badge.fu-next:hover { background:#bbf7d0; }
  .fu-badge.fu-src { background:var(--primary-soft); color:var(--primary); cursor:pointer; }
  .fu-badge.fu-src:hover { background:#dbeafe; }
  .fu-badge.fu-done { background:#e2e8f0; color:#475569; }
  tr.fu-flash > td { background:#fef9c3 !important; transition:background .4s; }

  /* 成员角色下拉 / 锁定 */
  .role-select { padding:5px 8px; font-size:13px; border:1px solid var(--line); border-radius:8px; background:#fff; color:var(--text); cursor:pointer; }
  .role-select:focus { outline:none; border-color:var(--primary); box-shadow:0 0 0 2px var(--primary-soft); }
  .role-locked { display:inline-block; padding:4px 10px; font-size:13px; border-radius:8px; background:#f1f5f9; color:var(--text-2); border:1px solid var(--line); }
  /* 批量导入 */
  .imp-map { display:grid; grid-template-columns:1fr 1fr; gap:10px 14px; }
  .imp-map-row { display:flex; align-items:center; gap:8px; }
  .imp-map-row label { flex:0 0 96px; margin:0; font-size:13px; color:var(--muted); }
  .imp-map-row select { flex:1; min-width:0; }
  .imp-result { display:flex; flex-wrap:wrap; gap:10px; }
  .imp-r { flex:1 1 140px; background:#f8fafc; border:1px solid var(--line); border-radius:12px; padding:12px; font-size:13px; color:var(--text-2); }
  .imp-r b { font-size:20px; display:block; margin-top:4px; color:var(--text); }
  .imp-r.ok { background:var(--good-soft); border-color:rgba(22,163,74,.28); color:var(--good); }
  .imp-r.warn { background:var(--warn-soft); border-color:rgba(217,119,6,.28); color:#b45309; }
  .imp-r.err { background:var(--danger-soft); border-color:rgba(220,38,38,.3); color:#b91c1c; }
  .imp-file { padding:10px; border:1px dashed var(--line-2); border-radius:10px; width:100%; background:#f8fafc; font-size:13px; color:var(--text-2); }
  /* 资源表单：多位对接人 */
  .res-ct { display:grid; gap:8px; }
  .res-ct-row { display:grid; grid-template-columns:1.1fr 1fr 1fr 1.3fr auto; gap:8px; align-items:center; }
  .res-ct-row.no-title { grid-template-columns:1.3fr 1.3fr 1.5fr auto; }
  .res-ct-row input { margin:0; }
  .res-ct-row button { padding:6px 10px; line-height:1; }
  /* 评价字段的原因输入框：整行显示，选到「差」才出现 */
  .rate-note { grid-column:1/-1; }
  .rate-note label { color:#b45309; }
  /* 词条卡片第二行：评价标签 + 规模概要 */
  .res-item-meta { display:flex; align-items:center; flex-wrap:wrap; gap:6px; margin-bottom:8px; }
  .res-item-meta .rate { font-size:12px; line-height:1.7; padding:2px 9px; border-radius:999px;
    border:1px solid var(--line-2); background:#f8fafc; color:var(--text-2); }
  .res-item-meta .rate.good { color:#15803d; border-color:#15803d55; background:#15803d0f; }
  .res-item-meta .rate.bad  { color:#b91c1c; border-color:#b91c1c55; background:#b91c1c0f; }
  .res-item-meta .rate .r-note { opacity:.9; margin-left:2px; }
  .res-item-meta .r-sub { font-size:12px; color:var(--muted); }
  .empty { color:var(--muted); font-size:13px; padding:18px 0; text-align:center; }
  #login { position:fixed; inset:0; display:flex; align-items:center; justify-content:center;
    z-index:200;   /* v2.32：显式压过一切业务层，防止登录框被浮层盖住或层级异常 */
    background:#eef2f7;   /* v2.32：纯色兜底，渐变解析失败也保证不透明全屏遮挡 */
    background-image:linear-gradient(135deg,#eef2f7,#f8fafc); }
  #login .panel { background:#ffffff; border:1px solid var(--line-2); border-radius:18px; padding:34px; width:340px;
    box-shadow:0 24px 60px rgba(15,23,42,.15); }
  #login h1 { color:var(--text); text-align:center; margin-bottom:8px; font-size:26px; letter-spacing:2px; display:flex; align-items:center; justify-content:center; gap:10px; }
  #login h1::before { content:""; width:12px; height:12px; border-radius:50%; background:linear-gradient(135deg,#2563eb,#0ea5e9); box-shadow:0 0 0 5px rgba(37,99,235,.12); }
  #login p { text-align:center; color:var(--muted); font-size:13px; margin-bottom:20px; }
  #login .err { color:#b91c1c; font-size:12px; min-height:16px; margin-top:8px; text-align:center; }
  .loginbtn { width:100%; padding:11px; font-size:15px; }
  .hidden { display:none !important; }
  .pill { font-size:11px; padding:2px 9px; border-radius:999px; background:rgba(124,58,237,.12); color:#6d28d9; border:1px solid rgba(124,58,237,.3); margin-left:6px; }
  /* 头部"当前用户"下拉 */
  header .who { position:relative; display:inline-flex; align-items:center; }
  .who-btn { background:transparent; border:1px solid transparent; color:var(--text-2); font-size:13px; padding:6px 10px; border-radius:8px; cursor:pointer; display:inline-flex; align-items:center; gap:6px; line-height:1; }
  .who-btn:hover { background:var(--primary-soft); color:var(--primary); border-color:rgba(37,99,235,.2); }
  .who-btn[aria-expanded="true"] { background:var(--primary-soft); color:var(--primary); border-color:rgba(37,99,235,.25); }
  .who-btn b { color:var(--text); font-weight:600; }
  .who-caret { font-size:10px; opacity:.7; transition:transform .18s; }
  .who-btn[aria-expanded="true"] .who-caret { transform:rotate(180deg); }
  .who-menu { position:absolute; right:0; top:calc(100% + 6px); z-index:80; min-width:170px; background:#fff; border:1px solid var(--line-2); border-radius:12px; padding:6px; box-shadow:0 12px 32px rgba(15,23,42,.18); }
  .who-menu button { display:flex; align-items:center; gap:8px; width:100%; text-align:left; background:transparent; border:0; padding:8px 12px; font-size:13px; color:var(--text); border-radius:8px; cursor:pointer; }
  .who-menu button:hover { background:var(--primary-soft); color:var(--primary); }
  .who-menu .ico { width:18px; text-align:center; }
  .who-menu hr { border:0; border-top:1px solid var(--line); margin:4px 6px; }
  .records-edit .rec { border:1px dashed var(--line); border-radius:8px; padding:8px; margin-bottom:8px; }
  /* 拜访记录条数：可点击进入明细 */
  .rec-link { display:inline-flex; align-items:center; gap:4px; padding:2px 10px; border-radius:999px; font-size:12px; background:var(--primary-soft); color:var(--primary); border:1px solid rgba(37,99,235,.25); cursor:pointer; transition:all .15s; }
  .rec-link:hover { background:var(--primary); color:#fff; border-color:var(--primary); }
  .rec-link.zero { background:transparent; color:var(--muted); border:1px dashed var(--line); }
  .rec-link.zero:hover { background:var(--primary-soft); color:var(--primary); border-style:solid; border-color:rgba(37,99,235,.25); }
  /* 拜访记录明细弹窗 */
  .vr-item { border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:10px; background:var(--panel-2,#f8fafc); }
  .vr-item .vr-head { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:12px; color:var(--muted); margin-bottom:6px; }
  .vr-item .vr-date { font-weight:600; color:var(--primary); font-size:13px; }
  .vr-item .vr-body { font-size:13px; line-height:1.7; color:var(--text-2); white-space:pre-wrap; word-break:break-word; overflow-wrap:anywhere; }
  .vr-item .vr-follow { margin-top:8px; padding-top:8px; border-top:1px dashed var(--line); font-size:12px; color:var(--text-2); line-height:1.7; }
  .vr-item .vr-follow .k { color:var(--muted); margin-right:4px; }
  /* 明细弹窗头：左标题 + 右「＋ 新增拜访记录」，窄屏换行不挤 */
  .vr-hd { display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap; margin-bottom:6px; }
  .vr-hd h3 { margin-bottom:0; }
  .vr-hd .vr-add { flex:0 0 auto; white-space:nowrap; }
  /* 拟拜访记录（列表入口 + 管理弹窗） */
  .plan-link { display:inline-flex; align-items:center; gap:4px; padding:2px 10px; border-radius:999px; font-size:12px;
    background:var(--warn-soft); color:#b45309; border:1px solid rgba(217,119,6,.28); cursor:pointer; transition:all .15s; white-space:nowrap; }
  .plan-link:hover { background:#f59e0b; color:#fff; border-color:#f59e0b; }
  .plan-link.done { background:var(--good-soft); color:var(--good); border-color:rgba(22,163,74,.3); }
  .plan-link.done:hover { background:var(--good); color:#fff; border-color:var(--good); }
  .plan-link.zero, .plan-link.legacy { background:transparent; color:var(--muted); border:1px dashed var(--line); }
  .plan-link.zero:hover, .plan-link.legacy:hover { background:var(--primary-soft); color:var(--primary); border-style:solid; border-color:rgba(37,99,235,.25); }
  .plan-more { font-size:11px; opacity:.75; }
  .pv-item { border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:10px; background:#f8fafc; }
  .pv-item.done { background:var(--good-soft); border-color:rgba(22,163,74,.26); }
  .pv-item .pv-head { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:13px; color:var(--text-2); }
  .pv-item .pv-date { font-weight:600; color:var(--text); font-variant-numeric:tabular-nums; }
  .pv-item .pv-link { font-size:12px; margin-top:4px; }
  .pv-item .pv-act { display:flex; gap:6px; margin-top:8px; flex-wrap:wrap; }
  .pv-form { background:var(--primary-soft); border:1px solid rgba(37,99,235,.22); border-radius:10px; padding:12px; }
  .pv-form .form3 { margin-bottom:4px; }
  textarea { min-height:70px; }
  .muted-tip { font-size:11px; color:var(--muted); }
  .hint-box { background:var(--primary-soft); border:1px solid rgba(37,99,235,.22); border-radius:10px; padding:10px 12px; font-size:12px; color:#1e40af; margin-bottom:12px; line-height:1.6; }
  .suggest-item { display:flex; gap:10px; align-items:flex-start; padding:9px 0; border-bottom:1px solid var(--line); font-size:13px; }
  .suggest-item:last-child { border-bottom:none; }
  .suggest-item .s-icon { font-size:16px; line-height:1.4; }
  .suggest-item .s-text { color:var(--text-2); }
  #smartInput { margin-top:6px; }
  /* ---- 语音识别输入（智能识别登记 / 一句话生成拜访记录） ---- */
  .smart-bar { display:flex; align-items:center; gap:10px; margin-top:10px; flex-wrap:wrap; }
  .btn.voice { background:linear-gradient(135deg,#0ea5e9,#2563eb); border-color:#2563eb; }
  .btn.voice.rec { background:linear-gradient(135deg,#dc2626,#f43f5e); border-color:#dc2626; animation:voicePulse 1.4s ease-out infinite; }
  .btn.voice.is-off { background:#e2e8f0; border-color:#cbd5e1; color:#94a3b8; cursor:not-allowed; animation:none; }
  @keyframes voicePulse { 0%{ box-shadow:0 0 0 0 rgba(220,38,38,.5); } 70%{ box-shadow:0 0 0 12px rgba(220,38,38,0); } 100%{ box-shadow:0 0 0 0 rgba(220,38,38,0); } }
  .voice-live { margin-top:10px; padding:9px 12px; border-radius:10px; background:#ecfeff; border:1px dashed #22d3ee; color:#0e7490; font-size:12.5px; line-height:1.7; }
  .voice-live.err { background:#fef2f2; border-color:#fca5a5; color:#b91c1c; }
  .voice-live b { font-weight:600; }
  .voice-live .vi { color:#64748b; }
  .toast { position:fixed; left:50%; bottom:40px; transform:translateX(-50%); background:rgba(15,23,42,.95); color:#fff; padding:10px 18px;
    border-radius:10px; font-size:13px; z-index:999; opacity:0; transition:opacity .25s; pointer-events:none; border:1px solid rgba(37,99,235,.3); box-shadow:0 8px 24px rgba(15,23,42,.4); }
  .toast.show { opacity:1; }

  /* ---- 仪表盘 · 二级页签（每日事项 / 客户管理 / 基地学校 / 酒店 / 工作量与待办） ---- */
  .dash-tabs { display:flex; flex-wrap:wrap; gap:8px; margin:0 0 14px; padding:8px; background:var(--card);
    border:1px solid var(--line); border-radius:13px; }
  .dash-tab { position:relative; display:inline-flex; align-items:center; justify-content:center; gap:6px;
    flex:1 1 0;                                   /* 4 个页签等分，整齐（<860px 会改回横向滚动） */
    padding:9px 16px; font-size:13.5px; font-weight:600;
    color:var(--text-2); background:#f8fafc; border:1px solid var(--line); border-radius:9px; cursor:pointer;
    transition:background .16s, color .16s, border-color .16s; white-space:nowrap; }
  .dash-tab:hover { color:var(--text); border-color:#cbd5e1; }
  .dash-tab.active { color:#fff; background:linear-gradient(135deg,#2563eb,#0ea5e9); border-color:transparent;
    box-shadow:0 4px 12px rgba(37,99,235,.28); }
  .dash-tab-badge { display:inline-flex; align-items:center; justify-content:center; min-width:18px; height:18px; padding:0 5px;
    font-size:11px; font-weight:700; color:#fff; background:#ef4444; border-radius:9px; }
  .dash-tab.active .dash-tab-badge { background:rgba(255,255,255,.28); color:#fff; }
  .dash-pane { animation:dashFade .18s ease; }
  @keyframes dashFade { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:none; } }
  /* 标题后的次要标签（如统计范围：我的 / 全部） */
  .h2-sub { margin-left:8px; font-size:12px; font-weight:500; color:var(--muted); background:#f1f5f9;
    border:1px solid var(--line); border-radius:999px; padding:2px 9px; vertical-align:middle; letter-spacing:0; }
  /* 空态卡片 */
  .empty-card { text-align:center; padding:26px 16px; }
  .empty-ico { font-size:28px; line-height:1; margin-bottom:9px; }

  /* ---- 数据看板 ---- */
  .board-grid { display:grid; grid-template-columns:1fr 1fr; gap:18px; align-items:stretch; }
  .mini { min-width:0; background:#f8fafc; border:1px solid var(--line); border-radius:13px; padding:16px 16px 18px;
    display:flex; flex-direction:column; }
  .mini > b { display:flex; align-items:center; gap:7px; font-size:13px; font-weight:600; color:var(--text-2); margin-bottom:14px; letter-spacing:.5px; }
  .mini > b::before { content:""; width:7px; height:7px; border-radius:50%; background:linear-gradient(135deg,#2563eb,#0ea5e9); }
  .mini > .chart-host { flex:1; display:flex; align-items:center; justify-content:center; }
  /* 客户看板：左=地图+示意图，右=雷达；左右排列 */
  .board-cust { grid-template-columns:1fr 1fr; gap:18px; align-items:stretch; }
  .board-cust .cust-left, .board-cust .cust-right { display:flex; flex-direction:column; }
  .board-cust .mini-map, .board-cust .mini-radar { flex:1; min-height:0; }
  .cust-left { display:flex; flex-direction:column; gap:10px; min-width:0; }
  .cust-right { min-width:0; }
  /* 客户看板：登记人 KPI 行 + 登记人分布图（跨两列，宽图更好看） */
  .cust-kpis { display:flex; flex-wrap:wrap; gap:10px; margin-bottom:14px; }
  .cust-kpis .res-kpi { flex:1 1 150px; }
  .board-cust .cust-reg { grid-column:1/-1; }
  .cust-reg .chart-bar svg { max-width:640px; }
  .hbar-pt { cursor:pointer; }
  .hbar-pt:hover rect:last-of-type { opacity:.82; }
  .hbar-pt:hover text { fill:#1e40af; }
  .hbar-has-detail { cursor:help; }
  .hbar-has-detail:hover rect:last-of-type { opacity:.82; }
  .data-detail-tip { position:fixed; display:none; pointer-events:none; background:rgba(15,23,42,.92); color:#fff; font-size:12px; line-height:1.65; padding:6px 9px; border-radius:6px; z-index:60; white-space:pre-line; max-width:280px; box-shadow:0 4px 14px rgba(0,0,0,.25); }
  .mini-map { width:100%; }
  .mini-map .chart-map { display:flex; align-items:center; justify-content:center; }
  .mini-map > b { margin-bottom:10px; }
  .mini-radar { display:flex; flex-direction:column; align-items:center; text-align:center; }
  .chart-pie { display:flex; flex-direction:column; align-items:center; gap:12px; width:100%; }
  .chart-pie svg { width:100%; max-width:210px; height:auto; }
  .chart-bar { display:flex; justify-content:center; width:100%; }
  .chart-bar svg { width:100%; max-width:560px; height:auto; }
  .chart-radar { display:flex; justify-content:center; width:100%; flex:1; min-height:0; }
  .chart-radar svg { width:100%; height:100%; max-width:none; }
  .radar-tip { position:fixed; display:none; pointer-events:none; background:rgba(15,23,42,.92); color:#fff; font-size:12px; padding:4px 8px; border-radius:6px; z-index:50; white-space:nowrap; }
  .radar-pt { cursor:pointer; }
  .radar-dot { transition:r .12s, fill .12s; }
  .radar-pt:hover .radar-dot { r:5.5; fill:#1e40af; }
  .chart-map { width:100%; position:relative; }
  .geo-svg { width:100%; height:100%; display:block; background:transparent; border-radius:8px; margin:0 auto; }
  .geo-path { cursor:pointer; transition:fill .15s, stroke .15s; }
  .geo-path:hover { stroke:#1e40af; stroke-width:1.2; }
  .geo-tip { position:absolute; display:none; pointer-events:none; background:rgba(15,23,42,.92); color:#fff; font-size:12px; padding:4px 8px; border-radius:6px; z-index:20; white-space:nowrap; }
  .geo-filter { display:flex; flex-wrap:wrap; gap:14px; align-items:center; margin:8px 0 4px; }
  .geo-filter label { font-size:11px; color:var(--text-2,#334155); font-weight:500; display:inline-flex; align-items:center; gap:6px; }
  .geo-filter select { padding:5px 8px; border:1px solid var(--border,#e2e8f0); border-radius:8px; background:#fff; color:var(--text,#0f172a); font-size:13px; font-weight:400; min-width:90px; }
  .geo-filter select:disabled { opacity:.65; background:#f8fafc; color:var(--muted); cursor:not-allowed; }
  .geo-filter select:focus { border-color:#2563eb; outline:none; box-shadow:0 0 0 2px rgba(37,99,235,.12); }
  /* 客户地域分布：地图下方统一工具栏（桌面/移动共用），不再用地图角落浮窗 */
  .geo-map-wrap { position:relative; width:100%; margin:4px 0 0; flex:1; min-height:0; }
  .geo-map-wrap .chart-map { height:100%; }
  .geo-legend-map, .geo-zoom { display: none; }
  .mobile-map-extras { display:flex; align-items:center; justify-content:space-between; gap:10px 18px; flex-wrap:wrap;
    margin-top:10px; padding:10px 14px; background:#f8fafc; border:1px solid var(--line); border-radius:10px;
    font-size:12px; color:var(--text-2,#334155); }
  .mobile-map-extras .legend { display:inline-flex; align-items:center; gap:8px; }
  .mobile-map-extras .legend .title { color:var(--muted); margin-right:2px; font-weight:500; }
  .mobile-map-extras .legend .bar { display:inline-block; width:120px; height:8px; border-radius:4px;
    background:linear-gradient(to right,#bfdbfe,#1e40af); box-shadow:inset 0 0 0 1px rgba(15,23,42,.06); }
  .mobile-map-extras .legend .lt { color:var(--muted); font-size:11px; }
  .mobile-map-extras .zoom-mobile { display:inline-flex; align-items:center; gap:8px; }
  .mobile-map-extras .zoom-mobile input[type=range] { writing-mode:horizontal-tb; direction:ltr;
    width:120px; height:6px; accent-color:#2563eb; cursor:pointer; }
  .mobile-map-extras .zoom-mobile .val { font-family:var(--mono,monospace); min-width:36px; text-align:center; color:var(--text); }
  .mobile-map-extras .zoom-mobile button { padding:2px 12px; font-size:11px; }
  .legend { display:flex; flex-wrap:wrap; gap:6px 16px; justify-content:center; font-size:12px; color:var(--text-2); margin-top:2px; }
  .legend .lg { display:inline-flex; align-items:center; gap:6px; }
  .legend .lg i { width:10px; height:10px; border-radius:3px; display:inline-block; }
  .legend .lg b { color:var(--text); font-family:var(--mono); }
  .remind-card { border:1px solid rgba(220,38,38,.35); background:linear-gradient(180deg, rgba(254,242,242,.7), rgba(254,242,242,.5)); }
  .remind-card h2 { color:#dc2626; }
  .remind-group { font-weight:600; margin:10px 0 7px; color:#dc2626; font-size:13px; }
  .remind-group:first-child { margin-top:2px; }
  .remind-item { padding:8px 10px; margin-bottom:6px; border:1px solid rgba(220,38,38,.22);
    border-radius:9px; background:rgba(255,255,255,.72); font-size:13px; line-height:1.6; color:#7f1d1d; }
  .remind-item:last-child { margin-bottom:0; }
  .remind-foot { margin-top:12px; display:flex; justify-content:flex-end; }
  /* 导航上的待办红点（当前用于「新人考核」：有待评分 / 待查看时显示条数） */
  .nav-dot { display:inline-block; min-width:16px; height:16px; line-height:16px; padding:0 4px; margin-left:5px;
    border-radius:9px; background:#dc2626; color:#fff; font-size:11px; font-weight:600; text-align:center; vertical-align:middle; }
  .badge-red { background:linear-gradient(90deg,#ef4444,#dc2626); color:#fff; border-radius:999px; padding:1px 9px; font-size:12px; margin-left:6px; box-shadow:0 0 12px rgba(220,38,38,.4); }
  .table-wrap { width:100%; overflow-x:auto; -webkit-overflow-scrolling:touch; }
  /* ---- 分页（每日事项 / 客户管理 / 成员管理 共用） ---- */
  .pager { display:flex; flex-wrap:wrap; gap:10px; align-items:center; justify-content:space-between; margin-top:14px; padding-top:12px; border-top:1px dashed var(--line); font-size:13px; color:var(--muted); }
  .pager-left { display:flex; align-items:center; gap:6px; }
  .pager-right { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
  .pager-size { padding:3px 6px; border:1px solid var(--border,#e2e8f0); border-radius:6px; background:#fff; color:var(--text,#0f172a); font-size:12px; cursor:pointer; }
  .pager-total { white-space:nowrap; }
  .pager-total b { color:var(--text,#0f172a); font-family:var(--mono,monospace); }
  .pager-sep { color:var(--border,#e2e8f0); margin:0 2px; }
  .pager-size-wrap { display:inline-flex; align-items:center; gap:4px; white-space:nowrap; }
  .pager-info { font-size:12px; color:var(--muted); margin-right:4px; }
  .pager-btn { font-size:12px; padding:4px 9px; }
  .pager-btn:disabled { opacity:.45; cursor:not-allowed; }

  /* 回收明细表（openSurveyResponses）：桌面端排版优化，长内容换行防撑破；专属 class 不影响其它 .tbl */
  .tbl-resp { font-size:13px; }
  .tbl-resp th, .tbl-resp td { padding:9px 12px; vertical-align:top; line-height:1.55; border-bottom:1px solid var(--line); }
  .tbl-resp th { background:#f1f5f9; font-weight:700; color:var(--text-2); text-align:left; }
  .tbl-resp thead th { position:sticky; top:0; z-index:3; background:#f1f5f9; }
  .tbl-resp td { overflow-wrap:anywhere; word-break:break-word; }
  .tbl-resp th:nth-child(1), .tbl-resp td:nth-child(1),
  .tbl-resp th:nth-child(2), .tbl-resp td:nth-child(2) { width:1%; white-space:nowrap; color:var(--muted); }
  .tbl-resp tbody tr:hover td { background:#f8fafc; }
  /* 回收明细（v2.83 方案A）：题干改 Q1..Qn 编号 + 顶部图例，根除列头竖排；弹窗加宽见 .modal.respwide */
  .resp-legend{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px;background:#f8fafc;border:1px solid var(--line,#e5e7eb);
    border-radius:11px;margin:10px 0 12px}
  .resp-legend .lg{font-size:11.5px;color:#475569;background:#fff;border:1px solid var(--line,#e5e7eb);border-radius:8px;padding:4px 9px;
    max-width:260px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .resp-legend .lg b{color:var(--primary,#3b6ef0);font-weight:700;margin-right:4px}
  .resp-tblwrap{max-height:62vh;overflow:auto;border:1px solid var(--line,#e5e7eb);border-radius:12px}
  .tbl-num th:not(:nth-child(1)):not(:nth-child(2)),
  .tbl-num td:not(:nth-child(1)):not(:nth-child(2)){text-align:center;min-width:120px}
  .tbl-num thead th{position:sticky;top:0;z-index:2;background:#f1f5f9}
  .tbl-num tbody tr:nth-child(even) td{background:#fbfdff}
  /* 回收明细（v3.06）：布局瘦身 —— ① 题干图例默认单行省略、可一键展开；② 长答案单元格默认 4 行截断、点击展开（.rc），
     行高不再被最长答案绑架；③ 答案列改为内容自适应（去掉 120px 强制最小宽 + 居中），14 列也能尽量一屏容纳；
     ④ 桌面端横向滚动时「填写人 / 提交时间」两列冻结在左侧 */
  .resp-legend{position:relative;max-height:42px;overflow:hidden}
  .resp-legend.open{max-height:none;overflow:visible}
  .resp-legend .lg{display:block;max-width:380px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:unset}
  .resp-legend.open .lg{white-space:normal}
  .resp-lg-toggle{position:absolute;right:8px;top:7px;font-size:11.5px;color:var(--primary,#3b6ef0);background:#fff;
    border:1px solid var(--line,#e5e7eb);border-radius:8px;padding:3px 10px;cursor:pointer}
  .resp-lg-toggle:hover{background:#eff6ff}
  .tbl-resp .rc{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;cursor:pointer}
  .tbl-resp .rc.open{-webkit-line-clamp:unset;display:block}
  .tbl-resp td:not(:nth-child(1)):not(:nth-child(2)):not(:nth-child(3)){text-align:left;min-width:88px;max-width:320px}
  .tbl-resp th:not(:nth-child(1)):not(:nth-child(2)):not(:nth-child(3)){text-align:left;min-width:88px}
  @media (min-width:861px){
    .tbl-resp tbody td{background:#fff}   /* 冻结列需不透明底色 */
    .tbl-resp th:nth-child(1),.tbl-resp td:nth-child(1){position:sticky;left:0;z-index:2;width:56px;min-width:56px;max-width:56px}
    .tbl-resp th:nth-child(2),.tbl-resp td:nth-child(2){position:sticky;left:56px;z-index:2;width:108px;min-width:108px;max-width:108px}
    .tbl-resp th:nth-child(3),.tbl-resp td:nth-child(3){position:sticky;left:164px;z-index:2;width:152px;min-width:152px;max-width:152px;
      box-shadow:8px 0 10px -8px rgba(15,23,42,.18)}
    .tbl-resp thead th:nth-child(1),.tbl-resp thead th:nth-child(2),.tbl-resp thead th:nth-child(3){z-index:6}   /* 角头需压过表头 sticky(z:3) 与冻结列(z:2) */
  }
  /* 答卷数据表（问卷星式）：分组标签 + 工具栏 + 题头筛选/排序 + 分页条 */
  .resp-toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;margin:4px 0 12px}
  .resp-tabs{display:inline-flex;gap:4px;background:#f1f5f9;border-radius:10px;padding:3px}
  .resp-tab{border:none;background:transparent;color:var(--muted);font-size:13px;font-weight:600;padding:6px 14px;border-radius:8px;cursor:pointer}
  .resp-tab:hover{color:var(--text-2)}
  .resp-tab.on{background:#fff;color:var(--primary);box-shadow:0 1px 2px rgba(15,23,42,.08)}
  .resp-tools{display:inline-flex;gap:8px;align-items:center}
  .tbl-resp th.rc-q{position:relative;padding-right:26px}
  .tbl-resp th .qh{display:flex;flex-direction:column;gap:1px;max-width:210px}
  .tbl-resp th .qh-no{font-size:11px;color:var(--primary);font-weight:700;line-height:1.2}
  .tbl-resp th .qh-t{font-size:12.5px;font-weight:600;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:210px}
  .tbl-resp th.col-active .qh-t{color:var(--primary)}
  .col-filter{position:absolute;top:3px;right:3px;border:none;background:transparent;color:var(--muted);cursor:pointer;font-size:11px;line-height:1;padding:5px 5px;border-radius:6px}
  .col-filter:hover{background:var(--primary-soft);color:var(--primary)}
  .col-menu{position:absolute;top:100%;right:0;z-index:30;background:#fff;border:1px solid var(--line-2);border-radius:10px;box-shadow:0 12px 28px rgba(15,23,42,.18);padding:8px;min-width:176px;text-align:left}
  .col-menu button{display:block;width:100%;text-align:left;border:none;background:#f8fafc;color:var(--text-2);font-size:12.5px;padding:7px 10px;border-radius:7px;margin-bottom:5px;cursor:pointer}
  .col-menu button:hover{background:var(--primary-soft);color:var(--primary)}
  .col-filt{display:flex;gap:4px;margin-top:2px}
  .col-filt input{flex:1 1 auto;min-width:0;border:1px solid var(--line-2);border-radius:7px;padding:6px 8px;font-size:12.5px}
  .col-filt button{border:1px solid var(--line-2);background:#fff;color:var(--text-2);font-size:12px;padding:6px 8px;border-radius:7px;cursor:pointer;margin-bottom:0;width:auto}
  .col-filt button:hover{border-color:var(--primary-2);color:var(--primary)}
  .resp-pager{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;margin-top:14px;font-size:13px;color:var(--muted)}
  .resp-pager .rp-count{font-weight:600;color:var(--text-2)}
  .resp-pager .rp-pages{display:inline-flex;align-items:center;gap:8px}
  .resp-pager .rp-pages button{border:1px solid var(--line-2);background:#fff;color:var(--text-2);width:30px;height:30px;border-radius:8px;cursor:pointer}
  .resp-pager .rp-pages button:disabled{opacity:.4;cursor:default}
  .resp-pager .rp-size{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
  .resp-pager .rp-size select{border:1px solid var(--line-2);border-radius:7px;padding:5px 6px;font-size:12.5px;background:#fff}
  .resp-pager .rp-jump input{width:56px;border:1px solid var(--line-2);border-radius:7px;padding:5px 6px;font-size:12.5px}
  .resp-pager .rp-jump button,.resp-pager .rp-full{border:1px solid var(--line-2);background:#fff;color:var(--text-2);font-size:12.5px;padding:6px 10px;border-radius:8px;cursor:pointer}
  .resp-pager .rp-full:hover,.resp-pager .rp-jump button:hover{border-color:var(--primary-2);color:var(--primary)}
  .resp-pager .rp-close{margin-left:auto;border:1px solid var(--line-2);background:#fff;color:var(--text-2);font-size:12.5px;font-weight:600;padding:6px 16px;border-radius:8px;cursor:pointer}
  .resp-pager .rp-close:hover{border-color:var(--primary-2);color:var(--primary)}
  .modal.respwide .box.resp-full{width:100vw;max-width:100vw;height:100vh;max-height:100vh;border-radius:0;padding:24px}
  /* ---- 响应式 ---- */
  @media (max-width: 860px){
    header { flex-direction:column; align-items:stretch; gap:8px; padding:12px 14px; }
    header h1 { font-size:18px; }
    .brand-motto { font-size:11px; padding-left:20px; }
    header .who { font-size:13px; }
    .layout { flex-direction:column; min-height:auto; }
    nav { width:100%; display:flex; flex-wrap:wrap; gap:8px; border-right:none; border-bottom:1px solid var(--line); padding:10px; }
    nav button { flex:1 1 calc(50% - 8px); margin-bottom:0; text-align:center; padding:11px 8px; font-size:14px; }
    .nav-drop { flex:1 1 calc(50% - 8px); }
    .nav-drop-btn { margin-bottom:0; text-align:center; padding:11px 8px; font-size:14px; }
    .nav-caret { float:none; margin-left:4px; }
    .nav-drop-menu { left:0; right:0; top:calc(100% + 4px); }
    main { padding:14px; }
    .card { padding:16px 14px; margin-bottom:16px; }
    /* 仪表盘二级页签：横向滚动，避免换行挤压 */
    .dash-tabs { flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; padding:7px; }
    .dash-tabs::-webkit-scrollbar { display:none; }
    .dash-tab { flex:0 0 auto; padding:8px 14px; font-size:13px; }
    h2 { font-size:16px; flex-wrap:wrap; }
    h2 .btn, h2 button { margin-left:auto; }
    .form3, .form2 { grid-template-columns:1fr; }
    .form4 { grid-template-columns:1fr 1fr; }
    .board-grid { grid-template-columns:1fr; gap:14px; }
    .board-cust { grid-template-columns:1fr; gap:14px; }
    .board-cust .cust-left, .board-cust .cust-right { display:block; }
    .board-cust .mini-map, .board-cust .mini-radar { flex:none; height:auto; }
    .geo-map-wrap { aspect-ratio:23 / 20; flex:none; min-height:260px; }
    .chart-radar { flex:none; }
    .chart-radar svg { height:auto; max-width:460px; }
    .mini-map .chart-map { min-height:0; }
    /* 手机端：客户数量示意图和比例尺改为地图外、竖排紧凑布局 */
    .mini-map { display:flex; flex-direction:column; }
    .geo-map-wrap { position:relative; flex:none; }
    .mobile-map-extras { flex-direction:column; align-items:stretch; gap:8px; padding:8px 10px; }
    .mobile-map-extras .legend, .mobile-map-extras .zoom-mobile { justify-content:space-between; }
    .mobile-map-extras .legend .bar { width:90px; }
    .modal .box { width:94vw; padding:18px; max-height:88vh; }
    .bar-label { width:74px; }
    .row-actions { flex-wrap:wrap; gap:6px; }
    .table-wrap { overflow:visible; }
    .table-wrap table, .table-wrap tbody, .table-wrap tr, .table-wrap td { display:block; width:100%; }
    .table-wrap thead { display:none; }
    .table-wrap tr { border:1px solid var(--line); border-radius:12px; margin-bottom:12px; padding:4px 2px;
      background:#f8fafc; box-shadow:0 1px 2px rgba(15,23,42,.05); }
    .table-wrap td { display:grid; grid-template-columns:96px minmax(0,1fr); gap:10px; border:none; padding:8px 12px; align-items:start; }
    .table-wrap .tbl-resp td { grid-template-columns:128px minmax(0,1fr); }
    .tbl-resp td:not(:nth-child(1)):not(:nth-child(2)):not(:nth-child(3)){max-width:none;min-width:0}   /* 手机端卡片复位桌面端列宽限制 */
    .table-wrap td::before { content: attr(data-label); color:var(--muted); font-size:12px; font-weight:600; }
    .table-wrap td .row-actions { justify-content:flex-end; }
    .table-wrap .empty { display:block; text-align:center; }
    .status-select { width:100%; max-width:160px; }
    .imp-map { grid-template-columns:1fr; }
    .imp-map-row { flex-wrap:wrap; }
    .imp-map-row label { flex:0 0 88px; }
    .res-ct-row { grid-template-columns:1fr 1fr; }
    .res-ct-row.no-title { grid-template-columns:1fr 1fr; }
    .res-ct-row button { grid-column:2; justify-self:end; }
    .rate-note { grid-column:1/-1; }
    .rate-note input { width:100%; }
    /* 资源汇聚数据看板：手机/平板 KPI 3 列 + 图表单列 */
    .res-board .res-kpis { gap:8px; }
    .res-board .res-kpis .res-kpi { flex:1 1 calc(33.33% - 6px); }
    .res-board .res-charts { grid-template-columns:1fr; gap:12px; }
    /* 资源汇聚分组（省 → 市 → 区县）：手机端纵向堆叠，统计换行，不影响客户管理页 */
    .res-groups .cust-toolbar { padding:10px; gap:8px; }
    .res-groups .cust-search { flex:1 1 100%; }
    .res-groups .cust-stat { margin-left:0; flex:1 1 100%; font-size:11px; line-height:1.6; }
    .res-groups .prov-head, .res-groups .city-head, .res-groups .dist-head { flex-wrap:wrap; padding:10px 12px; }
    .res-groups .prov-head .cnt, .res-groups .city-head .cnt, .res-groups .dist-head .cnt {
      margin-left:0; flex:1 1 100%; font-size:11px; line-height:1.5; }
    .res-groups .prov-body { padding:5px; }
    .res-groups .city-body { padding:5px; }
    .res-groups .dist-body { padding:5px 5px 2px; }
    .res-groups .card { padding:11px 10px; }
    .res-groups .res-item-head { gap:6px; }
    .res-groups .res-item-head .row-actions { margin-left:0; flex:1 1 100%; justify-content:flex-end; }
    .res-groups .res-item-meta { gap:5px; margin-bottom:7px; }
    .res-groups .res-item-meta .rate { font-size:11px; padding:2px 8px; }
    .res-groups .res-item-meta .r-sub { font-size:11px; flex:1 1 100%; }
    /* 对接人表：手机端每人两行（姓名 / 职务·职称 / 电话），不再逐字段堆 4 行 */
    .table-wrap .res-ct-tb thead { display:none; }
    .table-wrap .res-ct-tb tr { display:block; width:100%; padding:7px 0; margin:0; border:none; border-bottom:1px dashed var(--line);
      border-radius:0; background:transparent; box-shadow:none; }
    .table-wrap .res-ct-tb tr:last-child { border-bottom:none; }
    .table-wrap .res-ct-tb td { display:block; width:auto; padding:0 0 1px; border:none; background:none; }
    .table-wrap .res-ct-tb td::before { display:none; }
    .table-wrap .res-ct-tb td[data-label="联系人"] { font-weight:600; font-size:14px; }
    .table-wrap .res-ct-tb td[data-label="职务"],
    .table-wrap .res-ct-tb td[data-label="职称"] { display:inline; font-size:12px; color:var(--muted); }
    .table-wrap .res-ct-tb td[data-label="职务"]:not(:empty)::after { content:' · '; }
    .table-wrap .res-ct-tb td[data-label="联系方式"] { font-size:13px; color:var(--primary); }
  }
  @media (max-width: 480px){
    header .who { font-size:12px; }
    .bar-val { width:32px; }
    .table-wrap td { grid-template-columns:84px minmax(0,1fr); padding:7px 10px; }
    /* 小屏看板：KPI 2 列，数值与内边距收紧 */
    .res-board .res-kpis { gap:7px; }
    .res-board .res-kpis .res-kpi { flex:1 1 calc(50% - 4px); }
    .res-kpi { padding:9px 10px; }
    .res-kpi .kpi-val { font-size:18px; }
    .res-kpi .kpi-lab { font-size:11px; }
    .dash-tab { padding:8px 12px; font-size:12.5px; }
  }

  /* ---- 手机端专项修复（v1.86）：本区块所有规则都在媒体查询里，>860px 的电脑端根本不匹配
      → 电脑端显示与本次改动前逐像素一致（已用 36 组元素几何指纹快照逐项校验） ---- */
  @media (max-width: 860px){
    /* A1. 页头「标题 + 操作按钮」：按钮不再被压扁，一行放不下就整颗换行，按钮文字永不折断。
           修复对象：资源汇聚三页 / 新人考核 / 客户管理（原先按钮宽 55~83px，文字折成 2~3 行） */
    h2 .btn-group { flex-wrap:wrap; justify-content:flex-start; max-width:100%; row-gap:8px; }
    h2 .btn-group > .btn,
    h2 .btn-group > .btn:first-of-type,
    h2 .btn-group > .btn:last-of-type { flex:0 0 auto; white-space:nowrap; border-radius:8px; }
    h2 .h2-actions { flex-wrap:wrap; row-gap:8px; }
    h2 .h2-actions .btn { flex:0 0 auto; white-space:nowrap; }
    /* A2. 新增 / 编辑事项弹窗：要点区「＋ 添加一条」不再被右侧说明文字挤成两行 */
    .pts-foot { gap:8px; }
    .pts-foot .btn { flex:0 0 auto; white-space:nowrap; }
    /* A3. 项目卡片 SOP 状态小圆点：长 emoji（🧑‍🎓 等）不再溢出圆点 */
    .proj-dot { overflow:hidden; font-size:10px; line-height:1; }
    /* A4. 表格卡片化（td 变 84px+1fr 两列网格）后，一个单元格若有多行内容
           （如「内容」的要点摘要、「日期/时间」的时间行），第 2 行会被自动排进
           84px 的标签列里 —— 表现为文字被压成 2~3 行、且跑到字段名正下方。
           约束：所有内容子元素固定落在第 2 列（标签列只留给 data-label 本身）。 */
    .table-wrap td > * { grid-column:2; min-width:0; }
    /* A5. 「内容」列多要点摘要（等 N 条 / 进度 / 责任人·最早）在窄屏可换行，
           首条文字独占一行后省略号截断，徽章另起一行 —— 不再互相挤压、更不会撑破卡片 */
    .tbl-tasks .pts-sum-1 { flex-wrap:wrap; row-gap:2px; }
    .tbl-tasks .pts-sum-1 .t { flex:1 1 100%; }
    .tbl-tasks .pts-sum-2 { white-space:normal; overflow-wrap:anywhere; }
    /* A6. 仪表盘「待办提醒」卡片：提醒正文含不可断行的长串（长英文名 / 长编号）时
           会整行顶出卡片并撑出整个页面的横向滚动条 → 强制允许在任意字符处断行 */
    .remind-item { overflow-wrap:anywhere; word-break:break-word; }
    /* A7. 分组标题行（v1.88）：手机端表格卡片化后，组标题不能变成一张空白卡片
           → 收成一条窄分隔条：折叠箭头 + 图标 + 组名 + 条数，一行排开 */
    .table-wrap tr.tbl-grp { border:none; border-radius:0; background:none; box-shadow:none; margin:12px 0 6px; padding:0; }
    .table-wrap tr.tbl-grp > td { display:flex; align-items:center; gap:4px; width:auto; padding:7px 10px;
      border:1px solid var(--line); border-radius:9px; background:#eef2f7; }
    .table-wrap tr.tbl-grp > td::before { display:none; }
    .table-wrap tr.tbl-grp .grp-tgl { flex:0 0 auto; }
    .table-wrap tr.tbl-grp .grp-ico { flex:0 0 auto; }
    .table-wrap tr.tbl-grp .grp-name { flex:1 1 auto; min-width:0; overflow-wrap:anywhere; }
    .table-wrap tr.tbl-grp .grp-cnt { flex:0 0 auto; margin-left:auto; }
  }

  /* ===== v1.89：「日期/时间」「预计完成」合并为一行 =====
     同一年份省略年份（跨年仍显示完整日期，鼠标悬停看完整值），时间用灰色小字跟在后面。
     .dt 是 flex-wrap 容器：列够宽就一行，列窄时时间自动折到第二行，不会撑破单元格。 */
  .tbl-tasks .dt { display:flex; flex-wrap:wrap; align-items:baseline; gap:0 5px; min-width:0; }

  /* ===== v1.89：电脑端分组显示时，表头与组标题在表格区域内吸顶 =====
     只对「每日事项」且处于「已分组」状态的表格生效。sticky 需要有真正的滚动容器，
     而 main 是不可滚的 overflow:auto —— 所以这里给表格区域限高、让它自己成为滚动容器。
     未分组时电脑端与旧版完全一致（不复现这组规则）。 */
  @media (min-width:861px){
    /* 操作列：「置顶/取消置顶 + 编辑 + 删」实测占 136~148px（含 6px 间距），原内边距在
       常见窗口宽度下放不下 → 折成两行，把每行都撑到 80px 高。这里只收窄这一列按钮的
       左右内边距（10px→8px，省 12px），手机端不受影响（它在卡片里本就是通栏）。 */
    .tbl-tasks td.td-act .row-actions .btn { padding-left:8px; padding-right:8px; }
    .table-wrap.tw-tasks.is-grouped { max-height:max(300px, calc(100vh - 580px)); overflow-y:auto; }
    /* ⚠️ 吸顶必须写在 thead 上：实测 `.table-wrap ... thead th{position:sticky}` 在 Chrome/Edge 下
       完全无效 —— th 的计算值虽是 sticky，但滚动时其相对容器偏移恒等于 -scrollTop（等同 static）。
       变体实验 _itmp/probe_sticky_variants.js：只有 thead 这一种写法偏移恒为 0。 */
    .table-wrap.tw-tasks.is-grouped thead { position:sticky; top:0; z-index:2; }
    .table-wrap.tw-tasks.is-grouped thead th { background:#f8fafc; box-shadow:0 1px 0 var(--line); }
    .table-wrap.tw-tasks.is-grouped tr.tbl-grp > td { position:sticky; top:38px; z-index:1; }
    /* 长项目名 / 长派单人在这两列（8.5% / 8%）里会被 anywhere 硬断成 3~4 行，
       把整行从 ~55px 顶到 107px（生产实测「EDGE-SOP 1789306227492」折 4 行）。
       电脑端改为单行省略号，完整值放 title（项目 = 「点击打开该项目工作站：<项目名>」）。 */
    .table-wrap.tw-tasks .td-proj .proj-link,
    .table-wrap.tw-tasks .c-disp .disp-t { display:block; max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  }

  /* ===== 专家库（新增模块，样式独立命名空间 exp-*、expert-*，不影响其他模块） =====
     注意：CSS 注释里绝不能出现「星号+斜杠」，否则注释会提前闭合，把紧随其后的下一条规则整条吃掉 */
  .exp-ns-note { display:none; }
  .modal.xwide .box { width:900px; max-width:96vw; }
  .modal.respwide .box { width:min(1520px,98vw); max-width:98vw; padding:24px 28px; max-height:96vh; overflow:auto; }   /* v3.08 弹窗进一步放大（仅放大该弹窗，不影响其它 xwide） */
  .expert-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(310px,1fr)); gap:14px; margin-top:6px; }
  .expert-card { display:flex; gap:12px; border:1px solid var(--line); border-radius:14px; background:#fff; padding:13px 15px; cursor:pointer; transition:.15s; }
  .expert-card:hover { border-color:var(--primary-2); box-shadow:0 4px 14px rgba(37,99,235,.12); transform:translateY(-1px); }
  .expert-card .exc-photo { flex:0 0 64px; width:64px; height:64px; border-radius:50%; overflow:hidden; background:#eef2ff; display:flex; align-items:center; justify-content:center; }
  .expert-card .exc-photo img { width:100%; height:100%; object-fit:cover; }
  .expert-card .exc-photo .ava { font-size:24px; font-weight:800; color:#4f46e5; }
  .expert-card .exc-main { flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:5px; }
  .expert-card .exc-head { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
  .expert-card .exc-name { font-size:16px; font-weight:800; color:#1e40af; overflow-wrap:anywhere; word-break:break-word; }
  .expert-card .exc-line { font-size:12.5px; color:var(--text-2); overflow-wrap:anywhere; word-break:break-word; }
  .expert-card .exc-ops { display:flex; gap:6px; margin-top:2px; flex-wrap:wrap; }
  .exp-flt { width:auto; min-width:118px; padding:8px 10px; }
  .exp-sec { grid-column:1/-1; font-size:13px; font-weight:800; color:#1e40af; margin:4px 0 2px; padding-bottom:6px; border-bottom:1px dashed var(--line); }
  .exp-img-box { display:flex; gap:10px; align-items:flex-start; }
  .exp-img-prev { width:112px; height:80px; border:1px dashed var(--line-2); border-radius:10px; background:#f8fafc; display:flex; align-items:center; justify-content:center; overflow:hidden; }
  .exp-img-prev img { width:100%; height:100%; object-fit:cover; }
  .exp-img-prev .ph { font-size:12px; color:var(--muted); }
  .exp-img-ops { display:flex; flex-direction:column; gap:6px; }
  .modal .exp-dl { display:grid; grid-template-columns:1fr 1fr; gap:5px 18px; margin-bottom:8px; }
  .exp-dl-row { display:flex; gap:8px; font-size:13px; padding:4px 0; border-bottom:1px dashed var(--line); min-width:0; }
  .exp-dl-row.wide { grid-column:1/-1; }
  .exp-dl-row .k { flex:0 0 104px; color:var(--muted); }
  .exp-dl-row .v { flex:1 1 auto; min-width:0; color:var(--text); overflow-wrap:anywhere; word-break:break-word; }
  .exp-d-img { max-width:240px; max-height:160px; border-radius:8px; border:1px solid var(--line); display:block; }
  /* v3.17：专家档案标题行的「建档 / 更新」时间标注（exp-stamp 独立命名空间，不碰 .muted-tip） */
  .exp-stamp { display:inline-flex; align-items:center; gap:7px; margin-left:10px; font-size:12px; font-weight:400;
    color:var(--muted); white-space:nowrap; vertical-align:1px; }
  .exp-stamp .st { display:inline-flex; align-items:baseline; gap:5px; }
  .exp-stamp .k { font-size:11px; color:var(--muted); }
  .exp-stamp .v { font-variant-numeric:tabular-nums; color:var(--text-2); }
  .exp-stamp .v.now { color:#1e40af; font-weight:600; }
  .exp-stamp .sep { color:var(--line-2); }
  .exp-stamp .none { color:#94a3b8; }
  /* v3.04：专家库卡片网格内「按姓名首字母」分组小标题（grid 整宽，跨所有列） */
  .expert-grid .exp-letter-h { grid-column:1 / -1; font-size:13px; font-weight:800; color:#4f46e5; letter-spacing:.06em; padding:8px 2px 3px; margin-top:4px; border-top:1px dashed var(--line); }
  .expert-grid .exp-letter-h:first-child { border-top:none; margin-top:0; padding-top:0; }
  @media (max-width: 640px){
    .expert-grid { grid-template-columns:1fr; }
    .modal .exp-dl { grid-template-columns:1fr; }
    .modal.xwide .box { width:96vw; }
    .modal.respwide .box { width:96vw; padding:18px; }   /* v2.83 手机端：回收明细弹窗铺满，避免窄屏被裁 */
    .exp-img-prev { width:96px; height:70px; }
    .exp-stamp { margin-left:0; }   /* v3.17：窄屏标题行换行后，时间块与姓名左对齐、不再右缩进 */
  }

  /* ===== 项目排期表（项目工作站 · 实施时间排期；v2.36 新增） =====
     命名空间 psched-* —— 只追加、不改动既有规则；移动端适配一律写在 @media(max-width:860px) 内。 */
  .psched-toolbar { display:flex; flex-wrap:wrap; gap:8px 10px; align-items:flex-end; margin:10px 0 8px; }
  .psched-input { flex:1 1 210px; max-width:330px; padding:8px 11px; border:1px solid var(--line-2); border-radius:9px; font-size:13px; }
  .psched-f { display:flex; flex-direction:column; gap:3px; margin:0; }
  .psched-f > span { font-size:11.5px; color:var(--muted); }
  .psched-f select { min-width:106px; padding:7px 8px; border:1px solid var(--line); border-radius:8px; background:#fff; font-size:13px; }
  .psched-stat { display:flex; flex-wrap:wrap; gap:6px 16px; align-items:center; font-size:12.5px; color:var(--muted);
    background:#f8fafc; border:1px solid var(--line); border-radius:10px; padding:8px 12px; margin-bottom:12px; }
  .psched-stat b { color:var(--primary); font-size:13.5px; }
  .psched-stat .warn b { color:var(--warn); }
  /* ---- 日历（月视图：7 列 × 周行 + 跨天条形 + 泳道，对齐常规日历页） ---- */
  .psched-cal-wrap { border:1px solid var(--line); border-radius:12px; background:#fff; padding:10px 12px 12px; margin-bottom:14px; }
  .psched-cal-bar { display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin-bottom:10px; }
  .psched-cal-bar .psched-cal-title { font-size:15.5px; font-weight:800; color:var(--text); padding:0 3px; letter-spacing:.3px; }
  .psched-cal-sp { flex:1 1 auto; }
  .psched-cal-bar .muted-tip { font-size:11.5px; }
  .psched-cal-hint { display:flex; align-items:center; gap:10px; flex-wrap:wrap; background:#fff7ed; border:1px solid #fed7aa;
    color:#9a3412; border-radius:9px; padding:7px 10px; font-size:12px; margin-bottom:10px; }
  .psched-cal-grids { display:grid; gap:14px; }
  .psched-cal-grids.n1 { grid-template-columns:1fr; }
  .psched-cal-grids.n3 { grid-template-columns:repeat(auto-fit,minmax(370px,1fr)); }
  .psched-cal-grids.n6 { grid-template-columns:repeat(auto-fit,minmax(320px,1fr)); }
  .psched-cal-grids.n12 { grid-template-columns:repeat(auto-fit,minmax(276px,1fr)); }
  .psched-cal-card { border:1px solid var(--line); border-radius:10px; overflow:hidden; background:#fff; }
  .psched-cal-mhead { display:flex; align-items:center; justify-content:space-between; gap:8px; flex-wrap:wrap;
    padding:7px 10px; background:#f8fafc; border-bottom:1px solid var(--line); font-size:13.5px; font-weight:800; color:var(--text-2); }
  .psched-cal-mhead .muted-tip { font-weight:400; font-size:11.5px; }
  .psched-cal-dow { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); background:#fbfcfe; border-bottom:1px solid var(--line); }
  .psched-cal-dow span { text-align:center; font-size:11.5px; color:var(--muted); padding:5px 0; }
  .psched-cal-dow span.wk { color:#dc2626; }
  .psched-cal-week { position:relative; display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); border-bottom:1px solid var(--line); }
  .psched-cal-week:last-child { border-bottom:0; }
  .psched-cal-day { position:relative; min-width:0; border-left:1px solid var(--line); background:#fff; }
  .psched-cal-day:first-child { border-left:0; }
  .psched-cal-day.out { background:#fcfcfd; }
  .psched-cal-day.wkend { background:#fdfdff; }
  .psched-cal-day.out.wkend { background:#fafafc; }
  .psched-cal-day.today { background:#eff6ff; }
  .psched-cal-daynum { position:absolute; top:4px; left:6px; z-index:2; font-size:12px; line-height:18px; color:var(--text-2);
    font-variant-numeric:tabular-nums; }
  .psched-cal-day.out .psched-cal-daynum { color:var(--muted); }
  .psched-cal-day.today .psched-cal-daynum { background:var(--primary); color:#fff; border-radius:999px; padding:0 7px; }
  .psched-cal-more { position:absolute; bottom:2px; left:6px; z-index:2; font-size:10px; color:var(--muted); }
  /* 条形 = 两行：第 1 行「✅/⏳ 状态点 + 项目名（含期次）」，第 2 行「时间 · 天数 · 地点 · 带班负责人」——
     用户需求：「不能直观地在日历上看到时间、地点、带班负责人三个信息」
     v2.43（用户：「项目排期显示还是不够清晰」）：条高 26→30px、项目名 11.5px、次行 10.5px（原 10.5 / 9.5），
     条内补「天数」；跨周（跨月）被切断的条两端留出箭头位并画「‹ ›」续接符。 */
  .psched-cal-bar-item { position:absolute; z-index:3; box-sizing:border-box; height:30px; border-radius:6px;
    font-size:11.5px; font-style:normal; line-height:1.2; color:#fff; padding:3px 7px; overflow:hidden;
    cursor:pointer; display:flex; flex-direction:column; justify-content:center; text-align:left;
    box-shadow:0 1px 3px rgba(15,23,42,.2); }
  .psched-cal-bar-item .bi-n { font-weight:700; font-size:11.5px; white-space:nowrap; overflow:hidden;
    text-overflow:ellipsis; }
  .psched-cal-bar-item .bi-m { margin-top:1px; font-size:10.5px; opacity:.95; white-space:nowrap; overflow:hidden;
    text-overflow:ellipsis; font-variant-numeric:tabular-nums; }
  .psched-cal-bar-item:hover { filter:brightness(1.1); z-index:6; }
  .psched-cal-bar-item.cl { border-top-left-radius:0; border-bottom-left-radius:0; padding-left:13px; }
  .psched-cal-bar-item.cr { border-top-right-radius:0; border-bottom-right-radius:0; padding-right:13px; }
  .psched-cal-bar-item.cl::before { content:'‹'; position:absolute; left:3px; top:50%; transform:translateY(-52%);
    font-size:13px; font-weight:700; line-height:1; opacity:.9; }
  .psched-cal-bar-item.cr::after { content:'›'; position:absolute; right:3px; top:50%; transform:translateY(-52%);
    font-size:13px; font-weight:700; line-height:1; opacity:.9; }
  .psched-cal-bar-item.unconf { opacity:.68; }
  .psched-cal-bar-item.c0 { background:linear-gradient(90deg,#2563eb,#3b82f6); }
  .psched-cal-bar-item.c1 { background:linear-gradient(90deg,#0ea5e9,#38bdf8); color:#083344; }
  .psched-cal-bar-item.c2 { background:linear-gradient(90deg,#7c3aed,#8b5cf6); }
  .psched-cal-bar-item.c3 { background:linear-gradient(90deg,#16a34a,#22c55e); color:#052e16; }
  .psched-cal-bar-item.c4 { background:linear-gradient(90deg,#d97706,#f59e0b); color:#451a03; }
  .psched-cal-bar-item.c5 { background:linear-gradient(90deg,#db2777,#ec4899); }
  .psched-cal-bar-item.c6 { background:linear-gradient(90deg,#0d9488,#14b8a6); }
  .psched-cal-bar-item.c7 { background:linear-gradient(90deg,#dc2626,#ef4444); }
  .psched-cal-bar-item.c8 { background:linear-gradient(90deg,#4f46e5,#6366f1); }
  .psched-cal-bar-item.c9 { background:linear-gradient(90deg,#65a30d,#84cc16); color:#1a2e05; }
  .psched-cal-foot { display:flex; gap:6px 16px; flex-wrap:wrap; margin-top:10px; font-size:11.5px; color:var(--muted); }
  .psched-cal-foot i { display:inline-block; width:11px; height:11px; border-radius:3px; margin-right:4px; vertical-align:-1px; }
  /* 单月视图给足格子高度（「太小」的直接对策）；月数越多格子越小 */
  .psched-cal-grids.n1 .psched-cal-day { min-height:172px; }
  .psched-cal-grids.n3 .psched-cal-day { min-height:132px; }
  .psched-cal-grids.n6 .psched-cal-day { min-height:116px; }
  .psched-cal-grids.n12 .psched-cal-day { min-height:104px; }
  /* ---- v2.43：原「日历下方的项目列表」所用的整套「项目分组卡片」样式（列表容器 / 项目卡 / 折叠按钮 /
         项目名·元信息·汇总·操作组）已随该列表下线而移除；badge / tbl / empty 三组保留
         （项目工作台的排期编辑弹窗仍在用，勿删）。 ---- */
  .psched-badge { display:inline-block; font-size:11.5px; font-weight:700; padding:2px 8px; border-radius:999px; white-space:nowrap; }
  .psched-badge.ok { background:var(--good-soft); color:var(--good); }
  .psched-badge.pend { background:var(--warn-soft); color:var(--warn); }
  .psched-badge.none { background:#e5e7eb; color:#6b7280; }
  .psched-tbl { width:100%; border-collapse:collapse; font-size:12.5px; }
  .psched-tbl th { background:#fff; font-size:11.5px; color:var(--muted); font-weight:600; padding:6px 10px;
    border-bottom:1px solid var(--line); white-space:nowrap; }
  .psched-tbl td { padding:6px 10px; border-bottom:1px dashed var(--line); color:var(--text-2); vertical-align:middle; overflow-wrap:anywhere; }
  .psched-tbl tr:last-child td { border-bottom:0; }
  .psched-tbl .num { font-variant-numeric:tabular-nums; white-space:nowrap; }
  .psched-tbl .psched-acts { text-align:right; white-space:nowrap; }
  .psched-empty { padding:14px; font-size:12.5px; color:var(--muted); }
  /* ---- 工作台侧栏入口 ---- */
  .psched-wb-act { padding:4px 0 2px; }
  .psched-wb-btn { width:100%; }
  /* ---- 排期编辑表（工作台内 / 排期表弹窗共用） ---- */
  .psched-edit-wrap { overflow-x:auto; -webkit-overflow-scrolling:touch; border:1px solid var(--line); border-radius:10px; }
  .psched-edit-tbl { width:100%; border-collapse:collapse; font-size:12.5px; min-width:900px; }
  .psched-edit-tbl th { background:#f8fafc; font-size:11.5px; color:var(--muted); font-weight:600; padding:7px 8px; border-bottom:1px solid var(--line); }
  .psched-edit-tbl td { padding:5px 6px; border-bottom:1px dashed var(--line); vertical-align:middle; }
  .psched-edit-tbl tr:last-child td { border-bottom:0; }
  .psched-edit-tbl input { width:100%; padding:5px 7px; border:1px solid var(--line-2); border-radius:7px; font-size:12.5px; }
  .psched-edit-tbl input:focus { outline:none; border-color:var(--primary); box-shadow:0 0 0 2px rgba(37,99,235,.14); }
  .psched-warn-tip { background:#fff7ed; border:1px solid #fed7aa; color:#9a3412; border-radius:9px; padding:8px 10px;
    font-size:12px; margin:8px 0; line-height:1.6; }
  .psched-chg { font-size:12.5px; color:var(--text-2); line-height:1.9; }
  .psched-chg b { color:var(--primary); }
  /* ---- v2.44：工具栏右侧「＋ 新增项目排期」按钮 + 新增排期弹层 ---- */
  .psched-addwrap { margin-left:auto; }
  .psched-addwrap .btn { white-space:nowrap; }
  .psa-sync { display:flex; align-items:flex-start; gap:8px; margin-top:12px; font-size:12.5px; color:var(--text-2);
    background:#f8fafc; border:1px solid var(--line); border-radius:9px; padding:9px 11px; line-height:1.65; cursor:pointer; }
  /* 全局 input{width:100%} 会把复选框撑满整行、把说明文字挤成竖排——还原原生小方块（同 .sop-pub-item / #exam-root 修法） */
  .psa-sync input[type=checkbox] { width:15px; height:15px; padding:0; margin:2px 0 0; flex:0 0 auto; accent-color:var(--primary); cursor:pointer; }
  .psa-sync b { color:var(--primary); }
  @media (max-width:860px){
    .psched-input { flex:1 1 100%; max-width:none; }
    .psched-cal-grids.n3, .psched-cal-grids.n6, .psched-cal-grids.n12 { grid-template-columns:1fr; }
    .psched-cal-grids.n1 .psched-cal-day, .psched-cal-grids.n3 .psched-cal-day,
    .psched-cal-grids.n6 .psched-cal-day, .psched-cal-grids.n12 .psched-cal-day { min-height:104px; }
    .psched-cal-bar .psched-cal-title { font-size:14.5px; }
    .psched-cal-mhead { font-size:12.5px; }
    .psched-cal-bar-item { height:26px; font-size:10px; padding:2px 5px; }
    .psched-cal-bar-item .bi-n { font-size:10px; }
    .psched-cal-bar-item .bi-m { font-size:9px; }
    .psched-cal-bar-item.cl { padding-left:11px; }
    .psched-cal-bar-item.cr { padding-right:11px; }
    .psched-f { flex:1 1 calc(50% - 5px); }
    .psched-f select { min-width:0; width:100%; }
    .psched-edit-tbl { min-width:780px; }
    .psched-addwrap { flex:1 1 100%; margin-left:0; }
    .psched-addwrap .btn { width:100%; }
  }
/* ===== 问卷模块样式（v2.83 方案A 卡片精修：标题可折2行+状态固定右上不换行；meta 拆小标签；按钮收「常用3+⋯更多」） ===== */
.survey-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;margin-top:10px}
.survey-card{border:1px solid var(--line,#e5e7eb);border-radius:12px;padding:0;background:#fff;overflow:hidden;display:flex;flex-direction:column}
.svcard-head{display:flex;align-items:flex-start;gap:10px;padding:14px 14px 10px}
.svcard-title{font-size:14.5px;font-weight:700;line-height:1.5;flex:1 1 auto;min-width:0;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.svcard-head .badge{flex:0 0 auto;white-space:nowrap;margin-top:1px}
.svcard-desc{color:#475569;font-size:12.5px;line-height:1.6;padding:0 14px 10px}
.svcard-chips{display:flex;flex-wrap:wrap;gap:6px;padding:0 14px 12px}
.svcard-chip{background:#f1f5f9;border:1px solid var(--line,#e5e7eb);border-radius:999px;padding:3px 10px;font-size:11.5px;color:#475569;
  display:inline-flex;align-items:center;gap:4px;max-width:100%}
.svcard-chip b{color:var(--text,#1f2937);font-weight:700}
.svcard-chip.wide{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}
.svcard-foot{margin-top:auto;padding:11px 14px;background:#f8fafc;border-top:1px solid var(--line,#e5e7eb);display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.svcard-more{position:relative;margin-left:auto}
.svcard-menu{position:absolute;right:0;bottom:calc(100% + 6px);background:#fff;border:1px solid var(--line,#e5e7eb);
  border-radius:10px;box-shadow:0 12px 30px rgba(15,23,42,.16);padding:6px;min-width:132px;display:none;z-index:20}
.svcard-menu.on{display:block}
.svcard-menu button{display:block;width:100%;text-align:left;background:none;border:0;padding:8px 10px;border-radius:7px;
  font-size:12.5px;color:var(--text-2,#334155);cursor:pointer;font-family:inherit;margin-bottom:2px}
.svcard-menu button:hover{background:var(--primary-soft,#eef3ff);color:var(--primary,#3b6ef0)}
.svcard-menu button.danger{color:var(--danger,#dc2626)}
.svcard-menu button.danger:hover{background:var(--danger-soft,#fee2e2);color:var(--danger,#dc2626)}
/* ===== v3.12 问卷列表：工具条内的「排序按钮组」+「卡片/列表切换」+ 紧凑列表布局 ===== */
.sv-toolbar .cust-stat{margin-left:0;flex:0 0 auto}
.sv-sortbar,.sv-laybar{display:inline-flex;align-items:center;gap:2px;background:#fff;border:1px solid var(--line,#e5e7eb);border-radius:8px;padding:2px;flex:0 0 auto}
.sv-sortbar-lb{font-size:11.5px;color:var(--muted,#6b7280);padding:0 4px 0 7px;white-space:nowrap}
.sv-sbtn,.sv-lbtn{border:0;background:none;padding:5px 9px;border-radius:6px;font-size:12.5px;line-height:1.4;color:var(--text-2,#334155);cursor:pointer;white-space:nowrap;font-family:inherit}
.sv-sbtn:hover,.sv-lbtn:hover{background:var(--primary-soft,#eef3ff);color:var(--primary,#3b6ef0)}
.sv-sbtn.on,.sv-lbtn.on{background:var(--primary,#3b6ef0);color:#fff;font-weight:700}
.sv-sbtn.on:hover,.sv-lbtn.on:hover{background:var(--primary,#3b6ef0);color:#fff}
/* v3.13：选中项显示方向箭头（↓ 倒序 / ↑ 正序），再点同一项即可互换 */
.sv-sbtn.on::after{content:' ↓';font-size:11px;font-weight:700;opacity:.92}
.sv-sbtn.on[data-dir="asc"]::after{content:' ↑'}
/* v3.13：重渲淡入，点击排序/翻页能明显看到列表刷新 */
.sv-fade .survey-card,.sv-fade .sv-row{animation:svFadeIn .26s ease both}
@keyframes svFadeIn{from{opacity:.25;transform:translateY(3px)}to{opacity:1;transform:none}}
.sv-list{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.sv-row{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line,#e5e7eb);border-radius:10px;background:#fff;transition:border-color .12s,box-shadow .12s}
.sv-row:hover{border-color:var(--primary-2,#93b4f5);box-shadow:0 2px 10px rgba(37,99,235,.08)}
.sv-row>.badge{flex:0 0 auto}
.sv-row-main{flex:1 1 auto;min-width:0}
.sv-row-title{font-size:14px;font-weight:700;color:var(--text,#1f2937);line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sv-row-sub{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:3px;font-size:11.5px;color:#64748b;line-height:1.6}
.sv-row-sub b{color:var(--text,#1f2937);font-weight:700}
.sv-row-acts{flex:0 0 auto;display:flex;align-items:center;gap:6px}
@media (max-width:760px){
  .sv-sortbar,.sv-laybar{flex:1 1 100%;justify-content:flex-start;overflow-x:auto}
  .sv-row{flex-wrap:wrap}
  .sv-row-acts{flex:1 1 100%;justify-content:flex-end;flex-wrap:wrap;margin-top:2px}
}
.fill-q{margin:14px 0;padding:16px 16px 14px;border:1px solid var(--border,#eef2f7);border-radius:12px;background:#fff;box-shadow:0 4px 16px rgba(31,41,55,.05);transition:.18s}
.fill-q:hover{box-shadow:0 8px 22px rgba(31,41,55,.08)}
.fill-q-title{display:flex;gap:10px;align-items:flex-start;font-weight:600;margin-bottom:12px;font-size:15px;line-height:1.5}
.fq-no{flex:0 0 auto;width:25px;height:25px;border-radius:50%;background:var(--primary-soft,#eef3ff);color:var(--primary,#3b6ef0);font-weight:700;font-size:13px;display:flex;align-items:center;justify-content:center;margin-top:1px}
.fq-text{flex:1}
.fq-chip{flex:0 0 auto;font-size:11px;color:var(--primary,#3b6ef0);background:var(--primary-soft,#eef3ff);border:1px solid #dbe6ff;padding:2px 8px;border-radius:999px;margin-top:1px;white-space:nowrap}
.opt-group{display:flex;flex-direction:column;gap:8px}
.pf-opt{display:block;position:relative;margin:0;cursor:pointer}
.pf-opt input{position:absolute;opacity:0;width:0;height:0}
.pf-opt .pf-ob{display:flex;align-items:center;gap:10px;padding:10px 13px;border:1.5px solid var(--border,#e5e9f0);border-radius:10px;background:#fff;transition:.16s;font-size:14px}
.pf-opt .mark{flex:0 0 auto;width:18px;height:18px;border-radius:50%;border:2px solid #c7cedb;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;transition:.16s}
.pf-opt.multi .mark{border-radius:6px}
.pf-opt:hover .pf-ob{border-color:var(--primary,#3b6ef0);background:var(--primary-soft,#eef3ff)}
.pf-opt input:checked+.pf-ob{border-color:var(--primary,#3b6ef0);background:var(--primary-soft,#eef3ff);font-weight:600;color:var(--primary-ink,#1b5ec2)}
.pf-opt input:checked+.pf-ob .mark{background:var(--primary,#3b6ef0);border-color:var(--primary,#3b6ef0)}
.pf-opt input:checked+.pf-ob .mark::after{content:'✓'}
.pf-stars{display:flex;gap:5px;margin:4px 0 2px;align-items:center}
.pf-stars label{cursor:pointer;font-size:28px;line-height:1;color:#d6dae3;transition:transform .12s,color .12s;user-select:none}
.pf-stars label:hover{transform:scale(1.12)}
.pf-stars label.on{color:#ffb400}
.pf-stars .hint{font-size:12px;color:#6b7280;margin-left:8px}
.pf-mcell{display:inline-flex;align-items:center;gap:5px;cursor:pointer;font-size:13.5px;color:#3a4452;margin:2px 0}
.pf-mcell input{accent-color:var(--primary,#3b6ef0);width:16px;height:16px}
.fill-q .matrix{border:1px solid var(--border,#eef2f7);border-radius:10px;overflow:hidden;margin-top:4px}
.fill-q .matrix-row{border-top:1px solid var(--border,#eef2f7)}
.fill-q .matrix-row:first-child{border-top:none}
.fill-q .matrix-row:hover{background:#fafbff}
.fill-q .sortable li{display:flex;align-items:center;gap:12px;padding:11px 14px;border:1.5px solid var(--border,#e5e7eb);border-radius:11px;margin:8px 0;background:#fff}
.fill-q .sortable li .rank{flex:0 0 auto;width:24px;height:24px;border-radius:50%;background:var(--primary-soft,#eef3ff);color:var(--primary,#3b6ef0);font-weight:700;font-size:13px;display:flex;align-items:center;justify-content:center}
.fill-q .sortable li .lbl{flex:1;font-size:14px}
.fill-q .sortable li .mv{display:flex;gap:6px}
.fill-q .sortable li .mv button{width:30px;height:30px;border-radius:8px}
/* ===== 问卷「去填写」弹窗：固定头/固定底栏 + 主体滚动（避免长问卷被裁、按钮找得到） ===== */
.modal.sfill .box{width:820px;max-width:96vw;padding:0;overflow:hidden;display:flex;flex-direction:column;max-height:90vh}
.sf-head{flex:0 0 auto;padding:16px 22px 12px;border-bottom:1px solid var(--line,#e5e7eb);background:linear-gradient(180deg,#f8fafc,#fff)}
.sf-head h3{margin:0 0 6px;font-size:16.5px;font-weight:800;line-height:1.5;color:var(--text,#1f2937);padding-right:8px}
.sf-head h3:last-child{margin-bottom:0}
.sf-desc{font-size:13px;color:#55606f;line-height:1.65;margin:0 0 7px;background:#f2f5fa;border:1px solid #e6ebf3;border-radius:8px;padding:7px 10px}
.sf-meta{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:12.5px;color:var(--muted,#6b7280)}
.sf-meta b.sf-req{color:#e5484d;font-weight:700}
.sf-body{flex:1 1 auto;min-height:0;overflow:auto;padding:10px 22px 4px;-webkit-overflow-scrolling:touch}
.sf-body .fill-q:first-child{margin-top:4px}
.sf-foot{flex:0 0 auto;display:flex;align-items:center;gap:10px;padding:12px 22px 16px;border-top:1px solid var(--line,#e5e7eb);background:#fff;box-shadow:0 -6px 16px rgba(15,23,42,.05)}
.sf-foot-tip{flex:1 1 auto;min-width:0;font-size:12.5px;color:var(--muted,#6b7280);overflow-wrap:anywhere}
@media (max-width:560px){
  .modal.sfill .box{width:100vw;max-width:100vw;height:100vh;max-height:100vh;border-radius:0}
  .sf-head{padding:13px 15px 10px}
  .sf-head h3{font-size:15.5px}
  .sf-body{padding:9px 15px 2px}
  .sf-body .fill-q{padding:13px 12px 11px;margin:11px 0}
  .sf-foot{padding:10px 15px 13px}
}
.pf-input:focus{border-color:var(--primary,#3b6ef0);box-shadow:0 0 0 3px var(--primary-soft,#eef3ff)}
.matrix-row{display:flex;gap:14px;align-items:flex-start;margin:8px 0;flex-wrap:wrap}
.matrix-r{min-width:90px;font-weight:600}
.matrix-c{display:flex;gap:10px;flex-wrap:wrap}
.se-field{margin:10px 0}
.se-field label{display:block;font-weight:600;margin-bottom:4px}
.se-qhead{display:flex;align-items:center;gap:10px;margin:14px 0 8px;font-weight:600}
.se-q{border:1px solid #e5e7eb;border-radius:12px;padding:12px 14px;margin:10px 0;background:#fbfdff;transition:border-color .15s}
.se-q.err{border-color:#f87171;background:#fff8f8}
.se-q-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.se-q-no{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 6px;border-radius:8px;background:var(--primary-soft,#eef3ff);color:var(--primary,#3b6ef0);font-weight:800;font-size:13px}
.se-q-space{flex:1}
.se-type{padding:4px 8px;border:1px solid #dbe3ee;border-radius:8px;background:#fff;font-size:13px;color:#1f2937;cursor:pointer}
.se-type:focus{border-color:var(--primary,#3b6ef0);outline:none}
.se-req{display:inline-flex;align-items:center;gap:4px;font-size:13px;color:#3a4452;cursor:pointer;user-select:none}
.se-req input{accent-color:var(--primary,#3b6ef0);width:15px;height:15px}
.se-cfg{margin-top:8px;padding:10px 12px;border:1px dashed #dbe3ee;border-radius:10px;background:#fff}
.se-cfg-label{font-weight:700;font-size:13px;color:#334155;margin-bottom:6px}
.se-cfg-hint{font-weight:400;font-size:12px;color:#94a3b8;margin-left:6px}
.se-cfg-tip{font-size:12px;color:#94a3b8;margin-top:6px;line-height:1.5}
.se-mx-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.se-mx-grid label{font-size:12.5px;color:#475569;display:block}
.se-mx-grid textarea{margin-top:4px;width:100%}
.se-inline{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#475569}
.se-opt-row{display:flex;align-items:center;gap:8px;margin:6px 0}
.se-opt-ic{flex:0 0 18px;text-align:center;color:#64748b;font-size:13px}
.se-opt-row .pf-input{flex:1}
.se-q-warn{margin-top:8px;font-size:12.5px;color:#dc2626;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:6px 10px;line-height:1.5}
/* ---- 问卷编辑器 v2：顶部工具条 / 图标按钮 / 折叠 / 选项批量 ---- */
.se-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 12px;padding:7px 10px;border:1px solid var(--line,#e5e7eb);border-radius:10px;background:#f8fafc}
.se-chip{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:#475569;background:#fff;border:1px solid #e2e8f0;border-radius:999px;padding:2px 10px}
.se-chip b{color:#2563eb;font-weight:800}
.se-ic{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid #dbe3ee;background:#fff;border-radius:8px;cursor:pointer;font-size:13.5px;line-height:1;color:#475569;transition:border-color .12s,color .12s,background .12s}
.se-ic:hover{border-color:#93b4f5;color:#2563eb;background:#eff6ff}
.se-ic:disabled{opacity:.4;cursor:not-allowed}
.se-ic.danger:hover{border-color:#f3a3a3;color:#dc2626;background:#fef2f2}
.se-qtools{display:inline-flex;gap:6px;align-items:center}
.se-q.folded .se-q-body{display:none}
.se-fold-preview{max-width:46%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px}
.se-desc-in{margin-top:6px}
.se-opt-mv{display:inline-flex;gap:4px}
.se-opt-mv .se-ic{width:24px;height:24px;font-size:12px}
.se-opt-foot{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:8px}
.se-batch-wrap{margin-top:8px;padding:8px;border:1px solid #dbe3ee;border-radius:8px;background:#f8fafc}
.se-batch-ta{width:100%;min-height:110px;font-family:inherit;font-size:13px;padding:8px;border:1px solid #dbe3ee;border-radius:8px;resize:vertical}
.se-batch-acts{display:flex;gap:8px;align-items:center;margin-top:6px}
.fill-q-desc{font-size:12.5px;color:#8a94a6;line-height:1.6;margin:2px 0 8px;padding-left:2px}
/* ---- 问卷预览（新窗口） ---- */
.pv-toolbar{position:fixed;right:18px;bottom:24px;display:flex;gap:8px;z-index:20}
.pv-toolbar button{padding:9px 15px;border:none;border-radius:8px;cursor:pointer;font-size:13px;box-shadow:0 2px 8px rgba(43,108,246,.28)}
.pv-print{background:#2b6cf6;color:#fff}
.pv-close{background:#fff;color:#475569;border:1px solid #dbe3ee}
.pv-hero{margin:0 0 4px;font-size:20px;font-weight:800;text-align:center}
.pv-sub{text-align:center;color:#8a94a6;font-size:12.5px;margin-bottom:20px}
@media print{.pv-toolbar{display:none}}
.se-empty{border:1.5px dashed #cbd5e1;border-radius:12px;padding:24px 14px;text-align:center;color:#94a3b8;margin:10px 0;font-size:13.5px}
.se-statusline{display:flex;align-items:center;gap:8px;margin:10px 0;font-size:12.5px;color:#64748b;flex-wrap:wrap}
.se-st-badge{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:700}
.se-st-badge.draft{background:#f1f5f9;color:#475569}
.se-st-badge.open{background:#dcfce7;color:#16a34a}
.se-st-badge.closed{background:#fee2e2;color:#dc2626}
/* ---- 问卷编辑器：左侧题型面板 ---- */
.se-wrap{display:flex;gap:16px;align-items:flex-start}
.se-palette{flex:0 0 212px;position:sticky;top:12px;background:var(--card,#fff);border:1px solid var(--line,#e5e7eb);border-radius:12px;padding:10px 10px 12px;max-height:calc(100vh - 100px);overflow:auto;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.se-palette h4{margin:12px 2px 6px;font-size:13px;font-weight:800;color:#2563eb;display:flex;align-items:center;gap:5px}
.se-palette h4:first-child{margin-top:2px}
.se-pt{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px;cursor:pointer;font-size:13.5px;color:var(--text-1,#1f2937);user-select:none;line-height:1.2}
.se-pt:hover{background:#eff6ff;color:#2563eb}
.se-pt .ic{width:18px;text-align:center;flex:0 0 18px;font-style:normal}
.se-pt.soon{opacity:.45;cursor:not-allowed}
.se-pt.soon em{font-style:normal;font-size:11px;margin-left:auto;color:#94a3b8}
.se-pt em.tool{font-style:normal;font-size:11px;margin-left:auto;background:#eef2ff;color:#4f46e5;padding:1px 7px;border-radius:999px}
.fill-page{margin:18px 0 6px;padding:12px 16px;border-left:4px solid var(--accent,#3b82f6);background:linear-gradient(90deg,rgba(59,130,246,.07),transparent);border-radius:10px}
.fill-page-title{font-weight:800;font-size:15.5px;color:#1f2937;line-height:1.4}
.fill-page-desc{font-size:13px;color:var(--text-2,#475569);margin-top:4px;line-height:1.6}
.matrix-head{font-weight:700;background:#f8fafc}
.matrix.mfill .mfill-cell{width:100%;min-width:88px;box-sizing:border-box;margin:3px 0}
.rq-page{margin:18px 0 6px;padding:12px 16px;border-left:4px solid #3b82f6;background:#f1f5f9;border-radius:10px}
.rq-page-title{font-weight:800;font-size:16px;color:#1f2937}
.se-main{flex:1;min-width:0}
/* ---- 问卷编辑器 v2.89 方案B：三栏工作台（题型库 ｜ 题目大纲 ｜ 属性面板） ---- */
.se-cols{display:flex;gap:14px;align-items:flex-start}
.se-outline{flex:0 0 250px;position:sticky;top:12px;background:var(--card,#fff);border:1px solid var(--line,#e5e7eb);border-radius:12px;padding:10px;max-height:calc(100vh - 130px);overflow:auto;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.se-ol-set{display:flex;gap:8px;align-items:center;padding:9px 10px;border-radius:9px;background:#f8fafc;border:1px solid var(--line,#e5e7eb);font-size:12.5px;font-weight:700;color:#334155;margin-bottom:10px;cursor:pointer;user-select:none}
.se-ol-set:hover{border-color:#93b4f5;color:#2563eb}
.se-ol-set.on{background:#eff6ff;border-color:rgba(37,99,235,.35);color:#2563eb}
.se-ol-set-ic{font-size:14px}
.se-ol-set-n{margin-left:auto;font-weight:700;color:#dc2626;font-size:11px}
.se-ol-set-tip{font-size:11.5px;line-height:1.6;color:#94a3b8;margin:-4px 2px 10px;padding:0 2px}
.se-ol-h{font-size:11.5px;font-weight:800;color:#94a3b8;letter-spacing:.6px;margin:2px 2px 6px}
.se-ol-list{display:flex;flex-direction:column;gap:4px}
.se-ol-empty{border:1.5px dashed #cbd5e1;border-radius:10px;padding:18px 10px;text-align:center;color:#94a3b8;font-size:12.5px;line-height:1.7}
.se-oli{display:flex;gap:8px;align-items:center;padding:8px 9px;border-radius:9px;border:1px solid transparent;cursor:pointer;transition:background .12s,border-color .12s}
.se-oli:hover{background:#f1f5f9}
.se-oli.sel{background:#eff6ff;border-color:rgba(37,99,235,.35)}
.se-oli.err{border-color:#fca5a5;background:#fff8f8}
.se-oli.dragging{opacity:.45}
.se-oli.dragover{background:#dbeafe;border-color:#60a5fa}
.se-oli-grip{color:#cbd5e1;font-size:13px;flex:0 0 auto;cursor:grab;line-height:1}
.se-oli-no{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:22px;padding:0 5px;border-radius:7px;background:#eff6ff;color:#2563eb;font-weight:800;font-size:11.5px;flex:0 0 auto}
.se-oli-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.se-oli-tt{font-size:12.5px;color:#1f2937;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.se-oli-mt{display:flex;gap:6px;align-items:center;font-size:10.5px;color:#94a3b8;line-height:1.4}
.se-oli-type{background:#eef2ff;color:#4f46e5;border-radius:999px;padding:0 7px;font-weight:700}
.se-oli-req{color:#dc2626;font-weight:700}
.se-oli-warn{color:#d97706;font-weight:800}
.se-ol-add{width:100%;margin-top:6px;box-sizing:border-box}
.se-panel{flex:1;min-width:0;background:var(--card,#fff);border:1px solid var(--line,#e5e7eb);border-radius:12px;padding:16px 18px;box-shadow:0 1px 3px rgba(15,23,42,.05)}
.se-ph{display:flex;gap:10px;align-items:center;padding-bottom:12px;border-bottom:1px solid var(--line,#e5e7eb);margin-bottom:14px;flex-wrap:wrap}
.se-ph-ic{font-size:15px;line-height:1}
.se-ph-t{font-size:14.5px;font-weight:800;color:#1e293b}
.se-pr{display:flex;gap:10px;align-items:center;margin:0 0 12px;flex-wrap:wrap}
.se-pr-lb{font-size:12px;font-weight:700;color:#475569}
.se-pr .se-type{min-width:150px}
@media (max-width:980px){
  .se-cols{flex-direction:column}
  .se-outline{position:static;flex:none;width:100%;max-height:none}
  .se-panel{width:100%}
}
@media (max-width:880px){ .se-wrap{flex-direction:column} .se-palette{position:static;flex:none;width:100%;max-height:none} .se-palette .se-pg{display:inline-flex;margin-right:14px} }
.se-title-in{width:100%;margin-top:6px}
.se-opts{margin-top:8px}
.se-tip{margin-top:10px}
.se-samples{margin:6px 0;padding-left:18px}
.analysis-wrap{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;margin-top:10px}
.analysis-q{border:1px solid #eef2f7;border-radius:10px;padding:12px;background:#fff}
.analysis-q-title{font-weight:600;margin-bottom:6px}
.analysis-cross{margin:10px 0 4px;padding:10px;border:1px dashed #cbd5e1;border-radius:10px}
.analysis-cross label{margin-right:10px}
.cross-group{margin:10px 0}
.sortable{list-style:none;padding:0;margin:6px 0}
.sortable li{display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #e5e7eb;border-radius:8px;margin:4px 0;background:#fff}
.sm-num{width:80px}
.btn.green{background:#10b981;border-color:#10b981}
.btn.danger{color:#b91c1c}

.tpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin:14px 0}
.tpl-group{grid-column:1/-1;font-size:13px;font-weight:600;color:#6b7686;margin:10px 0 -2px;padding-left:2px;border-left:3px solid #4f7cff;padding:2px 0 2px 8px}
.tpl-link-badge{font-size:12px;margin-left:2px}
.se-linkrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tpl-card{border:1px solid var(--border,#e3e8f0);border-radius:12px;padding:14px;cursor:pointer;background:#fff;transition:.15s;display:flex;flex-direction:column;gap:6px}
.tpl-card:hover{border-color:var(--primary,#3b6ef0);box-shadow:0 4px 14px rgba(59,110,240,.12);transform:translateY(-2px)}
.tpl-ic{font-size:26px;line-height:1}
.tpl-name{font-weight:700;color:var(--text,#1f2733);font-size:14px}
.tpl-desc{font-size:12.5px;color:#6b7585;line-height:1.5;min-height:38px}
.tpl-meta{font-size:12px;color:#9aa4b2}
.tpl-divider{display:flex;align-items:center;gap:10px;color:#9aa4b2;font-size:13px;margin:6px 0}
.tpl-divider::before,.tpl-divider::after{content:'';flex:1;height:1px;background:#e3e8f0}
.tpl-upload-row{display:flex;align-items:center;gap:10px;margin:4px 0 10px;flex-wrap:wrap}
.tpl-pick{position:relative;overflow:hidden;display:inline-flex;align-items:center}
.tpl-pick input{position:absolute;inset:0;opacity:0;cursor:pointer}
.tpl-fname{font-size:13px;color:var(--muted,#8a93a3)}
.tpl-out{margin:4px 0}
.tpl-status{font-size:13.5px;padding:8px 10px;border-radius:8px;background:#f4f7fb;color:#3a4452}
.tpl-status.ok{background:#effaf1;color:#177a37}
.tpl-status.err{background:#fdf0ef;color:#c0392b}
.tpl-prev{margin:6px 0 0;padding-left:20px;font-size:13px;color:#3a4452;max-height:180px;overflow:auto}

/* ============================================================================
 * v2.69 新增：组织架构管理 / 审批流程管理（public/orgflow.js 专用）
 * ========================================================================== */
.of-tip{color:var(--muted);font-size:12px;line-height:1.75;margin:-4px 0 12px}
.of-empty{padding:26px 14px;text-align:center;color:var(--muted);font-size:13px;line-height:1.9}
.of-dept{border:1px solid var(--line);border-radius:10px;margin-bottom:12px;overflow:hidden}
.of-dept-head{display:flex;align-items:center;gap:8px;padding:10px 12px;background:var(--bg);flex-wrap:wrap}
.of-dept-name{font-weight:600;font-size:14px;color:var(--text)}
.of-badge{font-size:11px;padding:1px 8px;border-radius:999px;background:var(--line);color:var(--muted);white-space:nowrap}
.of-badge.on{background:var(--good-soft);color:var(--good)}
.of-badge.off{background:var(--danger-soft);color:var(--danger)}
.of-children{padding:4px 12px 10px 22px}
.of-child{display:flex;align-items:center;gap:8px;padding:7px 0;border-bottom:1px dashed var(--line);flex-wrap:wrap}
.of-child:last-child{border-bottom:0}
.of-owner{font-size:12px;padding:1px 8px;border-radius:999px;background:var(--primary-soft);color:var(--primary);white-space:nowrap}
.of-mem{font-size:11px;padding:1px 6px;border-radius:4px;background:var(--line);color:var(--muted);margin-right:4px;display:inline-block}
.of-actions{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
.of-flow{border:1px solid var(--line);border-radius:10px;padding:12px;margin-bottom:12px}
.of-flow-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.of-chain{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin:10px 0 0;font-size:12.5px;color:var(--text-2);line-height:2}
.of-chain b{font-weight:600;color:var(--text)}
.of-sep{color:var(--muted);padding:0 2px}
.of-meta{font-size:12px;color:var(--muted);margin-top:8px}
.of-form{display:flex;flex-direction:column;gap:10px;margin-bottom:14px}
.of-form label{display:flex;flex-direction:column;gap:4px;font-size:13px;color:var(--text-2)}
.of-form label.of-inline{flex-direction:row;align-items:center;gap:6px}
.of-hint{font-size:11.5px;color:var(--muted);line-height:1.7}
.of-pickbox{display:flex;flex-wrap:wrap;gap:4px 12px;max-height:150px;overflow:auto;border:1px solid var(--line);border-radius:8px;padding:8px;background:var(--bg)}
.of-pick{display:inline-flex;flex-direction:row;align-items:center;gap:4px;font-size:12.5px;color:var(--text-2);cursor:pointer}
.of-sub{font-weight:600;font-size:13px;color:var(--text);margin:14px 0 8px;padding-left:8px;border-left:3px solid var(--primary)}
.of-node{border:1px solid var(--line);border-radius:8px;padding:9px 10px;margin-bottom:8px;background:var(--bg)}
.of-node-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.of-node-idx{width:20px;height:20px;border-radius:50%;background:var(--line);color:var(--muted);font-size:11px;display:inline-flex;align-items:center;justify-content:center;flex:none}
.of-node-acts{margin-left:auto;display:flex;gap:4px}
.of-node-acts .btn{padding:2px 8px}
.of-node-conf{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:8px}
.of-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.of-tag{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:1px 4px 1px 8px;border-radius:999px;background:var(--primary-soft);color:var(--primary)}
.of-tag button{border:0;background:transparent;color:inherit;cursor:pointer;font-size:13px;line-height:1;padding:0 3px}
.of-nodefoot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:2px;font-size:12px}
.of-err{color:var(--danger);min-height:18px;font-size:13px;margin-top:10px}
.of-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
@media (max-width:560px){
  .of-actions{margin-left:0;width:100%}
  .of-children{padding-left:12px}
  .of-node-acts{margin-left:0;width:100%;justify-content:flex-end}
  .of-node-conf select,.of-node-conf input{width:100%!important;min-width:0!important}
  .of-form label input,.of-form label select{width:100%!important;max-width:none!important}
}

/* ==== rd-style-v271 ==== */
/* ============================================================================
 * 读书笔记 · 知识中台（v2.71，第 245 次）—— .rd-* 样式
 * 桌面基础规则 + 文末 @media(max-width:860px) 手机端适配（只加不改，绝不动桌面规则）
 * ========================================================================== */
.rd-toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:14px}
.rd-inp,.rd-sel{padding:8px 11px;border:1px solid var(--line-2);border-radius:9px;font-size:13px;font-family:inherit;color:var(--text)}
.rd-inp{flex:1 1 240px;max-width:340px}
.rd-sel{flex:0 0 auto;max-width:190px}
.rd-empty{padding:26px 16px;text-align:center;color:var(--muted);font-size:13px;line-height:1.7;border:1px dashed var(--line-2);border-radius:12px;background:#fbfcfe}
.rd-bd{font-size:11px;padding:1px 8px;border-radius:999px;white-space:nowrap;display:inline-flex;align-items:center;gap:3px}
.rd-bd-want{background:#f1f5f9;color:var(--text-2)}
.rd-bd-reading{background:var(--warn-soft);color:#b45309}
.rd-bd-read{background:var(--good-soft);color:#15803d}
.rd-bd-team{background:#ccfbf1;color:#0f766e}
.rd-bd-rec{background:#fef3c7;color:#92400e}
.rd-bd-ebook{background:#e0f2fe;color:#0369a1}
.rd-bd-paper{background:#ffedd5;color:#9a3412}
.rd-bd-ref{background:var(--primary-soft);color:var(--primary)}
.rd-bd-concept{background:#f3e8ff;color:#7c3aed}
.rd-bd-pick{background:var(--primary-soft);color:var(--primary)}
.rd-bd-think{background:#f3e8ff;color:#7c3aed}
.rd-bd-act{background:var(--good-soft);color:#15803d}
.rd-bd-check{background:#fef3c7;color:#92400e}
.rd-tag{font-size:11px;padding:1px 8px;border-radius:999px;background:#f1f5f9;color:var(--text-2);border:1px solid var(--line);white-space:nowrap}
.rd-stars{color:#f59e0b;font-size:13px;letter-spacing:1px}
.rd-x{color:inherit;text-decoration:none;font-weight:700;opacity:.65;padding:0 2px}
.rd-x:hover{opacity:1;color:var(--danger)}
.rd-av{flex:0 0 28px;width:28px;height:28px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:12.5px;font-weight:700}
/* —— 一、我的书架 —— */
.rd-bk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;margin-top:6px}
.rd-bk-card{display:flex;gap:14px;border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:13px 15px;transition:.15s;cursor:pointer}
.rd-bk-card:hover{border-color:var(--primary-2);box-shadow:0 4px 14px rgba(37,99,235,.12)}
.rd-bk-cover{flex:0 0 56px;height:112px;border-radius:6px 4px 4px 6px;display:flex;align-items:center;justify-content:center;writing-mode:vertical-rl;letter-spacing:1px;font-size:11.5px;font-weight:700;color:#fff;box-shadow:inset -6px 0 10px rgba(0,0,0,.16);overflow:hidden;white-space:nowrap}
.rd-bk-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.rd-bk-t{font-size:14.5px;font-weight:700;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rd-bk-a{font-size:12.5px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rd-bk-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.rd-bk-row:last-child{margin-top:auto}
.rd-detail-head{display:flex;gap:16px;align-items:flex-start;padding-bottom:12px;border-bottom:1px solid var(--line);margin-bottom:12px}
.rd-detail-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.rd-detail-acts{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;margin-bottom:12px}
.rd-ngrp{margin-bottom:14px}
.rd-ngrp-t{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.rd-note{border:1px solid var(--line);border-radius:11px;padding:11px 13px;margin-bottom:9px;background:#fff}
.rd-note-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.rd-note-h b{font-weight:700}
.rd-note-tm{font-size:11.5px;color:var(--muted)}
.rd-note-ops{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
.rd-note-x{margin-top:6px;font-size:13.5px;line-height:1.65;color:var(--text-2);white-space:pre-wrap;overflow-wrap:anywhere}
.rd-note-f{margin-top:8px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.rd-quote{border-left:3px solid var(--line-2);padding-left:10px;color:var(--muted);font-style:italic}
/* —— 二、团队共读 —— */
.rd-banner{border-radius:14px;padding:16px 18px;background:linear-gradient(120deg,#eff6ff,#e0f2fe);border:1px solid rgba(37,99,235,.22);display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin-bottom:12px}
.rd-banner-main{flex:1 1 320px;min-width:0}
.rd-banner-t{font-size:16px;font-weight:800}
.rd-banner-s{font-size:12.5px;color:var(--text-2);margin-top:4px;overflow-wrap:anywhere}
.rd-bstat{display:flex;gap:22px}
.rd-bstat .rd-n{font-size:19px;font-weight:800;color:var(--primary);text-align:center}
.rd-bstat .rd-t{font-size:11.5px;color:var(--muted);text-align:center}
.rd-banner-acts{flex:0 0 auto}
.rd-feed{display:flex;flex-direction:column}
.rd-fi{display:flex;gap:12px;padding:14px 0;border-bottom:1px solid var(--line)}
.rd-fi:last-child{border-bottom:none}
.rd-fi .rd-av{flex:0 0 38px;width:38px;height:38px;font-size:14px}
.rd-fi-c{flex:1;min-width:0}
.rd-fi-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.rd-fi-x{margin-top:6px;font-size:13.5px;line-height:1.65;color:var(--text-2);white-space:pre-wrap;overflow-wrap:anywhere}
.rd-fi-f{margin-top:7px;display:flex;gap:10px;font-size:12px;color:var(--muted);flex-wrap:wrap;align-items:center}
.rd-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;margin-bottom:16px}
.rd-kpi{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:#fbfcfe;text-align:center}
.rd-kpi-n{font-size:22px;font-weight:800;color:var(--primary)}
.rd-kpi-t{font-size:12px;color:var(--muted);margin-top:2px}
.rd-charts{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px}
.rd-chart-box{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff;min-width:0}
.rd-chart-t{font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:8px}
/* —— 三、概念地图 —— */
.rd-cm-wrap{display:grid;grid-template-columns:238px 1fr;gap:16px}
.rd-cm-wrap>div{min-width:0}
.rd-tree{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fbfcfe;align-self:start}
.rd-tn{border-radius:9px;padding:8px 10px;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:7px;margin-bottom:5px}
.rd-tn:hover{background:var(--primary-soft)}
.rd-tn.on{background:var(--primary-soft);color:var(--primary);font-weight:600}
.rd-tn-root{font-weight:700;background:#f1f5f9}
.rd-tn.l2{margin-left:18px;font-size:12.5px;color:var(--text-2)}
.rd-tn i{font-style:normal;margin-left:auto;font-size:11.5px;color:var(--muted)}
.rd-mapbox{border:1px solid var(--line);border-radius:12px;background:#fff;padding:8px;overflow:hidden}
.rd-legend{display:flex;gap:16px;font-size:11.5px;color:var(--muted);padding:4px 8px 8px;flex-wrap:wrap}
.rd-legend b{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:5px;vertical-align:-1px}
.rd-cm-node:hover circle{filter:brightness(.95)}
.rd-cm-node.on circle{stroke:#2563eb;stroke-width:2.4}
.rd-grp-t{font-size:12.5px;font-weight:700;color:var(--muted);margin:16px 0 8px;display:flex;align-items:center;gap:8px}
.rd-tc-box{max-height:46vh;overflow-y:auto;border:1px solid var(--border);border-radius:10px;padding:8px;margin-bottom:12px}
.rd-tc-chk{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:8px;cursor:pointer;font-size:13px}
.rd-tc-chk:hover{background:var(--primary-soft)}
.rd-tc-chk input[type=checkbox]{width:auto;height:auto;margin:0}
.rd-tc-n{flex:1;min-width:0;overflow-wrap:anywhere}
.rd-tc-chk i{font-style:normal;font-size:11.5px;color:var(--muted);white-space:nowrap}
.rd-cp-new{display:flex;gap:6px;align-items:center;margin-top:8px;padding-top:8px;border-top:1px dashed var(--border)}
.rd-cp-new input{flex:1;min-width:0;font-size:12.5px}
.rd-in-card{margin-bottom:12px}
.rd-in-card h3{font-size:13px;font-weight:600;margin:0 0 10px;display:flex;align-items:center;gap:10px}
.rd-in-conf{font-size:11.5px;padding:2px 8px;border-radius:999px;font-weight:500}
.rd-in-conf.ok{background:#e7f6ec;color:#1a7f43}
.rd-in-conf.mid{background:#fdf3e0;color:#9a6512}
.rd-in-conf.low{background:#fdecec;color:#b9352f}
.rd-in-sum{font-size:13.5px;line-height:1.75;color:var(--text-1);background:var(--primary-soft);border-radius:9px;padding:10px 12px}
.rd-in-gap{margin-top:10px;display:flex;flex-direction:column;gap:7px}
.rd-in-gap-i{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12.5px;color:var(--text-2)}
.rd-in-gap-i b{color:var(--text-1)}
.rd-in-ok{margin-top:10px;font-size:12.5px;color:#1a7f43}
.rd-in-row{margin-bottom:11px}
.rd-in-row-h{display:flex;align-items:baseline;gap:8px;font-size:13px;margin-bottom:4px}
.rd-in-row-h b{font-weight:600}
.rd-in-n{font-size:11.5px;color:var(--muted)}
.rd-in-bar{display:block;height:7px;background:var(--bg-3,#eef2f7);border-radius:999px;overflow:hidden}
.rd-in-bar i{display:block;height:100%;background:var(--primary);border-radius:999px;opacity:.75}
.rd-in-rel{font-size:11.5px;color:var(--muted);margin-top:4px;line-height:1.7}
.rd-in-chip{display:inline-block;font-size:11.5px;background:var(--bg-3,#eef2f7);border-radius:6px;padding:1px 7px;margin:2px 4px 0 0;color:var(--text-2)}
.rd-in-sub{font-size:12px;color:var(--muted);margin:10px 0 4px}
.rd-in-pvbox{background:var(--bg-3,#eef2f7);border-radius:9px;padding:10px 12px;font-size:13px;line-height:1.8;max-height:46vh;overflow-y:auto}
.rd-in-pv{margin-top:6px}
.rd-bk-card{position:relative}
.rd-bk-look{position:absolute;top:6px;right:6px;z-index:2;font-size:10.5px;padding:2px 7px;border:1px solid var(--border);border-radius:999px;background:#fff;color:var(--text-2);cursor:pointer}
.rd-bk-look:hover{background:var(--primary-soft);color:var(--primary)}
/* —— 四、全局检索 / 跨模块引用 —— */
.rd-sr-box{display:flex;gap:10px;align-items:center}
.rd-sr-input{flex:1;padding:12px 14px;border:1px solid var(--line-2);border-radius:10px;font-size:14px;font-family:inherit;color:var(--text);min-width:0}
.rd-chips{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
.rd-chip{font-size:12px;padding:4px 12px;border-radius:999px;background:#f1f5f9;border:1px solid var(--line);color:var(--text-2);cursor:pointer}
.rd-chip.on{background:var(--primary-soft);border-color:rgba(37,99,235,.3);color:var(--primary);font-weight:600}
.rd-res{border:1px solid var(--line);border-radius:11px;padding:11px 13px;margin-bottom:9px;background:#fff}
.rd-res-t{font-size:13.5px;font-weight:700;margin-bottom:4px;overflow-wrap:anywhere}
.rd-res-x{font-size:12.5px;color:var(--text-2);line-height:1.6;overflow-wrap:anywhere}
.rd-res-f{margin-top:7px;display:flex;gap:10px;flex-wrap:wrap;font-size:11.5px;color:var(--muted);align-items:center}
.rd-res mark,.rd-tbl mark{background:#ffe58f;color:#1f2328;border-radius:2px;padding:0 2px}
.rd-tbl-wrap{overflow-x:auto}
.rd-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.rd-tbl th,.rd-tbl td{padding:9px 10px;border-bottom:1px solid var(--line);text-align:left}
.rd-tbl th{color:var(--muted);font-weight:600;font-size:12px;white-space:nowrap}
.rd-tbl td{overflow-wrap:anywhere}
/* —— 表单 —— */
.rd-form label{display:block;font-size:13px;color:var(--text-2);margin-bottom:10px}
.rd-form label input,.rd-form label select,.rd-form label textarea{width:100%;margin-top:4px;padding:8px 10px;border:1px solid var(--line-2);border-radius:9px;font-size:13px;font-family:inherit;color:var(--text);box-sizing:border-box}
.rd-form label textarea{resize:vertical;line-height:1.6}
.rd-f2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.rd-chk{display:flex!important;align-items:center;gap:8px}
.rd-chk input{width:auto!important;margin:0!important}
.rd-err{color:var(--danger);min-height:18px;font-size:13px;margin-bottom:6px}
.rd-form-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
.rd-cp-wrap{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:10px;background:#fbfcfe}
.rd-cp-t{font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:8px}
.rd-cp-grp{margin-bottom:10px}
.rd-cp-g1{font-size:12.5px;font-weight:700;color:var(--text-2);margin-bottom:5px}
.rd-cp-kids{display:flex;gap:8px;flex-wrap:wrap}
.rd-cp-chk{display:inline-flex!important;align-items:center;gap:5px;font-size:12.5px;margin:0!important;background:#fff;border:1px solid var(--line);border-radius:999px;padding:3px 10px}
.rd-cp-chk input{width:auto!important;margin:0!important}
.rd-cp-item{border:1px solid var(--line);border-radius:11px;padding:11px 13px;margin-bottom:9px;background:#fff}
.rd-cp-i1{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13.5px}
.rd-cp-ops{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
.rd-cp-k2{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.rd-cp-chip{font-size:12px;padding:2px 10px;border-radius:999px;background:#f1f5f9;border:1px solid var(--line);color:var(--text-2)}
.rd-pick{display:flex;flex-direction:column;gap:8px;max-height:340px;overflow:auto}
.rd-pick-i{text-align:left!important;justify-content:flex-start}
/* —— v3.05：成员管理文字显示修复 ——
   根因1：全局 input,select,textarea{width:100%}(L475) 把 .role-select 撑成窄列 100% 宽，
   「管理员」被压成「管理/员」两行 → 显式 width:auto + min-width 还原内容宽度（同 v1.86 复选框修法）。
   根因2：可见模块标签云占满行宽后，角色/操作列被挤到最小 → 按钮与下拉无 nowrap 文字竖排。
   根因3：.mod-tag 无 nowrap，长标签内部断行（「工作量比对看/板」）。 */
.role-select { width:auto; min-width:92px; }
.row-actions { flex-wrap:nowrap; }
.row-actions .btn { white-space:nowrap; flex:0 0 auto; }
.mod-tag, .custom-dot { white-space:nowrap; max-width:100%; overflow:hidden; text-overflow:ellipsis; }
.mod-meta { white-space:nowrap; }
@media (min-width:861px){
  #users-list .table-wrap table { min-width:880px; }  /* 桌面端成员表最小宽度，列不再被标签云挤瘪；.table-wrap 自带横向滚动兜底 */
  #users-list th { white-space:nowrap; }
}
@media (max-width:860px){
  .table-wrap .row-actions { flex-wrap:wrap; }        /* 手机端卡片式布局仍允许操作按钮换行 */
  .table-wrap .row-actions .btn { white-space:nowrap; }
}
/* —— 成员管理：读书笔记能力位（v2.71） —— */
.ms-cap{display:flex;align-items:center;gap:8px;margin:10px 0 4px;padding:9px 12px;border:1px solid var(--line);border-radius:10px;background:#fbfcfe;font-size:13px}
.ms-cap input{width:auto!important;margin:0!important}
@media (max-width:860px){
  .rd-toolbar .rd-inp{max-width:none;flex:1 1 100%}
  .rd-sel{max-width:none;flex:1 1 46%}
  .rd-bk-grid{grid-template-columns:1fr}
  .rd-cm-wrap{grid-template-columns:1fr}
  .rd-detail-head{flex-direction:column;align-items:stretch}
  .rd-detail-head .rd-bk-cover{height:96px}
  .rd-detail-acts .btn{flex:1 1 auto}
  .rd-banner{flex-direction:column;align-items:stretch}
  .rd-bstat{justify-content:space-around;gap:10px}
  .rd-banner-acts .btn{width:100%}
  .rd-f2{grid-template-columns:1fr}
  .rd-charts{grid-template-columns:1fr}
  .rd-sr-box{flex-wrap:wrap}
  .rd-sr-input{flex:1 1 100%}
  .rd-note-ops,.rd-cp-ops{margin-left:0;width:100%;justify-content:flex-end}
  .rd-kpis{grid-template-columns:repeat(3,1fr)}
}

/* ==== rd-style-v271-fix1 ==== */
/* v2.71 修正：全局 `input,select,textarea{width:100%}` 会让 .rd-sel 在页头 .h2-actions 里撑满整行，
   把同一行的按钮挤到卡片外（桌面 1500 实测「团队共读 → 共读打卡流」溢出 13px）。
   ① .rd-sel 明确 width:auto（工具条里靠 flex 控制宽度，不受影响）；
   ② 本模块四页的卡片 h2 允许换行，窄桌面也不会挤爆 —— 只在 #tab-book* 作用域内，不动其它模块。 */
.rd-sel{width:auto}
#tab-book .card>h2,#tab-bookteam .card>h2,#tab-bookmap .card>h2,#tab-booksr .card>h2{flex-wrap:wrap;row-gap:8px}
#tab-book .h2-actions,#tab-bookteam .h2-actions,#tab-bookmap .h2-actions,#tab-booksr .h2-actions{flex-wrap:wrap;row-gap:8px;max-width:100%}

/* ==== rd-style-v271-fix2 ==== */
/* v2.71 手机端修正：概念地图 SVG 是按 660x440 viewBox + width:100% 等比缩放的，
   390 宽视口下只剩 358px 宽 → 字号缩到 6.5px 读不清。改成「框内横向滚动 + SVG 保底 560px」，
   文字恢复可读；滚动发生在 .rd-mapbox 自己的容器里，不会引起页面级横向溢出。
   严格写在 @media(max-width:860px) 内，桌面端不匹配。 */
@media (max-width:860px){
  #tab-bookmap .rd-mapbox{overflow-x:auto;-webkit-overflow-scrolling:touch}
  #tab-bookmap .rd-mapbox svg{min-width:560px}
}

/* ================= v2.79 专家邀约 · 课程表安排 ================= */
/* 课表 9 列，xwide(900px) 会把「课酬 / 学员问卷」两列压出视野 ⇒ 用专用变体 schedwide。
   ⚠️ 不用 :has() 兜底（无 :has() 的浏览器会走 @supports 回退把**所有** xwide 弹窗一起撑宽，
   波及专家库 / 每日事项等既有弹窗）；改为 openModal 传自定义 variant，作用域精确。
   v2.80 尺寸/形态优化（用户：「弹窗太小了，不利于查看和操作」）：
   · 尺寸：1280×78vh → **视口宽 − 边距**（min(1840px,97vw)）× **94vh**，另给 ⤢ 全屏（可选 100vw×100vh）。
   · 形态：box 自身**不再滚动**（padding:0 + overflow:hidden + flex 列布局），
     头部 / 说明条 / 课酬联动条 / 底部统计**固定**，**只有课表区与右侧抽屉内部滚动**。 */
.modal.schedwide .box{ width:min(1840px,97vw); max-width:97vw; height:94vh; max-height:94vh;
  padding:0; overflow:hidden; display:flex; flex-direction:column; }
.modal.schedwide.full .box{ width:100vw; max-width:100vw; height:100vh; max-height:100vh;
  border-radius:0; border-color:transparent; }
.sc-wrap{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;position:relative}
/* 🔴 抽屉进**正常文档流**做两栏（而非 absolute 覆盖）：
   absolute 覆盖会遮住课表右侧列，且表格 min-width:1120px 不会因父级留白而变窄 ⇒ 必然压到抽屉底下。
   两栏 flex 里，抽屉是同级元素，课表容器宽度 = 弹窗宽 − 抽屉宽，表格 min-width 到 1120 才滚动，
   列不丢、功能不减。 */
.sc-pane-row{display:flex;gap:0;align-items:stretch;min-height:0;flex:1 1 auto}
.sc-pane-row > .sc-bd{flex:1 1 auto;min-width:0}
.sc-pane-row > .sc-drawer{flex:0 0 420px;min-width:0;align-self:stretch}
@media (max-width:760px){
  .sc-pane-row{flex-direction:column}
  .sc-pane-row > .sc-drawer{flex:0 0 auto;width:auto;max-height:62%}
  /* 手机上抽屉在**竖直方向**排列 ⇒ flex-basis 会变成"高度"，必须覆盖掉桌面端的 420px */
  #schedPickPane{flex:0 0 auto;max-height:62%}
}
.sc-hd{display:flex;align-items:center;gap:12px;padding:14px 18px 12px;border-bottom:1px solid var(--line);
  background:linear-gradient(180deg,#f8fafc,#fff);flex-wrap:wrap;flex:0 0 auto}
.sc-hd-t{flex:1 1 320px;min-width:0}
/* 注意：全局有 `.modal .box h3{margin-bottom:12px;font-size:16px}`（0,2,1）比 `.sc-hd h3`（0,1,1）更具体，
   所以这里必须用同等/更高具体度写，否则标题会被全局规则顶回 16px + 下间距 12px。 */
.modal.schedwide .sc-hd h3{margin:0;font-size:17px;font-weight:800;line-height:1.35}
.sc-hd .sub{font-size:12.5px;color:var(--muted);margin-top:3px}
/* 🔴 v2.80b 修：原为 `flex:0 0 auto`（不可收缩）⇒ 窄屏（≤~570px）时按钮行宽 559 撑破头部，
   连带 .sc-wrap/.sc-hd 出现整页横向滚动条。改为可收缩 + 允许内部换行（本行已有 flex-wrap:wrap），
   按钮文字自身不折行（white-space:nowrap），于是窄屏只是把按钮排成多行，不再横向溢出。 */
.sc-hd-acts{flex:0 1 auto;min-width:0;display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  justify-content:flex-end;margin-left:auto}
.sc-hd-acts .btn{white-space:nowrap}
.sc-hd .sp{margin-left:auto}
.sc-bar{padding:9px 18px;border-bottom:1px solid var(--line);background:#fff;font-size:12.5px;
  color:var(--text-2);flex:0 0 auto}
/* 课表区容器**自身不滚动**，滚动交给内层 .sc-tblwrap —— sticky 只对最近的滚动容器生效，
   原来滚动发生在 .sc-bd、而 .sc-tblwrap 高度=内容高度 ⇒ 表头 position:sticky 形同虚设。 */
.sc-bd{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:14px 18px}
#sc-feebar-host{flex:0 0 auto}
.sc-ft{padding:11px 18px;border-top:1px solid var(--line);background:#f8fafc;display:flex;
  align-items:center;gap:10px;flex-wrap:wrap;flex:0 0 auto}
.sc-ft .sp{margin-left:auto}
.sc-sum{display:flex;gap:14px;align-items:center;font-size:12.5px;color:var(--muted);flex-wrap:wrap}
.sc-sum b{color:var(--text)}
.sc-feebar{display:flex;align-items:center;gap:12px;padding:10px 14px;margin:12px 18px 0;border-radius:11px;
  border:1px solid var(--line);background:#f8fafc;flex-wrap:wrap;font-size:12.5px}
.sc-feebar.warn{background:linear-gradient(90deg,#fffbeb,#fff);border-color:#fde68a}
.sc-feebar.ok{background:linear-gradient(90deg,#f0fdf4,#fff);border-color:#bbf7d0}
.sc-feebar .sc-t{font-weight:800;white-space:nowrap}
.sc-feebar .sc-v{color:var(--text-2)}
.sc-feebar .sc-v b{color:var(--text);font-family:Consolas,monospace}
.sc-feebar .sp{margin-left:auto}
.sc-feebar .sc-sync{color:var(--muted);font-size:11.5px}
.sc-delta{margin-left:8px;padding:2px 9px;border-radius:20px;font-size:11.5px;font-weight:700;white-space:nowrap}
.sc-delta.over{background:var(--warn-soft);color:#b45309}
.sc-delta.under{background:var(--primary-soft);color:#1e40af}
.sc-delta.ok{background:var(--good-soft);color:var(--good)}
.sc-tblwrap{border:1px solid var(--line);border-radius:12px;overflow:auto;
  flex:1 1 auto;min-height:0;background:#fff}
.sc-tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:12.5px;min-width:1180px}
.sc-tbl th{background:#eef2f7;border-right:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:9px 8px;font-size:12px;font-weight:700;color:var(--text-2);text-align:left;white-space:nowrap;position:sticky;top:0;z-index:5}
.sc-tbl td{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:6px;vertical-align:top}
.sc-tbl tr:hover td{background:#f7fbff}
.sc-date{background:#f8fafc;text-align:center;font-weight:700;position:sticky;left:0;z-index:3;vertical-align:middle;min-width:86px}
.sc-date b{display:block;font-size:15px;color:var(--primary);line-height:1.25}
.sc-date span{font-size:11.5px;color:var(--muted);font-weight:600}
.sc-slot{text-align:center;vertical-align:middle!important;background:#fbfdff}
.sc-slot span{display:inline-block;padding:3px 8px;border-radius:20px;font-size:11.5px;font-weight:700}
.sc-slot .am{background:#fef3c7;color:#b45309}
.sc-slot .pm{background:#e0e7ff;color:#4338ca}
.sc-slot .nt{background:#f1f5f9;color:var(--muted)}
/* 输入框**常显浅边框**：原来 border 是 transparent、只在 hover 才显形 ⇒
   整张表看着像只读文本，用户看不出"哪里能填"（本次报障「不利于操作」的直接原因之一）。 */
.sc-in{width:100%;border:1px solid #e6ebf3;background:#fff;padding:6px 7px;border-radius:7px;
  font-size:12.5px;font-family:inherit;color:var(--text);resize:none;line-height:1.5;display:block}
.sc-in::placeholder{color:#b9c4d4}
.sc-in.sm{margin-top:4px;font-size:11.5px;padding:4px 6px}
.sc-in:hover{border-color:var(--primary-2)}
.sc-in:focus{outline:0;border-color:var(--primary);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
.sc-in.num{text-align:right;font-family:Consolas,monospace;font-weight:700}
.sc-sel{width:100%;margin-top:4px;border:1px solid #e6ebf3;background:#fff;padding:5px 7px;border-radius:7px;
  font-size:11.5px;font-family:inherit;color:var(--text-2)}
.sc-sel:hover{border-color:var(--primary-2)}
.sc-sel:focus{outline:0;border-color:var(--primary);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
.sc-exp{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.sc-exp .nm{font-weight:700}
.sc-pick{border:1px dashed rgba(37,99,235,.45);background:var(--primary-soft);color:var(--primary);
  border-radius:6px;padding:1px 7px;font-size:11px;cursor:pointer;white-space:nowrap}
.sc-pick:hover{background:#dbeafe}
.sc-ph{color:#cbd5e1}
.sc-del{border:0;background:none;color:var(--muted);cursor:pointer;font-size:14px;padding:3px 6px;border-radius:5px}
.sc-del:hover{background:var(--danger-soft);color:var(--danger)}
.sc-q{display:inline-block;padding:2px 8px;border-radius:20px;font-size:11px;font-weight:700;cursor:pointer;white-space:nowrap}
.sc-q.made{background:var(--primary-soft);color:var(--primary);border:1px solid rgba(37,99,235,.28)}
.sc-q.made:hover{background:#dbeafe}
.sc-q.none{background:#f1f5f9;color:#94a3b8;cursor:default}
.sc-q.busy{opacity:.55;cursor:progress}
.sc-q-wrap{display:block;padding-top:5px}
.sc-empty{padding:26px 12px;text-align:center;color:var(--muted);font-size:13px;background:#fafbfc;
  border:1px dashed var(--line-2);border-radius:12px}
.sc-epitem:hover{border-color:var(--primary-2);background:var(--primary-soft)}
.sc-em b{font-size:13.5px}
.sc-em small{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sc-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.sc-form-f{margin-bottom:10px}
.sc-form-f label{display:block;font-size:12px;color:var(--text-2);font-weight:700;margin-bottom:4px}
.sc-form-f .pf-input{width:100%}
.sc-svhd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.sc-svhd b{font-size:15px;color:var(--good)}
.sc-url{font-family:Consolas,monospace;font-size:13px;background:#f8fafc;border:1px solid var(--line-2);
  border-radius:8px;padding:10px 12px;color:var(--primary);word-break:break-all;margin-bottom:10px}
.sc-meta{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin-bottom:12px}
.sc-meta b.ok{color:var(--good)}
.sc-acts{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.sc-note{background:var(--warn-soft);border:1px solid #fde68a;border-radius:9px;padding:9px 11px;
  font-size:12px;color:#92400e;line-height:1.6}
@media (max-width:860px){
  /* 手机端直接铺满全屏：屏幕本来就小，再留边距只会更难操作 */
  .modal.schedwide .box{ width:100vw; max-width:100vw; height:100vh; max-height:100vh;
    border-radius:0; border-color:transparent }
  .sc-form-grid{grid-template-columns:1fr}
  .sc-hd{padding:11px 12px}
  .modal.schedwide .sc-hd h3{font-size:15px}
  .sc-hd-acts{gap:5px}
  .sc-hd-acts .btn{padding:5px 8px;font-size:11.5px}
  .sc-bar{padding:8px 12px;font-size:12px}
  .sc-bd{padding:10px 12px}
  .sc-ft{padding:9px 12px}
  .sc-feebar{margin:10px 12px 0}
}

/* ===== v2.79 修正：选专家 / 手动新增 —— 内嵌面板（不再是嵌套弹窗） ===== */
/* 🔴 抽屉挂在 `#schedPickPane` 里（它是 .sc-pane-row 的**直接子元素**，.sc-drawer 是孙元素），
   所以宽度必须写在 pane 上；同时让 pane 成为 flex 容器，抽屉才能撑满高度并内部滚动。 */
#schedPickPane{position:static;flex:0 0 420px;min-width:0;min-height:0;display:flex;align-items:stretch}
#schedPickPane:empty{display:none}
#schedPickPane > .sc-drawer{flex:1 1 auto;min-width:0}
/* 🔴 面板必须**绝对定位浮在课表之上**，不能进正常文档流 ——
   否则它会把课表主体挤到只剩一行（第一版就踩了这个：面板一开课表几乎看不见）。
   配套：.sc-wrap 需 position:relative 作为定位上下文。 */
/* 🔴 面板做成**右侧抽屉**，而不是盖住课表的浮层。
   原因：全宽浮层会**挡住课表各行的放大镜按钮**（真机上点不到、playwright 直接报
   "intercepts pointer events"），用户想换一个课节的专家却必须先关面板。
   抽屉让「课表（左） + 选专家（右）」同屏并存，符合"边看课表边挑人"的使用意图。 */
.sc-drawer{border-left:1px solid var(--primary-2);background:#fff;
  padding:14px 16px 16px;overflow:auto;animation:scPickIn .14s ease-out}
@keyframes scPickIn{from{opacity:0;transform:translateX(14px)}to{opacity:1;transform:none}}
.sc-pick-hd{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.sc-pick-t{font-size:14.5px;font-weight:800;color:var(--text)}
.sc-pick-hd .muted{font-size:12px;font-weight:600}
.sc-pick-x{margin-left:auto;border:1px solid var(--line);background:#fff;color:var(--muted);
  width:26px;height:26px;border-radius:7px;font-size:16px;line-height:1;cursor:pointer;flex:0 0 auto}
.sc-pick-x:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-soft)}
.sc-pick-tip{background:var(--primary-soft);border:1px solid rgba(37,99,235,.2);border-radius:9px;
  padding:8px 11px;font-size:12px;color:#1e40af;line-height:1.6;margin-bottom:10px}
.sc-pick-tip b{font-weight:800}
.sc-pick-tip.warn{background:var(--warn-soft);border-color:#fde68a;color:#92400e}
.sc-pick-tools{display:flex;gap:10px;align-items:center;margin-bottom:9px;flex-wrap:wrap}
.sc-pick-q{flex:1 1 240px;min-width:180px}
.sc-pick-tabs{display:flex;gap:5px;flex:0 0 auto}
.sc-pick-tab{border:1px solid var(--line);background:#fff;color:var(--text-2);border-radius:8px;
  padding:5px 11px;font-size:12px;font-weight:700;cursor:pointer;white-space:nowrap}
.sc-pick-tab:hover{border-color:var(--primary-2);color:var(--primary)}
.sc-pick-tab.on{background:var(--primary);border-color:var(--primary);color:#fff}
.sc-pick-empty{padding:20px 12px;text-align:center;color:var(--muted);font-size:12.5px;
  background:#fafbfc;border:1px dashed var(--line-2);border-radius:10px}
.sc-pick-hidden{margin-top:7px;font-size:11.5px;color:var(--muted);text-align:center}
.sc-pick-or{display:flex;align-items:center;gap:10px;margin:11px 0 9px;color:var(--muted);font-size:12px}
.sc-pick-or::before,.sc-pick-or::after{content:"";flex:1 1 auto;height:1px;background:var(--line)}
.sc-pick-add{width:100%;padding:9px}
.sc-pick-acts{display:flex;gap:9px;align-items:center;margin-top:12px;padding-top:11px;
  border-top:1px dashed var(--line);flex-wrap:wrap}
.sc-pick-acts .sp{margin-left:auto}
.sc-pick-cur{font-size:12px;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sc-pick-cur b{color:var(--text);font-weight:800}
.sc-pick-chk{display:flex;gap:9px;align-items:flex-start;border:1px solid #bbf7d0;border-radius:10px;
  padding:9px 11px;font-size:12.5px;background:#f0fdf4;color:#166534;line-height:1.6;cursor:pointer;flex-wrap:wrap}
/* 🔴 v2.80b 修：`.modal .box label` 全局有 `overflow-wrap:anywhere;word-break:break-word`，
   会把 flex 子项的 min-content 宽度压到 1 个字符；再叠加 flex 默认 nowrap，<span> 被缩到 1 字宽、
   逐字换行 ⇒ 整段文字竖排。给 span 设 min-width:0（解除 1 字约束）+ flex:1 1 auto（占满剩余宽度正常折行）。 */
.sc-pick-chk > span{flex:1 1 auto;min-width:0}
.sc-pick-chk input{margin-top:2px;flex:0 0 auto}
.sc-pick-chk b{font-weight:800}
/* 专家条目：网格排布，姓名/单位/电话三列对齐，不再靠 flex 挤压 */
.sc-eplist{display:flex;flex-direction:column;gap:6px;max-height:264px;overflow:auto;padding-right:2px}
.sc-epitem{display:grid;grid-template-columns:18px 32px minmax(0,1fr) auto;align-items:center;gap:10px;
  border:1px solid var(--line);border-radius:10px;padding:8px 12px;cursor:pointer;background:#fff}
.sc-epitem:hover{border-color:var(--primary-2);background:var(--primary-soft)}
.sc-epitem:has(input:checked){border-color:var(--primary);background:var(--primary-soft);
  box-shadow:0 0 0 2px rgba(37,99,235,.12)}
.sc-epitem input[type=radio]{margin:0;width:15px;height:15px;cursor:pointer;accent-color:var(--primary)}
.sc-epitem.used{background:#f8fafc}
.sc-eav{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#2563eb,#0ea5e9);
  color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px;flex:0 0 auto}
.sc-em{min-width:0;display:flex;flex-direction:column;gap:1px}
.sc-em b{font-size:13.5px;font-weight:700;display:flex;align-items:center;gap:6px;min-width:0}
.sc-em small{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sc-used{font-size:10.5px;font-weight:700;color:var(--good);background:var(--good-soft);
  border-radius:20px;padding:1px 6px;white-space:nowrap;flex:0 0 auto}
.sc-eph{font-size:11.5px;color:var(--primary);font-family:var(--mono,Consolas,monospace);
  white-space:nowrap;text-align:right;flex:0 0 auto}
.sc-eph .sc-ph{color:var(--muted);font-family:inherit}
.sc-form-f label .muted{font-weight:600;font-size:11.5px}
.sc-form-f .req{color:var(--danger)}
/* 问卷链接窗：标题与元信息分行，链接与按钮更清晰 */
.sc-svwin{padding:22px 24px;min-height:0;overflow:auto}   /* 🔴 v2.82：组件自带内边距，不再依赖宿主 .box 的 padding（曾经只有 2px ⇒ 整块贴边被圆角裁切） */
.sc-svhd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px;
  padding-bottom:9px;border-bottom:1px dashed var(--line)}
.sc-svhd b{font-size:15.5px;color:var(--good);font-weight:800}
.sc-svhd .muted{font-size:12px}
.sc-url{font-family:var(--mono,Consolas,monospace);font-size:13.5px;background:#f0fdf4;
  border:1px solid #bbf7d0;border-radius:9px;padding:11px 13px;color:#047857;
  word-break:break-all;margin-bottom:11px;font-weight:600;
  width:fit-content;max-width:100%}   /* v2.82：短链接不再被拉成满宽空荡长条 */
.sc-meta{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--muted);
  margin-bottom:12px;padding:9px 11px;background:#f8fafc;border-radius:9px}
.sc-meta b.ok{color:var(--good);font-weight:800}
.sc-acts{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.sc-note{background:var(--warn-soft);border:1px solid #fde68a;border-radius:9px;
  padding:10px 12px;font-size:12px;color:#92400e;line-height:1.7}
/* ===== v2.82：杜绝「弹窗内容贴边 / 被圆角裁切」 ===== */
/* 背景：`.modal.wide / .sfill / .schedwide` 的 .box 一律 `padding:0` —— 这套零内边距是给
   「自带头/体/脚分区内边距」的骨架准备的（.wb-* 工作台 / .stw-* 项目环节 / .sc-wrap 课表 / .sf-head 问卷填写）。
   2026-10-09 报障：问卷链接窗借用了 'wide'，而它是「裸内容」（根节点 .sc-svwin），于是整块内容距 .box 边缘只有 3px，
   又叠上 `.box{border-radius:16px;overflow:hidden}` ⇒ 被圆角裁掉，看着像「溢出到卡片外面」。 */
/* ① 问卷链接窗独立变体：宽度收敛，内容自带内边距（见上方 .sc-svwin） */
.modal.svlink .box{width:860px;max-width:94vw;padding:0;overflow:hidden;display:flex;flex-direction:column;max-height:90vh}
/* ② 🔴 通用兜底：以后任何人再往这三个零内边距变体里塞「裸内容」，自动补标准内边距 + 允许自身滚动。
   命中骨架（上面四个类）的既有弹窗完全不受影响 —— 这是「杜绝再发生」的机制，而不是只修一处。 */
.modal.wide .box:not(:has(> .wb-head)):not(:has(> .stw-head)),
.modal.sfill .box:not(:has(> .sf-head)),
.modal.schedwide .box:not(:has(> .sc-wrap)){padding:20px 24px;overflow:auto}
/* ③ 窄屏：内边距收紧，别把本就小的屏再吃掉一圈 */
@media (max-width:760px){
  .sc-svwin{padding:16px}
  .modal.wide .box:not(:has(> .wb-head)):not(:has(> .stw-head)),
  .modal.sfill .box:not(:has(> .sf-head)),
  .modal.schedwide .box:not(:has(> .sc-wrap)){padding:16px}
}
@media (max-width:760px){
  .sc-epitem{grid-template-columns:18px 28px minmax(0,1fr);gap:8px}
  .sc-eph{display:none}
  .sc-pick-acts .sp{margin-left:0;width:100%;height:0}
  /* 手机端抽屉改横向占满，放到课表下方 */
  #schedPickPane{flex:0 0 auto;max-height:56%;min-height:0}
  #schedPickPane > .sc-drawer{border-left:0;border-top:1px solid var(--primary-2);max-height:100%}
  @keyframes scPickIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
}

/* ===== 问卷 · 图片题 / 图片分享（v2.86） ===== */
.sf-img{ margin-top:6px; display:flex; flex-wrap:wrap; align-items:center; gap:10px; }
.sf-img .sf-img-pick, .sf-img .btn-up{ border:1.5px solid var(--line,#e5e9ef); background:#fff; color:var(--primary,#2f7fe5); border-radius:10px; padding:8px 14px; font-size:13.5px; cursor:pointer; transition:all .15s; }
.sf-img .sf-img-pick:hover, .sf-img .btn-up:hover{ border-color:var(--primary,#2f7fe5); background:var(--primary-soft,#eaf2ff); }
.sf-img .sf-img-hint, .qimg-hint{ font-size:12px; color:var(--muted,#6b7280); }
.sf-img-prev, .sh-img-prev{ display:flex; flex-wrap:wrap; gap:8px; width:100%; margin-top:4px; }
.sf-img-prev img, .sh-img-prev img{ width:88px; height:88px; object-fit:cover; border-radius:10px; border:1px solid var(--line,#e5e9ef); box-shadow:0 2px 8px rgba(31,41,55,.08); }
/* 分析页图片画廊 */
.se-img-gallery{ display:flex; flex-wrap:wrap; gap:10px; margin-top:8px; }
.se-img-gallery a{ display:block; }
.se-img-gallery img{ width:120px; height:120px; object-fit:cover; border-radius:12px; border:1px solid var(--line,#e5e9ef); transition:transform .15s; }
.se-img-gallery img:hover{ transform:scale(1.04); }
/* 分享链接行 */
.sh-link-row{ display:flex; gap:8px; align-items:center; }
.sh-link-row .pf-input{ flex:1 1 auto; }

/* ===== 问卷 · 文件上传 / 签名 / 多级下拉（v2.90） ===== */
/* 文件上传题 */
.sf-file{ margin-top:6px; display:flex; flex-wrap:wrap; align-items:center; gap:10px; }
.sf-file .sf-file-pick{ border:1.5px solid var(--line,#e5e9ef); background:#fff; color:var(--primary,#2f7fe5); border-radius:10px; padding:8px 14px; font-size:13.5px; cursor:pointer; transition:all .15s; }
.sf-file .sf-file-pick:hover{ border-color:var(--primary,#2f7fe5); background:var(--primary-soft,#eaf2ff); }
.sf-file .sf-file-hint{ font-size:12px; color:var(--muted,#6b7280); }
.sf-file-list{ width:100%; display:flex; flex-direction:column; gap:6px; margin-top:4px; }
.sf-file-list.ana{ flex-direction:row; flex-wrap:wrap; }
.sf-file-item{ display:inline-flex; align-items:center; gap:8px; max-width:100%; padding:6px 10px; background:#f6f8fb; border:1px solid var(--line,#e5e9ef); border-radius:9px; }
.sf-file-item a{ color:var(--primary,#2f7fe5); font-size:13px; text-decoration:none; max-width:340px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sf-file-item a:hover{ text-decoration:underline; }
.sf-file-item .sf-file-del{ flex:0 0 auto; border:0; background:transparent; color:#b91c1c; cursor:pointer; font-size:13px; padding:0 2px; line-height:1; }
/* 签名题 */
.sf-sign{ margin-top:6px; }
.sf-sign .sf-sign-cv{ display:block; width:100%; max-width:520px; height:auto; background:#fff; border:1.5px dashed #c8d2e0; border-radius:12px; touch-action:none; cursor:crosshair; }
.sf-sign-bar{ display:flex; align-items:center; gap:12px; margin-top:6px; flex-wrap:wrap; }
.sf-sign-state{ font-size:12px; }
/* 多级下拉 */
.sf-cascade{ margin-top:6px; display:flex; gap:10px; flex-wrap:wrap; }
.sf-cascade select{ flex:1 1 200px; min-width:160px; }
/* 地图题（v2.91）：容器样式；选择器自身的 .gp-* 样式由 geo-picker.js 注入（与公开填写页共用一份） */
.sf-map{ margin-top:6px; }
.sf-map-canvas{ min-height:120px; }
.se-map-level{ max-width:340px; }
/* 分析页签名画廊（尺寸放宽，签名多为横向） */
.se-sign-gallery img{ width:auto; max-width:260px; height:96px; object-fit:contain; background:#fff; }
/* 编辑器：级联配置文本框 */
.se-cascade-ta{ font-family:ui-monospace,Consolas,Menlo,monospace; font-size:12.5px; line-height:1.7; }
@media (max-width:640px){
  .sf-sign .sf-sign-cv{ max-width:100%; }
  .sf-cascade select{ flex:1 1 100%; }
}

/* ===== v2.93：每日事项 · 「要点完成 → 事项完成」打通 =====
 * ① 列表内容列：单要点行首直接勾选；多要点点摘要就地展开（行内清单可勾）
 * ② 全要点完成后的「待收口」徽标 + 底部收口条
 * ③ 月历卡片里的「✓ 完成事项」与「✓ 全部要点已完成」标记 */
  .pts-caret { flex:0 0 auto; font-size:10px; color:var(--muted); margin-left:2px; }
  .pts-sum-1.is-open .t { white-space:normal; overflow:visible; text-overflow:clip; }
  .pts-sum-1.is-done .t { color:var(--muted); text-decoration:line-through; }
  .pi-ck { flex:0 0 14px; width:14px; height:14px; margin:1px 0 0; accent-color:var(--primary); cursor:pointer; }
  .pi-ck.single { margin:0 5px 0 0; vertical-align:-2px; }
  .pts-inline { margin:5px 0 2px; padding:5px 8px; border:1px solid var(--line); border-radius:8px; background:#fbfcff; }
  .pi-row { display:flex; align-items:flex-start; gap:6px; padding:3px 0; cursor:pointer; }
  .pi-row + .pi-row { border-top:1px dashed var(--line); }
  .pi-row .pi-t { flex:1 1 auto; min-width:0; font-size:12px; line-height:1.45; color:var(--text); overflow-wrap:anywhere; }
  .pi-row .pi-m { flex:0 0 auto; font-size:10.5px; color:var(--muted); white-space:nowrap; }
  .pi-row .pi-m .od { color:var(--danger); font-weight:700; }
  .pi-row.is-done .pi-t { color:var(--muted); text-decoration:line-through; }
  .pi-ck-ro { flex:0 0 14px; width:14px; text-align:center; font-size:11px; color:var(--line-2); }
  .pi-foot { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:5px; padding-top:5px; border-top:1px dashed var(--line); }
  .pi-prog { font-size:11px; font-weight:700; color:var(--muted); }
  .pi-close { margin-left:auto; }
  /* 状态列「待收口」：点了直接完结，不必再翻下拉 */
  .st-close { display:inline-block; margin:0 5px 3px 0; padding:1px 7px; border:1px solid #f59e0b; background:var(--warn-soft);
    color:#b45309; font-size:10.5px; font-weight:800; border-radius:999px; cursor:pointer; line-height:1.5; }
  .st-close:hover { background:#fde68a; }
  /* 底部收口条 */
  .pts-close-bar { position:fixed; left:50%; bottom:22px; transform:translateX(-50%) translateY(14px); z-index:9999;
    display:flex; align-items:center; gap:10px; max-width:min(92vw,720px); padding:10px 14px; background:#0f172a; color:#fff;
    border-radius:12px; box-shadow:0 12px 30px rgba(15,23,42,.28); font-size:13px; opacity:0; transition:.18s; }
  .pts-close-bar.show { opacity:1; transform:translateX(-50%) translateY(0); }
  .pts-close-bar .pcb-ic { flex:0 0 20px; width:20px; height:20px; border-radius:50%; background:#16a34a; color:#fff;
    font-size:12px; font-weight:900; display:flex; align-items:center; justify-content:center; }
  .pts-close-bar .pcb-t { flex:1 1 auto; min-width:0; line-height:1.5; }
  .pts-close-bar .pcb-t b { color:#86efac; }
  .pts-close-bar .btn { flex:0 0 auto; }
  .pts-close-bar .btn.gray { background:rgba(255,255,255,.14); color:#fff; border-color:transparent; }
  .mon-ev-act .row-actions { flex-wrap:wrap; justify-content:flex-end; }
  .pt-alldone { font-size:10.5px; font-weight:800; color:var(--good); background:var(--good-soft); border-radius:999px; padding:1px 7px; }
  .moncal-foot .foot-close { color:#b45309; font-weight:800; }
  /* 完成弹窗：未完成要点提示 */
  .fu-pts { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:8px 0 2px; padding:7px 10px;
    background:var(--warn-soft); border:1px solid #fde68a; border-radius:9px; font-size:12px; color:#92400e; }
  .fu-pts label { display:inline-flex; align-items:center; gap:6px; font-weight:600; cursor:pointer; white-space:nowrap; }
  .fu-pts input { accent-color:var(--primary); }
  @media (max-width:860px){
    .pts-close-bar { bottom:12px; flex-wrap:wrap; font-size:12.5px; padding:9px 11px; }
    .pts-close-bar .pcb-t { flex:1 1 100%; }
    .pts-close-bar .btn { flex:1 1 auto; }
    .pi-row { flex-wrap:wrap; }
    .pi-row .pi-m { flex:1 1 100%; padding-left:20px; }
  }

/* ===== v2.94：月历「要点 i/n」可就地展开该事项全部要点 =====
 * 用户原话「这个地方，也要能点击查看事件要点」—— 此前「要点 i/n」只是个死标签（形似按钮、点了没反应）。
 * 现在：徽标 / 要点正文 / 事项卡片摘要 都是同一个热区，点一下就地展开（▾ → ▴），当前这条高亮。 */
  .tag-pt { cursor:pointer; font-family:inherit; font-size:12px; font-weight:400; line-height:1.5;
    display:inline-flex; align-items:center; gap:3px; transition:background .15s, border-color .15s; }
  .tag-pt:hover { background:#dbeafe; border-color:rgba(37,99,235,.55); }
  .tag-pt.is-open { background:#dbeafe; border-color:rgba(37,99,235,.55); }
  .tag-pt:focus-visible { outline:2px solid rgba(37,99,235,.45); outline-offset:1px; }
  .tag-pt-caret { width:0; height:0; margin-left:1px; opacity:.8;
    border-left:3.5px solid transparent; border-right:3.5px solid transparent; border-top:4.5px solid currentColor; }
  .tag-pt.is-open .tag-pt-caret,
  .cal-pts-sum.is-open .tag-pt-caret { border-top:0; border-bottom:4.5px solid currentColor; }
  .cal-pts-sum .tag-pt-caret { color:currentColor; opacity:.85; margin-left:0; align-self:center; }
  .mon-ev.pt-ev .pt-t { cursor:pointer; }
  .mon-ev.pt-ev .pt-t:hover { color:var(--primary); }
  .cal-pts-sum { cursor:pointer; align-items:center; }
  .cal-pts-sum:hover .t { color:var(--primary); text-decoration:underline; }
  .cal-pts-sum .cal-pts-badge { white-space:nowrap; display:inline-flex; align-items:center; gap:4px; }
  .pi-row.is-cur { background:#e8f0ff; border-radius:6px; box-shadow:inset 2px 0 0 var(--primary); padding-left:5px; }
  .pi-row.is-cur .pi-t { font-weight:700; }
  .pi-foot .btn.gray { margin-left:auto; }
  .cal-pts-sum + .pts-inline { margin-top:6px; }
  @media (max-width:860px){
    .cal-pts-sum .cal-pts-badge { white-space:normal; }
    .tag-pt { font-size:11.5px; }
  }
/* ---------- 每日循环事项（v3.01） ---------- */
.daily-block { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin:10px 0 2px; padding:10px 12px; background:#f3f8ff; border:1px solid #d7e6ff; border-radius:10px; }
.daily-toggle { font-weight:600; }
.daily-toggle.on { background:var(--primary); color:#fff; border-color:var(--primary); box-shadow:0 1px 0 rgba(0,0,0,.05); }
.daily-opts { display:flex; align-items:center; flex-wrap:wrap; gap:8px; }
.daily-opts label { font-weight:600; color:var(--muted); }
.daily-opts input[type=time] { width:110px; padding:5px 8px; border:1px solid var(--bd,#d7e0ea); border-radius:7px; }
.daily-zone { margin:0 0 12px; border:1px solid #d7e6ff; border-radius:12px; overflow:hidden; background:#f7faff; }
.daily-zone-t { padding:8px 12px; font-weight:700; color:var(--primary); background:#eaf2ff; border-bottom:1px solid #d7e6ff; }
.daily-row { display:flex; align-items:center; gap:10px; padding:9px 12px; border-bottom:1px solid #e3edfb; }
.daily-row:last-child { border-bottom:none; }
.daily-row.is-done { opacity:.72; background:#f0fbf2; }
.daily-ico { font-size:18px; }
.daily-main { display:flex; flex-direction:column; gap:2px; flex:1; min-width:0; }
.daily-main b { word-break:break-all; }
.daily-meta { font-size:12px; color:var(--muted); }
.daily-act { flex:none; }
.daily-do { background:var(--primary); color:#fff; border-color:var(--primary); }
.daily-done { background:#e7f7ea; color:#1a7f37; border-color:#bfe6c8; }


/* ============ 仪表盘 · 问卷统计（v3.15） ============ */
.sv-kpis { display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); gap:10px; margin:2px 0 18px; }
.sv-k { background:#f8fafc; border:1px solid var(--line); border-radius:11px; padding:12px 13px; min-width:0; }
.sv-k .t { font-size:12px; color:var(--muted); display:flex; align-items:center; gap:5px; }
.sv-k .v { font-size:22px; font-weight:800; color:var(--text); line-height:1.25; margin-top:3px; display:flex; align-items:baseline; gap:3px; overflow-wrap:anywhere; }
.sv-k .v .u { font-size:12px; font-weight:600; color:var(--muted); }
.sv-k .s { font-size:11px; color:var(--muted); margin-top:3px; line-height:1.5; }
.sv-k .s b { color:var(--text-2); font-weight:600; }
.sv-k.hl { background:linear-gradient(180deg,#eff6ff,#fff); border-color:rgba(37,99,235,.22); }
.sv-k.hl .v { color:var(--primary); }

.sv-sec { border-top:1px solid var(--line); padding-top:16px; margin-top:16px; }
.sv-sec:first-of-type { border-top:0; padding-top:0; margin-top:0; }
.sv-sec > h3 { font-size:14.5px; font-weight:700; display:flex; align-items:center; gap:9px; margin-bottom:12px; flex-wrap:wrap; }
.sv-sec > h3 .sub { font-size:11.5px; font-weight:400; color:var(--muted); }
.sv-sec > h3 .h2-actions { margin-left:auto; }
.seg { display:inline-flex; background:#f1f5f9; border:1px solid var(--line); border-radius:9px; padding:2px; gap:2px; }
.seg button { border:0; background:transparent; font-family:inherit; font-size:12px; color:var(--muted); padding:4px 11px; border-radius:7px; cursor:pointer; }
.seg button.on { background:#fff; color:var(--primary); font-weight:700; box-shadow:0 1px 3px rgba(15,23,42,.10); }

.sv-cat { display:grid; grid-template-columns:210px minmax(0,1fr); gap:22px; align-items:center; }
.sv-ring { display:flex; flex-direction:column; align-items:center; gap:10px; }
.sv-legend { display:flex; flex-direction:column; gap:6px; width:100%; }
.sv-legend .lg { display:flex; align-items:center; gap:7px; font-size:12.5px; color:var(--text-2); }
.sv-legend .lg i { width:9px; height:9px; border-radius:3px; flex:0 0 9px; }
.sv-legend .lg .pct { color:var(--muted); font-size:11.5px; margin-left:auto; }
.sv-legend .lg b { font-weight:700; color:var(--text); min-width:22px; text-align:right; }

.sv-tablewrap { overflow-x:auto; min-width:0; }
/* v3.15 修复：auto 布局会让列宽随容器漂移（占比条被推远、首列被压成竖排）。
   改为 fixed 布局 + colgroup 定宽，列宽完全确定；首列 nowrap 保证姓名/分类不折行。 */
.sv-table { width:100%; table-layout:fixed; border-collapse:collapse; font-size:13px; }
.sv-table th { font-size:12px; color:var(--muted); font-weight:600; text-align:left; padding:8px 10px; background:#f8fafc; border-bottom:1px solid var(--line); white-space:nowrap; }
.sv-table td { padding:9px 10px; border-bottom:1px solid #f1f5f9; color:var(--text-2); }
.sv-table tr:last-child td { border-bottom:0; }
.sv-table .num { text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.sv-cat .sv-table td:first-child,
.sv-cr .sv-table td:first-child { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* v3.15 修复：表体行原误用 .sv-row（旧问卷列表的 display:flex）→ 单元格宽度退化到内容宽度、首列被压成竖排。改用独立类名 .sv-tr。 */
.sv-tr { cursor:pointer; }
.sv-tr:hover td { background:var(--primary-soft); }
.sv-tr.dim { opacity:.55; }
/* 占比条：grid 两栏（条 1fr + 百分比 40px 定宽），百分比宽度相对轨道解析，不再撑破单元格 */
.sv-pbar { position:relative; display:grid; grid-template-columns:minmax(0,1fr) 40px; align-items:center; gap:8px; width:100%; }
.sv-pbar::before { content:""; position:absolute; left:0; right:48px; top:50%; height:7px; margin-top:-3.5px; border-radius:5px; background:#eef2f7; }
.sv-pbar i { position:relative; z-index:1; display:block; height:7px; border-radius:5px; background:linear-gradient(90deg,#2563eb,#0ea5e9); min-width:2px; }
.sv-pbar span { font-size:11.5px; color:var(--muted); white-space:nowrap; text-align:right; font-variant-numeric:tabular-nums; }

.sv-cr { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.15fr); gap:22px; align-items:start; }
.sv-bars { display:flex; flex-direction:column; gap:10px; }
.sv-b { display:grid; grid-template-columns:70px minmax(0,1fr) 32px; align-items:center; gap:9px; cursor:pointer; }
.sv-b .nm { font-size:12.5px; color:var(--text-2); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sv-b .tr { height:16px; border-radius:4px; background:#eef2f7; position:relative; display:block; }
.sv-b .tr > i { position:absolute; left:0; top:0; bottom:0; border-radius:4px; background:linear-gradient(90deg,#3b82f6,#0ea5e9); }
.sv-b .vl { text-align:right; font-weight:700; color:var(--text); font-size:12.5px; font-variant-numeric:tabular-nums; }
.sv-b:hover .nm { color:var(--primary); }
.sv-note { font-size:12px; color:var(--muted); background:#fff; border:1px dashed var(--line-2); border-radius:10px; padding:10px 12px; line-height:1.65; margin-top:10px; }

.sv-ranks { display:grid; grid-template-columns:1fr 1fr; gap:18px; align-items:start; }
.sv-rcol { display:flex; flex-direction:column; gap:18px; min-width:0; }
/* 「最近创建的问卷」小卡（填补项目榜条目少时的空白） */
.sv-rec { display:flex; align-items:center; gap:10px; padding:7px 6px; border-radius:9px; cursor:pointer; }
.sv-rec:hover { background:#fff; }
.sv-rec-main { flex:1 1 auto; min-width:0; }
.sv-rec .nm { font-size:12.5px; font-weight:600; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sv-rec .sub { font-size:11.5px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:1px; }
.sv-rec-r { flex:0 0 auto; text-align:right; min-width:54px; white-space:nowrap; }
.sv-rec-r b { font-size:13px; color:var(--text); font-variant-numeric:tabular-nums; }
.sv-rec-r span { font-size:10.5px; color:var(--muted); margin-left:3px; }
.sv-rank { background:#f8fafc; border:1px solid var(--line); border-radius:13px; padding:14px 15px; }
.sv-rank h4 { font-size:13.5px; font-weight:700; display:flex; align-items:center; gap:7px; }
.sv-rsub { font-size:11.5px; color:var(--muted); margin:3px 0 10px; }
.sv-ri { display:grid; grid-template-columns:22px minmax(0,1fr) 86px 74px; align-items:center; gap:10px; padding:7px 6px; border-radius:9px; cursor:pointer; }
.sv-ri:hover { background:#fff; }
.sv-ri .no { width:20px; height:20px; border-radius:6px; display:flex; align-items:center; justify-content:center; font-size:11.5px; font-weight:800; color:#64748b; background:#eef2f7; }
.sv-ri .no.t1 { background:linear-gradient(135deg,#f59e0b,#fbbf24); color:#fff; }
.sv-ri .no.t2 { background:linear-gradient(135deg,#94a3b8,#cbd5e1); color:#fff; }
.sv-ri .no.t3 { background:linear-gradient(135deg,#b45309,#d97706); color:#fff; }
.sv-ri-main { min-width:0; }
.sv-ri .nm { font-size:13px; font-weight:600; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sv-ri .sub { font-size:11.5px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sv-ribar { height:7px; border-radius:5px; background:#eef2f7; position:relative; }
.sv-ribar i { position:absolute; left:0; top:0; bottom:0; border-radius:5px; }
.sv-ripct { text-align:right; font-variant-numeric:tabular-nums; }
.sv-ripct b { display:block; font-size:13px; }
.sv-ripct span { font-size:11px; color:var(--muted); }
.sv-tag { font-size:10.5px; font-weight:600; color:#92400e; background:var(--warn-soft); border-radius:5px; padding:1px 5px; margin-left:5px; vertical-align:1px; }
.sv-tag.gray { color:#475569; background:#eef2f7; }

.sv-foot { margin-top:16px; background:#fff; border:1px solid var(--line); border-radius:12px; }
.sv-foot summary { cursor:pointer; list-style:none; padding:12px 15px; font-size:13px; font-weight:600; color:var(--text-2); display:flex; align-items:center; gap:8px; }
.sv-foot summary::-webkit-details-marker { display:none; }
.sv-foot summary::before { content:"\25B8"; color:var(--primary); font-size:11px; transition:.15s; display:inline-block; }
.sv-foot[open] summary::before { transform:rotate(90deg); }
.sv-foot .body { padding:0 15px 14px; font-size:12.5px; color:var(--text-2); line-height:1.9; }
.sv-foot .body ul { padding-left:18px; }
.sv-foot .body li { margin-bottom:3px; }

#modal .svdt-t { color:var(--primary); cursor:pointer; font-weight:600; }
#modal .svdt-t:hover { text-decoration:underline; }

@media (max-width:1180px){
  .sv-kpis { grid-template-columns:repeat(3,minmax(0,1fr)); }
  .sv-cat { grid-template-columns:1fr; }
  /* 堆叠后环形图与图例不做整宽拉伸，否则占比数字会被推到屏宽最右 */
  .sv-cat .sv-ring { width:100%; max-width:360px; margin:0 auto; }
  .sv-cr { grid-template-columns:1fr; }
  .sv-ranks { grid-template-columns:1fr; }
}
@media (max-width:680px){
  .sv-kpis { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .sv-ri { grid-template-columns:20px minmax(0,1fr) 64px; }
  .sv-ribar { display:none; }
}
