*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:13px/1.6 -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;-webkit-font-smoothing:antialiased}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;border:0;background:none}
h1,h2,h3,h4,p,dl,dd{margin:0}
a{color:var(--blue);text-decoration:none}a:hover{color:var(--blue-d)}
::selection{background:#cfe0fc}
.mono{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}

/* ---------------- shell ---------------- */
.app{display:grid;grid-template-columns:212px minmax(0,1fr);min-height:100vh}
.side{background:#fff;border-right:1px solid var(--line);position:sticky;top:0;height:100vh;overflow-y:auto;display:flex;flex-direction:column}
.side::-webkit-scrollbar{width:6px}.side::-webkit-scrollbar-thumb{background:#e3e6ec;border-radius:6px}
.brand{display:flex;align-items:center;gap:9px;padding:14px 16px 12px;font-weight:800;font-size:14px}
.brand .lg{width:26px;height:26px;border-radius:7px;background:var(--blue);color:#fff;display:grid;place-items:center;font-size:13px}
.brand small{display:block;font-weight:500;font-size:10.5px;color:var(--muted);letter-spacing:.2px}
.ng{padding:2px 8px}
.ng .gt{font-size:10px;font-weight:700;color:var(--faint);letter-spacing:.7px;text-transform:uppercase;padding:9px 8px 4px}
.ni{display:flex;align-items:center;gap:8px;width:100%;padding:6px 9px;border-radius:6px;color:var(--sub);font-size:13px;text-align:left;position:relative}
.ni:hover{background:#f4f6f9;color:var(--ink)}
.ni.on{background:var(--blue-soft);color:var(--blue-d);font-weight:700}
.ni.on::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;border-radius:2px;background:var(--blue)}
.ni .dot{margin-left:auto;min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--red);color:#fff;font-size:10px;font-weight:700;display:grid;place-items:center}
.side-foot{margin-top:auto;padding:12px 16px;border-top:1px solid var(--line);font-size:10.5px;color:var(--muted);line-height:1.55}

.main{display:flex;flex-direction:column;min-width:0}
.top{position:sticky;top:0;z-index:30;height:48px;background:rgba(255,255,255,.94);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:14px;padding:0 20px}
.crumbs{font-size:12.5px;color:var(--muted);font-weight:600;display:flex;align-items:center;gap:6px}
.crumbs b{color:var(--ink)}
.search{position:relative;margin-left:4px;flex:1;max-width:320px;display:flex;align-items:center;gap:7px;background:#f1f3f6;border:1px solid transparent;border-radius:7px;padding:5px 10px;color:var(--muted);font-size:12.5px}
.gsg-i:hover{background:var(--blue-soft)}
.search:focus-within{background:#fff;border-color:var(--blue-line);box-shadow:0 0 0 3px var(--blue-soft)}
.search input{border:0;background:none;outline:none;flex:1;color:var(--ink)}
.search svg{width:14px;height:14px;flex:none}
.top .sp{flex:1}
.rolep{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--sub)}
.rolep select{background:#f1f3f6;border:1px solid var(--line2);border-radius:6px;padding:5px 8px;font-weight:600;font-size:12px;outline:none}
.ibtn{width:30px;height:30px;border-radius:7px;display:grid;place-items:center;color:var(--sub)}
.ibtn:hover{background:#f1f3f6;color:var(--ink)}
.ibtn svg{width:16px;height:16px}
.av{border-radius:50%;display:inline-grid;place-items:center;color:#fff;font-weight:700;flex:none}
.av.c0{background:#3b7ff0}.av.c1{background:#d98033}.av.c2{background:#3fae7a}.av.c3{background:#8f5fd6}.av.c4{background:#cf6480}.av.sys{background:#e7eaf0;color:#7b8494}
.avimg{object-fit:cover;background:#e7eaf0;vertical-align:middle}

.content{padding:18px 22px 70px;max-width:1800px;width:100%}
/* 大屏适配：内容上限放宽后，宽屏下整体等比放大（对齐用户"150% 才舒服"的体感），
   zoom 为 Chromium 系（Chrome/Edge/飞书内置浏览器）支持，全站排版无需逐项改 */
@media (min-width:1680px){ body{zoom:1.12} }
@media (min-width:2200px){ body{zoom:1.3} }
.screen{display:none}.screen.on{display:block}

/* ---------------- dense primitives ---------------- */
.ph{margin-bottom:14px}
.ph h1{font-size:18px;font-weight:800;letter-spacing:-.2px}
.ph p{color:var(--sub);margin-top:3px;font-size:12.5px;max-width:820px}
.dcard{background:#fff;border:1px solid var(--line2);border-radius:8px}
.dsec{padding:14px 18px;border-top:1px solid var(--hair)}
.dsec:first-child{border-top:0}
.lbl{font-size:10px;font-weight:700;letter-spacing:.6px;color:var(--faint);text-transform:uppercase;margin-bottom:9px;display:flex;align-items:center;gap:8px}
.lbl .r{margin-left:auto;text-transform:none;letter-spacing:0;font-weight:600;color:var(--muted);font-size:11px}
.dsec-h{display:flex;align-items:center;gap:8px;padding:11px 18px;border-bottom:1px solid var(--line2)}
.dsec-h h3{font-size:13.5px;font-weight:700}
.dsec-h .r{margin-left:auto;font-size:11.5px;color:var(--muted)}

.stats{display:flex;border:1px solid var(--line2);border-radius:8px;overflow:hidden;background:#fff}
.stat{flex:1;padding:12px 16px;border-left:1px solid var(--hair)}
.stat:first-child{border-left:0}
.stat .sk{font-size:11.5px;color:var(--muted)}
.stat .sv{font-size:22px;font-weight:800;margin-top:1px;font-variant-numeric:tabular-nums;letter-spacing:-.5px}
.stat .sd{font-size:10.5px;color:var(--muted);margin-top:1px}
.stat.click{cursor:pointer}.stat.click:hover{background:var(--panel)}.stat.click .sd{color:var(--blue)}
.stat.bad .sv{color:var(--red)}.stat.warn .sv{color:var(--amber)}.stat.ok .sv{color:var(--green)}

.dt{width:100%;border-collapse:collapse;font-size:12.5px}
.dt th{text-align:left;font-size:10px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);padding:9px 14px;border-bottom:1px solid var(--line2);background:var(--panel);white-space:nowrap}
.dt td{padding:9px 14px;border-bottom:1px solid var(--hair);color:var(--sub);vertical-align:middle}
.dt tr:last-child td{border-bottom:0}
.dt tr:hover td{background:#fafbfd}
.dt b{color:var(--ink);font-weight:600}
.dt .id{font-weight:700;color:var(--blue-d)}
/* 列表长标题统一截断：套在标题文本节点（<b>/<span>）上而非 td——徽标（部门内/子单）做
   兄弟节点排在省略号之后永不被吃；完整标题走 title 悬浮；移动端卡片视图在媒体查询内还原换行 */
.tcut{display:inline-block;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}
.who{display:inline-flex;align-items:center;gap:6px}
.who .av{width:20px;height:20px;font-size:10px}

.tg{display:inline-flex;align-items:center;gap:4px;height:19px;padding:0 7px;border-radius:5px;font-size:11px;font-weight:700;line-height:1}
/* 表格语义类不折行（2026-08-10 中宽挤压修复）：编号/状态胶囊/人名/等宽值被挤压时折行不可读
   （D0722-005 断在连字符、「待客户反馈」竖排溢出胶囊——inline-flex 匿名项 CJK 逐字断，
   settings.js wkSubmit 上方注释同族教训）。nowrap 抬高列的 min-content，容器不足时由
   .tblwrap 的 overflow-x:auto 横滚接管（notify/perm-rules 矩阵表「宁横滚不挤压」既有立场）。
   唯一长文本豁免：settings 文档 URL 单元格内联 white-space:normal。 */
.id,.tg,.who,.mono{white-space:nowrap}
.tg.blue{background:var(--blue);color:#fff}
.tg.blues{background:var(--blue-soft);color:var(--blue-d)}
.tg.gray{background:#eceef2;color:var(--sub)}
.tg.green{background:var(--green-soft);color:var(--green)}
.tg.amber{background:var(--amber-soft);color:var(--amber)}
.tg.red{background:var(--red-soft);color:var(--red)}
.tg.redf{background:var(--red);color:#fff}
.tg.line{background:#fff;border:1px solid var(--line2);color:var(--sub);font-weight:600}

.btn{height:30px;padding:0 12px;border-radius:7px;font-size:12.5px;font-weight:600;border:1px solid var(--line2);background:#fff;color:var(--ink);display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.btn:hover{background:#f4f6f9;border-color:#c9cfda}
.btn.pri{background:var(--blue);border-color:var(--blue);color:#fff}
.btn.pri:hover{background:var(--blue-d)}
.btn.amb{border-color:var(--amber-line);color:var(--amber);background:#fff}
.btn.amb:hover{background:var(--amber-soft)}
.btn.green{border-color:#c7e6cf;color:var(--green);background:#fff}
.btn.danger{color:var(--red);border-color:#f0cccc;background:#fff}
.btn.danger:hover{background:var(--red-soft)}
.btn.ghost{border-color:transparent;color:var(--sub)}.btn.ghost:hover{background:#f1f3f6}
.btn.sm{height:26px;padding:0 9px;font-size:11.5px;border-radius:6px}
.btns{display:flex;flex-wrap:wrap;gap:7px}

.dl{display:grid;grid-template-columns:auto 1fr;gap:7px 16px;font-size:12.5px}
.dl dt{color:var(--muted)}
.dl dd{color:var(--ink);white-space:pre-wrap;overflow-wrap:break-word}
.note{background:var(--blue-soft);border:1px solid var(--blue-line);border-radius:7px;padding:9px 12px;font-size:12.5px;color:var(--blue-d);white-space:pre-wrap;overflow-wrap:break-word}
.warnbox{background:var(--amber-soft);border:1px solid var(--amber-line);border-radius:7px;padding:9px 12px;font-size:12.5px;color:#7d5106}
.dangerbox{background:var(--red-soft);border:1px solid #f0cccc;border-radius:7px;padding:9px 12px;font-size:12.5px;color:#a52c2c;white-space:pre-wrap;overflow-wrap:break-word}
.chk{display:flex;gap:7px;margin-bottom:6px;font-size:12.5px}
.chk:last-child{margin-bottom:0}
.chk .i{flex:none;margin-top:1px;color:var(--green)}
.chk .i.r{color:var(--red)}.chk .i.a{color:var(--amber)}.chk .i.b{color:var(--blue)}
.kbd{font-family:ui-monospace,Menlo,monospace;font-size:11px;background:#eef0f4;padding:1px 5px;border-radius:4px;color:var(--sub)}
.g2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.two{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:14px;align-items:start}
/* 多卡等分并列（部门榜单区）：卡数自适应（3 卡各 1/3、4 卡各 1/4），中屏两列，窄屏单列 */
.four{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;align-items:start}
/* 榜卡内两三列小表不受全局 .tblwrap>.dt 560px 兜底约束（否则窄卡出现横向滚动条） */
.four .tblwrap>.dt{min-width:0}
@media (max-width:1400px){.four{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:768px){.four{grid-template-columns:minmax(0,1fr)}}
.stack{display:flex;flex-direction:column;gap:14px}
.hint{font-size:11px;color:var(--muted);margin-top:4px}
/* 优先级定义三行块（K2）：整理弹窗优先级下拉下方 + 登记页影响情况区，文案来自 params.priorityDefs */
.pridefs{margin-top:6px;border:1px solid var(--line);border-radius:7px;padding:7px 10px;background:var(--panel);font-size:11.5px;line-height:1.6;color:var(--sub)}
.pridefs>div+div{margin-top:2px}
.pridefs b{display:inline-block;min-width:24px;color:var(--ink);font-weight:700}
.pridefs>div:first-child b{color:var(--red)}
.pridefs>div:nth-child(2) b{color:var(--amber)}

/* subnav */
.subnav{display:inline-flex;gap:2px;background:#eceef2;padding:3px;border-radius:8px;margin-bottom:14px;flex-wrap:wrap}
.subnav button{padding:6px 12px;border-radius:6px;font-size:12.5px;font-weight:600;color:var(--sub)}
.subnav button:hover{color:var(--ink)}
.subnav button.on{background:#fff;color:var(--blue-d);font-weight:700;box-shadow:0 1px 2px rgba(0,0,0,.06)}
.subpage{display:none}.subpage.on{display:block}
/* filter bar */
.filterbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.filterbar .fl{font-size:11px;font-weight:700;letter-spacing:.5px;color:var(--faint);text-transform:uppercase}
.fseg{display:inline-flex;background:#eceef2;padding:2px;border-radius:7px}
.fseg button{padding:5px 11px;border-radius:5px;font-size:12px;font-weight:600;color:var(--sub)}
.fseg button:hover{color:var(--ink)}
.fseg button.on{background:#fff;color:var(--blue-d);font-weight:700;box-shadow:0 1px 2px rgba(0,0,0,.06)}
.fcount{margin-left:auto;font-size:11.5px;color:var(--muted)}
.fsearch{display:flex;align-items:center;gap:6px;background:#fff;border:1px solid var(--line2);border-radius:7px;padding:5px 9px;min-width:250px}
.fsearch:focus-within{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.fsearch svg{width:14px;height:14px;color:var(--muted);flex:none}
.fsearch input{border:0;background:none;outline:none;flex:1;font-size:12.5px;min-width:0}
.fsearch .clr{width:16px;height:16px;border-radius:50%;display:none;place-items:center;color:var(--muted);font-size:11px;flex:none}
.fsearch .clr:hover{background:#eceef2;color:var(--ink)}
.fsearch.has .clr{display:grid}
.tk mark{background:#fdeec2;color:inherit;border-radius:2px;padding:0 1px}
.tk.hide,.grp.hide{display:none}
.dt tr.hide{display:none}
/* handover manual pick */
.hopick-all{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid var(--line2);background:var(--panel);font-size:12.5px;cursor:pointer}
.horow{display:flex;align-items:center;gap:9px;padding:9px 14px;border-bottom:1px solid var(--hair);font-size:12.5px;cursor:pointer}
.horow:last-child{border-bottom:0}
.horow:hover{background:#fafbfd}
.horow input,.hopick-all input{width:15px;height:15px;accent-color:var(--blue);flex:none;margin:0}
.horow b{font-weight:600;color:var(--ink)}
.horow .hom{margin-left:auto;color:var(--muted);font-size:11.5px}
/* density toggle */
.densw{display:inline-flex;background:#f1f3f6;border:1px solid var(--line2);border-radius:7px;padding:2px}
.densw button{padding:4px 9px;border-radius:5px;font-size:11.5px;font-weight:600;color:var(--sub)}
.densw button.on{background:#fff;color:var(--blue-d);font-weight:700;box-shadow:0 1px 2px rgba(0,0,0,.06)}
body.comfy{font-size:14px}
body.comfy .content{padding:22px 26px 80px}
body.comfy .dt td{padding:12px 15px}
body.comfy .dt th{padding:11px 15px}
body.comfy .tk{padding:15px 18px}
body.comfy .dr{padding:12px 15px}
body.comfy .dsec{padding:17px 20px}
body.comfy .dh h1{font-size:21px}
body.comfy .ph h1{font-size:20px}

/* ============ DETAIL (dense) ============ */
.dwrap{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:0;align-items:start;background:#fff;border:1px solid var(--line2);border-radius:8px;overflow:hidden}
.dleft{border-right:1px solid var(--line2)}
.dh{padding:14px 18px}
.dh .r1{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.dh .oid{font-weight:800;font-size:13px;letter-spacing:.3px}
.dh .stuck{color:var(--muted);font-size:12px}
.dh h1{font-size:19px;font-weight:800;margin:9px 0 8px;letter-spacing:-.2px}
.dh .meta{display:flex;flex-wrap:wrap;gap:3px 18px;font-size:12.5px;color:var(--muted)}
.dh .meta b{color:var(--ink);font-weight:600}
.steps{display:flex;align-items:center;flex-wrap:wrap;gap:2px 0}
.stp{display:inline-flex;align-items:center;font-size:11.5px;color:var(--muted);white-space:nowrap}
.stp .d{width:7px;height:7px;border-radius:50%;background:#d3d8e1;margin-right:5px}
.stp.done .d{background:var(--green)}.stp.done{color:var(--sub)}
.stp.cur{color:var(--blue-d);font-weight:800}.stp.cur .d{background:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.stp .sep{width:14px;height:1.5px;background:var(--hair);margin:0 8px}
.stp.done .sep,.stp.cur .sep{background:#cfd6e0}
.dact{background:#f7faff;border-left:3px solid var(--blue);padding:13px 16px}
.dact .top{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.dact .k{font-size:11px;font-weight:700;color:var(--blue);letter-spacing:.4px}
.dact .who2{margin-left:auto;font-size:12px;color:var(--sub);display:flex;align-items:center;gap:6px}
.dact h2{font-size:15.5px;font-weight:800;margin-bottom:9px}
.dact .ln{display:flex;gap:8px;font-size:12.5px;margin-bottom:5px}
.dact .ln .kk{color:var(--muted);flex:none;width:60px}
.dact .ln .vv{color:var(--ink);white-space:pre-wrap;overflow-wrap:break-word}
.dact .warn{color:#8a5606}
.dact .bt{display:flex;flex-wrap:wrap;gap:7px;margin-top:11px}
.orig{font-size:13px;line-height:1.6;padding-left:11px;border-left:2px solid var(--ink);margin:2px 0 10px;white-space:pre-wrap;overflow-wrap:break-word}
.files{display:flex;gap:16px;font-size:12px;flex-wrap:wrap}
.files a{display:inline-flex;align-items:center;gap:5px;color:var(--sub)}
.files svg{width:13px;height:13px;opacity:.7;flex:none}
.relay{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:var(--hair);border:1px solid var(--hair);border-radius:7px;overflow:hidden}
.rs{background:#fff;padding:7px 6px;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center}
.rs.cur{background:var(--blue-soft)}
.rs .rk{font-size:9.5px;color:var(--muted);margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rs .av{width:26px;height:26px;font-size:11px;margin:0 auto 4px}
/* 空槽态类名用 vac（vacant）——不能叫 empty：与 265 行"空状态占位"组件类撞名，
   其 padding:38px 曾把整行撑高 76%（撞名即事故，2026-07-12 反馈 #10 排查半天的根因） */
.rs.vac .av{background:#eef0f4;color:var(--faint)}
.rs .rn{font-size:11px;font-weight:700}
.rs.vac .rn{color:var(--faint);font-weight:600}
.rs.cur .rn{color:var(--blue-d)}
.copy{background:var(--amber-soft);border:1px solid var(--amber-line);border-radius:7px;padding:10px 13px}
.copy .ch{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}
.copy .ct{font-size:11px;font-weight:700;color:#8a5606}
.copy .cq{font-size:13px;line-height:1.6;color:#5f4405;white-space:pre-wrap;overflow-wrap:break-word}
.copy .cb{height:24px;padding:0 9px;border-radius:6px;border:1px solid var(--amber-line);background:#fff;font-size:11px;font-weight:600;color:var(--amber)}
/* dense records —— 右栏随页面自然滚动（用户口径：不钉住，与左侧一起滚）；
   长清单仍保留栏内滚动上限，避免几百条进展把页面拉成万米长卷 */
.rc{position:static}
.rc-tabs{display:flex;border-bottom:1px solid var(--line2)}
.rc-tabs button{flex:1;padding:10px 4px;font-size:12px;font-weight:600;color:var(--muted);border-bottom:2px solid transparent}
.rc-tabs button.on{color:var(--blue-d);border-bottom-color:var(--blue);font-weight:700}
.rc-tabs .cnt{font-size:10px;color:var(--faint)}
.rc-tabs button.on .cnt{color:var(--blue-d)}
.rc-intro{font-size:11px;color:var(--muted);padding:10px 14px 4px}
.rc-comp{padding:10px 14px;border-bottom:1px solid var(--hair);background:var(--panel)}
.rc-comp textarea{width:100%;border:1px solid var(--line2);border-radius:7px;padding:7px 9px;font:inherit;font-size:12px;resize:none;min-height:34px;outline:none;background:#fff;line-height:1.5}
.rc-comp textarea:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.rc-comp .cf{display:flex;align-items:center;gap:8px;margin-top:6px}
.rc-comp .ab{font-size:11.5px;color:var(--muted)}
.rc-comp .post{margin-left:auto;height:28px;padding:0 12px;border-radius:7px;background:var(--blue);color:#fff;font-size:12px;font-weight:700}
.rc-comp .post:hover{background:var(--blue-d)}
.rc-body{max-height:calc(100vh - 130px);overflow-y:auto}
.rc-body::-webkit-scrollbar{width:6px}.rc-body::-webkit-scrollbar-thumb{background:#e3e6ec;border-radius:6px}
.dr{display:grid;grid-template-columns:18px 1fr;gap:8px;padding:9px 14px;border-bottom:1px solid var(--hair)}
.dr:last-child{border-bottom:0}
.dr .av{width:18px;height:18px;font-size:9px;margin-top:2px}
.dr .rt{min-width:0}
.dr .rh{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.dr .rh b{font-size:12px;font-weight:700}
.dr .rh .tm{margin-left:auto;font-size:10.5px;color:var(--faint)}
.dr .rx{font-size:12px;color:var(--sub);margin-top:2px;line-height:1.5;white-space:pre-wrap;overflow-wrap:break-word}
.dr .rchip{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--sub);background:#f2f4f7;border-radius:5px;padding:2px 7px;margin-top:5px}
/* 文件类附件卡片（.fchip）：浅底 + 边框 + 圆角，字号常规、彩色类型图标不再压暗——
   替代此前几乎无样式的 .rchip 文件链，让 pdf/excel/zip 等非图非视频附件在详情页更醒目、
   不易漏看（用户以 D0812-008 反馈）。图片/视频仍走各自缩略图/播放态，不用本类。 */
.fchip{display:inline-flex;align-items:center;gap:7px;max-width:100%;font-size:12.5px;color:var(--ink);
  background:var(--panel);border:1px solid var(--line2);border-radius:8px;padding:6px 11px;line-height:1.3;
  vertical-align:middle;text-decoration:none;transition:background .12s,border-color .12s}
a.fchip:hover{background:var(--blue-soft);border-color:var(--blue-line)}
.fchip svg{width:20px;height:20px;flex:none;opacity:1}
/* dim：关联背景快照的文件类"不可下载"——虚线框 + 压暗，明确锁定/不开放（见 detail.js 快照渲染） */
.fchip.dim{background:var(--hair);border-style:dashed;opacity:.6;cursor:default}
/* .origcard/.files 对内部 svg 有 opacity:.7 + 13px 的更高特异性规则，此处显式压过 */
.origcard .files .fchip svg{width:20px;height:20px;opacity:1}
.badge{display:inline-flex;align-items:center;height:15px;padding:0 5px;border-radius:4px;font-size:10px;font-weight:700}
.b-dept{background:#eceef2;color:#5a6473}
.b-act{background:var(--blue-soft);color:var(--blue-d)}
.b-cus{background:#e7f5f6;color:#0f7a86}
.b-ok{background:var(--green-soft);color:var(--green)}
.b-agg{background:var(--amber-soft);color:var(--amber)}
.b-fail{background:var(--red-soft);color:var(--red)}

/* todos dense list */
.tklist>.tk:first-child{border-top:0}
.tk{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center;padding:11px 16px;border-bottom:1px solid var(--hair);cursor:pointer}
.tk:hover{background:#fafbfd}
.tk.hot{box-shadow:inset 3px 0 0 var(--red)}
.tk.warm{box-shadow:inset 3px 0 0 var(--amber)}
.tk.cool{box-shadow:inset 3px 0 0 var(--blue)}
.tk .l1{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.tk .tt{font-size:14px;font-weight:700;margin:4px 0 3px}
.tk .m{font-size:12px;color:var(--muted);display:flex;gap:8px 16px;flex-wrap:wrap}
.tk .m b{color:var(--sub);font-weight:600}
.tk .r{color:var(--muted);font-size:11.5px;margin-top:3px;white-space:pre-wrap;overflow-wrap:break-word}
.grp{display:flex;align-items:center;gap:8px;padding:9px 16px;background:var(--panel);border-bottom:1px solid var(--hair)}
.grp .gt{font-size:12px;font-weight:800}
.grp.u .gt{color:var(--red)}
.grp .cn{font-size:11px;color:var(--muted);background:#eceef2;padding:1px 7px;border-radius:7px}
.empty{text-align:center;padding:38px 20px;color:var(--muted)}
.empty svg{width:34px;height:34px;opacity:.4;margin-bottom:8px}
.empty b{display:block;color:var(--ink);font-size:14px;margin-bottom:5px}

/* forms */
.form{display:grid;grid-template-columns:1fr 1fr;gap:14px 16px}
.form .full{grid-column:1/-1}
/* sectioned register form */
.fsec{padding:16px 0;border-top:1px solid var(--hair)}
.fsec:first-child{border-top:0;padding-top:12px}
.fsec-h{display:flex;align-items:center;gap:9px;font-size:13.5px;font-weight:800;margin-bottom:14px}
.fsec-h .fn{width:20px;height:20px;border-radius:6px;background:var(--blue);color:#fff;display:grid;place-items:center;font-size:12px;font-weight:800;flex:none}
.foldbtn{display:inline-flex;align-items:baseline;gap:8px;font-size:12.5px;font-weight:700;color:var(--blue-d);padding:2px 0}
.foldbtn:hover{color:var(--blue)}
.foldbtn .fh{font-weight:500;color:var(--muted);font-size:11.5px}
.branchnote{margin-top:10px;font-size:11.5px;color:var(--muted);display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:9px;border-top:1px dashed var(--line2)}
/* 选填折叠区（K1）：登记页非必填字段收纳条——默认折叠，必填主路径一屏直通；
   有客户档案带出值 / 草稿值 / 合规提醒时由 JS 加 .on 自动展开（不藏用户已填内容） */
.fold{border:1px solid var(--line2);border-radius:8px;background:var(--panel);overflow:hidden}
.fold-h{display:flex;width:100%;align-items:center;gap:10px;padding:10px 13px;text-align:left;flex-wrap:wrap}
.fold-h:hover{background:var(--hair)}
.fold-t{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:800;color:var(--ink)}
.fold-t .fn{width:20px;height:20px;border-radius:6px;background:var(--blue);color:#fff;display:grid;place-items:center;font-size:12px;font-weight:800;flex:none}
.fold-cx{color:var(--muted);font-size:13px;line-height:1;transition:transform .15s}
.fold.on .fold-cx{transform:rotate(180deg)}
.fold-s{flex:1;min-width:170px;text-align:right;font-size:11.5px;color:var(--muted)}
.fold-s b{color:var(--blue-d);font-weight:700}
.fold-b{border-top:1px solid var(--line2);background:var(--card);padding:13px}
.fold:not(.on) .fold-b{display:none}
@media (max-width:720px){.fold-s{text-align:left;min-width:0;flex-basis:100%}}
@media (max-width:720px){.form{grid-template-columns:1fr}}
/* type picker cards */
.typepick{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
@media (max-width:720px){.typepick{grid-template-columns:1fr}}
.tp{position:relative;cursor:pointer;display:block}
.tp input{position:absolute;opacity:0;pointer-events:none}
.tp .tpb{border:1px solid var(--line2);border-radius:8px;padding:11px 13px;height:100%;transition:.12s;background:#fff}
.tp:hover .tpb{border-color:#c9cfda;background:#fafbfd}
.tp input:checked+.tpb{border-color:var(--blue);background:var(--blue-soft);box-shadow:0 0 0 1px var(--blue) inset}
.tp .tt{font-size:13.5px;font-weight:700;display:flex;align-items:baseline;gap:7px;flex-wrap:wrap}
.tp .th{font-size:11px;font-weight:600;color:var(--muted)}
.tp input:checked+.tpb .th{color:var(--blue-d)}
.tp .tx{font-size:11.5px;color:var(--sub);margin-top:5px;line-height:1.5}
.tp-uns .tpb{background:var(--panel);border-style:dashed}
.tp-uns input:checked+.tpb{background:var(--amber-soft);border-color:var(--amber-line);box-shadow:0 0 0 1px var(--amber-line) inset}
.tp-uns input:checked+.tpb .th{color:var(--amber)}
.field label{display:block;font-size:12px;font-weight:700;color:var(--sub);margin-bottom:5px}
.field label .req{color:var(--red)}
.field input,.field select,.field textarea{width:100%;border:1px solid var(--line2);border-radius:7px;padding:7px 10px;outline:none;background:#fff;font-size:12.5px}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.field textarea{resize:vertical;min-height:60px;line-height:1.55}
.upload{border:1.5px dashed var(--line2);border-radius:7px;padding:12px;text-align:center;color:var(--muted);font-size:12px;background:var(--panel)}
/* ⚡ 快速登记模式（批D）：#register-form 挂 .reg-quick 时隐藏 .qhide 段、显示 .qonly 说明 */
.reg-quick .qhide{display:none!important}
.reg-quick .qhide.qshow{display:block!important}   /* X2:快速模式登新客户时临时放出选填段（业务线/合规提醒不可静默取默认） */
.qonly{display:none;margin-bottom:12px}
.reg-quick .qonly{display:block}
.stepband{display:flex;gap:8px;margin-bottom:16px}
.stepband .sb{flex:1;border:1px solid var(--line2);border-radius:7px;padding:9px 12px}
.stepband .sb.on{border-color:var(--blue-line);background:var(--blue-soft)}
.stepband .sb .n{display:inline-grid;place-items:center;width:18px;height:18px;border-radius:50%;background:#e6e9ef;color:var(--sub);font-size:11px;font-weight:800;margin-right:7px}
.stepband .sb.on .n{background:var(--blue);color:#fff}
.stepband .sb b{font-size:12.5px}
.stepband .sb p{font-size:10.5px;color:var(--muted);margin-top:2px}

/* modal */
/* 弹窗尺寸禁用 vh：body zoom 档会把 vh 按倍率放大导致大屏溢出且不可滚。
   mask 是 fixed inset:0，其内容盒在任何 zoom 下恰等于可视区 → modal 用 max-height:100% 天然正确；
   margin:auto 居中（溢出时贴边不裁头）+ mask overflow:auto 兜底永远可滚。 */
.mask{position:fixed;inset:0;background:rgba(20,24,33,.44);backdrop-filter:blur(2px);display:none;overflow:auto;z-index:100;padding:24px}
.mask.on{display:flex}
.modal{background:#fff;border-radius:10px;width:min(540px,100%);max-height:100%;margin:auto;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.modal .mh{padding:15px 18px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:12px}
.modal .mh h3{font-size:15px;font-weight:800}
.modal .mh .ms{font-size:11.5px;color:var(--muted);margin-top:3px;font-family:ui-monospace,Menlo,monospace}
.modal .mh .x{width:28px;height:28px;border-radius:7px;display:grid;place-items:center;color:var(--muted)}
.modal .mh .x:hover{background:#f1f3f6}
.modal .mb{padding:16px 18px;overflow-y:auto}
.modal .mf{padding:12px 18px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px;background:var(--panel)}
.modal .mf button:disabled{opacity:.6;pointer-events:none}
.mf-err{padding:8px 18px;background:var(--red-soft);color:var(--red);font-size:12px;border-top:1px solid #f0cccc}
.mf-warn{padding:8px 18px;background:var(--amber-soft);color:#8a5606;font-size:12px;border-top:1px solid var(--amber-line)}
.modal .field input.err,.modal .field textarea.err,.modal .field select.err{border-color:var(--red)!important;box-shadow:0 0 0 3px var(--red-soft)}
.role-banner{align-items:center;gap:10px;padding:9px 18px;border-bottom:1px solid var(--line2)}
.role-banner.ok{background:var(--blue-soft)}.role-banner.ro{background:var(--amber-soft)}
.role-banner .rb-t{font-weight:800;font-size:12.5px}
.role-banner.ok .rb-t{color:var(--blue-d)}.role-banner.ro .rb-t{color:var(--amber)}
.role-banner .rb-s{color:var(--sub);font-size:11.5px;margin-top:1px}
.act-off{opacity:.4;pointer-events:none;filter:grayscale(.35)}
.modal .field{margin-bottom:13px}.modal .field:last-child{margin-bottom:0}
.frow{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.origcard{border:1px solid var(--line2);border-radius:8px;background:var(--panel);padding:12px 14px;margin-bottom:14px}
.origcard .oc-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.origcard .files svg{width:13px;height:13px;opacity:.7;vertical-align:-2px}
.catsel{border:1px solid var(--line2);border-radius:6px;padding:4px 8px;font-size:12px;outline:none;background:#fff;max-width:180px}
.catsel:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.grp-row td{background:var(--panel);font-weight:800;font-size:11px;letter-spacing:.4px;color:var(--sub);padding:7px 14px}
.minicard{border:1px solid var(--line2);border-radius:8px;padding:10px 12px}
.minicard p{font-size:11.5px;color:var(--muted);margin-top:6px;line-height:1.5}
.rolevars{display:flex;flex-wrap:wrap;gap:6px}
.takeover{display:flex;gap:9px;align-items:center;background:var(--blue-soft);border:1px solid var(--blue-line);border-radius:7px;padding:9px 12px;margin-bottom:11px}
.takeover .tk-lbl{flex:none;font-size:11px;font-weight:800;color:var(--blue-d);background:#fff;border:1px solid var(--blue-line);border-radius:5px;padding:2px 7px}
.takeover .tk-txt{font-size:12.5px;color:var(--ink);line-height:1.55;flex:0 1 auto;min-width:0;white-space:pre-wrap;overflow-wrap:break-word}
.fsec-r{margin-left:auto;font-size:11px;font-weight:600;color:var(--muted)}
.profcard{border:1px solid var(--blue-line);background:var(--blue-soft);border-radius:8px;padding:11px 13px}
.profcard .pc-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:9px}
.profcard .pc-t{font-size:11.5px;font-weight:800;color:var(--blue-d)}
.profcard .pc-r{font-size:11px;color:var(--muted)}
.profcard .pc-g{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.profcard .pc-f{display:flex;flex-direction:column;gap:4px}
.profcard .pc-k{font-size:11px;color:var(--sub);font-weight:600}
.profcard .pc-opt{color:var(--faint);font-weight:500}
.profcard .pc-f input,.profcard .pc-f select{border:1px solid var(--line2);border-radius:6px;padding:5px 8px;font-size:12px;background:#fff;outline:none;width:100%}
.profcard .pc-f input:focus,.profcard .pc-f select:focus{border-color:var(--blue);box-shadow:0 0 0 3px #fff}
.profcard .pc-sub{margin-top:10px;padding-top:10px;border-top:1px dashed var(--blue-line)}
.profcard .pc-g3{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:6px}
.profcard .pc-g3 select,.profcard .pc-g3 input{border:1px solid var(--line2);border-radius:6px;padding:5px 8px;font-size:12px;background:#fff;outline:none;width:100%}
.profcard .pc-g3 select:focus,.profcard .pc-g3 input:focus{border-color:var(--blue);box-shadow:0 0 0 3px #fff}
.pick{display:flex;gap:8px;flex-wrap:wrap}
.pick .pk{flex:1;min-width:140px;display:flex;gap:8px;align-items:flex-start;border:1px solid var(--line2);border-radius:8px;padding:9px 11px;cursor:pointer}
.pick .pk:hover{background:var(--panel)}
.pick .pk input{margin-top:2px;accent-color:var(--blue);flex:none;width:auto}
.pick .pk>div{flex:1;min-width:0}
.pick .pk:has(input:checked){border-color:var(--blue-line);background:var(--blue-soft)}
.pick .pkt{font-size:12.5px;font-weight:700}
.pick .pkx{font-size:11px;color:var(--muted);margin-top:2px}

.foot{font-size:11.5px;color:var(--muted);margin-top:12px}

@media (max-width:820px){.relay{grid-template-columns:repeat(7,108px);overflow-x:auto}}
@media (max-width:1080px){
  .app{grid-template-columns:1fr}
  .side{position:fixed;left:-240px;transition:.2s;z-index:60;box-shadow:0 0 40px rgba(0,0,0,.2)}
  .side.open{left:0}
  .dwrap,.two{grid-template-columns:1fr}
  .dleft{border-right:0;border-bottom:1px solid var(--line2)}
  .rc,.rc.rc{position:static}
  .menu{display:grid!important}
  /* 中宽（768-1080）收窄标题地板：.tcut 的 max-width 是标题列 min-content 硬地板（280→200），
     换取语义类 nowrap 后表格少横滚甚至不横滚；悬停 tooltip 仍看全文；≤768 卡片视图
     max-width:none 不受影响 */
  .tcut{max-width:200px}
}
.menu{display:none}

/* ============================================================
   以上：V2 原型样式逐字平移（仅删除未迁移视图专用块：
   drawers/tryb、phone、map/mapc）。
   以下：V3 拆分新增段 —— 布局修正 + 响应式 + 新组件。
   规则：只追加、不回改上方存量声明。
   ============================================================ */

/* ---- 布局修正：PC 铺满（原型限宽 1360 且未居中，宽屏右侧留白） ---- */
.content{max-width:1720px;margin:0 auto}

/* ---- 宽屏 ≥1600：详情/双栏右栏等比放宽，避免左肥右瘦 ---- */
@media (min-width:1600px){
  .dwrap{grid-template-columns:minmax(0,1fr) 440px}
  .two{grid-template-columns:minmax(0,1fr) 400px}
}

/* ---- 通用新组件 ---- */
/* 矩阵型宽表容器：移动端容器内横滚，页面主体不横滚 */
.tblwrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tblwrap>.dt{min-width:560px}
/* 无权动作原因汇总行（规格 5.5：禁用按钮必须给原因，触屏无 hover 也能看到） */
.act-reason{font-size:12px;color:var(--muted);margin-top:8px;line-height:1.5}
/* 轻提示 */
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(6px);background:#20242e;color:#fff;font-size:12.5px;padding:9px 16px;border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.25);z-index:300;opacity:0;pointer-events:none;transition:.18s ease-out;max-width:calc(100vw - 32px)}
.toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
/* 登录页（无侧栏独立布局） */
.login-wrap{min-height:100vh;display:grid;place-items:center;padding:24px 16px;background:var(--bg)}
.login-card{width:min(400px,100%)}
/* 详情页移动端底部固定操作栏（桌面隐藏） */
.actbar{display:none}

/* ---- 修正：.dwrap{overflow:hidden} 会成为 .rc{sticky;top:60px} 的包含滚动容器，
        右栏被永久下推 60px 且吸顶从未生效（原型隐性问题）。
        overflow:clip 同样裁切圆角，但不建立滚动容器：右栏顶对齐、滚动时正常吸顶 ---- */
.dwrap{overflow:clip}

/* ---- 修正：塌单列后 1fr 的 min-width=auto 会被 .relay(756px) 等宽内容顶开，
        溢出部分被 .dwrap overflow 裁掉（原型隐性问题）。
        用 minmax(0,1fr) 让列可压缩，宽内容在自身容器内横滚 ---- */
@media (max-width:1080px){
  .dwrap,.two{grid-template-columns:minmax(0,1fr)}
  .dleft,.dwrap>.rc{min-width:0}
}

/* ---- 移动主断点 ≤768（720 旧断点规则已被本段覆盖，原样保留在上方） ---- */
@media (max-width:768px){
  .content{padding:14px 12px 84px}
  .top{padding:0 12px;gap:10px}
  .search{display:none}
  .rolep .rlbl{display:none}
  /* 顶栏防挤压：面包屑单行省略；密度切换收起；视角下拉限宽 */
  .crumbs{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px}
  .crumbs b{display:inline}
  .densw{display:none}
  .rolep select{max-width:44vw}
  .form,.typepick,.g2,.g3,.frow,.profcard .pc-g,.profcard .pc-g3{grid-template-columns:1fr}
  .stats{flex-wrap:wrap}
  .stat{flex:1 1 50%;min-width:50%;border-top:1px solid var(--hair)}
  .stat:nth-child(-n+2){border-top:0}
  .stat:nth-child(odd){border-left:0}
  .subnav{display:flex;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}
  .subnav button{white-space:nowrap}
  /* 筛选栏：搜索框独占一行；分段按钮保持完整文字（禁竖排压缩），放不下换行 */
  .filterbar{flex-wrap:wrap;padding-bottom:4px}
  .fsearch{flex:1 1 100%;min-width:0}
  .filterbar .fl{display:none}
  .fseg{flex:none;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
  .fseg button{white-space:nowrap;flex:none}
  .fcount{white-space:nowrap;margin-left:auto;font-size:11px;color:var(--muted)}
  /* 触控目标 */
  .btn{height:38px;padding:0 14px;font-size:13px}
  .btn.sm{height:34px;padding:0 12px;font-size:12px}
  .ibtn{width:36px;height:36px}
  .field input,.field select{min-height:40px}
  .rc-comp .post{height:36px}
  .mask{padding:12px}
  /* 表格卡片化：行=实体的表加 .rsp，td 渲染时带 data-label */
  .dt.rsp thead{display:none}
  .dt.rsp tr{display:block;border-bottom:1px solid var(--line2);padding:10px 14px}
  .dt.rsp tr:last-child{border-bottom:0}
  .dt.rsp td{display:flex;gap:10px;padding:3px 0;border:0}
  .dt.rsp td::before{content:attr(data-label);flex:none;width:76px;font-size:11px;color:var(--muted);padding-top:2px}
  .dt.rsp td.card-title{display:block;font-size:13.5px}
  .dt.rsp td.card-title::before{display:none}
  .dt.rsp td:not([data-label]):not(.card-title)::before{display:none}
  .dt.rsp td .tcut{max-width:none;white-space:normal}   /* 卡片视图标题保持换行完整显示 */
  .tblwrap>.dt.rsp{min-width:0}   /* 卡片视图豁免 560px 表格下限：块级堆叠不需要最小画布，留着=整组卡片横滚（存量病，随中宽修复一并治） */
  /* 详情页：底部固定操作栏接管主动作，卡内按钮区隐藏防双份 */
  .actbar{display:flex;gap:8px;position:fixed;left:0;right:0;bottom:0;z-index:50;background:rgba(255,255,255,.96);backdrop-filter:blur(8px);border-top:1px solid var(--line);padding:8px 12px calc(8px + env(safe-area-inset-bottom))}
  .actbar .btn{flex:1;height:44px;font-size:13.5px;justify-content:center}
  .dact .bt{display:none}
  /* 登记页（批D）：步骤条紧凑（副文案在 375px 下会把首屏挤掉一大块）+ 提交栏底部固定（.actbar 同款；
     .content 自带 84px 底衬不遮内容） */
  .stepband{gap:6px}
  .stepband .sb{padding:7px 8px}
  .stepband .sb p{display:none}
  .regbar{position:fixed;left:0;right:0;bottom:0;z-index:50;background:rgba(255,255,255,.96);backdrop-filter:blur(8px);border-top:1px solid var(--line);padding:8px 12px calc(8px + env(safe-area-inset-bottom));margin-top:0!important}
  .regbar .btn{height:44px}
  .regbar .btn.pri{flex:1;justify-content:center}
  .regbar .hint{display:none}   /* 草稿状态字在固定栏里挤占按钮，移动端隐藏 */
}
/* dl 拆分时间控件（Y2）：date+时/分下拉。显式压掉 .field input/select 的 width:100%
   （settings.js 勾选框同源坑——通用宽度规则会把行内小控件撑成整行） */
.dlrow{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.dlrow input,.dlrow select{width:auto;flex:none}
.dlrow input[type=date]{flex:1;min-width:130px}
.dlsep{color:var(--muted);font-weight:600}
.dtin{height:32px;padding:0 8px;border:1px solid var(--line2);border-radius:7px;background:#fff;font:inherit;font-size:12.5px;color:var(--ink)}
/* 列表筛选条（Y3 公共组件 App.listFilter） */
.lfbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
