
  :root{
    /* v4 暖中性 + 深青主色(与下方 1009 行 v2 令牌块保持一致,后者生效) */
    --ink:#2a2823; --ink2:#55524a; --muted:#837d70;
    --paper:#f6f4ef; --panel:#ffffff; --hover:#efebe1;
    --rule:#e7e3d9; --rule2:#d6d0c2;
    --blue:#2f6772; --blue-bg:#e3eceb;
    --halt:#bd4142; --review:#a05e10; --pass:#2c7a4b;
    --mono:"SFMono-Regular",ui-monospace,Menlo,monospace;
    --serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; /* 去衬线,沿用变量名 */
    --side:224px;
  }
  *{box-sizing:border-box}
  body{margin:0;background:var(--panel);color:var(--ink);font:13px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;-webkit-font-smoothing:antialiased;
       display:grid;grid-template-columns:var(--side) 1fr;grid-template-rows:52px 1fr;height:100vh;overflow:hidden}
  a{color:var(--blue);text-decoration:none}
  /* 左侧栏 */
  aside.side{grid-row:1/3;grid-column:1;background:var(--paper);border-right:1px solid var(--rule);overflow:auto;padding:14px 0}
  aside .brandmark{font-size:14px;font-weight:700;padding:2px 18px 14px;color:var(--ink)}
  aside nav{display:flex;flex-direction:column;gap:1px;border:0;background:transparent;padding:0}
  aside nav a{padding:8px 18px;font-size:13px;color:var(--ink2);cursor:pointer;border-left:2px solid transparent;margin:0}
  aside nav a:hover{background:var(--hover);color:var(--ink)}
  aside nav a.on{background:var(--blue-bg);color:var(--blue);border-left-color:var(--blue);font-weight:600}
  aside nav .navgrp{padding:12px 18px 3px;font-size:11px;color:var(--ink2);opacity:.75;letter-spacing:2px;user-select:none}
  aside nav .navgrp:first-child{padding-top:4px}
  /* 机会队列批量操作条与弹窗 */
  .oppsel{width:14px;height:14px;cursor:pointer;vertical-align:middle}
  .oppbatch{position:sticky;top:0;z-index:5;display:flex;gap:8px;align-items:center;background:var(--blue-bg);border:1px solid var(--blue);border-radius:6px;padding:7px 12px;margin:8px 0;font-size:13px}
  .oppbatch .cnt{font-weight:600;color:var(--blue);margin-right:4px}
  .oppbatch button{font-size:12px;padding:4px 10px}
  .oppbatch button.danger{color:var(--halt);border-color:var(--halt)}
  .oppact{display:flex;gap:6px;margin-top:10px;flex-wrap:wrap}
  .oppact button{font-size:12px;padding:4px 10px}
  .oppact button.danger{color:var(--halt);border-color:var(--halt)}
  .oppmodal-scrim{position:fixed;inset:0;background:rgba(32,29,25,.45);z-index:60;display:flex;align-items:center;justify-content:center}
  .oppmodal{background:var(--card,#fff);border-radius:10px;padding:20px 22px;min-width:340px;max-width:460px;box-shadow:0 12px 40px rgba(0,0,0,.22)}
  .oppmodal h3{margin:0 0 12px;font-size:15px}
  .oppmodal .fld2{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;font-size:13px}
  .oppmodal .fld2 span{color:var(--ink2);font-size:12px}
  .oppmodal input,.oppmodal select,.oppmodal textarea{padding:6px 8px;border:1px solid var(--rule);border-radius:5px;font-size:13px;font-family:inherit}
  .oppmodal textarea{min-height:56px;resize:vertical}
  .oppmodal .btns{display:flex;gap:8px;justify-content:flex-end;margin-top:14px}
  .oppnote{font-size:12px;color:var(--ink2);margin-top:6px}
  .sumlist{margin:6px 0 0;padding-left:18px;color:var(--ink2);font-size:12px;line-height:1.7}
  /* 异常证据面板 */
  .anmrow{cursor:pointer}
  .anmrow.open{background:var(--blue-bg)}
  .anmevbox{padding:12px 6px}
  .anmevgrid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
  .anmevsec .anmevt{font-size:12px;color:var(--ink2);margin-bottom:6px;letter-spacing:.5px}
  /* 死码已删:.anmspark 高 120px 版被 v3 定版段(.anmspark 高 132px)属性超集覆盖 */
  .anmimp,.anmcoh,.anmsib{font-size:13px;line-height:1.7}
  @media (max-width:900px){ .anmevgrid{grid-template-columns:1fr} }
  .oppvcard,.lkevbox,.rqevbox,.oppsummary,.anmdetail{border:1px solid var(--rule);background:var(--paper);border-radius:6px;padding:12px;margin:8px 0}
  .oppvhead,.lkevhead,.rqevhead{display:flex;gap:10px;align-items:baseline;flex-wrap:wrap;margin-bottom:8px}
  .oppvtitle,.lkevtitle,.rqevtitle{font-family:var(--serif);font-weight:650;font-size:15px}
  .oppvrule{color:var(--ink2);font-size:12px}
  .oppvgrid,.lkevgrid,.rqevgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 14px}
  .oppvitem,.lkevitem,.rqevitem{font-size:13px;min-width:0}
  .oppvitem b,.lkevitem b,.rqevitem b{color:var(--ink2);font-weight:500;margin-right:4px}
  .oppvline,.lkevline,.rqevline{margin-top:8px;font-size:13px}
  .oppvline .p1pill{margin-right:5px}
  .oppsummary{background:var(--panel);font-size:13px}
  .oppsummary .sumrow{margin:4px 0;line-height:1.6}
  .rqrow.open,.lkevmain.open{background:var(--blue-bg)}
  .lkevrow td,.rqevrow td{background:var(--panel)}
  .lksnippet{margin-top:10px;border-top:1px solid var(--rule);padding-top:10px}
  .lksnippet code{display:block;background:var(--panel);border:1px solid var(--rule);padding:7px 8px;border-radius:5px;white-space:pre-wrap;word-break:break-word;margin-top:5px}
  .lkevacts,.rqevacts,.anmevacts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}
  .rqbatch .cnt,.samplebar .cnt{font-weight:600;color:var(--blue)}
  @media (max-width:900px){ .oppvgrid,.lkevgrid,.rqevgrid{grid-template-columns:1fr} }
  /* 顶栏 */
  header.topbar{grid-column:2;grid-row:1;display:flex;align-items:center;gap:16px;padding:0 22px;background:var(--paper);border-bottom:1px solid var(--rule)}
  .controls{margin-left:auto;display:flex;gap:12px;align-items:center;flex-wrap:wrap}
  .fld{display:flex;flex-direction:column;gap:2px}
  .fld>span{font-size:9px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
  /* 顶栏控件单行对齐:品牌标签改行内,全部控件统一 32px 高(浮动小标签把块撑高造成错位) */
  .controls .fld{flex-direction:row;align-items:center;gap:6px}
  .controls .fld>span{font-size:12.5px;text-transform:none;letter-spacing:0;color:var(--ink2)}
  .controls select,.controls button{height:32px;box-sizing:border-box}
  .controls .fld select{width:118px} /* 定宽防加载跳动:初始只有"全部"选项,站点列表载入后按最长项(soundcore)重排会抖 */
  .controls .whoami{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
  select,input{font:13px/1.4 inherit;color:var(--ink);background:var(--paper);border:1px solid var(--rule);padding:5px 8px;border-radius:6px}
  select:focus,input:focus{outline:0;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-bg)}
  input[type=checkbox]{width:15px;height:15px}
  button{font:13px inherit;cursor:pointer;background:var(--paper);color:var(--ink);border:1px solid var(--rule);border-radius:6px;padding:5px 12px}
  button:hover{background:var(--hover)} button.primary{background:var(--blue);color:#fff;border-color:var(--blue)} button.primary:hover{background:var(--blue-deep)}
  button:disabled{opacity:.4;cursor:default}
  .meta{font-size:12px;color:var(--muted)}
  .whoami{font-size:13px;color:var(--ink2)} .whoami b{color:var(--ink);font-weight:600}
  .rolebadge{font-size:10px;padding:1px 7px;border-radius:10px;border:1px solid var(--blue);color:var(--blue);margin-left:4px}
  .rolebadge.member{border-color:var(--rule);color:var(--muted)}
  button.ghost{background:transparent;color:var(--muted)}
  .main{grid-column:2;grid-row:2;overflow:auto;background:var(--panel)}
  .page{display:none} .page[hidden]{display:none!important} .page.on{display:block}

  /* 总览 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .flow{display:flex;gap:0;flex-wrap:wrap;border:1px solid var(--rule2)}
  .stp{flex:1;min-width:150px;border-right:1px solid var(--rule);padding:14px 16px}
  .stp:last-child{border-right:0}
  .stp .si{font-family:var(--mono);font-size:10px;color:var(--ink2)}
  .stp .sn{font-family:var(--serif);font-size:17px;margin:3px 0 8px}
  .stp .nums{font-family:var(--mono);font-size:12px;color:var(--ink2);line-height:1.7}
  .stp .pend{color:var(--halt);font-weight:600}
  .stp.has-pend{box-shadow:inset 4px 0 0 var(--halt)}
  .ovh{font-family:var(--serif);font-size:18px;margin:0 0 12px}
  .taskstat{display:flex;gap:22px;margin:18px 0 0;font-family:var(--mono);font-size:13px}
  .taskstat b{font-size:20px;font-family:var(--serif)}
  .hint{color:var(--ink2);font-size:13px;margin:14px 0 0;max-width:80ch}

  /* 任务 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .tform{border:1px solid var(--rule2);padding:18px 20px;margin-bottom:22px;max-width:920px}
  .tform h3{font-family:var(--serif);font-size:17px;margin:0 0 14px}
  .trow{display:flex;gap:26px;flex-wrap:wrap;align-items:flex-end;margin-bottom:14px}
  .trow .fld{gap:4px}
  .trow label.ck{display:flex;gap:7px;align-items:center;font-size:13px;color:var(--ink)}
  .st{font-family:var(--mono);font-size:11px;padding:1px 7px;border:1px solid currentColor;white-space:nowrap}
  .st-待执行{color:var(--ink2)} .st-执行中{color:var(--review)} .st-待复核{color:var(--halt)} .st-已完成{color:var(--pass)} .st-失败{color:var(--halt)} .st-已取消{color:var(--ink2)}

  /* 裁决 */
  #page-review{display:none} #page-review.on{display:grid;grid-template-columns:320px 1fr;height:calc(100vh - 102px)}
  #clusters{overflow:auto;border-right:1px solid var(--rule2);background:var(--panel)}
  .cl{display:grid;grid-template-columns:38px 1fr;padding:13px 16px 13px 0;border-bottom:1px solid var(--rule);cursor:pointer}
  .cl:hover{background:var(--paper)} .cl.active{background:var(--paper)}
  .cl .no{font-family:var(--mono);font-size:11px;color:var(--ink2);text-align:center;padding-top:3px} .cl.active .no{color:var(--halt)}
  .cl .gid{font-family:var(--serif);font-size:15px;line-height:1.25;word-break:break-word} .cl.active .gid{text-decoration:underline;text-underline-offset:3px}
  .cl .sub{font-family:var(--mono);font-size:11px;color:var(--ink2);margin-top:5px;display:flex;gap:14px} .b-halt{color:var(--halt)}
  #detail{overflow:auto}
  .dhead{position:sticky;top:0;background:var(--panel);border-bottom:2px solid var(--rule2);padding:16px 28px;z-index:2}
  .dhead h2{margin:0;font-family:var(--serif);font-size:20px;word-break:break-word}
  .dhead .ksub{font-family:var(--mono);font-size:11px;color:var(--ink2);margin-top:4px}
  .batchbar{margin-top:13px;display:flex;gap:12px;align-items:center;flex-wrap:wrap} .batchbar .note{color:var(--ink2);font-size:12px}
  .item{border-bottom:1px solid var(--rule);padding:18px 28px}
  .item .top{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap}
  .item .lab{font-family:var(--serif);font-weight:600;font-size:17px}
  .v-need_review{color:var(--review)} .v-halt{color:var(--halt)} .v-auto_pass{color:var(--pass)}
  .aligned{font-family:var(--mono);font-size:11px;color:var(--ink2)}
  .axes{display:grid;grid-template-columns:repeat(3,1fr);margin:14px 0;border:1px solid var(--rule2)}
  .ax{padding:9px 13px;border-right:1px solid var(--rule)} .ax:last-child{border-right:0}
  .ax .t{font-family:var(--mono);font-size:9px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink2)}
  .ax .val{font-family:var(--mono);font-size:14px;margin-top:5px;word-break:break-word}
  .ax.ok{box-shadow:inset 3px 0 0 var(--pass)} .ax.ok .val{color:var(--pass)} .ax.no{box-shadow:inset 3px 0 0 var(--halt)} .ax.no .val{color:var(--halt)}
  .halt-reasons{margin:10px 0 2px}
  .hr{font-family:var(--mono);font-size:11px;color:var(--halt);border:1px solid var(--halt);padding:1px 6px;margin:0 6px 5px 0;display:inline-block}
  details.ev summary{cursor:pointer;font-family:var(--mono);font-size:11px;color:var(--ink2);margin-top:11px}
  pre.kv{background:var(--panel);border:1px solid var(--rule);padding:10px 12px;overflow:auto;font-family:var(--mono);font-size:12px;margin:8px 0 0}
  .actions{margin-top:14px;display:flex;gap:10px;align-items:center;flex-wrap:wrap} .actions .reason{flex:1;min-width:180px;border-bottom:1px solid var(--rule)}
  button.approve{border-color:var(--pass);color:var(--pass)} button.approve:hover{background:var(--pass);color:var(--paper)}
  button.reject{border-color:var(--halt);color:var(--halt)} button.reject:hover{background:var(--halt);color:var(--paper)}
  button.correct{border-color:var(--ink2);color:var(--ink2)} button.correct:hover{background:var(--ink2);color:var(--paper)}
  .corr{margin-top:12px;border:1px solid var(--rule2);padding:12px 14px;display:none;background:var(--panel)} .corr.open{display:block}
  .corr .fr{display:flex;gap:10px;align-items:center;margin:5px 0} .corr label{width:180px;font-family:var(--mono);font-size:11px;color:var(--ink2)} .corr input,.corr select{flex:1}
  .done{opacity:.4} .done .actions{display:none}
  /* 死码已删:.empty 衬线斜体版的 5 条属性被下方 SaaS 皮肤段的 .empty 逐条覆盖 */

  /* 意图集群 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .clintro{color:var(--ink2);font-size:13px;margin:0 0 16px;max-width:92ch}
  .clintro b{color:var(--ink)}
  .cluster{border:1px solid var(--rule2);margin-bottom:22px;background:var(--panel)}
  .cluster>.ch{display:flex;gap:16px;align-items:baseline;flex-wrap:wrap;padding:13px 16px;border-bottom:1px solid var(--rule)}
  .cluster .topic{font-family:var(--serif);font-size:18px;font-weight:600}
  .cluster .cmeta{font-family:var(--mono);font-size:11px;color:var(--ink2);display:flex;gap:14px;flex-wrap:wrap}
  .ccfm{margin-left:auto;display:flex;gap:7px;align-items:center;font-size:12px;color:var(--ink2)}
  .curl{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:10px 16px;border-bottom:1px solid var(--rule);background:var(--paper);font-size:13px}
  .curl .lbl{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink2);white-space:nowrap}
  .curl a.ln{color:var(--ink);text-decoration:underline;text-underline-offset:2px;word-break:break-all}
  .curl .src{font-family:var(--mono);font-size:10px;color:var(--ink2);border:1px solid var(--rule);padding:0 5px;white-space:nowrap}
  .curl .src.brand_ranked{color:var(--pass);border-color:var(--pass)} .curl .src.manual{color:var(--halt);border-color:var(--halt)}
  .clstate{margin-left:auto;font-size:12px;color:var(--ink2);white-space:nowrap}
  .kwreadonly{font-size:12px;color:var(--ink2);white-space:nowrap}
  .kwreadonly.ok{color:var(--pass);font-weight:600}
  .kwev{border:1px solid var(--rule);background:var(--panel);border-radius:8px;padding:10px 12px;margin:0 0 12px}
  .kwev h4{margin:0 0 8px !important;border:0 !important;padding:0 !important;color:var(--ink) !important;text-transform:none !important;letter-spacing:0 !important;font-size:13px !important;font-family:inherit !important}
  .kwevgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px 12px}
  .kwevitem{font-size:12px;min-width:0;word-break:break-word}
  .kwevitem b{display:block;font-size:10px;color:var(--muted);font-family:var(--mono);font-weight:500;margin-bottom:2px}
  .kwdacts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:8px 0 4px}
  .kwdacts input{font-size:12px;min-width:220px;flex:1}
  .urlbox{display:flex;gap:8px;align-items:center;flex-wrap:wrap;flex:1;min-width:260px}
  .urlbox input{flex:1;min-width:220px;border-bottom:1px solid var(--rule);font-family:var(--mono);font-size:12px}
  .reco{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:7px;width:100%}
  .reco .rl{font-family:var(--mono);font-size:9px;color:var(--ink2);text-transform:uppercase}
  .reco .rc{font-family:var(--mono);font-size:11px;border:1px solid var(--rule);padding:2px 7px;cursor:pointer;color:var(--ink2)}
  .reco .rc:hover{border-color:var(--ink);color:var(--ink)}
  tr.kwrow{cursor:pointer} tr.kwrow:hover{background:var(--paper)} tr.kwrow.open{background:var(--paper)}
  .tw{font-family:var(--serif);font-size:15px}
  .twi{font-family:var(--mono);font-size:10px;color:var(--ink2);margin-right:5px}
  .eurl{font-family:var(--mono);font-size:11px;word-break:break-all} .eurl a{color:var(--ink)} .eurl.inh{color:var(--ink2)} .eurl.inh a{color:var(--ink2)}
  td.cfm{text-align:center}
  .kwdetail>td{background:var(--paper);padding:0}
  .kwd{padding:16px 20px;border-top:1px solid var(--rule2)}
  .kwdcol{display:grid;grid-template-columns:1.3fr 1fr;gap:22px}
  @media(max-width:980px){.kwdcol{grid-template-columns:1fr}}
  .kwd h4{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink2);margin:0 0 9px;border-bottom:1px solid var(--rule);padding-bottom:4px}
  .serprow{display:flex;gap:9px;padding:6px 0;border-bottom:1px dotted var(--rule)}
  .serprow .rk{font-family:var(--mono);font-size:11px;color:var(--ink2);width:18px;flex-shrink:0}
  .serprow .body{flex:1;min-width:0}
  .serprow .t{font-size:12.5px;line-height:1.35;font-weight:600} .serprow .t a{color:var(--ink);text-decoration:none} .serprow .t a:hover{text-decoration:underline}
  .serprow .host{font-family:var(--mono);font-size:10px;color:var(--ink2)}
  .serprow .surl{font-size:11px;line-height:1.3;margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .serprow .surl a{color:var(--blue);text-decoration:none} .serprow .surl a:hover{text-decoration:underline}
  .serprow .smeta{display:flex;align-items:center;gap:6px;margin-top:2px;flex-wrap:wrap}
  .serprow .ptype{font-size:10px;color:var(--ink2);background:var(--panel);border:1px solid var(--rule);border-radius:4px;padding:0 5px}
  .serprow .cbadge{font-size:10px;color:#fff;background:var(--halt);border-radius:4px;padding:0 6px;font-weight:600}
  .serprow.comphit{box-shadow:inset 3px 0 0 var(--halt)} .serprow.comphit .host{color:var(--halt)}
  /* 「看内容」展开:SERP 头部页面的内容骨架(db/100 il_serp_page_content)。
     没采到的结果压根不出 <details>,所以这里不需要任何空态样式 —— 按钮在即有内容。
     用原生 details/summary 而不是自己搭折叠:零 JS、零状态、键盘可达,行数据本来就一次发全。 */
  .serprow .scdet{margin-top:3px}
  .serprow .scdet>summary{font-size:11px;color:var(--blue);cursor:pointer;list-style:none;width:fit-content}
  .serprow .scdet>summary::-webkit-details-marker{display:none}
  .serprow .scdet>summary::before{content:"▸ ";font-size:9px}
  .serprow .scdet[open]>summary::before{content:"▾ "}
  .serprow .scbody{margin:3px 0 4px;padding:6px 8px;background:var(--panel);border:1px solid var(--rule);border-radius:4px}
  .serprow .scbody .scl{font-size:10px;color:var(--ink2);font-family:var(--mono)}
  .serprow .scbody .scv{font-size:11.5px;line-height:1.4;margin-bottom:4px;word-break:break-word}
  .serprow .scbody ul{margin:2px 0 4px;padding-left:15px}
  .serprow .scbody li{font-size:11.5px;line-height:1.45}
  .serprow .scbody li ul{margin:1px 0 1px;padding-left:14px}
  .serprow .scbody li li{font-size:11px;color:var(--ink2)}
  .mcpdesc{color:var(--ink2);font-size:13px;line-height:1.6;margin:6px 0 14px;max-width:760px}
  .mcpbox{background:var(--panel);border:1px solid var(--rule);border-radius:10px;padding:12px 14px;margin:0 0 14px}
  .mcpbox-h{font-size:12px;font-weight:600;color:var(--ink2);margin-bottom:8px}
  .mcpep{font-family:var(--mono);font-size:12.5px;color:var(--ink);background:var(--paper);border:1px solid var(--rule);border-radius:6px;padding:4px 8px;display:inline-block}
  .mcpform{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
  .mcpform input{padding:6px 9px;border:1px solid var(--rule);border-radius:7px;font-size:13px}
  .mcpform input#mcpname{flex:1;min-width:220px}
  .mcpnew{margin-top:12px;border-top:1px dashed var(--rule);padding-top:10px}
  .mcpnew-h{font-size:11px;font-weight:600;color:var(--review);margin:8px 0 5px}
  .mcptok{display:flex;gap:8px;align-items:center;background:var(--paper);border:1px solid var(--rule);border-radius:7px;padding:6px 9px}
  .mcptok code{font-family:var(--mono);font-size:12px;color:var(--ink);overflow-wrap:anywhere;word-break:break-word;flex:1;line-height:1.5}
  .mcptbl code{font-family:var(--mono);font-size:11px;color:var(--ink2)}
  .mcptbl .muted{color:var(--ink2);text-align:center}
  .mcpinfo{border:1px solid var(--rule);border-radius:10px;margin:0 0 14px;background:var(--paper)}
  .mcpinfo>summary{cursor:pointer;padding:11px 14px;font-size:13px;font-weight:600;color:var(--ink);list-style:none}
  .mcpinfo>summary::-webkit-details-marker{display:none}
  .mcpinfo>summary::before{content:"▸ ";color:var(--ink2)} .mcpinfo[open]>summary::before{content:"▾ "}
  .mcpinfo-b{padding:0 16px 14px}
  .mcpinfo-b h4{font-size:12.5px;color:var(--ink);margin:14px 0 6px}
  .mcpinfo-b p{font-size:13px;line-height:1.65;color:var(--ink2);margin:0}
  .mcpinfo-b ul{margin:0;padding-left:18px} .mcpinfo-b li{font-size:13px;line-height:1.7;color:var(--ink2)}
  .mcpinfo-b li b{color:var(--ink);font-family:var(--mono);font-size:12px}
  .mcpcols{display:flex;gap:16px;flex-wrap:wrap;margin-top:8px}
  .mcpcol{flex:1;min-width:240px;border:1px solid var(--rule);border-radius:8px;padding:6px 13px 10px}
  .mcpcol.can{background:#ecf4ee;border-color:#c2ddc9} .mcpcol.cant{background:#faf0ee;border-color:#ebcfca}
  .mcpcol.can h4{color:var(--pass)} .mcpcol.cant h4{color:var(--halt)}
  .mcpcli{margin:9px 0} .mcpcli-h{font-size:11px;font-weight:600;color:var(--ink2);margin:0 0 4px}
  .mcptok code.pre{white-space:pre-wrap;line-height:1.55}
  .serprow .desc{font-size:11px;color:var(--ink2);margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .serprow.brandhit{box-shadow:inset 3px 0 0 var(--pass)} .serprow.brandhit .host{color:var(--pass)}
  .complist{max-height:300px;overflow:auto;border:1px solid var(--rule);border-radius:8px}
  .comprow{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-bottom:1px solid var(--rule)} .comprow:last-child{border-bottom:0}
  .aio{border:1px solid var(--review);background:var(--review-bg);padding:10px 12px;margin:0 0 12px;font-size:13px;line-height:1.55}
  .aio .tag{font-family:var(--mono);font-size:9px;color:var(--review);text-transform:uppercase;letter-spacing:.1em;display:block;margin-bottom:5px}
  .paa{list-style:none;margin:0;padding:0} .paa li{padding:5px 0;border-bottom:1px dotted var(--rule);font-size:12px}
  .paa li .q{font-weight:600} .paa li .a{color:var(--ink2);display:block;margin-top:2px}
  .onsite-stub{color:var(--ink2);font-style:italic;font-size:12px;padding:6px 0}
  .kwurl{margin-top:6px}

  /* 说明 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  #page-guide h2{font-family:var(--serif);font-size:22px;margin:0 0 6px}
  #page-guide h3{font-family:var(--serif);font-size:18px;margin:26px 0 8px;border-bottom:1px solid var(--rule);padding-bottom:5px}
  #page-guide p{margin:8px 0;color:var(--ink)} #page-guide .muted{color:var(--ink2)}
  #page-guide code{font-family:var(--mono);font-size:12px;background:var(--panel);border:1px solid var(--rule);padding:1px 5px}
  #page-guide ol{padding-left:22px} #page-guide li{margin:6px 0}

  .toast{position:fixed;right:20px;bottom:20px;background:var(--ink);color:#fff;padding:10px 16px;font-size:13px;opacity:0;transition:opacity .2s;max-width:60ch;border-radius:8px;font-family:inherit} .toast.show{opacity:1}

  /* ===== SaaS 皮肤覆盖(参考常规数据工具外观)===== */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .clintro{font-family:inherit;color:var(--ink2)}
  /* 卡片白底圆角细边 */
  .cluster{background:var(--paper);border:1px solid var(--rule);border-radius:10px;box-shadow:0 1px 2px rgba(42,40,35,.04);overflow:hidden}
  .cluster>.ch{padding:12px 16px;border-bottom:1px solid var(--rule)}
  .cluster .topic{font-family:inherit;font-size:15px;font-weight:600}
  .cluster .cmeta{font-family:inherit;font-size:12px;color:var(--muted)}
  .curl{background:var(--panel);border-bottom:1px solid var(--rule)}
  .curl .lbl{font-family:inherit;letter-spacing:0;font-size:11px;text-transform:none;color:var(--muted)}
  .curl a.ln{color:var(--blue);text-decoration:none}
  .curl .src{font-family:inherit;border-radius:10px;background:var(--paper);font-size:11px;padding:1px 8px;color:var(--ink2);border:1px solid var(--rule)}
  .curl .src.brand_ranked{color:var(--pass);border-color:#c2ddc9;background:var(--pass-bg)}
  .curl .src.manual{color:var(--review);border-color:#e6d8ae;background:var(--review-bg)}
  .curl .src.ai_reasoned{color:var(--blue);border-color:var(--blue-soft);background:var(--blue-bg)}
  .curl .src.needs_human{color:var(--halt);border-color:#ebcfca;background:var(--halt-bg)}
  .curl .src.verified{color:var(--pass);border-color:#c2ddc9;background:var(--pass-bg)}
  .twi.vrf{color:var(--pass);font-weight:600}
  .curl .rsn{font-size:11px;color:var(--muted);margin-top:3px;width:100%}
  /* 数据表 */
  /* 固定列宽,展开详情不再挤动列宽抖动 */
  .main{scrollbar-gutter:stable}
  table.kwt{table-layout:fixed}
  table.kwt td{word-break:break-word}
  table.kwt th:nth-child(1),table.kwt td:nth-child(1){width:26%}
  table.kwt th:nth-child(2),table.kwt td:nth-child(2){width:10%}
  table.kwt th:nth-child(3),table.kwt td:nth-child(3){width:8%}
  table.kwt th:nth-child(4),table.kwt td:nth-child(4){width:38%}
  table.kwt th:nth-child(5),table.kwt td:nth-child(5){width:6%}
  table.kwt th:nth-child(6),table.kwt td:nth-child(6){width:12%}
  td.cmt .kcmt{width:100%;font-size:12px;padding:3px 6px;border:1px solid var(--rule);border-radius:5px;background:var(--paper)}
  td.cmt .kcmt:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-bg)}
  .rc .sc{color:var(--pass);font-weight:700;margin-right:4px}
  tr.kwrow:hover{background:var(--hover)} tr.kwrow.open{background:var(--blue-bg)}
  .tw{font-family:inherit;font-size:13px;font-weight:500;color:var(--ink)}
  .twi{font-family:var(--mono);color:var(--muted)}
  .eurl{font-family:inherit;font-size:12px} .eurl a{color:var(--blue)} .eurl.inh a{color:var(--ink2)}
  /* 意图色块 */
  /* .bdg.navigational 是意图分类色(非状态语义),用 --mark 一族,与成功/警告/失败三色区分 */
  .bdg.navigational{background:var(--mark-bg);color:var(--mark)}
  /* 裁决 chip */
  .v{font-family:inherit;border:0;border-radius:5px;padding:1px 8px;font-size:11px;font-weight:600}
  .v-auto_pass{background:var(--pass-bg);color:var(--pass)} .v-need_review{background:var(--review-bg);color:var(--review)} .v-halt{background:var(--halt-bg);color:var(--halt)}
  /* KD 彩点 */
  .kddot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:middle}
  /* 集群头 */
  .ccfm{font-family:inherit;font-size:12px;color:var(--ink2)}
  /* 展开详情 */
  .kwdetail>td{background:var(--panel)} .kwd{border-top:1px solid var(--rule)}
  .kwd h4{font-family:inherit;text-transform:none;letter-spacing:0;font-size:12px;font-weight:600;color:var(--ink);border-bottom:1px solid var(--rule)}
  .serprow .t a{color:var(--blue)} .serprow .host{font-family:inherit;color:var(--pass)}
  .serprow .desc{font-family:inherit}
  .aio{background:#faf4e2;border-color:#e9dbb6;border-radius:8px;color:var(--ink)} .aio .tag{color:var(--review)}
  /* 站内 GSC 表 */
  .gsctot{font-size:12px;color:var(--ink);margin:2px 0 6px} .gsctot b{font-weight:700}
  table.gsct td.gu{width:100%;min-width:280px} table.gsct td.gu a{color:var(--blue);overflow-wrap:anywhere;font-size:11px}
  /* 确认筛选条 + 已确认表 */
  .filterbar{display:flex;gap:8px;align-items:center;margin:0 0 14px;flex-wrap:wrap}
  .filterbar .fl{font-size:12px;color:var(--muted);margin-right:2px}
  .fbtn{font-size:12px;padding:4px 12px;border:1px solid var(--rule);border-radius:16px;background:var(--paper);color:var(--ink2);cursor:pointer}
  .fbtn:hover{border-color:var(--ink2)} /* 死码已删:.fbtn.on 蓝底白字版被 v3 段 .fbtn.on 属性超集覆盖 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .lnsum{font-size:12px;color:var(--muted);margin:0 0 12px;display:flex;gap:14px;flex-wrap:wrap;align-items:center}
  .lnsum .kpi-good{color:var(--pass);font-weight:600} .lnsum .kpi-bad{color:var(--halt);font-weight:600} .lnsum .kpi-mut{color:var(--muted)} .lnsum .kpi-amber{color:var(--review);font-weight:600}
  /* 死码已删:.ilseg 下划线版的 6 条属性被 v3 定版段 .ilseg(胶囊版)的 border/padding 简写覆盖。
     同段 .ilseg-b 保留:v3 段没有 cursor/margin-bottom,删了会掉 1px 与手型光标。 */
  .ilseg-b{font-size:13px;padding:7px 16px;border:none;border-bottom:2px solid transparent;background:none;color:var(--ink2);cursor:pointer;margin-bottom:-1px}
  .exb{font-size:12px;padding:5px 12px;border:1px solid var(--blue);border-radius:8px;background:var(--blue);color:#fff;cursor:pointer}
  .exb.ghost{background:transparent;color:var(--blue)}
  .exb:hover{opacity:.9}
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .perfcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:14px 0}
  .perfcard{background:var(--paper);border:1px solid var(--rule);border-radius:12px;padding:12px 14px}
  .perfcard .pcl{font-size:12px;color:var(--muted)} .perfcard .pcv{font-size:24px;font-weight:700;color:var(--ink);margin-top:4px} .perfcard .pcs{font-size:12px;color:var(--ink2);margin-top:2px}
  .perfsec{margin:18px 0} .perfsec h3{font-size:14px;font-weight:600;color:var(--ink);margin:0 0 8px}
  table.perft th,table.perft td{padding:6px 10px} .perft .num{font-variant-numeric:tabular-nums} .perft tr.cmoff{opacity:.5} .perft .opx{white-space:nowrap} .perft .opx button+button{margin-left:8px}
  .tblwrap table.lkt.perft th,.tblwrap table.lkt.perft td{padding:4px 10px;vertical-align:middle}
  .perft .opx button{min-height:26px;padding:2px 10px;font-size:12px}
  .perfsec h3 .expbtn{margin-left:10px;font-size:12px;font-weight:400;min-height:26px;padding:2px 10px;vertical-align:2px}
  .cmadd{display:flex;gap:8px;margin-bottom:10px;flex-wrap:wrap}
  .cmadd input{padding:6px 10px;border:1px solid var(--rule);border-radius:8px;font-size:13px} .cmadd input#cm-dom,.cmadd input#ex-dom{min-width:200px}
  .cmadd button{padding:6px 14px;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:8px;cursor:pointer;font-size:13px}
  .ilseg-b.on{color:var(--blue);border-bottom-color:var(--blue);font-weight:600}
  .ilseg-b .segn{font-size:11px;background:var(--panel);border-radius:9px;padding:0 6px;color:var(--ink2)}
  .ilseg-b.on .segn{background:var(--blue-bg);color:var(--blue)}
  .ilfbar{display:flex;gap:8px;align-items:center;margin:0 0 14px;flex-wrap:wrap}
  .ilfbar .fl{font-size:12px;color:var(--muted)}
  .ilfbar select{font-size:12px;padding:3px 6px;border:1px solid var(--rule);border-radius:5px}
  .ilfbar #ilf-q{flex:1;min-width:200px;padding:5px 10px;border:1px solid var(--rule);border-radius:6px;font-size:13px}
  .ilfbar .alf{font-size:12px;color:var(--muted)}
  details.lk.leak{border-top:1px solid #ebcfca;background:#faf3f1} details.lk.leak>summary{color:var(--halt)}
  .bredir{font-size:11px;padding:2px 10px;border:1px solid var(--halt);background:#fff;color:var(--halt);border-radius:4px;cursor:pointer} .bredir:hover{background:var(--halt-bg)}
  .plancard{border:1px solid var(--rule);border-radius:10px;margin-bottom:10px;background:var(--paper)}
  .plancard .lh{border-bottom:none}
  .plancard .topic{font-size:13px;font-weight:600;color:var(--ink)}
  .planacts{display:flex;gap:8px;padding:0 14px 11px}
  .planacts .pconf{font-size:12px;padding:4px 14px;background:var(--pass);color:#fff;border:none;border-radius:6px;cursor:pointer} .planacts .pconf:disabled{opacity:.4;cursor:default}
  .planacts .pgoto{font-size:12px;padding:4px 12px;background:#fff;color:var(--blue);border:1px solid var(--rule);border-radius:6px;cursor:pointer}
  .ltarget{border:1px solid var(--rule);border-radius:10px;margin-bottom:14px;background:var(--paper);overflow:hidden}
  .lh{display:flex;align-items:center;gap:10px;padding:11px 14px;border-bottom:1px solid var(--rule);flex-wrap:wrap}
  .lh .ln{color:var(--blue);font-size:13px;font-weight:500;word-break:break-all}
  .lh-tgl{cursor:pointer} .lh-tgl:hover{background:var(--panel)}
  .lh .cmeta{display:inline-flex;gap:12px;flex-wrap:wrap;margin-left:auto}
  .lh-tgl .tgl{color:var(--muted);font-size:11px;width:12px;flex:none}
  .ltarget.folded{margin-bottom:8px} .ltarget.folded .lh{border-bottom:none}
  .act-keep{background:#efece5;color:var(--ink2)}
  details.lk summary .muted2{font-weight:400;color:var(--muted);font-size:11px;margin-left:8px}
  .iladdrow{padding:8px 14px;border-top:1px solid var(--rule)}
  .iladd{font-size:12px}
  .kwline{padding:7px 14px;display:flex;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--rule);background:var(--panel)}
  .kwchip{font-size:11px;color:var(--ink2);background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:1px 8px}
  .cnt-bad{color:var(--halt);font-weight:600} .cnt-act{color:var(--blue);font-weight:600}
  /* 待修正动作的运营反馈,跟在原因下面,颜色与坏内链一致以示需要上游处理 */
  .fixnote{margin-top:4px;font-size:11px;line-height:1.5;color:var(--halt);white-space:normal;overflow-wrap:anywhere}
  details.lk{border-top:1px solid var(--rule)} details.lk summary{padding:8px 14px;cursor:pointer;font-size:12px;color:var(--ink2);user-select:none}
  details.lk[open]>summary{font-weight:600}
  table.lkt{border-collapse:collapse;width:100%;font-size:12px;margin:0 0 6px}
  table.lkt th{background:transparent;font-size:10px;color:var(--muted);text-align:left;padding:6px 14px;border-bottom:1px solid var(--rule2);font-weight:500}
  table.lkt td{padding:6px 14px;border-bottom:1px solid var(--rule);vertical-align:top}
  table.lkt td.num,table.lkt th.num{font-family:var(--mono);text-align:right;white-space:nowrap} table.lkt a{color:var(--blue);word-break:break-all}
  table.lkt td.anc{font-family:var(--mono);color:var(--review);white-space:nowrap} table.lkt td.flow{font-size:11px} table.lkt td.rsncell{color:var(--muted);font-size:11px}
  .rkwbar #rkwq{flex:1;min-width:260px;padding:6px 10px;border:1px solid var(--rule);border-radius:6px;font-size:13px}
  .rkwfilters{margin-bottom:12px}
  .rkwfilters select{font-size:12px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px;min-width:120px}
  table.rkwt{table-layout:fixed;min-width:1120px}
  table.rkwt th,table.rkwt td{padding:7px 8px;vertical-align:middle}
  table.rkwt th.num,table.rkwt td.num{font-variant-numeric:tabular-nums}
  table.rkwt th:nth-child(1){width:3%}
  table.rkwt th:nth-child(2){width:15%}
  table.rkwt th:nth-child(3){width:7%}
  table.rkwt th:nth-child(4){width:5%}
  table.rkwt th:nth-child(5){width:5%}
  table.rkwt th:nth-child(6){width:5%}
  table.rkwt th:nth-child(7){width:5%}
  table.rkwt th:nth-child(8){width:6%}
  table.rkwt th:nth-child(9){width:4%}
  table.rkwt th:nth-child(10){width:38%}
  table.rkwt th:nth-child(11){width:7%}
  .rkwt .selc{text-align:center}
  .rkwt .selc input{width:14px;height:14px;cursor:pointer;vertical-align:middle}
  .rkwkw{font-weight:600;color:var(--ink)}
  .rkwkw .kwcopy{cursor:default}
  .rkwtagcell{display:flex;gap:4px;flex-wrap:wrap}
  .tagchip.sm{font-size:10px;padding:1px 7px;margin:1px 3px 1px 0}
  .rkwintent{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;border-radius:5px;font-size:11px;font-weight:700;margin-right:4px}
  .rkwintent.i,.rkwintent.informational{background:var(--blue-soft);color:var(--blue)}
  .rkwintent.n,.rkwintent.navigational{background:var(--mark-bg);color:var(--mark)}
  .rkwintent.c,.rkwintent.commercial{background:#f3e3b8;color:var(--review)}
  .rkwintent.t,.rkwintent.transactional{background:var(--pass-bg);color:var(--pass)}
  .rkwurl{font-size:12px;line-height:1.35;white-space:normal;word-break:break-word}
  .rkwurl a{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  table.rkwt td:nth-child(11){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .rkwdate{font-family:var(--mono);font-size:11px;color:var(--muted);white-space:nowrap}
  table.lkt td.kwc{white-space:nowrap} table.lkt td.kwc .tw{font-weight:600;color:var(--ink)}
  table.lkt td.kwc .cov{white-space:normal;font-size:10px;color:var(--muted);margin-top:3px;max-width:180px}
  .optgrp{margin:0 0 10px} .opth{font-size:11px;font-weight:600;color:var(--ink2);padding:5px 0 3px;border-bottom:1px solid var(--rule);margin-bottom:2px}
  label.okck{font-size:11px;color:var(--ink2);white-space:nowrap;cursor:pointer}
  td.opx{white-space:nowrap} td.opx .dnflag{font-size:11px;color:var(--go,var(--pass));margin-right:6px}
  button.bstat{font-size:11px;padding:3px 9px;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:4px;cursor:pointer}
  button.bstat.ghost{background:transparent;color:var(--muted);border-color:var(--rule);margin-left:5px}
  table.lkt.done{opacity:.72}
  .tnav{font-family:var(--mono);font-size:11px;color:var(--ink2);background:var(--paper);padding:1px 5px;border:1px solid var(--rule);border-radius:3px}
  .act{font-size:11px;font-weight:600;padding:1px 7px;border-radius:5px;white-space:nowrap}
  .act-add{background:var(--pass-bg);color:var(--pass)} .act-modify{background:var(--blue-bg);color:var(--blue)} .act-delete{background:var(--halt-bg);color:var(--halt)}
  .ctx{margin-top:4px;font-size:11px;color:var(--ink2);line-height:1.5;background:var(--panel);border-left:2px solid var(--rule);padding:4px 8px;border-radius:0 4px 4px 0;max-width:560px}
  .ctx .hla{color:var(--review);background:var(--review-bg)}
  .ctx.sug{border-left-color:var(--pass);background:#ecf4ee;color:var(--ink);position:relative;padding-right:106px} .ctx.sug .hla{color:var(--pass);background:var(--pass-bg)}
  .ctx-acts{position:absolute;top:4px;right:4px;display:flex;gap:4px;opacity:0;transition:opacity .15s}
  .ctx.sug:hover .ctx-acts,.ctx.sug.editing .ctx-acts{opacity:1}
  .ctx-acts button{font-size:10px;padding:1px 7px;border-radius:3px;border:1px solid var(--pass);background:#fff;color:var(--pass);cursor:pointer;white-space:nowrap}
  .ctx-acts button:hover{background:#ecf4ee}
  .ctx-ta{width:100%;min-height:56px;font-size:11px;margin:4px 0;border:1px solid var(--pass);border-radius:4px;padding:4px 6px;resize:vertical;box-sizing:border-box;font-family:inherit;line-height:1.5}
  .ctx-inline-acts{display:flex;gap:6px;margin-top:4px}
  .ctx-save{font-size:10px;padding:2px 10px;background:var(--pass);color:#fff;border:none;border-radius:3px;cursor:pointer}
  .ctx-save:disabled{opacity:.5;cursor:default}
  .ctx-cancel-btn{font-size:10px;padding:2px 8px;background:#fff;color:var(--pass);border:1px solid var(--pass);border-radius:3px;cursor:pointer}
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .albar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px}
  .albar #alq{flex:1;min-width:240px;padding:6px 10px;border:1px solid var(--rule);border-radius:6px;font-size:13px}
  .albar .alf{font-size:12px;color:var(--muted)} .albar select{font-size:12px;padding:3px 6px;border:1px solid var(--rule);border-radius:5px}
  .albar .alinfo{font-size:12px;color:var(--muted);margin-left:auto}
  /* 连体分段控件(全部链接 .altab / 链接结构 .lsfb 原为逐字相同的两套,已并)。
     选中态原写 var(--accent,var(--accent)) —— 自引用 fallback,等于没有 fallback,
     且 --accent 是 v2 暖青 #2f6772,与同页其余 .on 的冷青对不上,统一到 --blue。 */
  .altabs,.lsfbs{display:inline-flex;border:1px solid var(--rule);border-radius:7px;overflow:hidden}
  .altab,.lsfb{font-size:12px;padding:5px 12px;border:0;background:transparent;color:var(--muted);cursor:pointer;min-height:auto;line-height:1.4}
  .altab.on,.lsfb.on{background:var(--blue);color:#fff}
  .altab+.altab,.lsfb+.lsfb{border-left:1px solid var(--rule)}
  .lkt .chgo{color:var(--halt);text-decoration:line-through;opacity:.75}
  .lkt .chgn{color:var(--pass)}
  .qm{display:inline-flex;align-items:center;justify-content:center;width:13px;height:13px;border-radius:50%;background:var(--rule);color:var(--ink2);font-size:9px;font-weight:700;margin-left:4px;cursor:help;vertical-align:1px}
  .msmid{color:var(--review)} .msbad{color:var(--halt);font-weight:600}
  /* 链接视图平铺表:勾选列最前+固定列宽,锚文本可换行限宽压低行高 */
  .ilflatbar{display:flex;align-items:center;gap:10px;padding:8px 14px;border-bottom:1px solid var(--rule)}
  .ilflatbar .ln-bapprove{font-size:12px}
  table.flatt{table-layout:fixed;min-width:1450px}  /* 列宽走 colgroup,含勾选列与否都不错位 */
  table.flatt td.ckc,table.flatt th.ckc{text-align:center;padding-left:10px;padding-right:2px}
  table.flatt td.anc{white-space:normal;word-break:break-word;max-width:none;color:var(--review)}
  table.flatt td.flow{display:table-cell;border:0}
  table.flatt td{padding:5px 10px;overflow-wrap:break-word}
  table.flatt td.kwc{white-space:normal}
  table.flatt .opx{white-space:nowrap} table.flatt .opx button+button{margin-left:6px}
  /* 链接视图可排序列头:可点击,当前排序列加深指示(箭头由渲染层拼进标题文字) */
  table.flatt th.ilsort{cursor:pointer;user-select:none;white-space:nowrap}
  table.flatt th.ilsort:hover,table.flatt th.ilsort.on{color:var(--ink)}
  /* 异常表:对象列放宽,数字列窄,操作列固定 */
  /* B-09:窄视口下 table-layout:fixed 会把"严重度/成因/状态"的徽标挤到压住曝光数字。
     给最小宽度,宽度不够时由 .tblwrap 的 overflow 横向滚动,而不是让列互相重叠。 */
  table.anmt{table-layout:fixed;min-width:920px}
  table.anmt th,table.anmt td{padding:6px 10px;overflow-wrap:break-word}
  table.anmt th.num,table.anmt td.num,table.urlt2 th.num,table.urlt2 td.num{text-align:center;font-variant-numeric:tabular-nums}
  table.anmt .opx{white-space:normal} table.anmt .opx button{margin-right:4px}
  table.anmu th:nth-child(1){width:32%} table.anmu th:nth-child(2){width:30%}
  table.anmu th:nth-child(3){width:8%} table.anmu th:nth-child(4){width:8%}
  table.anmu th:nth-child(5){width:7%} table.anmu th:nth-child(6){width:9%}
  table.anmk th:nth-child(1){width:28%} table.anmk th:nth-child(2){width:42%}
  table.anmk th:nth-child(3){width:9%} table.anmk th:nth-child(4){width:12%}
  .anmexpacts{padding:6px 14px 0}
  table.anmt tr.anmrow{cursor:pointer} table.anmt tr.anmrow:hover td{background:var(--panel)}
  .anmexpwrap{padding:12px 16px 16px;display:flex;flex-direction:column;gap:10px;background:var(--panel);border-top:2px solid var(--blue-bg)}
  .anmexpwrap .anmevbox{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:14px 16px}
  .anmexpwrap details.diagx{margin:0}
  .anmexpwrap .diagbox{max-width:none}
  .anmtech{font-size:11.5px;color:var(--ink2);font-family:var(--mono);display:flex;gap:14px;flex-wrap:wrap;background:var(--paper);border:1px solid var(--rule);border-radius:8px;padding:7px 12px}
  .anmtech span{white-space:nowrap}
  .anmevgrid.one{grid-template-columns:1fr}
  .anmexpacts{padding:0}
  /* 超常表 */
  .posup{color:var(--pass);font-weight:600}
  table.urlt2 tr.hlrow{cursor:pointer} table.urlt2 tr.hlrow:hover td{background:var(--panel)}
  .aio .aiohit{background:var(--info-bg);color:var(--info);padding:0 2px;border-radius:3px}
  .aio.aiobrand{border:1px solid var(--blue-soft)}
  .aio .aiotext{margin-top:4px}
  .aio .aiotext.clamped{max-height:132px;overflow:hidden;position:relative}
  .aio .aiotext.clamped::after{content:'';position:absolute;left:0;right:0;bottom:0;height:34px;background:linear-gradient(transparent,#faf4e2)}
  .aio .aiotgl{display:block;margin-top:6px;font-size:11px;padding:2px 10px;border:1px solid var(--rule);border-radius:5px;background:var(--paper);cursor:pointer}
  .aio .aioh{font-weight:700;margin:6px 0 2px} .aio .aiop{margin:4px 0} .aio .aioli{margin:2px 0 2px 10px}
  .aio .aiorefs{margin-top:8px;display:flex;gap:6px;flex-wrap:wrap;align-items:center}
  .aio .aioref{font-size:11px;padding:1px 8px;border:1px solid #e6d8ae;border-radius:10px;background:#fbf8ec;color:var(--ink2);text-decoration:none}
  .aio .aioref .aiohit{background:var(--info-bg)}
  /* 任务清单达成率进度条 */
  .ptbar{position:relative;background:var(--rule);border-radius:8px;height:16px;min-width:90px;overflow:hidden}
  .ptbar .ptfill{height:100%;background:#7fa8ad;border-radius:8px}
  .ptbar .ptfill.full{background:var(--pass)}
  .ptbar span{position:absolute;left:0;right:0;top:0;text-align:center;font-size:10.5px;font-weight:600;color:var(--ink);line-height:16px}
  table.ptt{table-layout:fixed} table.ptt td{overflow-wrap:break-word}
  table.ptt .opx button{margin-right:4px}
  /* 数据表现三表固定列宽,数字列居中收窄 */
  table.pfa,table.pfb,table.pfc{table-layout:fixed}
  table.pfa td.num,table.pfb td.num,table.pfc td.num,table.pfa th.num,table.pfb th.num,table.pfc th.num{text-align:center}
  table.pfa th:nth-child(1){width:40%}
  .perfgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
  .perfgrid .perfsec{margin:0}
  @media(max-width:1200px){.perfgrid{grid-template-columns:1fr}}
  .perfgrid table.perft th,.perfgrid table.perft td{padding:5px 10px}
  table.pfb th:nth-child(1){width:26%} table.pfb th:nth-child(2){width:12%} table.pfb th:nth-child(3){width:18%} table.pfb th:nth-child(4){width:14%}
  table.pfc th:nth-child(1){width:34%} table.pfc th:nth-child(2){width:12%} table.pfc th:nth-child(3){width:20%}
  table.urlt td.num,table.urlt th.num{text-align:center}
  .auditbox{padding:12px 14px;border-bottom:1px solid var(--rule);background:var(--paper)}
  .auditscore{display:flex;align-items:center;gap:10px;margin-bottom:8px} .auditscore .scorebdg{font-size:15px;padding:3px 12px}
  .auditlab{font-size:12.5px;color:var(--ink2);font-weight:600}
  .auditlist{display:flex;flex-direction:column;gap:6px;margin:6px 0 10px}
  .audititem{display:flex;align-items:baseline;gap:8px;font-size:12.5px;flex-wrap:wrap}
  .audititem b{flex:none} .auditdetail{color:var(--ink2)}
  .auditok{color:var(--pass)}
  .auditstates{margin-top:6px} .auditts{display:block;color:var(--muted);font-size:11px}
  .cwall{display:inline-block;padding:0 6px;border-radius:9px;background:var(--blue-bg);color:var(--blue);font-size:10px;font-weight:600;font-family:-apple-system,sans-serif;vertical-align:1px}
  .pcchk{font-size:12px;color:var(--muted);display:inline-flex;align-items:center;gap:4px;cursor:pointer}
  .pcver{display:inline-block;min-width:20px;padding:1px 6px;border-radius:10px;background:#f2dc9a;color:var(--review);font-weight:600}
  .lscards{display:flex;gap:12px;margin:0 0 12px;flex-wrap:wrap}
  .lscard{flex:1;min-width:110px;border:1px solid var(--rule);border-radius:8px;padding:10px 14px;text-align:center}
  .lscard b{display:block;font-size:22px;line-height:1.25}
  .lscard span{font-size:12px;color:var(--muted)}
  .lscard.amber b{color:var(--review)}
  .lsdist{font-size:12px;color:var(--muted);margin:0 0 12px;display:flex;gap:14px;flex-wrap:wrap}
  .lsdist .dgood{color:var(--pass)} .lsdist .dwarn{color:var(--review)} .lsdist .dbad{color:var(--halt)}
  table.alt td.ty{font-size:11px;color:var(--muted)} table.alt td.anc2{font-family:var(--mono);font-size:11px;color:var(--ink2);max-width:260px;word-break:break-word}
  .urlasof{font-size:12px;color:var(--muted);display:flex;gap:14px;flex-wrap:wrap;margin:0 0 10px}
  .urlbar{display:flex;gap:8px;align-items:center;margin:0 0 14px;flex-wrap:wrap}
  .urlbar select{font-size:12px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px}
  .urlbar input{flex:1;min-width:240px;padding:6px 10px;border:1px solid var(--rule);border-radius:6px;font-size:13px}
  table.urlt{table-layout:fixed;min-width:1390px}
  /* 14列:URL/页型/状态/索引/Google收录/Sitemap/标注/体检分/上新/内容更新/点击/曝光/均位/GA */
  table.urlt th:nth-child(1),table.urlt td:nth-child(1){width:320px}
  table.urlt th:nth-child(2),table.urlt td:nth-child(2){width:60px}
  table.urlt th:nth-child(3),table.urlt td:nth-child(3){width:95px}
  table.urlt th:nth-child(4),table.urlt td:nth-child(4){width:70px}
  table.urlt th:nth-child(5),table.urlt td:nth-child(5){width:105px}
  table.urlt th:nth-child(6),table.urlt td:nth-child(6){width:75px}
  table.urlt th:nth-child(7),table.urlt td:nth-child(7){width:120px}
  table.urlt th:nth-child(8),table.urlt td:nth-child(8){width:65px}
  table.urlt th:nth-child(9),table.urlt td:nth-child(9){width:85px}
  table.urlt th:nth-child(10),table.urlt td:nth-child(10){width:85px}
  table.urlt th:nth-child(11),table.urlt td:nth-child(11){width:90px}
  table.urlt th:nth-child(12),table.urlt td:nth-child(12){width:75px}
  table.urlt th:nth-child(13),table.urlt td:nth-child(13){width:65px}
  table.urlt th:nth-child(14),table.urlt td:nth-child(14){width:75px}
  table.urlt tr.urlrow{cursor:pointer}
  table.urlt tr.urlrow:hover{background:var(--hover)}
  table.urlt tr.urlrow.open{background:var(--blue-bg)}
  .urlcell a{font-weight:500;word-break:break-all}
  .urltitle{font-size:11px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .urlsrc{font-size:11px;color:var(--muted);margin-top:2px}
  /* URL 生命周期状态:语义映射见文件末段规范表;canonical_other 属分类色(--mark)不属失败 */
  .urlst.urlst-active{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}
  .urlst.urlst-no_exposure{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)}
  .urlst.urlst-noindex{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
  .urlst.urlst-fetch_error{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}
  .urlst.urlst-redirected{background:var(--mark-bg);color:var(--mark);border-color:var(--mark-line)}
  .urlst.urlst-canonical_other{background:var(--mark-bg);color:var(--mark);border-color:var(--mark-line)}
  .urlst.urlst-unknown{background:var(--mute-bg);color:var(--muted);border-color:var(--mute-line)}
  .lostdot{width:7px;height:7px;border-radius:50%;background:var(--halt);display:inline-block;flex:0 0 auto}
  /* URL 人工标注(重复页/停产页)。生效标注用实色,待确认建议用虚线弱化 —— 建议不排除优化,视觉上要一眼区分 */
  /* td 在 table-layout:auto 下 max-width 不生效,必须靠内层 div 限宽,否则 chip 会溢出压到相邻列 */
  /* table-layout:auto 会把这列压到内容最窄,主页面末段就被省略号吃掉;min-width 给出下限,max-width 防它抢宽 */
  .utgcell{min-width:122px}
  .utgwrap{min-width:118px;max-width:180px;display:flex;flex-wrap:wrap;gap:2px 4px;align-items:center}
  .utg.utg-duplicate{background:var(--mark-bg);color:var(--mark);border-color:var(--mark-line)}.utg.utg-discontinued{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}.utg.utg-excluded{background:var(--mute-bg);color:var(--ink2);border-color:var(--mute-line)}
  .utg.pend{background:var(--paper);color:var(--muted);border:1px dashed var(--rule);font-weight:500}
  /* 主页面独占一行(flex-basis:100%),整行省略号,不挤 chip 也不外溢 */
  .utgpri{flex:0 0 100%;font-family:var(--mono);font-size:10px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .ilseg-b .segn.pend{background:var(--paper);color:var(--muted);border:1px dashed var(--rule);margin-left:4px}
  /* .urlbar input 那条规则(flex:1;min-width:240px)会把复选框撑成输入框大小并挤到换行,须显式复位 */
  .urlbar input[type="checkbox"]{flex:0 0 auto;min-width:0;width:13px;height:13px;padding:0;margin:0 5px 0 0;border-radius:3px}
  .urlbar label.alf{display:inline-flex;align-items:center;white-space:nowrap;cursor:pointer}
  .utgbox{border:1px solid var(--rule);border-radius:8px;padding:10px 12px;margin:0 0 12px;background:var(--paper)}
  .utghead{font-size:12px;font-weight:600;color:var(--ink2);margin-bottom:8px}
  .utgitem{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;padding:5px 0;border-bottom:1px dashed var(--rule)}
  .utgitem:last-of-type{border-bottom:0}
  .utgsrc{font-size:10px;color:var(--muted);background:var(--panel);border-radius:4px;padding:0 5px}
  .utgpend{font-size:10px;color:var(--review);background:var(--review-bg);border-radius:4px;padding:0 5px}
  .utgline{font-size:11px;color:var(--ink2)}.utgline a{font-family:var(--mono);font-size:11px}
  .utgform{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:9px}
  .utgform select{font-size:12px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px}
  .utgpriinp{font-size:12px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px;min-width:300px;font-family:var(--mono)}
  .utgadd,.utgok{font-size:12px;padding:4px 12px;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:6px;cursor:pointer}
  .utgadd:disabled{opacity:.5;cursor:default}
  .utgx{font-size:11px;padding:2px 8px;border:1px solid var(--rule);background:var(--paper);color:var(--muted);border-radius:6px;cursor:pointer}
  .utgx:hover{border-color:var(--halt);color:var(--halt)}
  .utghint{font-size:11px;color:var(--muted)}
  .urldelta{font-size:11px;margin-left:4px}.urldelta.up{color:var(--pass)}.urldelta.down{color:var(--halt)}.urldelta.flat{color:var(--muted)}
  .urldhead{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;margin:0 0 14px}
  .urldhead h2{font-size:16px;margin:0 0 4px;font-weight:600;word-break:break-all}
  .urldmeta{font-size:12px;color:var(--muted);line-height:1.7}
  .urlsourcegrid{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0 14px}
  .urlsourcegrid .srcitem{font-size:11px;color:var(--ink2);background:var(--paper);border:1px solid var(--rule);border-radius:6px;padding:5px 8px}
  .urlcharts{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:12px 0 18px}
  .urlchart{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:10px 12px;min-width:0}
  .urlchart h3,.urlsec h3{font-size:13px;font-weight:600;margin:0 0 8px;color:var(--ink)}
  .urlchart svg{width:100%;height:auto;display:block}
  .urllegend{font-size:11px;color:var(--muted);display:flex;gap:12px;flex-wrap:wrap;margin-top:5px}
  .urlsec{margin:16px 0}
  .urlexp>td{background:var(--panel);padding:0}
  .urlexpbox{border-top:1px solid var(--rule);padding:14px 16px 16px}
  .urlexphead{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 10px;flex-wrap:wrap}
  .urlexphead .twi{word-break:break-all}
  .urllivegrid{display:grid;grid-template-columns:minmax(240px,.9fr) minmax(280px,1.1fr);gap:12px;margin:0 0 12px}
  .urltdk,.urllivechart{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:10px 12px;min-width:0}
  .urltdk h3,.urllivechart h3,.urlliveq h3{font-size:13px;font-weight:600;margin:0 0 8px;color:var(--ink)}
  .tdkrow{display:grid;grid-template-columns:92px 1fr auto;gap:8px;padding:6px 0;border-bottom:1px solid var(--rule);align-items:start}
  .tdkrow:last-child{border-bottom:0}
  .tdkrow .lab{font-size:12px;color:var(--muted)}
  .tdkrow .val{font-size:12px;word-break:break-word}
  .tdkrow .cnt{font-family:var(--mono);font-size:11px;color:var(--muted);white-space:nowrap}
  .urllivecharts{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:0 0 12px}
  .urlliveq{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:10px 12px}
  .urlliveerr{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:12px;color:var(--ink2);display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap}
  .urllivefoot{display:flex;gap:10px;align-items:center;justify-content:flex-end;margin-top:10px}
  @media(max-width:820px){.urllivegrid,.urllivecharts{grid-template-columns:1fr}.tdkrow{grid-template-columns:1fr}.tdkrow .cnt{white-space:normal}}
  @media(max-width:900px){.urlcharts{grid-template-columns:1fr} table.urlt{table-layout:auto}}
  /* 「未规划」是中性起点不是失败,收敛前染成失败红(存量语义错) */
  .kst.kst-unplanned{background:var(--mute-bg);color:var(--muted);border-color:var(--mute-line)} .kst.kst-planned{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)} .kst.kst-confirmed{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)} .kst.kst-brand{background:var(--mark-bg);color:var(--mark);border-color:var(--mark-line)} .kst.kst-library,.kst.kst-candidate{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
  table.cfmt td.eurl a{color:var(--blue);word-break:break-all;font-size:12px}
  .paa li .q{font-weight:600}
  .reco .rc{font-family:inherit;border-radius:10px;font-size:11px;border:1px solid var(--rule)} .reco .rl{font-family:inherit;color:var(--muted)}
  .urlbox input{font-family:var(--mono);border:1px solid var(--rule);border-radius:6px;padding:5px 8px}
  /* 总览 */
  .flow{border:1px solid var(--rule);border-radius:10px;overflow:hidden;background:var(--paper)}
  .stp{border-right:1px solid var(--rule)} .stp .sn{font-family:inherit;font-size:15px;font-weight:600} .stp .si{font-family:inherit;color:var(--muted)} .stp .nums{font-family:inherit}
  .stp.has-pend{box-shadow:inset 3px 0 0 var(--halt)}
  .ovh{font-family:inherit;font-size:16px;font-weight:600} .taskstat{font-family:inherit} .taskstat b{font-family:inherit}
  .hint{font-family:inherit}
  .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;margin:0 0 18px}
  .kpi{border:1px solid var(--rule);border-radius:10px;padding:12px 14px;background:var(--paper);display:flex;flex-direction:column;gap:3px}
  .kpi b{font-size:22px;font-weight:600;color:var(--ink);line-height:1.1}
  .kpi b.kpi-good{color:var(--pass)} .kpi b.kpi-bad{color:var(--halt)} .kpi b.kpi-amber{color:var(--review)}
  .kpi span{font-size:11px;color:var(--muted)}
  .ovsec{margin:0 0 18px} .ovsec-h{font-size:12px;color:var(--muted);margin:0 0 8px;font-weight:600}
  .ovfunnel .ovstp{cursor:pointer;transition:box-shadow .12s} .ovfunnel .ovstp:hover{box-shadow:inset 0 -3px 0 var(--blue)} .ovfunnel .ovstp .nums b{font-size:18px;font-weight:600;color:var(--ink)}
  table.ovtop td.num,table.ovtop th.num{text-align:right;font-variant-numeric:tabular-nums}
  .ovgo{font-size:11px;padding:3px 12px;background:var(--blue);color:#fff;border:none;border-radius:5px;cursor:pointer} .ovgo:hover{opacity:.9}
  .ovpipe{margin-top:6px;border:1px solid var(--rule);border-radius:10px;overflow:hidden} .ovpipe>summary{padding:10px 14px;cursor:pointer;font-size:12px;color:var(--ink2);user-select:none} .ovpipe[open]>summary{font-weight:600;border-bottom:1px solid var(--rule)} .ovpipe .flow{border:none;border-radius:0} .ovpipe .taskstat{padding:10px 14px;margin:0}
  /* 任务 */
  .tform{border:1px solid var(--rule);border-radius:10px;background:var(--paper)} .tform h3{font-family:inherit;font-size:15px;font-weight:600}
  .st{font-family:inherit;border-radius:5px;border:0;padding:1px 8px;background:var(--panel)}
  /* 裁决页适配新布局 */
  #page-review.on{height:calc(100vh - 52px)}
  #clusters{background:var(--paper)} .cl .gid{font-family:inherit;font-size:14px} .cl .no,.cl .sub{font-family:inherit}
  .dhead{background:var(--paper)} .dhead h2{font-family:inherit;font-size:17px;font-weight:600} .dhead .ksub{font-family:inherit}
  .item .lab{font-family:inherit;font-size:15px} .axes{border-radius:8px;overflow:hidden}
  .hr{font-family:inherit;border-radius:5px} pre.kv{font-family:var(--mono);border-radius:6px}
  /* 说明 */
  #page-guide h2,#page-guide h3{font-family:inherit} #page-guide code{font-family:var(--mono);border-radius:4px}

  /* 流水线看板 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .pbar{display:flex;align-items:center;gap:12px;margin:0 0 14px;flex-wrap:wrap}
  .pbar .ptitle{font-size:16px;font-weight:600}
  .pboard{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;align-items:start}
  .pcol{background:var(--panel);border:1px solid var(--rule);border-radius:10px;display:flex;flex-direction:column;max-height:calc(100vh - 180px)}
  .pcolh{padding:11px 14px;border-bottom:1px solid var(--rule);font-weight:600;font-size:13px;display:flex;align-items:center;gap:8px}
  .pcolh .cnt{font-family:var(--mono);font-size:12px;color:var(--muted);font-weight:500}
  .pcolh .dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
  .pcol.s-imported .dot{background:var(--review)} .pcol.s-clustered .dot{background:var(--blue)} .pcol.s-confirmed .dot{background:var(--pass)}
  .pcards{overflow:auto;padding:10px;display:flex;flex-direction:column;gap:8px}
  .pcard{background:var(--paper);border:1px solid var(--rule);border-radius:9px;padding:10px 12px}
  .pcard .kw{font-weight:600;font-size:13px;color:var(--ink);word-break:break-word}
  .pcard .meta{font-family:var(--mono);font-size:11px;color:var(--muted);margin-top:3px;display:flex;gap:10px;flex-wrap:wrap}
  .pcard .intent{font-size:11px;color:var(--ink2);margin-top:4px;word-break:break-word}
  .pcard .pacts{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;align-items:center}
  .pcard .pacts button{font-size:11px;padding:3px 9px;border-radius:6px}
  .pcard .pacts select{font-size:11px;padding:3px 6px;border-radius:6px;max-width:150px}
  .pbtn-go{border-color:var(--pass);color:var(--pass)} .pbtn-go:hover{background:var(--pass);color:#fff}
  .pbtn-x{border-color:var(--rule);color:var(--muted)} .pbtn-x:hover{color:var(--halt);border-color:var(--halt)}
  .parch{margin-top:14px} .parch summary{cursor:pointer;color:var(--muted);font-size:12px}
  .parch .pcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px}
  .pmodal{position:fixed;inset:0;background:rgba(32,29,25,.42);display:none;align-items:center;justify-content:center;z-index:50}
  .pmodal.on{display:flex}
  .pmbox{background:#fff;border-radius:12px;padding:20px 22px;width:560px;max-width:92vw;box-shadow:0 20px 60px rgba(0,0,0,.25)}
  .pmbox h3{margin:0 0 4px;font-size:16px} .pmbox .hint{color:var(--muted);font-size:12px;margin:0 0 12px}
  .pmbox textarea{width:100%;height:200px;border:1px solid var(--rule);border-radius:8px;padding:10px;font:12px/1.5 var(--mono);resize:vertical}
  .pmbox .row{display:flex;gap:10px;justify-content:flex-end;margin-top:12px;align-items:center}
  .pmbox .res{color:var(--ink2);font-size:12px;margin-right:auto}
  /* 监测词展开详情:2 栏(左 SERP / 右 SEMrush+GSC)+ canvas 图 + hover tooltip */
  /* 三栏:左 GSC/GA 图 · 中 SERP · 右 AIO */
  .kwd3{display:grid;grid-template-columns:minmax(360px,1.05fr) minmax(380px,1.05fr) minmax(260px,0.9fr);gap:18px;align-items:start}
  .kwd3>*{min-width:0}
  @media(max-width:1180px){.kwd3{grid-template-columns:1fr 1fr}}
  @media(max-width:760px){.kwd3{grid-template-columns:1fr}}
  .kwdc-charts,.kwdc-serp{border-right:1px solid var(--rule);padding-right:16px}
  @media(max-width:1180px){.kwdc-serp{border-right:0;padding-right:0} .kwdc-aio{grid-column:1/-1;border-top:1px solid var(--rule);padding-top:10px}}
  @media(max-width:760px){.kwdc-charts,.kwdc-serp{border-right:0;padding-right:0;border-bottom:1px solid var(--rule);padding-bottom:10px}}
  .aiobody{font-size:12px;line-height:1.5;color:var(--ink)} .aiobody p{margin:0 0 6px} .aioh{font-weight:600;margin:6px 0 3px} .aioli{margin:0 0 4px}
  .aioref{margin-top:8px;border-top:1px dashed var(--rule);padding-top:6px}
  .aioref>summary{cursor:pointer;font-size:11px;color:var(--ink2);list-style:none;user-select:none;padding:2px 0} .aioref>summary::-webkit-details-marker{display:none}
  .aioref>summary::before{content:"▸ ";color:var(--muted)} .aioref[open]>summary::before{content:"▾ "}
  .aiosrc{display:inline-block;font-size:10px;color:var(--blue);text-decoration:none;background:var(--blue-bg);border-radius:4px;padding:0 5px;margin-left:3px;white-space:nowrap;font-family:var(--mono)} .aiosrc:hover{text-decoration:underline}
  .kwdrow .kwd h4{font-size:12px;font-weight:600;margin:0 0 6px;color:var(--ink)}
  /* 整行可点展开;关键词双击复制 */
  #page-keywords tbody tr:not(.kwdrow){cursor:pointer}
  #page-keywords tbody tr:not(.kwdrow):hover{background:var(--hover)}
  .kwcopy{cursor:text;border-radius:3px} .kwcopy:hover{background:var(--blue-bg)}
  /* 前端规范第 3 批-1:词抽屉两张 canvas 已迁到共享 chartLine。随之删掉三组死码 ——
     .kwdchart-rank/.kwdchart-traffic(canvas 尺寸)、.kwdtip/.kwdtip.on(第二套 tooltip 单例,
     共享件用 body 上的 #ui-chart-pop)。原 .chlegend 保留但已名不副实 —— 图例由共享件出,
     它只剩图下那行"断点=当天无排名"的灰字说明,故本批改名 .chnote(图下注)。 */
  .kwdchartbox{max-width:560px}
  .kwdfull{margin-top:14px;border-top:1px solid var(--rule);padding-top:10px}
  .chnote{font-size:11px;color:var(--muted);margin-top:2px}
  /* 标签胶囊(新增弹窗选项用) */
  .tagcell{display:flex;gap:5px;flex-wrap:wrap}
  .tagchip{font-size:11px;padding:2px 9px;border-radius:999px;border:1px solid var(--rule);color:var(--muted);background:var(--paper);cursor:pointer;user-select:none;white-space:nowrap}
  .tagchip:hover{border-color:var(--ink2)}
  .tagchip.on{background:var(--blue-bg);border-color:var(--blue);color:var(--blue);font-weight:600}
  /* 行内标签编辑器(Shopify 式) */
  .tagedit{position:relative;display:flex;gap:4px;flex-wrap:wrap;align-items:center;min-width:150px}
  .tagedit .tg{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:2px 4px 2px 9px;border-radius:999px;background:var(--blue-bg);color:var(--blue);border:1px solid var(--blue);white-space:nowrap}
  .tagedit .tg .x{cursor:pointer;font-style:normal;color:var(--blue);opacity:.7;font-size:13px;line-height:1}
  .tagedit .tg .x:hover{opacity:1}
  /* 保留标签「意图」:进意图集群规划清单,与普通业务标签区分开 */
  .tagedit .tg.intentplan{background:var(--review-bg,#fdf6e6);color:var(--review,#96700f);border-color:var(--review,#96700f)}
  .tagedit .tg.intentplan .x{color:var(--review,#96700f)}
  .tagedit .taginp{border:0;outline:0;background:transparent;font-size:12px;min-width:54px;flex:1;padding:2px}
  .kwsystags{display:flex;gap:4px;flex-wrap:wrap;margin-bottom:4px}
  .kwsystag{display:inline-flex;align-items:center;font-size:10px;line-height:1.2;padding:2px 7px;border-radius:999px;background:var(--mute-bg);color:var(--ink2);white-space:nowrap}
  .kwsystag.pending{background:var(--review-bg);color:var(--review)}
  .tagac{position:absolute;top:100%;left:0;z-index:30;background:#fff;border:1px solid var(--rule);border-radius:7px;box-shadow:0 6px 20px rgba(42,40,35,.12);min-width:120px;max-height:180px;overflow:auto;display:none}
  .tagac.on{display:block}
  .tagac .it{padding:5px 10px;font-size:12px;cursor:pointer;white-space:nowrap}
  .tagac .it:hover,.tagac .it.hl{background:var(--blue-bg);color:var(--blue)}
  .tagac .it.new{color:var(--pass)}
  .kwmonbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 10px;padding:9px 12px;background:var(--blue-bg);border:1px solid #bcd4d4;border-radius:9px}
  .kwmonbar .lab{font-size:11px;color:var(--muted);margin-left:6px}
  .kwmonbar .res{font-size:12px;color:var(--muted)}
  .kwmonbar input{min-height:30px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px;background:var(--paper);font-size:12px}
  .kwassess{display:block;margin-top:4px;border:0;background:transparent;padding:0;color:var(--blue);font-size:10px;cursor:pointer}
  .kwassess:hover{text-decoration:underline}
  .moncell{line-height:1.25}.moncell small{display:block;margin-top:3px;color:var(--muted);font-size:10px}.moncell small.bad{color:var(--halt)}
  /* 关键词中心固定列宽:展开详情(colspan 行)不再回算列宽导致整表抖动。
     只 scope 到 #page-keywords,不影响共用 cfmt 的已确认页。16 列在窄屏横向滚动。
     配合全局 .main{scrollbar-gutter:stable}(纵向滚动条常驻)消除横向位移。*/
  #page-keywords table.cfmt{table-layout:fixed;min-width:1770px;font-size:12px}
  #page-keywords table.cfmt thead th{padding:6px 8px}
  #page-keywords table.cfmt tbody td{padding:6px 8px;vertical-align:middle}
  #page-keywords table.cfmt td.num,#page-keywords table.cfmt th.num{white-space:nowrap}
  /* 长文本列(关键词/意图簇/承接URL)单行省略号,尽量不换行;
     标签列(含补全浮层 .tagac)不加 overflow:hidden 不裁,chip 自然换行 */
  #page-keywords table.cfmt td:nth-child(2),
  #page-keywords table.cfmt td:nth-child(14),
  #page-keywords table.cfmt td:nth-child(15){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #page-keywords table.cfmt th:nth-child(1),#page-keywords table.cfmt td:nth-child(1){width:34px}
  #page-keywords table.cfmt th:nth-child(2),#page-keywords table.cfmt td:nth-child(2){width:180px}
  #page-keywords table.cfmt th:nth-child(3),#page-keywords table.cfmt td:nth-child(3){width:142px}
  #page-keywords table.cfmt th:nth-child(4),#page-keywords table.cfmt td:nth-child(4){width:58px}
  #page-keywords table.cfmt th:nth-child(5),#page-keywords table.cfmt td:nth-child(5){width:72px}
  #page-keywords table.cfmt th:nth-child(6),#page-keywords table.cfmt td:nth-child(6){width:48px}
  #page-keywords table.cfmt th:nth-child(7),#page-keywords table.cfmt td:nth-child(7){width:74px}
  #page-keywords table.cfmt th:nth-child(8),#page-keywords table.cfmt td:nth-child(8){width:86px}
  #page-keywords table.cfmt th:nth-child(9),#page-keywords table.cfmt td:nth-child(9){width:66px}
  #page-keywords table.cfmt th:nth-child(10),#page-keywords table.cfmt td:nth-child(10){width:70px}
  #page-keywords table.cfmt th:nth-child(11),#page-keywords table.cfmt td:nth-child(11){width:150px}
  #page-keywords table.cfmt th:nth-child(12),#page-keywords table.cfmt td:nth-child(12){width:72px}
  #page-keywords table.cfmt th:nth-child(13),#page-keywords table.cfmt td:nth-child(13){width:90px}
  #page-keywords table.cfmt th:nth-child(14),#page-keywords table.cfmt td:nth-child(14){width:120px}
  #page-keywords table.cfmt th:nth-child(15),#page-keywords table.cfmt td:nth-child(15){width:205px}
  #page-keywords table.cfmt th:nth-child(16),#page-keywords table.cfmt td:nth-child(16){width:210px}
  #page-keywords .kwpick{text-align:center;padding-left:6px;padding-right:4px}
  #page-keywords .kwpick input{width:15px;height:15px;padding:0;cursor:pointer}
  /* 「已规划」标记:勾选框下面一行小字,纯文字不做徽标几何(不占徽标统一族的额度) */
  #page-keywords .kwpick .kwplanmark{display:block;margin-top:2px;font-size:10px;line-height:1.2;
    color:var(--review);white-space:nowrap}
  /* 固定列宽下,解除品类下拉/标签编辑器的固定像素诉求,让其随单元格收缩,
     否则窄笔记本宽度(1280/1366)下控件按 min-width/固有宽溢出、压到相邻意图列。
     不给 td 加 overflow:hidden(会裁掉标签补全浮层 .tagac)。*/
  #page-keywords table.cfmt .catsel{width:100%;max-width:100%;min-height:30px;padding:4px 28px 4px 8px;border:1px solid var(--rule);border-radius:6px;background:var(--panel);color:var(--ink);font-size:11px;line-height:1.3;text-overflow:ellipsis}
  #page-keywords table.cfmt .catsel:hover{border-color:var(--ink3)}
  #page-keywords table.cfmt .catsel:focus{outline:0;border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-bg)}
  #page-keywords table.cfmt .kwcompcell{text-align:left}
  #page-keywords table.cfmt .kwcomp{display:grid;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:6px;min-width:0}
  #page-keywords table.cfmt .kwcomprank{display:inline-flex;align-items:center;justify-content:center;width:26px;height:24px;border:1px solid var(--blue-soft);border-radius:6px;background:var(--blue-bg);color:var(--blue-deep);font-family:var(--mono);font-size:12px;line-height:1}
  #page-keywords table.cfmt .kwcompdomain{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink2);font-family:var(--mono);font-size:10px}
  #page-keywords table.cfmt .kwcompmore{white-space:nowrap;color:var(--muted);font-size:10px}
  #page-keywords table.cfmt .kwtag .kwsystags{display:inline-flex;vertical-align:middle;flex-wrap:nowrap;margin:0 3px 0 0;gap:3px}
  #page-keywords table.cfmt .kwtag .tagedit{display:inline-flex;vertical-align:middle;flex-wrap:nowrap;min-width:0;gap:3px}
  #page-keywords table.cfmt .kwtag .taginp{width:42px;min-width:42px;max-width:48px;font-size:11px;padding:0}
  #page-keywords table.cfmt .kwtag .tg{padding:1px 3px 1px 6px;font-size:10px}
  #page-keywords table.cfmt .kwsystag{padding:1px 5px;font-size:9px}
  #page-keywords table.cfmt .kwintent{white-space:nowrap}
  #page-keywords table.cfmt .kwintent .rkwintent{min-width:17px;height:17px;margin-right:2px;font-size:10px}
  .kwgscwarn{display:flex;align-items:center;gap:10px;margin:0 0 10px;padding:9px 12px;border:1px solid #e9d6a8;border-radius:8px;background:var(--review-bg);color:var(--review);font-size:12px}
  .kwgscwarn span{color:var(--ink2)}
  /* 交付升级一期:工单类型维度 tab / TDK 对照卡 / 样本区 / 策略 / 异常 */
  /* 死码已删:逐页 padding —— 页面容器边距已是全局默认(见 18.2 段 .page),这条被更靠后的 ID 规则整条压掉 */
  .p1grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px;margin:0 0 14px}
  .p1card{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:12px 14px}
  .p1card .k{font-size:11px;color:var(--muted)} .p1card .v{font-size:22px;font-weight:700;color:var(--ink);margin-top:4px}
  .p1card .v.bad{color:var(--halt)} .p1card .v.warn{color:var(--review)} .p1card .v.ok{color:var(--pass)}
  .p1bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 12px}
  .p1bar .lab{font-size:12px;color:var(--muted)}
  .p1bar select{font-size:12px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px}
  .jobsfilters{padding:8px 10px;border:1px solid var(--rule);border-radius:8px;background:var(--panel)}
  .jobsfilters label{display:flex;gap:6px;align-items:center}
  .jobsfilters .jobssearch{flex:1 1 220px}
  .jobsfilters input{width:100%;min-width:150px;font-size:12px;padding:5px 8px;border:1px solid var(--rule);border-radius:6px;background:var(--paper)}
  .p1errcell{min-width:250px;max-width:380px}
  .p1errsum{display:flex;flex-direction:column;gap:3px;font-size:11.5px;line-height:1.4}
  .p1errsum b{color:var(--halt)}.p1errsum span{color:var(--ink2)}.p1errsum small{color:var(--muted)}
  details.p1tech{margin-top:5px}
  details.p1tech>summary{font-size:11px;color:var(--blue)}
  details.p1tech pre{max-width:52ch;max-height:220px;overflow:auto;white-space:pre-wrap;word-break:break-word;font:10.5px/1.5 var(--mono);color:var(--ink2);background:var(--panel);border:1px solid var(--rule);border-radius:6px;padding:7px;margin:5px 0 0}
  .p1sec{margin:18px 0}.p1sec h3{font-size:14px;font-weight:600;color:var(--ink);margin:0 0 8px}
	  .rqrow{cursor:pointer}.rqrow:hover td{background:var(--hover)}
	  .rqtarget{max-width:360px;word-break:break-all}.rqreason{max-width:300px;color:var(--muted);font-size:11px}
	  .rqck{width:14px;height:14px;cursor:pointer;vertical-align:middle}
	  .rqbatch{position:sticky;top:0;z-index:5;display:flex;gap:8px;align-items:center;background:var(--blue-bg);border:1px solid var(--blue);border-radius:6px;padding:7px 12px;margin:8px 0;font-size:13px}
	  .rqbatch .cnt{font-weight:600;color:var(--blue);margin-right:4px}
	  .rqops{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
	  .rqops button{font-size:12px;padding:4px 10px}
	  .rqops button.danger,.rqbatch button.danger{color:var(--halt);border-color:var(--halt)}
	  .focusrow{outline:2px solid var(--blue);outline-offset:-2px} tr.focusrow td{background:var(--blue-bg)}
  .partgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:0 0 14px}
  .partcard{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:10px 12px;min-width:0}
  .partcard h3{font-size:13px;font-weight:600;color:var(--ink);margin:0 0 8px}
  @media(max-width:980px){.partgrid{grid-template-columns:1fr}}
  .oppbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 12px}
  .oppbar .lab{font-size:12px;color:var(--muted)}
  .oppbar select{font-size:12px;padding:4px 8px;border:1px solid var(--rule);border-radius:6px}
  .opprow{cursor:pointer}.opprow:hover td{background:var(--hover)}.opprow.open td{background:var(--blue-bg)}
  .oppkw{font-weight:600;color:var(--ink);word-break:break-word}
  .oppscore{font-family:var(--mono);white-space:nowrap}
  .oppexp>td{background:var(--panel);padding:0}
  .oppexpbox{border-top:1px solid var(--rule);padding:14px 16px}
  .oppmetrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;margin:8px 0 10px}
  .oppmetric{background:var(--paper);border:1px solid var(--rule);border-radius:8px;padding:8px 10px;min-width:0}
  .oppmetric .mk{font-size:10px;color:var(--muted);font-family:var(--mono);word-break:break-all}
  .oppmetric .mv{font-size:12px;color:var(--ink);margin-top:3px;word-break:break-word}
  .kpicards{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:12px 0 0}
  .kpicard{background:var(--paper);border:1px solid var(--rule);border-radius:12px;padding:14px 16px;min-width:0}
  .kpicard .kl{font-size:12px;color:var(--muted);margin-bottom:4px}
  .kpicard .kv{font-size:28px;font-weight:700;color:var(--ink);line-height:1.15}
  .kpicard .ks{font-size:12px;color:var(--ink2);margin-top:5px}
  .kpicard .kn{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.55}
  .kpidist{margin-top:7px;display:flex;gap:5px;flex-wrap:wrap}
  button.actst{font-size:11px;padding:3px 10px;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:4px;cursor:pointer;margin-left:5px}
  button.actst.ghost{background:transparent;color:var(--muted);border-color:var(--rule)}
  .tdkcard{border:1px solid var(--rule);border-radius:10px;margin-bottom:12px;background:var(--paper);overflow:hidden}
  table.tdkt td{font-size:12px;line-height:1.5} table.tdkt td.tdkf{font-weight:600;color:var(--ink2);white-space:nowrap;width:52px}
  table.tdkt th:nth-child(2),table.tdkt th:nth-child(3),table.tdkt td:nth-child(2),table.tdkt td:nth-child(3){width:44%}
  .clen{font-family:var(--mono);font-size:10px;color:var(--muted);background:var(--panel);border-radius:8px;padding:0 6px}
  .tdkev{font-size:11px;color:var(--ink2);background:var(--panel);border-top:1px solid var(--rule);padding:6px 14px;line-height:1.6} .tdkev b{color:var(--ink)}
  .faqbox{padding:8px 14px 4px} .faqmeta{padding:8px 14px 0}
  .faqqa{padding:7px 0;border-bottom:1px solid var(--rule)} .faqqa:last-child{border-bottom:0}
  .faqq{font-size:12px;font-weight:600;color:var(--ink);line-height:1.5} .faqa{font-size:12px;color:var(--ink2);line-height:1.6;margin-top:3px;white-space:pre-wrap}
  .samplebar{display:flex;gap:10px;align-items:center;margin:0 0 12px}
  pre.jsonpre{font-family:var(--mono);font-size:11px;background:var(--panel);border:1px solid var(--rule);border-radius:6px;padding:8px 10px;margin:6px 0;white-space:pre-wrap;word-break:break-all;max-height:260px;overflow:auto}
  .stgcard{border:1px solid var(--rule);border-radius:10px;margin-bottom:12px;background:var(--paper);overflow:hidden}
  .stgcard .topic{font-size:13px;font-weight:600;color:var(--ink)}
  .stgsummary{padding:10px 14px;border-top:1px solid var(--rule);display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px;background:var(--panel)}
  .stgsummary .it{font-size:12px;color:var(--ink);min-width:0}
  .stgsummary .it b{display:block;font-size:10px;font-family:var(--mono);font-weight:500;color:var(--muted);margin-bottom:2px}
  details.stgadv{border-top:1px solid var(--rule);padding:0 14px 12px}
  details.stgadv>summary{cursor:pointer;padding:10px 0;font-size:12px;color:var(--ink2);font-weight:600}
  .stgedit{display:grid;grid-template-columns:1fr 1fr;gap:12px}
  .stgedit label{display:flex;flex-direction:column;font-size:11px;color:var(--muted);gap:4px}
  .stgedit textarea{font-family:var(--mono);font-size:11px;min-height:64px;border:1px solid var(--rule);border-radius:6px;padding:6px 8px;resize:vertical}
  .stgsave{grid-column:1/3;display:flex;gap:10px;align-items:center}
  .candsum{font-size:12px;color:var(--ink2);display:flex;gap:10px;flex-wrap:wrap}
  .candrow{cursor:pointer}.candrow:hover td{background:var(--hover)}.candrow.open td{background:var(--blue-bg)}
  .candexp>td{background:var(--panel);padding:0}
  .candbox{padding:12px 14px;border-top:1px solid var(--rule)}
  .candacts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px}
  button.primary{font-size:12px;padding:5px 14px;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:6px;cursor:pointer}
  button.ghost{font-size:12px;padding:5px 12px;border:1px solid var(--rule);background:#fff;color:var(--ink2);border-radius:6px;cursor:pointer}
  .twi{font-size:11px;color:var(--muted)}
  span.sev-crit{color:var(--halt);font-weight:600} span.sev-warn{color:var(--review);font-weight:600} span.sev-info{color:var(--ink2)}
  #page-highlights .anm-diag{font-size:11px;padding:3px 10px;border:1px solid var(--blue);background:var(--blue);color:#fff;border-radius:4px;cursor:pointer;margin-right:5px}
  /* 二期:诊断结论展开渲染 */
  .cause-bdg{font-family:var(--mono);font-size:10px;padding:1px 6px;border-radius:5px;white-space:nowrap;background:var(--panel);color:var(--ink2);border:1px solid var(--rule)}
  .cause-bdg.c-content,.cause-bdg.c-tdk,.cause-bdg.c-internal_link{background:var(--info-bg);color:var(--info);border-color:var(--info-line)}
  .cause-bdg.c-technical,.cause-bdg.c-algo_wide{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
  .cause-bdg.c-competitor,.cause-bdg.c-serp_shift{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}
  .cause-bdg.c-data_artifact,.cause-bdg.c-unknown,.cause-bdg.c-auto_resolved{background:var(--mute-bg);color:var(--ink2);border-color:var(--mute-line)}
  details.diagx{margin-top:5px}
  details.diagx>summary{font-size:11px;color:var(--blue);cursor:pointer}
  .diagbox{border:1px solid var(--rule);border-radius:8px;background:var(--paper);padding:10px 12px;margin-top:6px;max-width:78ch}
  .diagbox .dhead{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:6px}
  .diagbox .dconf{font-family:var(--mono);font-size:11px;color:var(--ink2)}
  .diagbox .dnh{font-size:10px;font-weight:600;padding:1px 8px;border-radius:5px;background:var(--halt-bg);color:var(--halt-deep);border:1px solid var(--halt-line)}
  .diagbox .dsum{font-size:12px;line-height:1.55;color:var(--ink);margin:2px 0 8px}
  .diagbox .datitle{font-size:10px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.03em;margin:6px 0 3px}
  .diagbox ul.salist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}
  .diagbox ul.salist li{font-size:11px;line-height:1.45;border-left:2px solid var(--blue);padding:2px 0 2px 8px}
  .diagbox ul.salist li .saty{font-family:var(--mono);font-size:10px;color:var(--blue);margin-right:6px}
  .diagbox ul.salist li .saurl{font-size:11px;color:var(--blue);word-break:break-all}
  .diagbox ul.salist li .sanote{color:var(--ink2);display:block;margin-top:1px}
  .diagbox .devi{font-family:var(--mono);font-size:10px;color:var(--muted);margin-top:8px;line-height:1.5;word-break:break-all}
  .diagbox .dts{font-family:var(--mono);font-size:10px;color:var(--muted);margin-top:4px}
  .diagbox.autoresolved{border-style:dashed}
  .navtoggle{display:none;background:none;border:0;font-size:20px;line-height:1;padding:8px;margin-left:-6px;color:var(--ink);cursor:pointer}
  .navscrim{display:none;position:fixed;inset:0;background:rgba(32,29,25,.42);z-index:39}
  @media(max-width:820px){
    body{grid-template-columns:1fr}
    .navtoggle{display:inline-flex;align-items:center;min-width:40px;min-height:40px;justify-content:center}
    aside.side{position:fixed;top:0;left:0;width:240px;height:100vh;z-index:40;transform:translateX(-100%);transition:transform .2s ease;box-shadow:0 12px 40px rgba(0,0,0,.18)}
    body.nav-open aside.side{transform:none}
    body.nav-open .navscrim{display:block}
    header.topbar,.main{grid-column:1}
  }
  @media(max-width:820px){
    header.topbar{gap:10px;padding:0 14px;flex-wrap:wrap;min-height:52px}
    header.topbar #meta{flex:1 1 100%;order:3;font-size:11px}
    .controls{gap:10px}
    .controls button,.controls select,.controls .fld select{min-height:40px}
    #portal{min-height:40px;display:inline-flex;align-items:center}
  }
  @media(max-width:560px){
    .controls .whoami{display:none}
    #portal{display:none}
  }
  .ilseg{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  .ilseg::-webkit-scrollbar{display:none}
  .ilseg-b{flex:0 0 auto;white-space:nowrap}
  @media(max-width:820px){
    .ilsegrow{flex-wrap:wrap}
    .ilexport{margin-left:0 !important;flex:1 1 100%;justify-content:flex-start;flex-wrap:wrap}
    .exb{min-height:40px}
    .ilfbar #ilf-q,.albar #alq{min-height:40px}
    .fbtn{min-height:36px;padding:6px 14px}
  }
  /* 数据表统一容器(全站同一套):白卡+圆角+留距;卡内任意表族共享表头/末行/首末列规则 */
  .tblwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;background:var(--paper);border:1px solid var(--rule);border-radius:14px;padding:6px 18px 10px;margin:0 0 10px}
  .tblwrap.flat{background:transparent;border:0;border-radius:0;padding:0;margin:0}
  .tblwrap table{margin:0}
  .tblwrap table th{background:transparent;border-bottom:1px solid var(--rule2)}
  .tblwrap table tbody tr:last-child td{border-bottom:0}
  .tblwrap table th:first-child,.tblwrap table td:first-child{padding-left:2px}
  .tblwrap table th:last-child,.tblwrap table td:last-child{padding-right:2px}
  .tblwrap .lkt th,.tblwrap .lkt td{padding:9px 14px}
  .tblwrap .lkt th:first-child,.tblwrap .lkt td:first-child{padding-left:2px}
  .tblwrap .lkt th:last-child,.tblwrap .lkt td:last-child{padding-right:2px}
  /* 数据说明页(表格卡片规则已并入全局 .tblwrap) */
  .ddnote{color:var(--ink2);font-size:13px;line-height:1.7;max-width:880px;margin:6px 0 12px}
  .ddchip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;border:1px solid var(--rule);border-radius:999px;padding:4px 12px;color:var(--ink2);background:var(--paper)}
  .ddchip.dd-ok{color:var(--pass);border-color:var(--pass-line);background:var(--pass-bg)}
  .ddchip.dd-bad{color:var(--halt-deep);border-color:var(--halt-line);background:var(--halt-bg)}
  .ddh{margin:26px 0 10px;font-size:15px}
  .ddok{color:var(--pass);font-weight:600}
  .ddbad{color:var(--halt);font-weight:600}
  .ddmut{color:var(--muted)}
  .ddsm{color:var(--muted);font-size:12px;margin:8px 0 0}
  /* 死码已删:.ddnotecell(任务运行状态表的备注列)与结构化摘要一族 .ddplainnote /
     .ddstruct ×3 / details.ddjson ×3 —— 发放它们的 jrows 与 ddStructuredNote 已在
     同批删除,全库无任何元素再挂这些类。 */
  .ddgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(420px,1fr));gap:12px;align-items:start}
  @media(max-width:900px){.ddgrid{grid-template-columns:1fr}}
  .ddcard{background:var(--paper);border:1px solid var(--rule);border-radius:14px;padding:2px 16px}
  .ddcard summary{cursor:pointer;padding:11px 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;list-style:none}
  .ddcard summary::-webkit-details-marker{display:none}
  .ddcard summary b{font-size:13.5px}
  .ddcard code,.ddrow code{font-family:var(--mono);font-size:11.5px;background:var(--panel);border-radius:6px;padding:2px 6px}
  .ddrow{display:flex;gap:12px;padding:7px 0;font-size:13px;color:var(--ink);border-top:1px dashed var(--rule)}
  .ddrow>span{flex:0 0 36px;color:var(--muted);font-size:12px;padding-top:1px}
  .ddrow ul{margin:0;padding-left:18px}
  .ddrow li{margin:2px 0;line-height:1.55}
  .ddjump{color:inherit;cursor:pointer;border-bottom:1px dashed var(--muted)}
  .ddtogs{display:flex;gap:12px;flex-wrap:wrap;margin:4px 0}
  .ddtog{display:flex;align-items:center;gap:14px;background:var(--paper);border:1px solid var(--rule);border-radius:12px;padding:10px 16px}
  .ddtog b{font-size:13.5px}
  @media(max-width:900px){
    .ovfunnel{display:grid;grid-template-columns:1fr 1fr;gap:0}
    .ovfunnel .stp{min-width:0;flex:none;border-right:1px solid var(--rule)}
    .ovfunnel .stp:nth-child(2n){border-right:0}
    .ovfunnel .stp:nth-child(-n+2){border-bottom:1px solid var(--rule)}
  }

/* ============ 视觉系统 v2(decision-calm 定稿+三评审吸收:阴影纪律/描边色点状态丸/class双保险)============ */
/* ============================================================
   决策后台方向(decision-calm)
   参照 Stripe/Vercel 后台的留白与秩序:大呼吸感、证据卡片化、
   主/次/弱三级按钮体系、裁决动作醒目但不焦虑。
   选择器与 console/src/page.js 现有 DOM 完全兼容,可整段替换。
   ============================================================ */

/* ---------- 0. 设计令牌 ---------- */
:root{
  /* 底色与文字:暖中性(low-saturation warm neutral) */
  --paper:#f6f4ef;            /* 页面底,暖纸灰 */
  --panel:#ffffff;            /* 卡片/面板底 */
  --ink:#2a2823;              /* 主文字,暖墨 14:1 */
  --ink2:#55524a;             /* 次级文字 7.5:1 */
  --muted:#837d70;            /* 弱化文字 4.6:1 */
  --rule:#e7e3d9;             /* 常规分隔线(暖) */
  --rule2:#d6d0c2;            /* 重分隔/控件描边 */
  --hover:#efebe1;            /* 悬停底(暖) */
  --soft:#f1eee6;             /* 更弱的衬底(骨架屏/斑马纹) */
  --sel:#f0ede6;              /* 选中/展开行底色 */
  /* 主色:深青(deep teal),低饱和微暖;正文对比 6.3:1 */
  --blue:#2f6772;
  --blue-deep:#26555e;        /* 主色 hover/活化 */
  --blue-bg:#e3eceb;          /* 主色浅底 */
  --blue-soft:#cfdedd;        /* 主色描边/深一档浅底 */
  --info:#2b7d8a;             /* 信息提示(青蓝) */
  --info-bg:#e0edee;
  /* 语义色(全部正文对比 ≥4.5:1,暖化精修) */
  --pass:#2c7a4b;  --pass-bg:#e2efe5;
  --halt:#bd4142;  --halt-bg:#f8e8e5;  --halt-deep:#a33738;  --halt-line:#ecc8c6;
  --review:#a05e10; --review-bg:#f6eeda;
  /* 兼容别名(历史分片用过但未定义的变量) */
  --line:var(--rule); --card:#ffffff; --text:var(--ink); --go:var(--pass);
  /* 字体 */
  --mono:ui-monospace,"SF Mono","SFMono-Regular",Menlo,Consolas,"Liberation Mono",monospace;
  --serif:-apple-system,"PingFang SC","SF Pro Text",BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",Roboto,sans-serif; /* 置为无衬线,沿用变量名 */
  /* 结构 */
  --side:224px;               /* 侧边栏宽 */
  --hd:56px;                  /* 顶栏高 */
  /* 间距(4px 基数) */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:20px; --sp-6:24px; --sp-8:32px;
  /* 圆角 */
  --r-sm:6px; --r-md:8px; --r-lg:12px; --r-xl:16px;
  /* 阴影(暖墨色调,克制)与 focus 环 */
  --shadow-card:0 1px 2px rgba(42,40,35,.05),0 2px 8px rgba(42,40,35,.04);
  --shadow-raise:0 4px 16px rgba(42,40,35,.10),0 1px 3px rgba(42,40,35,.06);
  --shadow-pop:0 24px 64px rgba(42,40,35,.22),0 4px 16px rgba(42,40,35,.10);
  --focus:0 0 0 3px rgba(47,103,114,.30);
}

/* ---------- 1. 基础 ---------- */
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);
  font:13.5px/1.6 var(--serif);-webkit-font-smoothing:antialiased;
  display:grid;grid-template-columns:var(--side) 1fr;grid-template-rows:var(--hd) 1fr;
  height:100vh;overflow:hidden}
a{color:var(--blue);text-decoration:none;border-radius:4px}
a:hover{text-decoration:underline;text-underline-offset:2px}
::selection{background:rgba(47,103,114,.16)}
:where(button,a,input,select,textarea,summary,[tabindex]):focus-visible{
  outline:none;box-shadow:var(--focus)}

/* ---------- 2. 布局:侧边栏 / 顶栏 / 主区 ---------- */
aside.side{grid-row:1/3;grid-column:1;background:#fbfaf6;border-right:1px solid var(--rule);
  overflow:auto;padding:var(--sp-3) 10px var(--sp-4)}
aside .brandmark{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;
  color:var(--ink);padding:4px 10px 10px;letter-spacing:.01em}
aside .brandmark::before{content:none} /* v4:logo 改为 HTML 内联 SVG,弃用蓝紫渐变块 */
aside nav{display:flex;flex-direction:column;gap:1px;padding:0}
aside nav a{display:block;padding:4px 10px;font-size:13px;color:var(--ink2);cursor:pointer;
  border-radius:var(--r-sm);line-height:1.5;transition:background .12s,color .12s}
aside nav a:hover{background:var(--hover);color:var(--ink);text-decoration:none}
aside nav a.on{background:var(--blue-bg);color:var(--blue);font-weight:600}
aside nav .navgrp{padding:12px 10px 3px;font-size:10.5px;font-weight:600;color:var(--muted);
  letter-spacing:.1em;user-select:none}
aside nav .navgrp:first-child{padding-top:2px}

header.topbar{grid-column:2;grid-row:1;display:flex;align-items:center;gap:var(--sp-4);
  padding:0 var(--sp-6);background:var(--panel);border-bottom:1px solid var(--rule)}
.topbar .meta{font-size:13px;color:var(--muted)}
.topbar .controls{display:flex;align-items:center;gap:var(--sp-3);margin-left:auto}
.whoami{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink2)}
.navtoggle{display:none}
.navscrim{display:none}

.main{grid-column:2;grid-row:2;overflow:auto;background:var(--paper);
  padding:20px var(--sp-6) 64px}
.page{display:none;max-width:1720px}
.page.on{display:block}

/* ---------- 3. 文字层级 ---------- */
h2.ovh{margin:0 0 var(--sp-1);font-size:18px;font-weight:650;letter-spacing:-.01em;color:var(--ink)}
.clintro{margin:0 0 var(--sp-4);font-size:13px;line-height:1.7;color:var(--muted);max-width:92ch}
.clintro b{color:var(--ink2);font-weight:600}
.twi{font-size:12px;line-height:1.6;color:var(--muted)}
.lab{font-size:12px;color:var(--muted)}
.muted{color:var(--muted)}
.num{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums}
th.num{text-align:right}

/* ---------- 4. 按钮体系:实心主 / 描边次 / 文字弱 / 危险分离 ---------- */
button{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;
  min-height:36px;padding:7px 14px;border:1px solid var(--rule2);border-radius:var(--r-md);
  background:var(--panel);color:var(--ink2);font:500 13px/1.45 var(--serif);cursor:pointer;
  box-shadow:0 1px 1px rgba(42,40,35,.04);
  transition:background .12s,border-color .12s,color .12s,box-shadow .12s,transform .05s}
button:hover{background:var(--hover);border-color:#bdb5a3;color:var(--ink)}
button:active{transform:translateY(1px);box-shadow:none}
button:disabled{opacity:.5;cursor:not-allowed;transform:none}

.primary,
.oppmodal .btns [data-m="ok"]{background:var(--blue);border-color:var(--blue);color:#fff;
  box-shadow:0 1px 2px rgba(47,103,114,.32)}
.primary:hover,
.oppmodal .btns [data-m="ok"]:hover{background:var(--blue-deep);border-color:var(--blue-deep);color:#fff}

.ghost{background:transparent;box-shadow:none}
.ghost:hover{background:var(--hover)}

.flat{min-height:32px;padding:5px 10px;border:none;background:none;box-shadow:none;color:var(--blue)}
.flat:hover{background:var(--blue-bg);color:var(--blue-deep);border:none}

/* 危险动作:默认描边绯红(醒目不焦虑),弹窗确认用实心 */
.danger,.ghost.danger{color:var(--halt);border:1px solid var(--halt-line);background:var(--panel);box-shadow:none}
.danger:hover,.ghost.danger:hover{background:var(--halt-bg);border-color:#d9a5a3;color:var(--halt-deep)}
.oppmodal .btns .danger,.danger.solid{background:var(--halt);border-color:var(--halt);color:#fff;
  box-shadow:0 1px 2px rgba(189,65,66,.32)}
.oppmodal .btns .danger:hover,.danger.solid:hover{background:var(--halt-deep);border-color:var(--halt-deep);color:#fff}

/* 行内小按钮(≥32px) */
.oppbtn{min-height:32px;padding:5px 12px;font-size:12.5px;border-radius:7px}
#reload{min-height:36px}

/* ---------- 5. 表单控件 ---------- */
input,select,textarea{font:13px/1.5 var(--serif);color:var(--ink);background:var(--panel);
  border:1px solid var(--rule2);border-radius:var(--r-md);padding:8px 12px;min-height:36px;
  transition:border-color .12s,box-shadow .12s}
input:hover,select:hover,textarea:hover{border-color:#bdb5a3}
input:focus-visible,select:focus-visible,textarea:focus-visible{border-color:var(--blue);box-shadow:var(--focus)}
textarea{min-height:76px;resize:vertical;line-height:1.6}
select{padding-right:28px;cursor:pointer}
input[type="checkbox"]{width:16px;height:16px;min-height:0;padding:0;accent-color:var(--blue);cursor:pointer;vertical-align:middle}
input[type="date"],input[type="number"]{font-family:var(--mono);font-size:12.5px}
.fld{display:inline-flex;align-items:center;gap:8px;font-size:13px}
.fld span{font-size:12px;color:var(--muted)}
.fld select,.fld input{min-height:34px;padding:5px 10px}
.fld2{display:flex;flex-direction:column;gap:6px;font-size:13px}
.fld2 span{font-size:12px;font-weight:500;color:var(--ink2)}
.okck{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink2);cursor:pointer;user-select:none}

/* 筛选行 */
.oppbar{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin:0 0 var(--sp-3)}

/* ---------- 6. 徽标统一族 ---------- */
/* 全站状态徽标只有一套几何 + 一张色彩语义表。收敛前是 20 个家族各自带一份基类与一套色,
   同一个「成功绿」有 3 个前景值、「警告黄」有 5 个边框值,同语义跨页对不上。
   新徽标一律 <span class="sbdg 语义类">(方角)或 <span class="pill 语义类">(胶囊),
   语义类见文件末段「色彩语义规范表」。存量家族名保留(JS 侧零改动),按下面两条选择器列表并入。 */
/* 方角档 .sbdg:表格里贴着数字的状态标 */
.sbdg,.hltag,.lsflag,.ptag,.urlst,.sigbdg,.utg,.kst,.cbadge,.scorebdg{
  display:inline-flex;align-items:center;gap:4px;padding:1px 8px;
  border:1px solid transparent;border-radius:5px;
  background:var(--mute-bg);color:var(--ink2);
  font-size:11px;font-weight:600;line-height:1.6;white-space:nowrap;vertical-align:middle}
/* 胶囊档 .pill:卡片 / 工具条里独立成块的状态丸 */
.pill,.p1pill,.ibadge,.expill,.copill,.bwfpill,.monbdg,.exdivergetag,.anmevidence-bdg,
.pt-flag,.ddbadge,.cbtag,.cbbtag{
  display:inline-flex;align-items:center;gap:4px;padding:2px 9px;
  border:1px solid transparent;border-radius:999px;
  background:var(--mute-bg);color:var(--ink2);
  font-size:11.5px;font-weight:600;line-height:1.6;white-space:nowrap;vertical-align:middle}

/* 色彩语义表:同一语义只有一组令牌。加新状态类只许挂到下面某一条,不许再造第 21 套色。 */
.pill-pass,.sbdg-pass,
.p1pill.ok,.expill.ex-succeeded,.expill.ex-completed,.copill.pass,
.bwfpill.published,.bwfpill.approved,.monbdg.on,.ddbadge.ok,
.hltag.up,.ptag.ok,.cbadge.cb-ok,.scorebdg.good,
.sigbdg.index,.sigbdg.sitemap-in,
.bdg.good,.bdg.t10b,.bdg.transactional_model{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}

.pill-review,.sbdg-review,
.p1pill.warn,.expill.ex-running,.expill.ex-claimed,.expill.ex-generating,.expill.ex-validating,
.expill.ex-retryable_failed,.expill.ex-waiting_approval,.copill.review,.monbdg.pause,.anmevidence-bdg,
.hltag.new,.lsflag.warn,.ptag.warn,.cbadge.cb-warn,.scorebdg.mid,
.sigbdg.noindex,.sigbdg.sitemap-out,
.bdg.amber,.bdg.commercial{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}

.pill-halt,.sbdg-halt,
.p1pill.bad,.expill.ex-failed,.expill.ex-permanent_failed,
.expill.ex-terminal_update_conflict,.expill.ex-terminal_write_failed,
.copill.fail,.exdivergetag,.pt-flag,.ddbadge.stale,
.lsflag.bad,.cbadge.cb-bad,.scorebdg.bad,
.bdg.bad{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}

.pill-run,.sbdg-run,
.p1pill.run,.ibadge,.expill.ex-ready,.expill.ex-pending,.expill.ex-queued,.expill.ex-collecting,
.bwfpill.task,.hltag.rank,
.bdg.category{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)}

.pill-info,.sbdg-info,
.bdg.aiob,.bdg.informational{background:var(--info-bg);color:var(--info);border-color:var(--info-line)}

.pill-mute,.sbdg-mute,
.bwfpill.archived,.bwfpill.cancelled,.monbdg.off,.ddbadge.na,
.cbadge.cb-none,.scorebdg.none,
.sigbdg.unknown{
  background:var(--mute-bg);color:var(--muted);border-color:var(--mute-line)}

/* P3(低优先级)是 mute 再淡一档:同一组灰令牌 + 透明度,不是第二种灰。
   优先级四档共用 halt/review/mute 三组既有令牌(见 110-core-cn-dicts.js 的 PRIO_TONE),
   这条是四档里唯一的 delta —— P2「正常」与 P3「有余力再做」都不该抢注意力,但 P3 要更退后一档。 */
.prio-faint{opacity:.62}

/* 家族 delta:只许留字号 / 间距 / 宽度,颜色一律走上面的语义表。
   能挂到页内规则的一律挂过去 —— 同一个裸类名在本文件出现第三次时,前面那条必然是死代码
   (CI 检查 C 钉的就是这个),统一族的 base + 语义 已经占掉两次。 */
.monbdg{font-size:10px}
.cbtag,.cbbtag{margin-left:8px;font-size:11px}
#page-datadict .ddbadge{margin-left:6px}
#page-blogwriter .bwfpill{max-width:190px;font-size:10px}
#page-execution .exdivergetag{margin-left:6px}
.sbdg-wide,.sigbdg{min-width:44px;justify-content:center}
.sbdg-score,.scorebdg{min-width:30px;justify-content:center;border-radius:10px;font:700 12px/1.6 var(--mono)}
/* .p1pill 的状态色点:唯一一处「点 + 文字」形态,色点跟随语义 */
.p1pill::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--rule2);flex:none}
.p1pill.ok::before{background:var(--pass)}
.p1pill.bad::before{background:var(--halt)}
.p1pill.warn::before{background:var(--review)}
.p1pill.run::before{background:var(--blue)}
/* .bdg 是代码型标签(等宽 + 全大写),几何刻意与状态徽标不同,不并入上面两条 */
.bdg{display:inline-block;font:600 10px/1.6 var(--mono);letter-spacing:.06em;text-transform:uppercase;
  background:var(--mute-bg);color:var(--ink2);border-radius:5px;padding:1px 6px;vertical-align:1px}
.segn{display:inline-block;min-width:18px;text-align:center;font:600 11px/1.5 var(--mono);
  background:#e6e3d8;color:var(--ink2);border-radius:999px;padding:1px 6px;margin-left:2px}
/* 严重度:色点 + 有色文字,危险色只出现在危险语义 */
.sev-crit,.sev-warn,.sev-info{font-weight:600;white-space:nowrap}
.sev-crit{color:var(--halt)} .sev-warn{color:var(--review)} .sev-info{color:var(--blue)}
.sev-crit::before,.sev-warn::before,.sev-info::before{content:"";display:inline-block;
  width:7px;height:7px;border-radius:50%;background:currentColor;margin-right:5px;vertical-align:1px}

/* ---------- 7. 分段控件(tab):Vercel 式胶囊分段 ---------- */
.ilsegrow{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.ilseg{display:inline-flex;gap:4px;background:#eae7dc;border:1px solid var(--rule);
  padding:4px;border-radius:10px;margin:0 0 var(--sp-4)}
.ilseg-b{min-height:32px;padding:4px 14px;border:none;border-radius:7px;background:transparent;
  box-shadow:none;color:var(--ink2);font-size:13px;font-weight:500}
.ilseg-b:hover{background:rgba(255,255,255,.72);border:none;color:var(--ink)}
.ilseg-b.on{background:var(--panel);color:var(--ink);font-weight:600;
  box-shadow:0 1px 3px rgba(42,40,35,.12),0 0 0 1px rgba(42,40,35,.03)}
.ilseg-b.on .segn{background:var(--blue-bg);color:var(--blue)}
/* 数据视图切换条(数据表现 / 品类盘面 / 数据异动):三页互为兄弟视图,共用一个侧栏入口,
   这条段控件是它们之间唯一的切换处,所以恒排在页面最顶部、任何状态都渲染。几何全走 .ilseg,
   这里只压掉 .ilseg 自带的下外边距并统一给一行间距,免得与下一行工具条之间空出两截。 */
.dvsegrow{margin:0 0 var(--sp-3)}
.dvsegrow .ilseg{margin:0}

/* ---------- 8. 表格:白卡容器 + 分隔线 + 明显 hover ---------- */
.tblwrap{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  overflow-x:auto}
table.lkt{width:100%;border-collapse:separate;border-spacing:0;font-size:13px}
.lkt thead th{text-align:left;font-size:12px;font-weight:600;color:var(--muted);
  letter-spacing:.02em;white-space:nowrap;padding:9px 12px;background:var(--paper);
  border-bottom:1px solid var(--rule)}
.lkt tbody td{padding:10px 12px;line-height:1.55;color:var(--ink);vertical-align:top;
  border-bottom:1px solid #edeae0}
.lkt tbody tr:last-child td{border-bottom:none}
/* 可点击行:整行 hover + 光标 */
.lkt tbody tr:not(.oppexp):not(.anmexp):not(.lkevexp):hover td{background:var(--hover)}
.opprow,.anmrow,.lkevmain{cursor:pointer}
.opprow.open td,.anmrow.open td{background:var(--blue-bg);border-bottom-color:#dce7e5}
.opprow.open td:first-child,.anmrow.open td:first-child{box-shadow:inset 3px 0 0 var(--blue)}
.opprow.open:hover td,.anmrow.open:hover td{background:var(--blue-bg)}
.oppkw{font-weight:500;color:var(--ink);min-width:11em}
.oppscore{font:600 14px/1.5 var(--mono);color:var(--ink);font-variant-numeric:tabular-nums}
.oppsel{width:16px;height:16px;cursor:pointer}
.opx{white-space:nowrap}
.perft td .twi{margin-top:1px}
/* 防中文词组在窄列里逐字断行(按行类限定,不影响其他 perft 表) */
.opprow td:nth-child(4){white-space:nowrap}          /* 机会队列·建议动作 */
.anmrow td:nth-child(4),.anmrow td:nth-child(8){white-space:nowrap} /* 异常·基线→当前 / 成因 */
/* 长 URL 与下划线长 token 允许任意断行,避免撑破列宽 */
.lkt a{overflow-wrap:anywhere}
.opprow td:nth-child(3){overflow-wrap:anywhere}      /* 机会类型 token */

/* 展开行容器:浅灰底,与普通行区分 */
tr.oppexp>td,tr.anmexp>td{background:var(--paper);padding:var(--sp-4) var(--sp-6) var(--sp-6);
  border-bottom:1px solid var(--rule);cursor:default}

/* ---------- 9. 批量操作条(吸顶) ---------- */
.oppbatch,.rqbatch{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:var(--sp-2);
  flex-wrap:wrap;background:var(--panel);border:1px solid #c5d6d4;border-radius:10px;
  padding:10px 14px;margin:0 0 var(--sp-3);
  box-shadow:0 4px 16px rgba(47,103,114,.10),var(--shadow-card)}
.oppbatch .cnt,.rqbatch .cnt{font-weight:600;font-size:12.5px;color:var(--blue);
  background:var(--blue-bg);border-radius:999px;padding:4px 12px;margin-right:var(--sp-1)}
.oppbatch button,.rqbatch button{min-height:32px;padding:5px 12px;font-size:12.5px}
/* 主动作实心;危险按钮排到最右并与其余动作隔开(≥16px) */
.oppbatch [data-bact="approve"],.rqbatch .primary{background:var(--blue);border-color:var(--blue);color:#fff}
.oppbatch [data-bact="approve"]:hover{background:var(--blue-deep);border-color:var(--blue-deep);color:#fff}
.oppbatch [data-bact="clear"]{order:3}
.oppbatch [data-bact="suppress"]{order:8;margin-left:auto}
.oppbatch .danger{order:9;margin-left:var(--sp-4)}
.oppbatch [data-bact="unsuppress"]{margin-left:0;order:0}
.rqbatch .danger{order:9;margin-left:auto}
.rqbatch .ghost:not(.danger){order:3}

/* ---------- 10. 机会判定卡(证据第一屏) ---------- */
.oppvcard{background:var(--panel);border:1px solid var(--rule);border-left:3px solid var(--blue);
  border-radius:10px;padding:var(--sp-4) 20px}
.oppvhead{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.oppvtitle{font-size:14px;font-weight:650;color:var(--ink)}
.oppvrule{font-size:12px;color:var(--muted)}
.oppvgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:var(--sp-3) var(--sp-6);
  margin-top:var(--sp-3);padding:var(--sp-3) 0;border-top:1px solid var(--rule)}
.oppvitem{font:600 16px/1.4 var(--mono);color:var(--ink);font-variant-numeric:tabular-nums}
.oppvitem b{display:block;font:500 11px/1.6 var(--serif);color:var(--muted);margin-bottom:2px}
.oppvline{display:flex;align-items:baseline;gap:var(--sp-2);margin-top:var(--sp-2);
  padding:8px 12px;background:var(--paper);border-radius:var(--r-md);
  font-size:13px;color:var(--ink2);line-height:1.6}
.oppvline .p1pill{flex:none}

/* ---------- 11. 证据面板与动作区(证据在上、动作在下) ----------
   注意:td 不能改 display(会破坏 colspan 表格布局),
   块级子元素按文档流排列,用相邻选择器给统一间距。
   证据先于动作的顺序由渲染顺序保证:判定卡 → 证据快照 → 提示 → 动作区。 */
tr.oppexp>td>*+*{margin-top:var(--sp-3)}

.oppexpbox{padding:0}
.oppexpbox>.twi{margin-bottom:var(--sp-2)}
.oppmetrics{display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:var(--sp-2);
  margin:var(--sp-2) 0 var(--sp-3)}
.oppmetric{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-md);
  padding:9px 12px;min-width:0}
.oppmetric .mk{font:11px/1.5 var(--mono);color:var(--muted);word-break:break-all}
.oppmetric .mv{font-size:13px;color:var(--ink);margin-top:3px;word-break:break-word;line-height:1.55}
.jsonpre{background:#f1efe8;border:1px solid var(--rule);border-radius:var(--r-md);
  padding:var(--sp-3);font:12px/1.6 var(--mono);overflow:auto;max-height:320px;margin:var(--sp-2) 0 0}
details>summary{cursor:pointer;user-select:none}
details>summary.twi:hover{color:var(--ink2)}

/* 动作区:白卡托底,与证据背景区分;危险按钮与主动作分列两端 */
.oppact,.lkevacts,.rqevacts,.anmevacts{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;
  background:var(--panel);border:1px solid var(--rule);border-radius:10px;
  padding:var(--sp-3) var(--sp-4);margin-top:0}
.lkevacts,.rqevacts,.anmevacts{margin-top:var(--sp-3)}
.oppact [data-act="approve"],.oppact .primary,.anmevacts .anm-diag{background:var(--blue);border-color:var(--blue);color:#fff}
.oppact [data-act="approve"]:hover,.oppact .primary:hover,.anmevacts .anm-diag:hover{background:var(--blue-deep);border-color:var(--blue-deep);color:#fff}
.oppact [data-act="suppress"]{order:8;margin-left:auto}
.oppact .danger{order:9;margin-left:var(--sp-4)}
.oppact [data-act="unsuppress"]{margin-left:0}
.oppact .oppnote{order:5}
.lkevacts .danger,.rqevacts .danger{margin-left:auto}
.anmevacts .anm-dismiss{margin-left:auto}
.oppnote{font-size:12px;color:var(--muted);line-height:1.6}

/* ---------- 12. 异常证据面板(时序/影响面/对照组) ---------- */
.anmevbox{display:flex;flex-direction:column;gap:var(--sp-3);padding:0}
.anmevgrid{display:grid;grid-template-columns:1.1fr 1fr;gap:var(--sp-4)}
.anmevsec{background:var(--panel);border:1px solid var(--rule);border-radius:10px;
  padding:var(--sp-4) var(--sp-4);min-width:0}
.anmevsec .anmevt{font-size:12px;font-weight:600;color:var(--muted);letter-spacing:.03em;margin-bottom:var(--sp-2)}
/* 前端规范第 3 批-1:.anmspark 从"svg 自己"变成"图的壳"—— 图由共享 chartLine 画,
   壳只管卡片外观。高度不再写死 132px(改由 chartLine 的 height 决定,壳跟着走),
   底色从写死的暖白渐变(#fbfaf6→#f3f1ea)改成 --paper:该渐变此前只在 #page-highlights
   出现,而那一页 2687 行正好把 background 覆盖成 --paper —— 渐变本就是看不见的死值。 */
.anmspark{width:100%;background:var(--paper);border:1px solid var(--rule);
  border-radius:var(--r-md);padding:4px 6px}
.anmimp,.anmcoh,.anmsib{font-size:13px;line-height:1.7;color:var(--ink2)}
.anmimp b,.anmcoh b{font-family:var(--mono);color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}
.anmsib .p1pill{margin:2px 6px 2px 0}
.diagx summary{font-size:12px;color:var(--blue);margin-top:6px}
.diagbox{margin-top:var(--sp-2);padding:var(--sp-3);background:var(--panel);
  border:1px solid var(--rule);border-radius:var(--r-md);font-size:12.5px;line-height:1.7}

/* ---------- 13. KPI 卡 ---------- */
.kpicards{display:grid;grid-template-columns:repeat(auto-fit,minmax(228px,1fr));gap:var(--sp-4);margin:var(--sp-4) 0 0}
.kpicard{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  padding:var(--sp-4) 18px 18px;min-width:0}
.kpicard .kl{font-size:12px;font-weight:500;color:var(--muted);margin-bottom:6px}
.kpicard .kv{font-size:30px;font-weight:650;color:var(--ink);line-height:1.15;
  letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.kpicard .ks{font-size:12.5px;color:var(--ink2);margin-top:6px}
.kpicard .kn{font-size:11.5px;color:var(--muted);margin-top:var(--sp-3);line-height:1.6;
  padding-top:var(--sp-2);border-top:1px dashed var(--rule)}
.kpidist{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--sp-2)}
.kpidist span,.kpidist .p1pill{font:500 11.5px/1.5 var(--mono);background:var(--mute-bg);color:var(--ink2);
  border-radius:999px;padding:2px 9px;border:1px solid var(--mute-line)}

/* ---------- 14. 弹窗:遮罩 + 卡片(440px) ---------- */
.oppmodal-scrim{position:fixed;inset:0;background:rgba(32,29,25,.46);z-index:60;
  display:flex;align-items:center;justify-content:center;padding:var(--sp-8) var(--sp-4)}
.oppmodal{width:440px;max-width:96vw;max-height:90vh;overflow:auto;background:var(--panel);
  border-radius:var(--r-xl);box-shadow:var(--shadow-pop);padding:0}
.oppmodal h3{margin:0;padding:18px var(--sp-6) 14px;font-size:16px;font-weight:650;color:var(--ink);
  border-bottom:1px solid var(--rule)}
.oppmodal-body{display:flex;flex-direction:column;gap:var(--sp-4);padding:20px var(--sp-6) var(--sp-1)}
.oppmodal input,.oppmodal select,.oppmodal textarea{width:100%}
.oppmodal .btns{display:flex;justify-content:flex-end;gap:var(--sp-2);
  padding:var(--sp-4) var(--sp-6) 20px;margin-top:var(--sp-2)}
/* 批量汇总块 */
.oppsummary{background:var(--blue-bg);border:1px solid #d3e0de;border-radius:var(--r-md);
  padding:10px 12px;font-size:12.5px;color:var(--ink2);line-height:1.7}
.sumrow{padding:1px 0}
.sumrow b{color:var(--ink);font-weight:600;margin-right:4px}

/* ---------- 15. 空态 / 提示 ---------- */
/* 空态只有两种形态,各一套:
   ① 卡片空态 .empty —— 独占区域,虚线卡片 + 居中;.empty.compact 是它嵌在图表/小面板里的紧凑档。
   ② 行内空态 .emptyline —— 表格体、看板列、详情小节里的一行灰字。
   收敛前行内空态是 9 个各写各的类(pempty/dtempty/tblempty/exoutempty/clemptyline/
   loopemptyline/cbloading/cbblaneempty/psp-column-empty),差别只在 padding 与字号 ——
   其中 .dtempty 全库零 JS 调用,按清死类的标准直接删;
   卡片空态另有 chartempty/anmprimary-empty 两套近似实现。存量类名保留,按下面并入。 */
.empty{border:1px dashed var(--rule2);border-radius:var(--r-lg);background:var(--panel);
  color:var(--muted);font-size:13px;text-align:center;padding:48px var(--sp-6)}
.empty.compact,.anmprimary-empty{border:1px dashed var(--rule2);border-radius:var(--r-md);
  background:var(--panel);color:var(--muted);font-size:12.5px;text-align:center;padding:20px 14px}
/* .chartempty 嵌在 --paper 卡片里,原本就没有 background —— 给它上白底会在卡片里露白块 */
.chartempty{border:1px dashed var(--rule2);border-radius:var(--r-md);background:transparent;
  color:var(--muted);font-size:12.5px;text-align:center;padding:22px 14px}
/* 对齐分两档,按各自在 main 上的现值归组,不做统一(改对齐是视觉回归不是收敛):
   居中档 = 表体 / 看板列;左对齐档 = 详情小节、泳道、列表里跟正文对齐的一行。 */
.emptyline,.pempty,.tblempty,.psp-column-empty{
  color:var(--muted);font-size:12px;line-height:1.55;padding:12px;text-align:center}
.emptyline-l,.exoutempty,.clemptyline,.loopemptyline,.cbloading,.cbblaneempty{
  color:var(--muted);font-size:12px;line-height:1.55;padding:12px}
.toast{position:fixed;right:20px;bottom:20px;background:var(--ink);color:#fff;
  padding:11px 16px;font-size:13px;line-height:1.5;border-radius:10px;max-width:60ch;
  box-shadow:var(--shadow-raise);opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;
  transform:translateY(4px);z-index:80}
.toast.show{opacity:1;pointer-events:auto;transform:none}

/* ---------- 16. 长尾组件的继承样式 ---------- */
.perfsec{margin:var(--sp-6) 0;padding:var(--sp-4) 20px;background:var(--panel);
  border:1px solid var(--rule);border-radius:var(--r-lg)}
.lkevitem{padding:9px 12px;border:1px solid var(--rule);border-radius:var(--r-md);
  background:var(--panel);margin:6px 0;font-size:13px;line-height:1.6}
.cmeta{font-size:12px;color:var(--muted)}
.ddsm{font-size:12px;color:var(--muted);line-height:1.6}
.onsite-stub{border:1px dashed var(--rule2);border-radius:var(--r-md);padding:var(--sp-3);
  color:var(--muted);font-size:12.5px;background:var(--paper)}
.lk{font-family:var(--mono);font-size:12px;word-break:break-all}
.ln{color:var(--muted);font-size:12px}
.lh{font-weight:600;font-size:13px;color:var(--ink)}
.rl{color:var(--ink2)}
.it{font-style:normal;color:var(--ink2)}

/* ---------- 16b. 宽表修正:异常表首列限宽;展开面板钉在可视区不随横滚拉出 ---------- */
#page-highlights .anmt td:first-child{max-width:280px;overflow-wrap:anywhere}
tr.oppexp>td>*,tr.anmexp>td>*{position:sticky;left:var(--sp-6);max-width:min(1180px,calc(100vw - var(--side) - 112px))}

/* ---------- 17. 响应式兜底(窄屏) ---------- */
@media (max-width:900px){
  body{grid-template-columns:1fr}
  aside.side{position:fixed;left:0;top:0;bottom:0;width:var(--side);z-index:40;
    transform:translateX(-100%);transition:transform .18s}
  aside.side.open{transform:none;box-shadow:var(--shadow-pop)}
  header.topbar,.main{grid-column:1}
  .navtoggle{display:inline-flex;min-height:36px}
  .navscrim.show{display:block;position:fixed;inset:0;background:rgba(32,29,25,.38);z-index:30}
  .anmevgrid{grid-template-columns:1fr}
  .main{padding:var(--sp-4)}
}

/* ---------- 18. v3 定版层(Semrush 对齐,codex 裁决定稿;新规则只加在本段,不回改上面) ---------- */
:root{--r-lg:12px;--r-xl:16px}
/* 18.1 侧栏:压高度;选中态浅灰底黑字;分组标签常规小灰字 */
aside.side{padding:12px 8px 16px;overflow:hidden;display:flex;flex-direction:column}
aside .brandmark{padding:4px 8px 12px}
aside nav{gap:0;flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding-bottom:8px}
aside nav a{padding:4px 10px;line-height:1.4;border-radius:6px}
aside nav a.on{background:#e9e5da;color:var(--ink);font-weight:600}
aside nav .navgrp{padding:10px 10px 2px;font-size:10.5px;line-height:1.3;letter-spacing:0}
aside nav .navgrp:first-child{padding-top:2px}
/* 18.2 布局:.main 只管滚动背景,页面统一 padding,表格卡片吃满宽,说明文字仍限宽 */
.main{padding:0}
/* 页面容器边距是**全局默认**,不是逐页登记项:新建页不必再往任何 #page-* 名单里补一笔,
   漏登记就贴侧栏的老毛病到此为止。

   前端规范第 3 批-3 收官:#297 落这条全局默认时,值取的是当时那串 #page-* 名单上的
   20px 24px 64px —— 但实测那串名单本身早被第 27 段(v5 定版)一条 27 个 ID 的
   `padding:var(--content-pad-y) var(--content-pad-x) 72px` 整条压掉,老页面实收的一直是
   28/32/72。结果是"全局默认"只对没进那份名单的新页生效,新页 20/24/64、老页 28/32/72,
   两套边距并存 —— 正是这条规则本来要消灭的毛病。本批把全局默认取成实收值(令牌化的
   28/32/72),再把逐页 padding 规则全删掉:老页面计算值逐字节不变,漏网的新页与
   loopruns/taskmcp/catboard/catbattle/projectstrategy/rankkw/guide 一并归位。
   要不同边距的页面仍写 #page-X 覆盖,但必须在规则上方写明理由(见下面 #page-review)。 */
.page{padding:var(--content-pad-y) var(--content-pad-x) 72px}
.page{max-width:none}
/* 复核页是 320px|1fr 满高双栏,左栏自带边框、两栏各自滚动 —— 有意的零边距,显式覆盖全局默认。 */
#page-review{padding:0}
/* 死码已删:25 个 ID 的逐页 padding 名单 + #page-execution 同值一条 —— 值与全局默认等价,
   且被第 27 段的 27 ID 令牌规则整条压掉,两重死码。max-width:none 亦与全局默认 .page 等值。 */.exsectionhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.exsectionhead h3{margin:0}.exsectionhead p{margin:6px 0 0;color:var(--muted)}.extabs{display:flex;gap:8px;margin:18px 0}.extabs button.on{background:var(--blue);border-color:var(--blue);color:#fff}.exsection{margin-top:20px}.extaskgrid,.excataloggrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:12px}.extask,.excatalog{display:flex;min-height:180px;flex-direction:column;background:#fff;border:1px solid var(--line);border-radius:12px;padding:15px}.extask header,.excatalog header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.extask header span,.excatalog header span{font-size:11px;color:var(--muted)}.extask h3,.excatalog h3{font-size:15px;margin:4px 0 0;word-break:break-word}.extask p,.excatalog p{font-size:13px;line-height:1.55;color:var(--ink2);margin:12px 0}.exmeta{display:flex;flex-wrap:wrap;gap:6px 12px;color:var(--muted);font-size:11px}.extask footer,.excatalog footer{margin-top:auto;padding-top:14px}.extable{margin-top:12px}.extable tr.exdiverge{background:var(--halt-bg)}.exdim{color:var(--muted);font-size:11px}@media(max-width:1000px){.extaskgrid,.excataloggrid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:680px){.extaskgrid,.excataloggrid{grid-template-columns:1fr}}
/* 说明页是长正文,限宽保证行长可读;边距吃全局默认(原来在这里重申的 padding 已删)。 */
#page-guide{max-width:960px}
.clintro{line-height:1.55;margin:0 0 12px}
/* 18.3 页面级长说明折叠 */
details.introfold{margin:0 0 12px}
details.introfold>summary{cursor:pointer;font-size:12.5px;color:var(--muted);user-select:none;list-style:none}
details.introfold>summary::-webkit-details-marker{display:none}
details.introfold>summary::before{content:"▸ ";color:var(--muted)}
details.introfold[open]>summary::before{content:"▾ "}

details.introfold>summary:hover{color:var(--ink2)}
details.introfold .clintro{margin:8px 0 0}
/* 18.4 KPI 横向指标条(替代大卡片网格) */
.kpis,.kpicards{display:flex;flex-wrap:wrap;gap:0;margin:0 0 16px;background:var(--panel);
  border:1px solid var(--rule);border-radius:8px;overflow:hidden}
.kpicards{margin:16px 0 0}
.kpi,.kpicard{flex:1 1 160px;min-width:150px;border:0;border-right:1px solid var(--rule);
  border-radius:0;padding:12px 16px;background:transparent}
.kpi:last-child,.kpicard:last-child{border-right:0}
.kpi b{font-size:22px}
.kpicard .kv{font-size:24px}
/* 18.5 内链页状态行改安静 chip */
.lnsum{gap:8px;margin:0 0 12px}
.lnsum>span{display:inline-flex;align-items:center;font-size:12px;padding:3px 10px;
  border:1px solid var(--rule);border-radius:999px;background:var(--panel);color:var(--ink2);font-weight:500}
.lnsum .kpi-good{color:var(--pass);border-color:#c2ddc9}
.lnsum .kpi-bad{color:var(--halt-deep);border-color:var(--halt-line)}
.lnsum .kpi-amber{color:var(--review);border-color:#eadcb6}
.lnsum .kpi-mut{color:var(--muted)}
/* 18.6 工单类型主维度改下划线 tab,与阶段胶囊分层,只留一排胶囊 */
.ilseg.dimseg{background:transparent;border:0;border-radius:0;padding:0;gap:2px;margin:0 0 12px;
  border-bottom:1px solid var(--rule);flex:1}
.dimseg .ilseg-b{border-radius:0;border-bottom:2px solid transparent;background:transparent;
  box-shadow:none;min-height:34px;padding:6px 12px;margin-bottom:-1px}
.dimseg .ilseg-b:hover{background:transparent;border-bottom-color:var(--rule2);color:var(--ink)}
.dimseg .ilseg-b.on{background:transparent;box-shadow:none;color:var(--blue);
  border-bottom-color:var(--blue);font-weight:600}
/* 18.7 按钮层级定版:每视图最多一个实心主钮(批量提交/表单唯一提交/弹窗确认);
   行内与卡片内动作一律描边或文字级;绿色只留确认语义描边,hover 才填充 */
.planacts .pconf{background:var(--paper);color:var(--pass);border:1px solid #accfb6;
  min-height:30px;padding:4px 12px;border-radius:7px;font-size:12.5px;cursor:pointer}
.planacts .pconf:hover{background:var(--pass);border-color:var(--pass);color:#fff}
.planacts .pconf:disabled{background:var(--paper);color:var(--muted);border-color:var(--rule)}
.planacts .pgoto{min-height:30px;padding:4px 12px;border:1px solid var(--rule2);border-radius:7px;
  background:var(--paper);color:var(--ink2);font-size:12.5px;cursor:pointer}
.planacts .pgoto:hover{border-color:#bdb5a3;color:var(--ink)}
.exb,.exb.ghost{min-height:32px;padding:5px 12px;background:var(--paper);color:var(--blue);
  border:1px solid #c9dbd9;border-radius:7px;font-size:12.5px}
.exb:hover{background:var(--blue-bg);opacity:1}
button.bstat,button.actst,#page-highlights .anm-diag{background:var(--paper);color:var(--blue);
  border:1px solid #c9dbd9;border-radius:6px}
button.bstat:hover,button.actst:hover,#page-highlights .anm-diag:hover{background:var(--blue-bg);border-color:#b9d0d0;color:var(--blue-deep)}
button.bstat.ghost,button.actst.ghost{color:var(--muted);border-color:var(--rule2);background:transparent}
.ovgo{background:var(--paper);color:var(--blue);border:1px solid #c9dbd9;border-radius:6px}
.ovgo:hover{background:var(--blue-bg);opacity:1}
.oppact [data-act="approve"],.oppact .primary,.anmevacts .anm-diag{background:var(--paper);
  border:1px solid #c9dbd9;color:var(--blue);box-shadow:none}
.oppact [data-act="approve"]:hover,.oppact .primary:hover,.anmevacts .anm-diag:hover{
  background:var(--blue-bg);border-color:#b9d0d0;color:var(--blue-deep)}
/* 行内/展开区/候选列表里的 .primary 一律降为描边(实心只留批量条/表单唯一提交/弹窗确认) */
.rqevacts .primary,.candadd.primary{background:var(--paper);border:1px solid #c9dbd9;color:var(--blue);box-shadow:none}
.rqevacts .primary:hover,.candadd.primary:hover{background:var(--blue-bg);border-color:#b9d0d0;color:var(--blue-deep)}
.kwconfirm.primary{background:var(--paper);border:1px solid #accfb6;color:var(--pass);box-shadow:none}
.kwconfirm.primary:hover{background:var(--pass);border-color:var(--pass);color:#fff}
.fbtn.on{background:var(--paper);color:var(--blue);border-color:var(--blue);font-weight:600}
.ctx-save{background:#fff;color:var(--pass);border:1px solid #accfb6}
.ctx-save:hover{background:#ecf4ee}
/* 18.8 待规划卡改紧凑单行(grid 两列,动作靠右) */
.plancard{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;
  padding:10px 14px;margin-bottom:8px;border-radius:8px}
.plancard .lh{min-width:0;padding:0;border:0}
.plancard .planacts{padding:0;justify-self:end}
/* 18.9 筛选条:搜索框定宽,计数靠右,控件统一 32px */
.ilfbar #ilf-q{flex:0 1 380px;min-width:200px}
.albar #alq{flex:0 1 380px;min-width:200px}
.urlbar input{flex:0 1 380px;min-width:200px}
.albar .alinfo,.urlbar .alinfo{margin-left:auto}
.ilfbar select,.albar select,.urlbar select,.ilfbar button,.albar button,.urlbar button,
.ilfbar input,.albar input,.urlbar input{min-height:32px;padding:5px 10px}
/* 18.10 展开行选中态减淡,首列 3px 左标记 */
.opprow.open td,.anmrow.open td{background:var(--sel);border-bottom-color:#dfe8e7}
.opprow.open:hover td,.anmrow.open:hover td{background:var(--sel)}
tr.rqrow.open td,tr.lkevmain.open td,tr.candrow.open td{background:var(--sel)}
tr.rqrow.open,tr.lkevmain.open,tr.candrow.open{background:transparent}
tr.rqrow.open td:first-child,tr.lkevmain.open td:first-child,tr.candrow.open td:first-child,
tr.kwrow.open td:first-child,table.urlt tr.urlrow.open td:first-child{box-shadow:inset 3px 0 0 var(--blue)}
tr.kwrow.open{background:var(--sel)}
table.urlt tr.urlrow.open{background:var(--sel)}
/* 18.12 异常标签流量列:超常同款"前 → 现"单行呈现,粗体为近28天合计,右侧小字是与前28天的差 */
#page-highlights .anmt td.num b{font:600 12.5px/1.4 var(--mono);color:var(--ink)}
/* B-09:4px 间距下负增量会和现值粘成 "20-44"(看着像区间);用不可断空格+更大间距分开 */
#page-highlights .anmdelta{margin-left:8px;white-space:nowrap;font:500 10.5px/1.35 var(--mono)}
#page-highlights .anmdelta.anmdown{color:var(--halt)}
#page-highlights .anmdelta.anmup{color:var(--pass)}
#page-highlights .anmdelta.anmflat{color:var(--muted)}

/* 18.11 表格密度定版:压过旧层 .tblwrap 内边距与单元格 9px 14px */
.tblwrap{padding:0}
.tblwrap table.lkt thead th{padding:9px 12px}
.tblwrap table.lkt tbody td{padding:10px 12px}
.tblwrap table th:first-child,.tblwrap table td:first-child{padding-left:16px}
.tblwrap table th:last-child,.tblwrap table td:last-child{padding-right:16px}
.tblwrap table.lkt th:first-child,.tblwrap table.lkt td:first-child{padding-left:16px}
.tblwrap table.lkt th:last-child,.tblwrap table.lkt td:last-child{padding-right:16px}
/* 18.12 圆角收敛:普通卡片一律 8px(弹窗 12 toast 10 不动) */
.cluster,.tdkcard,.oppbatch,.rqbatch,.oppact,.lkevacts,.rqevacts,.anmevacts,
.oppvcard,.anmevsec,.ltarget,.stgcard,.perfsec,.perfcard,.mcpbox,.mcpinfo,.ddcard,.ddtog,
.empty,.urlchart,.urltdk,.urllivechart,.urlliveq,.urlliveerr,.diagbox,.oppmetric{border-radius:8px}
@media (max-width:900px){
  /* 窄屏同样只有全局默认这一条。原先这里跟着一串 26 个 ID 的同值名单,是为了压过宽屏的
     #page-* 规则;那些规则本批已全删,名单随之作废(它自己也早被第 27 段的 27 ID 规则压掉,
     窄屏其实一直没生效 —— 老页面在 900px 以下仍吃着 32px 的侧边距)。 */
  .page{padding:16px 16px 56px}
}

/* ---------- 侧栏查找与分组折叠 ---------- */
.navsearch{display:flex;align-items:center;gap:7px;margin:0 4px 8px;padding:0 9px;height:34px;
  background:var(--panel);border:1px solid var(--rule2);border-radius:7px;color:var(--muted)}
.navsearch:focus-within{border-color:var(--blue);box-shadow:var(--focus)}
.navsearch-icon{font-size:16px;line-height:1}
.navsearch input{flex:1;min-width:0;height:30px;min-height:0;padding:0;border:0;background:transparent;box-shadow:none;font-size:12.5px}
.navsearch input:focus-visible{border:0;box-shadow:none}
.navsearch kbd{font:10px/1 var(--mono);padding:3px 5px;border:1px solid var(--rule2);border-radius:4px;background:var(--paper);color:var(--muted)}
.navbulk{display:flex;align-items:center;gap:4px;margin:0 4px 6px;color:var(--muted)}
.navbulk>span{margin-right:auto;font-size:12px;line-height:16px}
.navbulk button{min-height:28px;padding:4px 7px;border-color:transparent;background:transparent;box-shadow:none;font-size:12px;line-height:18px;color:var(--blue)}
.navbulk button:hover{background:var(--hover);border-color:transparent}
.navbulk button:disabled{background:transparent;color:var(--muted);opacity:.45}
aside nav .navgrp[role="button"]{display:flex;align-items:center;gap:6px;cursor:pointer;border-radius:5px}
aside nav .navgrp[role="button"]::after{content:"⌄";margin-left:auto;font-size:12px;color:var(--muted);transition:transform .14s}
aside nav .navgrp[role="button"].collapsed::after{transform:rotate(-90deg)}
aside nav .navgrp[role="button"]:hover{background:var(--hover);color:var(--ink2)}
aside nav .navgrp[role="button"]:focus-visible{outline:none;box-shadow:var(--focus)}
body.nav-searching aside nav .navgrp.search-open{color:var(--blue)}
aside nav a[hidden],aside nav .navgrp[hidden]{display:none!important}
.navscrim{border:0;border-radius:0;padding:0;min-height:0;box-shadow:none}

@media(max-width:620px){
  body{grid-template-rows:auto minmax(0,1fr)}
  header.topbar{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-rows:auto auto;
    gap:7px 10px;min-height:0;padding:8px 12px}
  header.topbar .navtoggle{grid-column:1;grid-row:1;margin:0;align-self:center}
  header.topbar .controls{grid-column:2;grid-row:1;display:grid;grid-template-columns:minmax(112px,1fr) auto auto;
    gap:7px;width:100%;margin:0;min-width:0}
  header.topbar #meta{grid-column:1/-1;grid-row:2;order:initial;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .controls .fld{min-width:0}
  .controls .fld>span,.controls .whoami,#portal{display:none}
  .controls .fld select{width:100%;min-width:0}
  .controls button,.controls select,.controls .fld select{min-height:36px;height:36px}
  .navsearch{height:38px;margin-bottom:10px}
  .navsearch input{height:34px;font-size:14px}
  aside nav a{min-height:38px;display:flex;align-items:center}
  aside nav .navgrp[role="button"]{min-height:34px}
}

/* ---------- 18.13 content 内容规划板(只加不改) ---------- */
tr.ctrow{cursor:pointer}
tr.ctrow.open td{background:var(--sel);border-bottom-color:#dfe8e7}
tr.ctrow.open:hover td{background:var(--sel)}
tr.ctrow.open td:first-child{box-shadow:inset 3px 0 0 var(--blue)}
.ctev{background:var(--panel);border:1px solid var(--rule);border-radius:8px;padding:12px 14px;margin:6px 0}
.ctev .ctsec{margin:0 0 10px}
.ctev .ctsec:last-child{margin:0}
.ctev .cth{font-size:12px;color:var(--muted);font-weight:600;margin:0 0 4px}
.ctev .ctline{font-size:12.5px;line-height:1.55;color:var(--ink2)}
.ctev pre.ctpre{margin:4px 0 0;padding:8px 10px;background:var(--paper);border:1px solid var(--rule);border-radius:6px;
  font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:180px;overflow:auto}
/* 动作按钮一律描边(18.7 定版:实心只留弹窗确认) */
.ctacts{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.ctacts button,button.ctb{min-height:30px;padding:4px 12px;background:var(--paper);color:var(--blue);
  border:1px solid #c9dbd9;border-radius:7px;font-size:12.5px;cursor:pointer}
.ctacts button:hover,button.ctb:hover{background:var(--blue-bg);border-color:#b9d0d0;color:var(--blue-deep)}
.ctacts button.danger,button.ctb.danger{color:var(--halt-deep);border-color:var(--halt-line);background:var(--paper)}
.ctacts button.danger:hover,button.ctb.danger:hover{background:#faf0ee;border-color:#d9a5a3;color:#8f3038}
.ctacts button.good{color:var(--pass);border-color:#accfb6}
.ctacts button.good:hover{background:var(--pass);border-color:var(--pass);color:#fff}
.ctbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0 0 12px}
.ctbar .alinfo{margin-left:auto;font-size:12px;color:var(--muted)}

/* ---------- 18.14 新博客写作流程 ---------- */
.bwfhead{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin:0 0 16px}
.bwfhead h2{font-size:22px;line-height:1.25;margin:0 0 5px}
.bwfhead p{max-width:900px;margin:0;color:var(--muted);font-size:12.5px;line-height:1.65}
.bwfheadactions{display:flex;gap:8px;flex:none}
.bwfsummary{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));gap:10px;margin:0 0 14px}
.bwfsummary>div{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 13px;
  border:1px solid var(--rule);border-radius:9px;background:var(--panel);box-shadow:var(--shadow-card)}
.bwfsummary span{font-size:11.5px;color:var(--muted)}.bwfsummary b{font:700 20px var(--mono)}
.bwftools{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 12px}
.bwftools .ilseg{margin:0}.bwftools input{width:min(340px,38vw)}
.bwfworkspace{display:grid;grid-template-columns:310px minmax(0,1fr);gap:14px;align-items:start}
.bwflist,.bwfdetail{border:1px solid var(--rule);border-radius:11px;background:var(--panel);box-shadow:var(--shadow-card)}
.bwflist{position:sticky;top:0;max-height:calc(100vh - 120px);overflow:auto}
.bwflisthead{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:10px 12px;border-bottom:1px solid var(--rule);background:var(--paper)}
.bwflisthead b{font-size:12.5px}.bwflisthead span{font-size:10.5px;color:var(--muted)}
button.bwftopic{display:block;width:100%;min-height:0;padding:12px;border:0;border-bottom:1px solid var(--rule);
  border-radius:0;background:var(--panel);box-shadow:none;text-align:left;color:var(--ink)}
button.bwftopic:last-child{border-bottom:0}button.bwftopic:hover{background:var(--hover);border-color:var(--rule)}
button.bwftopic.on{background:var(--blue-bg);box-shadow:inset 3px 0 0 var(--blue)}
.bwftopline{display:flex;align-items:center;gap:5px;margin-bottom:5px}.bwftopic strong{display:block;font-size:13px;line-height:1.45}
.bwfmeta,.bwfnext{display:block;margin-top:4px;color:var(--muted);font-size:10.5px;line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bwfnext{color:var(--ink2)}.bwfprogress{display:block;height:3px;margin-top:8px;border-radius:999px;background:#e8e5da;overflow:hidden}
.bwfprogress i{display:block;height:100%;border-radius:inherit;background:var(--blue)}
.bwfpill.source{font:600 9px var(--mono);color:var(--muted)}
.bwfdetail{min-height:520px;padding:18px;overflow:hidden}
.bwfdetailhead{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}
.bwfcrumb{margin-bottom:3px;color:var(--muted);font-size:10.5px}.bwfdetailhead h2{margin:0;font-size:21px;line-height:1.32}
.bwfdetailmeta{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}.bwfowner{display:flex;flex-direction:column;align-items:flex-end;min-width:130px}
.bwfowner span{font-size:10px;color:var(--muted)}.bwfowner b{font-size:12px;margin:1px 0 3px}
.bwfstepper{display:grid;grid-template-columns:repeat(9,minmax(70px,1fr));gap:0;margin:20px 0 14px;overflow-x:auto}
.bwfstep{position:relative;display:flex;flex-direction:column;align-items:center;min-width:70px;gap:4px;color:var(--muted)}
.bwfstep::before{content:"";position:absolute;z-index:0;top:11px;right:50%;width:100%;height:2px;background:var(--rule)}
.bwfstep:first-child::before{display:none}.bwfstep span{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;
  width:24px;height:24px;border:2px solid var(--rule2);border-radius:50%;background:var(--panel);font:650 9.5px var(--mono)}
.bwfstep b{font-size:10px;white-space:nowrap}.bwfstep.done::before,.bwfstep.current::before{background:#b9d0d0}
.bwfstep.done span{border-color:var(--pass);background:var(--pass);color:#fff}.bwfstep.done b{color:var(--pass)}
.bwfstep.current span{border-color:var(--blue);background:var(--blue);color:#fff;box-shadow:0 0 0 4px var(--blue-bg)}
.bwfstep.current b{color:var(--blue)}
.bwfnextbox{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:11px 13px;border:1px solid #c9dbd9;border-radius:9px;background:var(--blue-bg)}
.bwfnextbox>div:first-child{min-width:0}.bwfnextbox span{display:block;color:var(--blue);font-size:9.5px;font-weight:700;letter-spacing:.06em}
.bwfnextbox b{display:block;margin-top:2px;font-size:12.5px}.bwfnextactions{display:flex;gap:7px;flex-wrap:wrap;justify-content:flex-end}
.bwfnextactions button{min-height:31px;padding:4px 10px;font-size:11.5px}
.bwftabs{display:flex;gap:2px;margin:16px -18px 0;padding:0 18px;border-bottom:1px solid var(--rule);overflow-x:auto}
.bwftab{min-height:36px;padding:7px 12px;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;
  box-shadow:none;color:var(--muted);font-size:12px;white-space:nowrap}
.bwftab:hover{border-color:transparent;background:var(--hover)}.bwftab.on{border-bottom-color:var(--blue);color:var(--blue);font-weight:650}
#bwf-tab-body{padding-top:16px}.bwfsectionhead{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin:0 0 10px}
.bwfsectionhead.second{margin-top:20px;padding-top:16px;border-top:1px solid var(--rule)}
.bwfsectionhead h3{margin:0;font-size:14px}.bwfsectionhead p{margin:2px 0 0;color:var(--muted);font-size:10.5px}
.bwfsectionhead>div:last-child{display:flex;gap:7px}.bwfsectionhead button{min-height:30px;padding:4px 10px;font-size:11px}
.bwfsourcegrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px}
.bwfsource{min-width:0;padding:10px 11px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6}
.bwfsource.missing{border-style:dashed;background:var(--paper)}.bwfsourcehead{display:flex;align-items:center;justify-content:space-between;gap:7px}
.bwfsourcehead>b{font-size:11px}.bwfsourcevalue{display:flex;flex-direction:column;margin-top:7px;min-height:37px}
.bwfsourcevalue>b{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bwfsourcevalue>span{color:var(--ink2);font-size:10.5px;line-height:1.45}
.bwfsource>p{margin:6px 0 0;color:var(--muted);font-size:9.5px;line-height:1.45}
.bwfevidence{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.bwfev{border:1px solid var(--rule);border-radius:8px;background:#fbfaf6;min-width:0}.bwfev.missing{border-style:dashed}
.bwfev>summary{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 10px;cursor:pointer;list-style:none}
.bwfev>summary::-webkit-details-marker{display:none}.bwfev>summary b{font:650 10.5px var(--mono)}.bwfev>summary span{font-size:9.5px;color:var(--muted)}
.bwfev>div{padding:9px 10px;border-top:1px solid var(--rule)}.bwfev p{margin:0 0 7px;font-size:10.5px;color:var(--ink2)}
.bwfev pre,.bwftimeline pre{max-height:280px;margin:0;padding:8px;border:1px solid var(--rule);border-radius:6px;background:var(--panel);
  font:9.5px/1.5 var(--mono);white-space:pre-wrap;overflow:auto;word-break:break-word}
.bwfbriefgrid,.bwfartifactmeta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.bwffield,.bwfartifactvalue{min-width:0;padding:10px 11px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6}
.bwffield>span,.bwfartifactvalue>span{display:block;margin-bottom:5px;color:var(--muted);font-size:10px;font-weight:650}
.bwffield>div,.bwfartifactvalue>div{min-height:20px;color:var(--ink2);font-size:11.5px;line-height:1.58;white-space:pre-wrap;overflow-wrap:anywhere}
.bwfversions{margin-top:12px;border:1px solid var(--rule);border-radius:8px;overflow:hidden}.bwfversions>summary{padding:8px 10px;cursor:pointer;color:var(--blue);font-size:10.5px;font-weight:650}
.bwfversions>div{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-top:1px solid var(--rule)}
.bwfversions b{font-size:10.5px}.bwfversions span{color:var(--muted);font-size:9.5px}
.bwfemptyaction{padding:42px 18px;text-align:center;color:var(--muted)}.bwfemptyaction p{margin:0 0 4px;color:var(--ink);font-size:14px}
.bwfemptyaction span{display:block;margin-bottom:12px;font-size:11px}
.bwfsections{display:flex;flex-direction:column;gap:9px;margin-top:12px}.bwfsections article{padding:12px 13px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6}
.bwfsections article>div{display:flex;align-items:center;justify-content:space-between}.bwfsections span,.bwfsections em{color:var(--muted);font-size:9.5px;font-style:normal}
.bwfsections h3{margin:6px 0 5px;font-size:13px}.bwfsections p{margin:0;color:var(--ink2);font-size:11.5px;line-height:1.7;white-space:pre-wrap}
.bwfartifacteditor .bwfartifactmeta{margin-bottom:6px}.bwfeditfield{display:flex;flex-direction:column;gap:4px;min-width:0}
.bwfeditfield>span{display:flex;align-items:center;justify-content:space-between;color:var(--ink2);font-size:10.5px;font-weight:650}
.bwfeditfield em{color:var(--muted);font:9.5px var(--mono);font-style:normal}.bwfeditfield input,.bwfeditfield textarea{width:100%;font-size:11.5px}
.bwfeditfield textarea{min-height:94px}.bwfeditsection{padding:11px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6;margin-bottom:9px}
.bwfeditsectionhead{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.bwfeditsectionhead b{font-size:11px}
.bwfeditsectionhead button{min-height:26px;padding:2px 7px;color:var(--halt);font-size:10px}.bwfeditsection .bwfeditfield+.bwfeditfield{margin-top:8px}
.bwfqagrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.bwfqagrid article{padding:9px 10px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6}
.bwfqagrid article.pass{border-color:#c2ddc9;background:var(--pass-bg)}.bwfqagrid article.warn{border-color:#eadcb6;background:var(--review-bg)}
.bwfqagrid article.fail{border-color:var(--halt-line);background:var(--halt-bg)}.bwfqagrid span,.bwfqagrid b{display:block;font-size:10.5px}
.bwfqagrid b{margin-top:2px}.bwfqagrid p{min-height:28px;margin:4px 0 0;color:var(--muted);font-size:9.5px;line-height:1.45}
.bwfqaver{margin-top:9px;color:var(--muted);font-size:10px}.bwfmonitor{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.bwfmonitor article{display:flex;flex-direction:column;padding:10px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6}
.bwfmonitor b{font-size:11px}.bwfmonitor span{margin-top:3px;font:9.5px/1.5 var(--mono);word-break:break-all}.bwfmonitor em{margin-top:4px;color:var(--muted);font-size:9.5px;font-style:normal}
.bwftimeline{position:relative;margin-left:7px;border-left:1px solid var(--rule)}.bwftimeline article{display:grid;grid-template-columns:115px minmax(0,1fr);gap:12px;padding:0 0 15px 14px;position:relative}
.bwftimeline article::before{content:"";position:absolute;left:-4px;top:5px;width:7px;height:7px;border-radius:50%;background:var(--blue)}
.bwftimeline article>span{color:var(--muted);font:9.5px var(--mono)}.bwftimeline b{font-size:11.5px}.bwftimeline p{margin:2px 0;color:var(--ink2);font-size:10.5px}
.bwftimeline small{color:var(--muted);font-size:9.5px}.bwftimeline details{margin-top:5px}.bwftimeline summary{cursor:pointer;color:var(--blue);font-size:9.5px}
.bwfmodalgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.bwfmodalgrid .wide{grid-column:1/-1}
.bwfmodalchecks{display:flex;flex-direction:column;gap:6px;margin:9px 0}.bwfmodalchecks>div{display:grid;grid-template-columns:100px 92px minmax(160px,1fr);gap:7px;align-items:center}
.bwfmodalchecks b{font-size:10.5px}.bwfmodalchecks select,.bwfmodalchecks input{min-height:32px;padding:4px 8px;font-size:11px}
@media(max-width:1120px){
  .bwfworkspace{grid-template-columns:260px minmax(0,1fr)}
  .bwfsourcegrid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .bwfqagrid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:820px){
  /* 死码已删:#page-blogwriter 窄屏 padding —— 被第 27 段 27 ID 规则压掉,窄屏边距吃全局默认 */
  .bwfhead,.bwfnextbox{align-items:stretch;flex-direction:column}
  .bwfworkspace{grid-template-columns:1fr}.bwflist{position:static;max-height:320px}
  .bwfsummary{grid-template-columns:repeat(2,minmax(0,1fr))}.bwftools{align-items:stretch;flex-direction:column}
  .bwftools input{width:100%}.bwfsourcegrid,.bwfevidence,.bwfbriefgrid,.bwfartifactmeta,.bwfmonitor{grid-template-columns:1fr}
  .bwfowner{display:none}.bwfnextactions{justify-content:flex-start}
  .bwfmodalgrid{grid-template-columns:1fr}.bwfmodalgrid .wide{grid-column:1}
  .bwfmodalchecks>div{grid-template-columns:1fr}.bwftimeline article{grid-template-columns:1fr}
}

/* ---------- 18.15 Collection 优化档案 ---------- */
tr.corow{cursor:pointer}
tr.corow:hover td{background:var(--hover)}
.copass{color:var(--pass);font-weight:650}.cofail{color:var(--halt);font-weight:700}
.codossier{max-width:1180px;margin:0 auto}
.codossierhead{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:14px;align-items:start;margin:0 0 18px}
.codossierhead h2{font-size:21px;line-height:1.25;margin:1px 0 3px}
.codossierhead a{font-size:12px;word-break:break-all}
.cosec{background:var(--panel);border:1px solid var(--rule);border-radius:10px;padding:18px;margin:0 0 14px;
  box-shadow:var(--shadow-card)}
.cohead{display:flex;align-items:center;gap:10px;margin:0 0 14px}
.cohead h3{font-size:16px;line-height:1.25;margin:0}
.conum{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:7px;
  background:var(--blue-bg);color:var(--blue);font:650 11px var(--mono)}
.cosub{color:var(--muted);font-size:11.5px;margin-left:auto}
.cokpis{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));border:1px solid var(--rule);border-radius:8px;overflow:hidden}
.cokpi{padding:11px 13px;border-right:1px solid var(--rule);min-width:0}.cokpi:last-child{border-right:0}
.cokpi .lab{font-size:10.5px;color:var(--muted);margin-bottom:3px}.cokpi .val{font-size:18px;font-weight:700}
.cokpi .val.good{color:var(--pass)}.cokpi .sub{font-size:10.5px;color:var(--ink2);white-space:normal;line-height:1.4;margin-top:2px}
.coegrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
details.coecard{border:1px solid var(--rule);border-radius:8px;background:var(--paper);min-width:0}
details.coecard>summary{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:pointer;
  list-style:none;padding:10px 12px;font-weight:650;font-size:12.5px}
details.coecard>summary::-webkit-details-marker{display:none}
details.coecard>summary time{font-size:10.5px;color:var(--muted);font-weight:500}
.cosource{border-top:1px solid var(--rule);padding:7px 12px 0;color:var(--muted);font:10.5px/1.45 var(--mono);word-break:break-all}
details.coecard pre,.cojson pre{margin:7px 12px 12px;padding:9px 10px;border:1px solid var(--rule);border-radius:6px;
  background:var(--panel);font:10.5px/1.55 var(--mono);white-space:pre-wrap;word-break:break-word;max-height:340px;overflow:auto}
.codecisions{display:flex;flex-direction:column;gap:8px}
.codecision{display:grid;grid-template-columns:26px 1fr;gap:10px;padding:10px 12px;border:1px solid var(--rule);border-radius:8px}
.codecision>span{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;
  background:var(--panel);border:1px solid var(--rule2);font:600 10.5px var(--mono);color:var(--muted)}
.codecision b{font-size:12.5px}.codecision p{margin:2px 0 0;color:var(--ink2);font-size:12px;line-height:1.55}
.codiff{margin:0 0 12px}.codifflabel{font-size:11px;font-weight:650;color:var(--muted);margin:0 0 5px}
.codiffcols{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--rule);border-radius:8px;overflow:hidden}
.codiffcols>div{padding:10px 12px;min-width:0}.codiffcols>div+div{border-left:1px solid var(--rule)}
.codiffcols>div.new{background:#f2f6f1}.codiffcols span{font-size:10.5px;color:var(--muted)}
.codiffcols p{font-size:13px;line-height:1.55;margin:2px 0 0;word-break:break-word}
.coartifactgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:14px}
.cocard{border:1px solid var(--rule);border-radius:8px;padding:11px 12px}.cocard h4{font-size:12px;margin:0 0 7px}
.cocard ul{list-style:none;margin:0;padding:0}.cocard li{display:flex;justify-content:space-between;gap:8px;padding:5px 0;border-top:1px solid var(--rule);font-size:11.5px}
.cocard li:first-child{border-top:0}.cocard li span{color:var(--muted);white-space:nowrap}.cocard code{font:10.5px var(--mono);word-break:break-all}
details.cojson{margin-top:12px;border-top:1px solid var(--rule)}
details.cojson>summary{cursor:pointer;padding:10px 0 0;font-size:11.5px;color:var(--blue);font-weight:600}
.coartifactsec>.cohead{flex-wrap:wrap}.coartifactactions{margin:0 0 0 4px}
.cometadata{margin-top:12px}.cometafield{margin-bottom:12px}.cometafield:last-child{margin-bottom:0}
.coartifactmodule{margin-top:16px;padding-top:16px;border-top:1px solid var(--rule)}
.comodulehead{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:9px}
.comodulehead>div{display:flex;align-items:baseline;gap:8px}.comodulehead h4{font-size:13.5px;margin:0}.comodulehead span{font-size:10.5px;color:var(--muted)}
.cofieldgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.cofieldgrid>.wide{grid-column:1/-1}.comodulefields{margin-bottom:9px}
.coeditfield{display:block;min-width:0}.cofieldlabel{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 5px}
.cofieldlabel>span:first-child{font-size:10.5px;font-weight:650;color:var(--ink2)}.cofieldlabel .cochar{font:10px var(--mono);color:var(--muted);white-space:nowrap}
.coeditfield input,.coeditfield textarea{display:block;width:100%;font-size:12.5px}.coeditfield textarea{min-height:108px}
.coeditfield small{display:block;margin-top:4px;color:var(--muted);font-size:9.5px;line-height:1.4}
.coviewfield{padding:9px 10px;border:1px solid var(--rule);border-radius:7px;background:var(--paper)}
.cofieldvalue{min-height:20px;color:var(--ink);font-size:12.5px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere}
.cofieldvalue.code{font:10.5px/1.55 var(--mono)}
.coeditable-view{cursor:pointer;transition:border-color .12s,background .12s}.coeditable-view:hover{border-color:#b9d0d0;background:var(--blue-bg)}
.coitemcard{padding:10px 11px;border:1px solid var(--rule);border-radius:8px;background:#fbfaf6;margin-bottom:9px}
.coitemcard:last-child{margin-bottom:0}.coitemhead{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.coitemhead b{font-size:11.5px;color:var(--ink2)}
.corelatedrule{margin:0 0 9px;padding:8px 10px;border:1px solid #c9dbd9;border-radius:7px;background:var(--blue-bg);color:var(--ink2);font-size:11px;line-height:1.45}
.corelatedproof{margin-top:9px;padding:6px 8px;border-radius:6px;font-size:10.5px;line-height:1.45}
.corelatedproof.good{border:1px solid #c2ddc9;background:#ecf4ee;color:var(--pass)}
.corelatedproof.bad{border:1px solid #ebcfca;background:#fbf3f2;color:var(--halt)}
.co-remove-artifact{min-height:25px;padding:2px 7px;border:1px solid var(--halt-line);border-radius:6px;background:var(--paper);color:var(--halt);font-size:10.5px;cursor:pointer}
.co-remove-artifact:hover{background:var(--halt-bg)}
.coimportlist{border:1px solid var(--rule);border-radius:8px;overflow:hidden}
.coimportlist>div{display:grid;grid-template-columns:minmax(0,1fr) 70px 90px;gap:10px;align-items:center;padding:8px 10px;border-top:1px solid var(--rule)}
.coimportlist>div:first-child{border-top:0}.coimportlist code{font:10.5px var(--mono);word-break:break-all}
.coimportlist span,.coimportlist em{font-size:10.5px;color:var(--muted);font-style:normal;text-align:right}
.cocheckgroups{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.cocheckgroup{border:1px solid var(--rule);border-radius:8px;overflow:hidden}.cocheckgroup h4{font-size:12px;margin:0;padding:9px 11px;background:var(--paper)}
.cocheck{display:grid;grid-template-columns:22px 1fr auto;gap:8px;padding:8px 10px;border-top:1px solid var(--rule);align-items:start}
.cocheck>span{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;
  font-size:11px;font-weight:700}.cocheck.ok>span{color:var(--pass);background:var(--pass-bg)}.cocheck.bad>span{color:var(--halt);background:var(--halt-bg)}
.cocheck b{display:block;font:600 10.5px/1.4 var(--mono);word-break:break-all}.cocheck p{font-size:11px;color:var(--ink2);line-height:1.45;margin:2px 0 0}
.cocheck em{font-size:10px;color:var(--muted);font-style:normal;white-space:nowrap}
.coreview{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.coreview .ctacts{margin:0}
.cospec{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:0 0 12px}
.cospec>div{border:1px solid var(--rule);border-radius:8px;background:var(--paper);padding:10px 12px}
.cospec b{font-size:11px;color:var(--muted)}.cospec p{font-size:12px;line-height:1.55;margin:4px 0 0;color:var(--ink2)}
.costages{display:flex;gap:7px;overflow-x:auto;margin:0 0 12px;padding-bottom:2px}.costage{min-width:104px;border:1px solid var(--rule);border-radius:8px;padding:8px 9px;background:var(--paper)}
.costage span,.costage b,.costage em{display:block}.costage span{font:10.5px var(--mono);color:var(--muted)}.costage b{font-size:11px;margin-top:4px}.costage em{font-size:10px;color:var(--muted);font-style:normal;margin-top:2px}
.costage.completed{border-color:#c2ddc9}.costage.completed b{color:var(--pass)}.costage.failed{border-color:var(--halt-line);background:var(--halt-bg)}.costage.failed b{color:var(--halt)}
.coresearch{border:1px solid var(--rule);border-radius:8px;margin:0 0 12px}.coresearch summary{padding:9px 11px;font-size:11.5px;color:var(--blue);font-weight:600}.coresearch>div{border-top:1px solid var(--rule);padding:5px 11px;max-height:320px;overflow:auto}.coresearch p{font-size:11.5px;line-height:1.5;margin:6px 0;color:var(--ink2)}.coresearch p b{display:inline-block;margin-right:8px;color:var(--muted);font:10px var(--mono)}
.coreviewsummary{display:grid;grid-template-columns:minmax(150px,.4fr) 1fr;gap:14px;align-items:start}
.coreviewsummary>div:first-child p{font-size:11.5px;color:var(--muted);line-height:1.6;margin:8px 0 0}
.coscores{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--rule);border-radius:8px;overflow:hidden}
.coscores>div{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-right:1px solid var(--rule);border-bottom:1px solid var(--rule)}
.coscores span{font-size:10.5px;color:var(--muted)}.coscores b{font:700 14px var(--mono)}
.coscores b.good{color:var(--pass)}.coscores b.bad{color:var(--halt)}
.cofindings{display:flex;flex-direction:column;gap:8px;margin-top:12px}.cofinding{border:1px solid var(--rule);border-left:3px solid var(--review);border-radius:8px;padding:9px 11px}
.cofinding.high,.cofinding.critical{border-left-color:var(--halt);background:var(--halt-bg)}
.cofinding b{font-size:11.5px}.cofinding p{font-size:12px;line-height:1.5;margin:3px 0}.cofinding span{font-size:11px;color:var(--muted)}
.coalert{margin-top:12px;padding:9px 11px;border:1px solid var(--rule);border-radius:8px;font-size:11.5px;line-height:1.5}
.coalert.ok{color:var(--pass);border-color:#c2ddc9;background:var(--pass-bg)}.coalert.bad{color:var(--halt);border-color:var(--halt-line);background:var(--halt-bg)}
/* 前置数据红标清单(2026-08-20 去掉人工审批的配套):红标标的是「当时的输入什么状态」。
   「自动批准」徽标本身不自造几何,走统一徽标族 .sbdg + 语义类 .sbdg-review(见本文件 6. 徽标统一族)——
   它是「这一版没人签过字,留意一下」,不是失败,故取 review 档而非 halt 档。 */
.cohealth{list-style:none;margin:6px 0 0;padding:0;display:grid;gap:4px}
.cohealth>li{overflow-wrap:anywhere}
.courlsec{max-width:none}
.courlsec .cohead>span{margin-left:auto;color:var(--muted);font-size:11.5px}
.cofocusbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 12px;padding:9px 12px;
  border:1px solid #9dbfc3;border-radius:8px;background:var(--blue-bg);color:var(--ink2);font-size:12px}
.cofocusbar span{min-width:0;overflow-wrap:anywhere}.cofocusbar a{flex:none;color:var(--blue);font-weight:650;text-decoration:none}
.cofocusbar a:hover{text-decoration:underline}
.co-table-controls{display:grid;grid-template-columns:minmax(260px,1fr) minmax(150px,.35fr) minmax(170px,.4fr) auto;
  gap:8px;align-items:end;margin:0 0 12px}
.co-table-controls label{display:flex;flex-direction:column;gap:4px;min-width:0}
.co-table-controls label>span{color:var(--muted);font-size:10.5px;font-weight:600}
.co-table-controls input,.co-table-controls select{width:100%;min-height:34px;padding:5px 9px;border:1px solid var(--rule2);
  border-radius:7px;background:var(--paper);color:var(--ink2);font-family:inherit;font-size:12px}
.co-table-controls select{padding-right:28px}
.co-table-controls .ctb{min-height:34px}
tr.courlrow{cursor:pointer}
tr.courlrow.open td{background:var(--sel);border-bottom-color:#dfe8e7}
tr.courlrow.open td:first-child{box-shadow:inset 3px 0 0 var(--blue)}
.co-decision{min-height:30px;max-width:150px;padding:4px 24px 4px 8px;border:1px solid var(--rule2);border-radius:7px;background:var(--paper);font-size:12px;color:var(--ink2)}
.coautodecision{margin-top:5px;font-size:10px;line-height:1.35;color:#9c5518}
.coreason{display:flex;align-items:flex-start;gap:6px;max-width:240px;margin-top:6px;color:var(--muted);font-size:10px;line-height:1.4}
.coreason span{min-width:0;overflow-wrap:anywhere}.coreason b{color:var(--ink2)}
.co-edit-reason{flex:none;padding:1px 5px;border:1px solid var(--rule2);border-radius:5px;background:var(--paper);color:var(--blue);font-size:9.5px;cursor:pointer}
.co-edit-reason:hover{border-color:var(--blue);background:var(--blue-bg)}
.co-decision-chips{margin-bottom:12px}
.co-filter-chip{display:inline-flex;align-items:center;min-height:26px;padding:3px 10px;border:1px solid var(--rule);
  border-radius:999px;background:var(--panel);color:var(--ink2);font-family:inherit;font-size:12px;font-weight:500;
  line-height:1.2;cursor:pointer}
.co-filter-chip:hover{border-color:var(--blue-soft);background:var(--blue-bg);color:var(--blue)}
.co-filter-chip.on{border-color:var(--blue);background:var(--blue-bg);color:var(--blue);font-weight:650;
  box-shadow:inset 0 0 0 1px rgba(47,103,114,.08)}
.co-filter-chip:focus-visible{outline:2px solid rgba(47,103,114,.28);outline-offset:2px}
.co-map-filters{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:-5px 0 10px}
.co-map-filters>span{margin-right:2px;color:var(--muted);font-size:11px}
.co-map-filters .co-filter-chip{min-height:23px;padding:2px 8px;font-size:11px}
.cocluster{min-width:220px;max-width:390px}
.cocluster>div:first-child{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.cocluster b{font-size:12px;line-height:1.35}.cocluster>span{display:block;margin-top:3px;color:var(--muted);font-size:10.5px}
.cocluster.missing b{color:var(--halt)}.cocluster.missing span{color:var(--muted)}
.cocluster.ignored b{color:#9c5518}
.cointent,.coconfirmed,.counconfirmed{display:inline-flex;align-items:center;min-height:18px;padding:1px 6px;border-radius:999px;font-size:9.5px;font-weight:600}
.cointent{background:var(--blue-bg);color:var(--blue)}.coconfirmed{background:var(--pass-bg);color:var(--pass)}
.counconfirmed{background:var(--review-bg);color:var(--review)}
.cokeywords{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px}
.cokeywords em{max-width:160px;padding:2px 6px;border:1px solid var(--rule);border-radius:999px;background:var(--paper);
  color:var(--ink2);font-size:9.5px;font-style:normal;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.courlpanel{background:var(--panel);border:1px solid var(--rule);border-radius:8px;padding:14px;margin:5px 0}
.courlgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.courlpanel .cth{font-size:11px;color:var(--muted);font-weight:650;margin-bottom:4px}
.courlpanel .ctline{font-size:12.5px;color:var(--ink2);line-height:1.5}
.coclusterfield{display:grid;grid-template-columns:130px minmax(260px,520px);gap:5px 10px;align-items:center;margin-top:13px}
.coclusterfield>span{font-size:11px;color:var(--muted);font-weight:650}
.coclusterfield select{min-height:32px;padding:4px 28px 4px 9px;border:1px solid var(--rule2);border-radius:7px;background:var(--paper);font-size:12px;color:var(--ink2)}
.coclusterfield small{grid-column:2;color:var(--muted);font-size:10.5px;line-height:1.45}
.coevopts{display:flex;flex-wrap:wrap;gap:7px;margin-top:7px}
.coevopt{display:grid;grid-template-columns:auto auto auto;align-items:center;gap:6px;min-height:31px;padding:4px 8px;border:1px solid var(--rule2);border-radius:7px;background:var(--paper);font-size:11.5px;cursor:pointer}
.coevopt.fixed{background:var(--paper);cursor:default}.coevopt input{margin:0}.coevopt small{font-size:9.5px;color:var(--muted)}
.cocommand{margin-top:11px;padding:9px 10px;border:1px solid var(--rule);border-radius:7px;background:#f7f5f0;word-break:break-all}
.cocommand code{font:10.5px/1.5 var(--mono);color:var(--ink2)}
.courlpanel button:disabled{cursor:not-allowed;opacity:.55}
@media(max-width:900px){
  body{grid-template-rows:auto minmax(0,1fr)}
  header.topbar{min-height:56px;height:auto;flex-wrap:nowrap;padding:8px 12px;gap:8px}
  header.topbar #meta{order:initial;flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .topbar .controls{flex:none;gap:8px}
  /* 死码已删:#page-content 窄屏 padding —— 同上,吃窄屏全局默认 */
  .cokpis{grid-template-columns:1fr 1fr}.cokpi{border-bottom:1px solid var(--rule)}
  .coegrid,.cocheckgroups,.coartifactgrid,.cospec,.coreviewsummary,.cofieldgrid{grid-template-columns:1fr}
  .cofieldgrid>.wide{grid-column:1}
  .coscores{grid-template-columns:repeat(2,minmax(0,1fr))}
  .courlgrid{grid-template-columns:1fr}
  .coclusterfield{grid-template-columns:1fr}.coclusterfield small{grid-column:1}
  .co-table-controls{grid-template-columns:1fr 1fr}.co-table-search{grid-column:1/-1}
}
@media(max-width:620px){
  #usermgmt,#portal,.controls .whoami{display:none!important}
  .topbar .controls{gap:6px}
  .topbar .controls .fld>span{display:none}
  .codossierhead{grid-template-columns:1fr}.codossierhead>div:last-child{grid-row:1}
  .codiffcols{grid-template-columns:1fr}.codiffcols>div+div{border-left:0;border-top:1px solid var(--rule)}
  .cokpis{grid-template-columns:1fr}
  .cofocusbar{align-items:flex-start;flex-direction:column}
  .co-table-controls{grid-template-columns:1fr}.co-table-search{grid-column:1}
}

/* ============================================================
   v4 设计系统层(暖中性 + 深青主色,DS01 定稿)
   本段只新增通用组件与外壳精修,不删改上方任何历史选择器。
   设计规范见 ui-redesign/DESIGN_SPEC.md。
   ============================================================ */

/* ---------- v4.1 外壳精修:侧栏 / 品牌标 / 顶栏 ---------- */
aside.side{background:#fbfaf6;border-right:1px solid var(--rule)}
aside .brandmark{display:flex;align-items:center;gap:9px;font-size:14px;font-weight:700;
  color:var(--ink);letter-spacing:.01em}
aside .brandmark .logo{flex:none;width:24px;height:24px;border-radius:7px;
  box-shadow:0 1px 2px rgba(42,40,35,.18)}
aside .brandmark .brandname{line-height:1.2}
aside .brandmark .brandsub{display:block;font-size:10px;font-weight:500;color:var(--muted);
  letter-spacing:.06em;margin-top:2px}
aside nav a{color:var(--ink2);border-left:0;transition:background .12s,color .12s}
aside nav a:hover{background:var(--hover);color:var(--ink)}
aside nav a.on{background:var(--blue-bg);color:var(--blue-deep);font-weight:600;
  box-shadow:inset 2.5px 0 0 var(--blue)}
aside nav .navgrp{color:var(--muted);font-weight:600;letter-spacing:.08em}

header.topbar{background:var(--panel);border-bottom:1px solid var(--rule);
  box-shadow:0 1px 2px rgba(42,40,35,.03)}
.topbar .controls{gap:8px;flex-wrap:nowrap}
.topbar .controls .fld{height:34px;gap:7px;flex:none}
.topbar .controls .fld>span{white-space:nowrap}
.topbar .controls .fld select{width:118px;height:34px;min-height:34px;padding:0 30px 0 10px;border-radius:7px;background:var(--panel);font-size:13px}
.topbar .controls .whoami{height:34px;box-sizing:border-box;gap:6px;padding:0 2px;white-space:nowrap}
.topbar .controls>button,.topbar .controls>a.toplink{display:inline-flex;align-items:center;justify-content:center;height:34px;min-height:34px;box-sizing:border-box;border:1px solid var(--rule);border-radius:7px;padding:0 12px;background:var(--panel);color:var(--ink2);font-size:13px;font-weight:500;line-height:1;text-decoration:none;white-space:nowrap}
.topbar .controls>button:hover,.topbar .controls>a.toplink:hover{border-color:var(--rule2);background:var(--hover);color:var(--ink);text-decoration:none}
.topbar #reload,.topbar #portal,.topbar #logout{min-width:56px;height:34px;min-height:34px}
.topbar #usermgmt{min-width:72px}
.topbar .rolebadge{display:inline-flex;align-items:center;justify-content:center;height:22px;box-sizing:border-box;border-radius:999px;padding:0 8px;margin-left:0;font-size:10px;font-weight:600;line-height:1}

/* 数据任务 */
#page-jobs{background:var(--canvas,#f5f6f4)}
#page-jobs .jobshead{align-items:flex-end;margin-bottom:18px}
#page-jobs .jobshead h2{margin:0 0 5px}
#page-jobs .jobshead p{margin:0;color:var(--muted);font-size:13px}
.dtheadactions{display:flex;gap:8px}
.dttabs{display:flex;align-items:center;gap:4px;padding:4px;width:max-content;border:1px solid var(--rule2);border-radius:10px;background:var(--panel);box-shadow:var(--shadow-card)}
.dttabs button{min-height:34px;padding:6px 14px;border:0;border-radius:7px;background:transparent;color:var(--muted);font-size:13px;font-weight:600}
.dttabs button:hover{background:var(--hover);color:var(--ink)}
.dttabs button.on{background:var(--ink);color:#fff;box-shadow:0 1px 3px rgba(16,35,38,.18)}
.dtbody{margin-top:18px}
.dtintro{margin:12px 0 14px;padding:10px 13px;border:1px solid var(--blue-soft);border-radius:8px;background:var(--blue-bg);color:var(--ink2);font-size:12px}
.dtboard{display:grid;grid-template-columns:repeat(4,minmax(230px,1fr));gap:12px;align-items:start;min-width:1010px}
.dtcolumn{min-height:400px;border:1px solid var(--rule2);border-radius:10px;background:rgba(255,255,255,.62)}
.dtcolumn>header{display:flex;align-items:center;justify-content:space-between;padding:12px 13px 10px;border-bottom:1px solid var(--rule2)}
.dtcolumn>header h3{margin:0;font-size:13px;color:var(--ink)}
.dtcolumn>header span{display:grid;place-items:center;min-width:22px;height:22px;border-radius:999px;background:var(--panel2);color:var(--muted);font-size:11px;font-weight:700}
.dtcolumn>div{display:grid;gap:9px;padding:10px}
.dtcard{padding:12px;border:1px solid var(--rule2);border-left:3px solid var(--rule);border-radius:8px;background:var(--panel);box-shadow:0 2px 7px rgba(23,52,56,.05)}
.dtcard.ok{border-left-color:var(--pass)}.dtcard.bad{border-left-color:var(--halt)}.dtcard.warn{border-left-color:var(--review)}.dtcard.run{border-left-color:var(--blue)}
.dtcardtop{display:flex;align-items:center;justify-content:space-between;gap:8px}
.dtkind{color:var(--muted);font-size:10px;font-weight:700;letter-spacing:.04em}
.dtstate{font-size:11px;font-weight:700;color:var(--ink2)}
.dtcard h4{margin:8px 0 4px;font-size:14px}.dtcard>p{min-height:34px;margin:0 0 9px;color:var(--muted);font-size:11px;line-height:1.5}
.dtcard dl{display:grid;gap:6px;margin:0}.dtcard dl div{display:grid;grid-template-columns:58px minmax(0,1fr);gap:6px}.dtcard dt{color:var(--muted);font-size:10px}.dtcard dd{margin:0;color:var(--ink2);font-size:11px;line-height:1.4}
.dtcardactions{display:flex;gap:5px;margin-top:11px;padding-top:9px;border-top:1px solid var(--rule2)}
.dtcardactions button{min-height:28px;padding:4px 8px;font-size:11px}
.dtpanel{margin-bottom:14px;padding:16px;border:1px solid var(--rule2);border-radius:10px;background:var(--panel);box-shadow:var(--shadow-card)}
.dtpanel>h3,.dtpanelhead h3{margin:0;font-size:15px}.dtpanelhead{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:13px}.dtpanelhead p{margin:4px 0 0;color:var(--muted);font-size:12px}
.dttimeline{position:relative;display:grid;gap:0}.dttimeline article{display:grid;grid-template-columns:115px 12px minmax(260px,1fr) 160px 62px;align-items:center;gap:12px;min-height:58px;border-top:1px solid var(--rule2)}.dttimeline article:first-child{border-top:0}.dttimeline time{font-size:12px;font-weight:700}.dttimeline i{width:9px;height:9px;border-radius:50%;background:var(--rule)}.dttimeline i.ok{background:var(--pass)}.dttimeline i.bad{background:var(--halt)}.dttimeline i.warn{background:var(--review)}.dttimeline i.run{background:var(--blue)}.dttimeline article div{display:grid;gap:3px}.dttimeline article div b{font-size:13px}.dttimeline article div span,.dtzone{color:var(--muted);font-size:11px}
.dtsearch{display:grid;gap:4px}.dtsearch span{color:var(--muted);font-size:10px}.dtsearch input{width:230px}
.dttable td:first-child b{display:block;font-size:13px}.dttable td small{display:block;max-width:420px;margin-top:3px;color:var(--muted);font-size:10px;line-height:1.4}.dttable .p1pill.run{background:var(--blue-bg);color:var(--blue-deep)}.dttable .p1pill.muted{background:var(--mute-bg);color:var(--muted)}
.dttodaylist{padding:0;overflow:hidden}.dttodaylist .dtpanelhead{margin:0;padding:15px 16px;border-bottom:1px solid var(--rule2)}
.dttodaytable{min-width:1080px;table-layout:auto}.dttodaytable th:nth-child(n+3):nth-child(-n+6),.dttodaytable td:nth-child(n+3):nth-child(-n+6){width:94px;text-align:center}.dttodaytable th:nth-child(2){width:135px}.dttodaytable th:nth-child(7){width:210px}.dttodaytable th:last-child{width:190px}
.dttodaytable td:first-child b{display:block;font-size:13px}.dttodaytable td:first-child small,.dttodaytable td:nth-child(2) small{display:block;margin-top:3px;color:var(--muted);font-size:11px}
.dtstatus{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:74px;font-size:12px;font-weight:650;white-space:nowrap}.dtstatus i{width:7px;height:7px;border-radius:50%;background:var(--rule)}.dtstatus.run i{background:var(--blue)}.dtstatus.ok i{background:var(--pass)}.dtstatus.bad i{background:var(--halt)}.dtstatus.warn i{background:var(--review)}.dtstatusoff{color:var(--rule);font-size:12px}.dtactions{white-space:nowrap}.dtactions button{min-height:30px;margin:2px 0;padding:4px 8px;font-size:12px}.dtactions button+button{margin-left:8px}
.dtscrim{position:fixed;z-index:70;inset:0;width:100%;height:100%;border:0;border-radius:0;background:rgba(19,32,34,.10);backdrop-filter:none}
.dtdrawer{position:fixed;z-index:71;top:0;right:0;bottom:0;display:grid;grid-template-rows:auto minmax(0,1fr) auto;width:min(540px,44vw);background:var(--panel);box-shadow:-18px 0 48px rgba(16,35,38,.16)}
.dtdrawer>header{display:flex;align-items:center;justify-content:space-between;padding:20px 22px 16px;border-bottom:1px solid var(--rule2)}.dtdrawer>header span{color:var(--muted);font-size:11px;font-weight:700}.dtdrawer>header h3{margin:4px 0 0;font-size:20px}.dtdrawer>header button{width:34px;height:34px;padding:0;border:0;background:var(--panel2);font-size:22px}
.dtdrawerbody{overflow:auto;padding:20px 22px}.dtdrawer>footer{display:flex;justify-content:flex-end;gap:8px;padding:14px 22px;border-top:1px solid var(--rule2);background:var(--panel)}
.dtdetailstate{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border:1px solid var(--rule2);border-radius:8px;background:var(--panel2)}.dtdetailstate.ok{border-color:var(--pass-line);background:var(--pass-bg)}.dtdetailstate.bad{border-color:var(--halt-line);background:var(--halt-bg)}.dtdetailstate.warn{border-color:var(--review-line);background:var(--review-bg)}.dtdetailstate span{font-size:12px;color:var(--muted)}
.dtdetails{display:grid;margin:18px 0}.dtdetails div{display:grid;grid-template-columns:110px minmax(0,1fr);gap:14px;padding:11px 0;border-bottom:1px solid var(--rule2)}.dtdetails dt{color:var(--muted);font-size:12px}.dtdetails dd{margin:0;font-size:13px;line-height:1.5}
.dterror{padding:14px;border:1px solid var(--halt-line);border-radius:8px;background:var(--halt-bg)}.dterror h4{margin:0 0 8px}.dttech{margin-top:16px}.dttech summary{color:var(--muted);font-size:12px}.dttech pre{overflow:auto;padding:12px;border-radius:7px;background:var(--ink);color:#dce8e7;font-size:11px}
.dttoggle{display:flex!important;align-items:flex-start;gap:10px;padding:12px 13px;border:1px solid var(--rule2);border-radius:8px;background:var(--panel2)}.dttoggle input{margin-top:3px}.dttoggle span{display:grid;gap:3px}.dttoggle small{color:var(--muted);font-size:11px}
.dtformgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:16px 0}.dtformgrid label,.dtdrawerbody>label{display:grid;gap:5px}.dtformgrid label>span,.dtdrawerbody>label>span{color:var(--muted);font-size:11px;font-weight:600}.dtformgrid input,.dtformgrid select,.dtdrawerbody textarea{width:100%;box-sizing:border-box}
.dtformgrid label[hidden]{display:none!important}
.dtdrawer fieldset{margin:0 0 16px;padding:12px;border:1px solid var(--rule2);border-radius:8px}.dtdrawer legend{padding:0 6px;font-size:12px;font-weight:700}.dtdrawer fieldset>p{margin:0 0 9px;color:var(--muted);font-size:11px}.dtscopefixed{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.dtscopefixed span{display:grid;gap:2px;padding:9px;border-radius:6px;background:var(--panel2)}.dtscopefixed small{color:var(--muted);font-size:10px}.dtsites{display:grid;grid-template-columns:1fr 1fr;gap:7px}.dtsites label{display:flex;align-items:center;gap:7px;padding:8px;border:1px solid var(--rule2);border-radius:6px}
.exreviewwarning{margin:14px 0;padding:12px 14px;border:1px solid #e5d1ae;border-radius:8px;background:var(--review-bg);font-size:13px;line-height:1.55}.exreviewitems{display:grid;gap:8px;margin:16px 0}.exreviewitems article{display:grid;gap:4px;padding:11px 12px;border:1px solid var(--rule2);border-radius:8px}.exreviewitems article b{font-size:13px}.exreviewitems article span,.exreviewitems article small{font-size:12px;line-height:1.45;color:var(--muted)}
.dtimpact{display:grid;gap:4px;margin-top:14px;padding:11px 12px;border:1px solid var(--blue-soft);border-radius:8px;background:var(--blue-bg);font-size:11px}.dtimpact span{color:var(--muted);line-height:1.5}

/* ---------- v4.2 通用卡片 / 面板 ---------- */
.card{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);padding:var(--sp-4) 20px}
.card>h3,.card .card-t{margin:0 0 var(--sp-3);font-size:14px;font-weight:650;color:var(--ink)}

/* ---------- v4.3 状态点(通用语义色点) ---------- */
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none;vertical-align:1px}
.dot.ok{background:var(--pass)} .dot.warn{background:var(--review)}
.dot.bad{background:var(--halt)} .dot.info{background:var(--blue)}
.dot.mut{background:var(--muted)}

/* ---------- v4.4 加载态:骨架屏与 spinner(通用) ---------- */
/* 死码已删:.skeleton/.skeleton-line/.skeleton-block 与 @keyframes sk-shine 全库零使用
   (boot 页用的是另一个类 .boot-skeleton + @keyframes boot-skeleton-run,不受影响) */
@keyframes sk-spin{to{transform:rotate(360deg)}}
.spinner{display:inline-block;width:16px;height:16px;flex:none;vertical-align:-3px;
  border:2px solid var(--rule2);border-top-color:var(--blue);border-radius:50%;
  animation:sk-spin .7s linear infinite}
.spinner.lg{width:26px;height:26px;border-width:3px}
.spinner.mut{border-top-color:var(--muted)}
.loading{display:flex;align-items:center;justify-content:center;gap:10px;
  padding:40px var(--sp-6);color:var(--muted);font-size:13px}

/* ---------- 登录回跳与首次启动加载态 ---------- */
.main{position:relative}
.boot-progress{position:fixed;z-index:1200;left:var(--side);right:0;top:0;height:3px;
  overflow:hidden;background:rgba(47,103,114,.12);pointer-events:none}
.boot-progress>span{position:absolute;inset:0 auto 0 0;width:38%;background:var(--blue);
  transform:translateX(-110%);animation:boot-progress-run .85s cubic-bezier(.45,0,.55,1) infinite}
@keyframes boot-progress-run{
  0%{transform:translateX(-110%) scaleX(.65)}
  55%{transform:translateX(125%) scaleX(1)}
  100%{transform:translateX(295%) scaleX(.72)}
}
.boot-loading{position:absolute;z-index:20;inset:0;display:flex;flex-direction:column;align-items:center;
  justify-content:flex-start;gap:18px;padding:70px 24px;background:var(--panel)}
.boot-loading-card{display:flex;align-items:center;gap:14px;min-width:min(420px,calc(100vw - var(--side) - 48px));
  max-width:560px;padding:18px 20px;background:var(--paper);border:1px solid var(--rule);
  border-radius:var(--r-lg);box-shadow:var(--shadow-card)}
.boot-loading-card>div{display:flex;flex-direction:column;gap:5px}
.boot-loading-card b{font-size:14px;font-weight:650;color:var(--ink)}
.boot-loading-card div>span{font-size:12px;color:var(--muted)}
.boot-skeleton{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;width:min(720px,100%)}
.boot-skeleton>span{height:68px;border:1px solid var(--rule);border-radius:var(--r-md);
  background:linear-gradient(100deg,var(--paper) 20%,var(--soft) 42%,var(--paper) 64%);
  background-size:220% 100%;animation:boot-skeleton-run 1.15s ease-in-out infinite}
.page-loading{display:flex;flex-direction:column;align-items:center;gap:4px;padding:24px}
.page-loading .loading{padding:20px var(--sp-6)}
.page-load-error{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.page-load-error>span{color:var(--muted)}
/* 非侵入加载指示(130 cachedView):宿主已有旧内容时不再整页换转圈,旧内容原地保留,
   顶栏下方浮这枚小提示;挂在宿主内部,页面被 hidden 时跟着一起隐藏 */
.view-loading-hint{position:fixed;z-index:900;top:calc(var(--hd) + 12px);
  left:calc(var(--side) + (100vw - var(--side))/2);transform:translateX(-50%);
  display:flex;align-items:center;gap:8px;padding:6px 14px;font-size:12px;color:var(--muted);
  background:var(--paper);border:1px solid var(--rule);border-radius:999px;
  box-shadow:var(--shadow-card);pointer-events:none}
@media (max-width:900px){.view-loading-hint{left:50%}}
@keyframes boot-skeleton-run{to{background-position-x:-220%}}
.boot-loading.error .spinner,.boot-loading.error+.boot-progress{display:none}
.boot-loading.error .boot-loading-card{border-color:var(--halt-line)}
.boot-loading.error .boot-skeleton{display:none}
.boot-loading .boot-retry{margin-left:auto}
.boot-loading[hidden],.boot-progress[hidden]{display:none}
body.app-booting nav,body.app-booting .controls{pointer-events:none;opacity:.72}
@media(max-width:820px){
  .boot-progress{left:0}
  .boot-loading{padding:52px 14px}
  .boot-loading-card{min-width:0;width:100%}
  .boot-skeleton{grid-template-columns:1fr}
  .boot-skeleton>span:nth-child(n+2){display:none}
}
@media(prefers-reduced-motion:reduce){
  .boot-progress>span{width:100%;transform:none;animation:boot-progress-fade 1s ease-in-out infinite alternate}
  .boot-skeleton>span{animation:none}
}
@keyframes boot-progress-fade{from{opacity:.35}to{opacity:1}}

/* ---------- v4.5 工具提示(body 浮层,不受表格 overflow 裁剪) ---------- */
.datatip-pop{position:fixed;left:0;top:0;width:max-content;max-width:min(280px,calc(100vw - 16px));
  padding:5px 9px;border-radius:var(--r-sm);background:var(--ink);color:var(--paper);
  font-size:11.5px;line-height:1.5;font-weight:400;white-space:normal;overflow-wrap:anywhere;
  box-shadow:var(--shadow-raise);pointer-events:none;z-index:1000}
.datatip-pop[hidden]{display:none}
.datatip-pop::after{content:"";position:absolute;left:50%;transform:translateX(-50%);border:4px solid transparent}
.datatip-pop[data-side="top"]::after{top:100%;border-top-color:var(--ink)}
.datatip-pop[data-side="bottom"]::after{bottom:100%;border-bottom-color:var(--ink)}
/* 死码已删:.kwdtip 的 v4 视觉对齐 —— 基类连同 260 的 canvas 实现一起清掉了,
   词抽屉的读数浮层现在是共享件的 .chartpop。 */

/* ---------- 分析页数据新鲜度 ---------- */
.freshness-strip{display:flex;align-items:center;gap:6px;min-height:36px;margin:0 0 12px;padding:5px 8px;
  overflow-x:auto;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--paper);white-space:nowrap}
.freshness-title{padding:0 4px;font-size:11px;font-weight:700;color:var(--ink2)}
.freshness-item{display:inline-flex;align-items:center;gap:5px;min-height:24px;padding:3px 7px;border:1px solid var(--rule);
  border-radius:999px;background:var(--panel);color:var(--ink2);font:11px/1.2 inherit;cursor:help}
.freshness-item:hover,.freshness-item:focus-visible{border-color:var(--blue);outline:0}
.freshness-item b{font-size:11px;color:var(--ink);font-weight:650}
.freshness-dot{width:7px;height:7px;flex:none;border-radius:50%;background:var(--muted)}
.freshness-item.s-fresh .freshness-dot{background:var(--pass)}
.freshness-item.s-delayed .freshness-dot{background:var(--review)}
.freshness-item.s-stale .freshness-dot{background:var(--halt)}
.freshness-date{font-family:var(--mono);font-size:10.5px}
.freshness-lag{color:var(--muted)}
.freshness-item.s-delayed .freshness-lag{color:var(--review)}
.freshness-item.s-stale .freshness-lag{color:var(--halt)}
.freshness-warning{padding:2px 6px;border-radius:var(--r-sm);background:var(--halt-bg);color:var(--halt);font-size:11px}
.freshness-wait,.freshness-error{font-size:11px;color:var(--muted)}
.freshness-strip.has-error{border-style:dashed}

/* ---------- v4.6 滚动条美化(暖灰细条) ---------- */
.main,aside.side,.tblwrap,.complist,.oppmodal,pre.kv,.jsonpre{
  scrollbar-width:thin;scrollbar-color:#cfc9ba transparent}
.main::-webkit-scrollbar,aside.side::-webkit-scrollbar,.tblwrap::-webkit-scrollbar,
.complist::-webkit-scrollbar,.oppmodal::-webkit-scrollbar,pre.kv::-webkit-scrollbar,
.jsonpre::-webkit-scrollbar{width:10px;height:10px}
.main::-webkit-scrollbar-thumb,aside.side::-webkit-scrollbar-thumb,
.tblwrap::-webkit-scrollbar-thumb,.complist::-webkit-scrollbar-thumb,
.oppmodal::-webkit-scrollbar-thumb,pre.kv::-webkit-scrollbar-thumb,
.jsonpre::-webkit-scrollbar-thumb{background:#cfc9ba;border-radius:6px;
  border:2px solid transparent;background-clip:padding-box}
.main::-webkit-scrollbar-thumb:hover,aside.side::-webkit-scrollbar-thumb:hover,
.tblwrap::-webkit-scrollbar-thumb:hover{background:#b8b1a0;background-clip:padding-box}
.main::-webkit-scrollbar-track,aside.side::-webkit-scrollbar-track,
.tblwrap::-webkit-scrollbar-track{background:transparent}

/* ---------- v4.7 通用工具类 ---------- */
.u-mono{font-family:var(--mono);font-variant-numeric:tabular-nums}
.u-mut{color:var(--muted)} .u-ink2{color:var(--ink2)}
.u-sm{font-size:12px} .u-lg{font-size:15px}
.u-flex{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.u-mt{margin-top:var(--sp-3)} .u-mb{margin-bottom:var(--sp-3)}
.u-right{margin-left:auto}

/* ---------- v4.8 动效节制与窄屏兜底 ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important}
}
@media (max-width:900px){
  .controls .fld select{width:96px}
  .oppbatch,.rqbatch{position:static}
}

/* ---------- v4.9 共享组件:必填标记(840 同名全局规则收口进基础层,视觉保持一致) ---------- */
.oppmodal .fld2 span.req::before{content:"*";color:var(--halt);font-weight:600;margin-right:3px}

/* ===== 800 core pages ===== */
/* 页面组样式 · 核心(总览/指南/任务/复核):page-overview, page-guide, page-tasks, page-review —— 归属「核心体验」页面组 agent,基础组件见 020-all.css 与 DESIGN_SPEC.md */
/* 本文件实际覆盖:overview / guide / jobs / execution / pipeline / tasklist(核心与总览组)。选择器均以 #page-xxx 限定,颜色只用 020 令牌。 */

/* ================= 总览 overview ================= */
#page-overview .ovhead{display:flex;align-items:baseline;gap:var(--sp-3);flex-wrap:wrap;margin:0 0 var(--sp-4)}
#page-overview .ovhead .ovh{margin:0}
#page-overview .ovsub{margin:0;font-size:12px;color:var(--muted)}
#page-overview .kpis .kpi{position:relative;padding-top:34px;min-width:0;overflow-wrap:anywhere}
#page-overview .kpi-info{position:absolute;top:7px;right:8px;min-height:24px;padding:2px 7px;border:0;background:transparent;box-shadow:none;color:var(--blue);font-size:11px}
#page-overview .kpi-info:hover,#page-overview .kpi-info[aria-expanded="true"]{background:var(--blue-bg)}
#page-overview .kpi-method{margin-top:8px;padding-top:8px;border-top:1px solid var(--rule);font-size:11px;line-height:1.55;color:var(--ink2)}
#page-overview .kpi-method[hidden]{display:none}
#page-overview .kpi-method div+div{margin-top:4px}
#page-overview .kpi-method strong{display:block;color:var(--muted);font-weight:600}

#page-overview .ovsec-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3);flex-wrap:wrap}
#page-overview .ovsec-h>span:first-child{color:var(--ink2)}
#page-overview .ovsec-hint{font-weight:400;font-size:11px;color:var(--muted)}

/* 漏斗阶段:可点击 + 待复核高亮 */
#page-overview .ovfunnel .ovstp{display:flex;flex-direction:column}
#page-overview .ovfunnel .ovstp .nums{margin-top:2px}
#page-overview .ovstp.has-pend{background:var(--halt-bg)}

/* 待办榜 */
#page-overview .ovtop td.ovleak{font-weight:700;color:var(--halt)}
#page-overview .ovtop{min-width:680px}
#page-overview .empty.ovok{font-style:normal;color:var(--ink2);display:flex;align-items:center;justify-content:center;gap:8px}

#page-overview .ovpipe>summary{display:flex;align-items:center;gap:10px}

/* ================= 任务质量看板 jobs ================= */
#page-jobs .jobshead{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);flex-wrap:wrap;margin:0 0 var(--sp-3)}
#page-jobs .jobshead .ovh{margin:0}
#page-jobs .p1grid .p1card{cursor:help}
#page-jobs .p1sec h3{display:flex;align-items:baseline;gap:8px}
#page-jobs .p1cnt{font-size:11px;font-weight:400;color:var(--muted)}
#page-jobs .jobslegend{display:flex;gap:18px;flex-wrap:wrap;margin:0 0 8px;font-size:12px;color:var(--muted)}
#page-jobs .jobslegend span{display:inline-flex;align-items:center;gap:6px}
#page-jobs .p1ds{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;margin:2px 10px 2px 0}
#page-jobs .p1dsid{font-family:var(--mono);font-size:11px;color:var(--ink);word-break:break-word}

/* 长表格:整表随页面滚动(不再卡内限高),表头保留暖白底与细影分隔 */
#page-jobs .tblwrap thead th{background:var(--panel);box-shadow:0 1px 0 var(--rule2)}

/* ================= 执行任务 execution ================= */
/* 头部两行卡片:第一行分类筛选(exhead),第二行状态统计条+操作按钮(exstatbar),卡片风格复用 .barcard */
#page-execution .exhead,#page-execution .exstatbar{margin:0 0 var(--sp-3)}
#page-execution .exflowscroll{display:flex;flex:1;min-width:0;align-items:center;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
#page-execution .exflowscroll::-webkit-scrollbar{display:none}
#page-execution .exstats{display:flex;flex:1;min-width:0;align-items:center;flex-wrap:wrap;gap:4px 0}
#page-execution .exstats article,#page-execution .exstats>button{display:inline-flex;align-items:baseline;gap:7px;padding:2px 14px;background:transparent;border:0;border-radius:0;box-shadow:none;color:inherit;font:inherit;white-space:nowrap}
#page-execution .exstats article:first-child{padding-left:0}
#page-execution .exstats>*+*{border-left:1px solid var(--rule)}
#page-execution .exstats span{font-size:12px;color:var(--muted)}
#page-execution .exstats b{font-size:16px;line-height:1;color:var(--ink);font-variant-numeric:tabular-nums}
#page-execution .exstats>button{cursor:pointer}
#page-execution .exstats>button:hover span,#page-execution .exstats>button:hover b{color:var(--blue)}
#page-execution .exstats article.exalert span,#page-execution .exstats article.exalert b{color:var(--halt-deep)}
#page-execution .exactions{display:flex;flex:0 0 auto;align-items:center;gap:8px;margin-left:auto}

#page-execution .extaskgrid,#page-execution .excataloggrid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
#page-execution .extask,#page-execution .excatalog{border-radius:var(--r-lg);transition:box-shadow .15s ease,transform .15s ease}
#page-execution .extask:hover,#page-execution .excatalog:hover{box-shadow:var(--shadow-raise)}
#page-execution .exerr{display:block;margin-top:8px;font-size:11px;line-height:1.5;color:var(--halt-deep);background:var(--halt-bg);border-radius:var(--r-sm);padding:6px 8px;word-break:break-word}

/* 最近执行请求:整表随页面滚动(不再卡内限高) */
#page-execution .extable thead th{background:var(--panel);box-shadow:0 1px 0 var(--rule2)}

/* 统一任务入口与分阶段任务中心 */
.taskentry{display:flex;align-items:center;justify-content:space-between;gap:18px;margin:0 0 14px;padding:13px 15px;background:var(--blue-bg);border:1px solid var(--blue-soft);border-radius:var(--r-lg)}
.taskentry>div:first-child{display:flex;min-width:0;flex-direction:column;gap:3px}
.taskentry>div:first-child>span{font-size:11px;color:var(--blue);font-weight:650}
.taskentry>div:first-child>b{font-size:14px;color:var(--ink)}
.taskentry>div:first-child>small{font-size:12px;line-height:1.5;color:var(--muted)}
.taskentry>div:last-child{display:flex;flex:0 0 auto;gap:8px;align-items:center}

#page-execution .exguide{margin:0 0 var(--sp-3);padding:16px;background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);box-shadow:var(--shadow-card)}
#page-execution .exmine{display:inline-flex;flex:0 0 auto;align-items:center;gap:7px;min-height:34px;padding-left:var(--sp-3);border-left:1px solid var(--rule);color:var(--ink2);font-size:12px;font-weight:600;white-space:nowrap}
#page-execution .exmine input{width:15px;height:15px;margin:0;accent-color:var(--blue)}
#page-execution .exflow{display:flex;flex:0 0 auto;min-height:34px;align-items:center;gap:8px;padding:6px 9px;text-align:left;background:var(--soft);border:1px solid transparent;border-radius:8px}
#page-execution .exflow:hover{border-color:var(--blue-soft);background:var(--blue-bg)}
#page-execution .exflow.on{border-color:var(--blue);background:var(--blue-bg)}
#page-execution .exflow span{font-size:12px;font-weight:650;color:var(--ink);white-space:nowrap}
#page-execution .exflow b{font-size:12px;color:var(--blue);font-variant-numeric:tabular-nums}
#page-execution .exflow.zero{opacity:.55}
#page-execution .exflow.zero b{color:var(--muted)}

#page-execution .exguide ol{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:0;margin:15px 0 0;padding:0;list-style:none}
#page-execution .exguide li{position:relative;min-width:0}
#page-execution .exguide li:not(:last-child):after{content:"";position:absolute;z-index:0;left:28px;right:0;top:13px;height:1px;background:var(--rule2)}
#page-execution .exguide li button{position:relative;z-index:1;display:flex;width:100%;min-height:72px;align-items:flex-start;flex-direction:column;padding:0 22px 0 0;text-align:left;background:transparent;border:0;box-shadow:none}
#page-execution .exguide li button:hover{background:transparent}
#page-execution .exguide li i{position:relative;z-index:1;display:grid;place-items:center;flex:0 0 27px;width:27px;height:27px;border:1px solid var(--rule2);border-radius:50%;background:var(--panel);font-style:normal;font-size:11px;color:var(--muted)}
#page-execution .exguide li button>div{min-width:0;margin-top:8px}
#page-execution .exguide li b,#page-execution .exguide li span{display:block}
#page-execution .exguide li b{font-size:12px;color:var(--ink)}
#page-execution .exguide li span{margin-top:4px;font-size:10px;line-height:1.45;color:var(--muted)}
#page-execution .exguide li em{display:inline-flex;min-width:18px;height:18px;align-items:center;justify-content:center;margin-left:4px;padding:0 5px;border-radius:9px;background:var(--soft);font-style:normal;font-size:10px;color:var(--muted)}
#page-execution .exguide li.on i{background:var(--blue);border-color:var(--blue);color:#fff;box-shadow:0 0 0 4px var(--blue-bg)}
#page-execution .exguide li.on b{color:var(--blue)}
#page-execution .exguide li.done i{background:var(--pass-bg);border-color:#b8d9c2;color:var(--pass)}
#page-execution .exguide li.selected i{background:var(--blue);border-color:var(--blue);color:#fff;box-shadow:0 0 0 4px var(--blue-bg)}
#page-execution .exguide li.selected b{color:var(--blue)}

#page-execution .extask{min-height:225px}
#page-execution .extask.has-error{border-color:#e6c3be}
#page-execution .excardpills{display:flex;flex:0 0 auto;flex-direction:column;align-items:flex-end;gap:5px}
#page-execution .exhandler{display:inline-flex;align-items:center;border:1px solid var(--rule);border-radius:999px;padding:3px 8px;font-size:11px;line-height:1;white-space:nowrap}
#page-execution .exhandler-operator{background:var(--blue-bg);border-color:var(--blue-soft);color:var(--blue)}
#page-execution .exhandler-system{background:var(--soft);border-color:var(--rule2);color:var(--muted)}
#page-execution .exhandler-developer{background:var(--halt-bg);border-color:#e6c3be;color:var(--halt-deep)}
#page-execution .exhandler-data{background:var(--review-bg);border-color:#e6d8ae;color:var(--review)}
#page-execution .extype{margin:9px 0 0}
#page-execution .exnext{margin:12px 0;padding:9px 10px;background:var(--soft);border-radius:var(--r-sm)}
#page-execution .exnext span,#page-execution .exnext b{display:block}
#page-execution .exnext span{font-size:10px;color:var(--muted)}
#page-execution .exnext b{margin-top:3px;font-size:12px;line-height:1.55;color:var(--ink);font-weight:600}
#page-execution .extask footer,#page-execution .excatalog footer{display:flex;flex-wrap:wrap;gap:8px}
#page-execution .excontextnote{display:flex;align-items:center;gap:14px;margin-top:12px;padding:14px;background:var(--blue-bg);border:1px solid var(--blue-soft);border-radius:var(--r-md)}
#page-execution .excontextnote b{font-size:13px}
#page-execution .excontextnote span{flex:1;font-size:12px;line-height:1.55;color:var(--muted)}
#page-execution .exscopegrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px;margin-top:12px}
#page-execution .exscopegrid article{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px;background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-md)}
#page-execution .exscopegrid article div{display:flex;min-width:0;flex-direction:column;gap:4px}
#page-execution .exscopegrid article b{font-size:13px;color:var(--ink)}
#page-execution .exscopegrid article span{font-size:11px;line-height:1.45;color:var(--muted)}

/* 任务中心首屏压缩，让待办列表在常用桌面高度内更早出现 */
/* 死码已删:任务中心页曾在这里单独收窄上内边距(padding-top:12px)—— 被第 27 段的 padding
   简写整条覆盖,从未生效;现在边距一律吃全局默认 */
#page-execution .exsectionhead p{margin-top:3px}
#page-execution .exguide{padding:9px 12px}
#page-execution .exguide ol{margin-top:6px}
#page-execution .exguide li:not(:last-child):after{top:11px}
#page-execution .exguide li button{min-height:45px;padding-right:16px}
#page-execution .exguide li i{flex-basis:23px;width:23px;height:23px}
#page-execution .exguide li button>div{margin-top:3px}
#page-execution .exguide li span{margin-top:2px;line-height:1.25}
#page-execution .exjoined{font-variant-numeric:tabular-nums;color:var(--ink2)}
#page-execution .exsetupdrawer{width:min(760px,calc(100vw - 48px))}
#page-execution .exsetupform{display:grid;grid-template-columns:minmax(180px,1fr) 150px 120px auto;gap:10px;align-items:end;margin:16px 0}
#page-execution .exsetupform label{display:grid;gap:5px;font-size:12px;color:var(--muted)}
#page-execution .exsetupform input,#page-execution .exsetupform select{width:100%}
#page-execution .exsetuptoken{margin-top:14px;padding:14px;border:1px solid var(--pass);border-radius:var(--r-md);background:var(--pass-bg)}
#page-execution .exsetuptoken>div{display:flex;align-items:center;gap:8px;margin-top:8px}
#page-execution .exsetuptoken code{flex:1;min-width:0;padding:8px;background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-sm);overflow-wrap:anywhere}
#page-execution .exsetuptoken p{margin:9px 0 0;font-size:12px;line-height:1.55;color:var(--ink2)}
#page-execution .exsetuptable{margin-top:0}
#page-execution .excontrols{margin:0 0 var(--sp-3);padding:0 12px;background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);box-shadow:var(--shadow-card)}
#page-execution .excontrols .exguide{margin:0;padding:10px 0;background:transparent;border:0;border-radius:0;box-shadow:none}
#page-execution .excontrols .exsectionhead h3{font-size:12px;font-weight:650;color:var(--muted)}
#page-execution .excontrols .exguide li:not(:last-child):after{background:var(--rule)}
#page-execution .extabs{position:sticky;top:0;z-index:3;margin:0 0 var(--sp-3);padding:var(--sp-2) 0;
  background:var(--canvas);border-bottom:1px solid var(--rule)}
#page-execution .extabs button{background:transparent;border-color:transparent}
#page-execution .extabs button:hover{background:var(--soft)}
#page-execution .extabs button.on{background:var(--blue-bg);border-color:var(--blue-soft);color:var(--blue)}
#page-execution .extaskgrid{gap:10px;margin-top:10px}
#page-execution .extask{min-height:218px;border-color:var(--rule);box-shadow:none}
#page-execution .extask:hover{border-color:var(--blue-soft);box-shadow:var(--shadow-card);transform:none}
#page-execution .exnext{background:var(--soft);border-left:2px solid var(--blue);border-radius:4px}
#page-execution .exmeta{align-items:center;padding-top:8px;border-top:1px solid var(--rule)}
#page-execution .exdetail{margin-top:10px;border-top:1px solid var(--rule);padding-top:8px}
#page-execution .exdetail>summary{cursor:pointer;color:var(--muted);font-size:11px;user-select:none}
#page-execution .exdetail[open]>summary{color:var(--ink);font-weight:600}
#page-execution .exdetailgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px 10px;margin-top:8px}
#page-execution .exdetailgrid span{display:block;color:var(--muted);font-size:10px}
#page-execution .exdetailgrid b{display:block;color:var(--ink2);font-size:12px;font-weight:600;word-break:break-word}
#page-execution .exrowdetail>summary{cursor:pointer;color:var(--blue);font-weight:600;word-break:break-word}
#page-execution .exrowdetail .exdetail{margin-top:8px;min-width:360px}
#page-execution .exoutputs{margin-top:10px;border-top:1px dashed var(--rule);padding-top:10px}
#page-execution .exouttitle{font-size:12px;font-weight:650;color:var(--ink);margin-bottom:7px}
#page-execution .exoutmuted{font-size:12px;color:var(--muted);line-height:1.5}
#page-execution .exoutmuted.error{color:var(--halt)}
#page-execution .exoutcounts{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;margin-bottom:8px}
#page-execution .exoutcounts span{background:var(--soft);border-radius:6px;padding:6px 8px;color:var(--muted);font-size:10px}
#page-execution .exoutcounts b{display:block;margin-top:2px;color:var(--ink);font-size:14px;font-variant-numeric:tabular-nums}
#page-execution .exoutitems{border-top:1px solid var(--rule)}
#page-execution .exoutitem{padding:7px 0;border-bottom:1px solid var(--rule);display:grid;gap:4px}
#page-execution .exoutitem div{display:flex;align-items:center;justify-content:space-between;gap:8px}
#page-execution .exoutitem b{font-size:12px;color:var(--ink)}
#page-execution .exoutitem span,#page-execution .exoutitem small{font-size:11px;color:var(--muted)}
#page-execution .exoutitem code{font-family:var(--mono);font-size:11px;color:var(--ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#page-execution .exjoined{margin-left:auto}
#page-execution .excontrols{width:fit-content;max-width:100%;min-width:780px}
#page-execution .excontrols .exguide{min-width:0}
#page-execution .excontrols .exguide ol{display:flex;align-items:center;gap:18px}
#page-execution .excontrols .exguide li{flex:0 0 auto}
#page-execution .excontrols .exguide li:not(:last-child):after{left:calc(100% + 4px);right:-14px;top:11px}
#page-execution .excontrols .exguide li button{width:auto;min-height:24px;align-items:center;flex-direction:row;gap:6px;padding:0}
#page-execution .excontrols .exguide li button>div{margin-top:0}
#page-execution .excontrols .exguide li b{white-space:nowrap}
#page-execution .extaskgrid{grid-template-columns:repeat(auto-fill,minmax(min(100%,380px),440px));justify-content:start}
#page-execution .extask{min-height:205px}

@media(max-width:1100px){
  #page-execution .exstatbar{align-items:flex-start;flex-direction:column}
  #page-execution .exstatbar .exactions{margin-left:0}
  #page-execution .excontrols{width:100%;min-width:0}
  #page-execution .exguide ol,#page-execution .excontrols .exguide ol{display:flex;flex-wrap:wrap;gap:10px 18px}
  #page-execution .exguide li:not(:last-child):after{display:none}
}
@media(max-width:680px){
  .taskentry{align-items:flex-start;flex-direction:column}
  .taskentry>div:last-child{width:100%;flex-wrap:wrap}
  #page-execution .excontextnote{align-items:flex-start;flex-direction:column}
  #page-execution .exstats article,#page-execution .exstats>button{padding:2px 10px}
  #page-execution .exdetailgrid,#page-execution .exoutcounts{grid-template-columns:repeat(2,minmax(0,1fr))}
  #page-execution .exrowdetail .exdetail{min-width:0}
}

/* ================= 使用指南 guide ================= */
#page-guide .gdhero{margin:0 0 var(--sp-5)}
#page-guide .gdhero h2{margin:0 0 var(--sp-2);font-size:20px;font-weight:650;letter-spacing:-.01em;color:var(--ink)}
#page-guide .gd3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-3);margin-top:var(--sp-4)}
#page-guide .gdcard{background:var(--soft);border:1px solid var(--rule);border-radius:var(--r-md);padding:12px 14px;display:flex;flex-direction:column;gap:4px}
#page-guide .gdcard b{font-size:13px;color:var(--blue-deep)}
#page-guide .gdcard span{font-size:12px;color:var(--ink2);line-height:1.55}
#page-guide .gdsec{margin:0 0 var(--sp-4)}
#page-guide .gdsec h3{margin:0 0 var(--sp-3);font-size:14px;font-weight:650;color:var(--ink)}
#page-guide .gdsec h3+p{margin-top:0}
#page-guide .gdsteps{margin:0;padding-left:20px}
#page-guide .gdsteps li{margin:0 0 8px;line-height:1.7;color:var(--ink2)}
#page-guide .gdsteps code{background:var(--soft);border:1px solid var(--rule);border-radius:var(--r-sm);padding:1px 6px;font-size:12px;color:var(--ink)}
#page-guide .gdstline{line-height:2.1;color:var(--ink2)}
#page-guide .gdsec p{color:var(--ink2);line-height:1.7}
#page-guide .gdsec p b{color:var(--ink)}
#page-guide .gdnote{font-size:12px;border-top:1px dashed var(--rule2);padding-top:var(--sp-3)}

/* ================= 流水线 pipeline ================= */
#page-pipeline .pstats{display:inline-flex;gap:14px;flex-wrap:wrap}
#page-pipeline .pstat{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--ink2)}
#page-pipeline .pstat b{font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--ink)}
#page-pipeline .pcard{transition:box-shadow .15s ease,border-color .15s ease}
#page-pipeline .pcard:hover{box-shadow:var(--shadow-raise);border-color:var(--rule2)}
/* 死码已删:#page-pipeline .pcolh{position:sticky;top:0} —— 吸顶要求祖先是滚动容器,而 .pcol
   本身 overflow:hidden(020-all.css v5 段)从不滚动,真正滚的是它的兄弟 .pcards;
   .pcolh 又本就是 .pcol 的第一个子元素,吸不吸顶画面完全一样。列头底色由 v5 段的
   `#page-pipeline .pcolh{background:#fff}` 给,删这条不改任何像素。 */
#page-pipeline .pempty{padding:22px 14px;border:1px dashed var(--rule2);border-radius:var(--r-md);margin:2px}
#page-pipeline .pgr.ppg{flex:0 0 auto;margin:0;padding:9px 8px;border-top:1px solid var(--rule);background:var(--panel)}

/* ================= 任务清单 tasklist ================= */
#page-tasklist .pt-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 12px}
#page-tasklist .pt-toolbar .ilseg{margin-bottom:0}
#page-tasklist .pt-overdue{color:var(--halt);font-weight:600}
#page-tasklist .pt-flag{margin-left:4px;font-size:10.5px;padding:0 7px}
#page-tasklist .ptt .p1pill{font-weight:600}
#page-tasklist .tblwrap thead th{background:var(--panel);box-shadow:0 1px 0 var(--rule2)}

/* ================= 响应式 ================= */
@media (max-width:1100px){
  #page-pipeline .pboard{grid-template-columns:1fr;gap:12px}
  #page-pipeline .pcol{max-height:none}
  #page-pipeline .partgrid{grid-template-columns:1fr}
  #page-guide .gd3{grid-template-columns:1fr}
}
@media (max-width:720px){
  #page-overview .ovhead{flex-direction:column;align-items:flex-start;gap:4px}
  #page-jobs .jobshead{align-items:flex-start;flex-direction:column;gap:8px}
  #page-execution .extaskgrid,#page-execution .excataloggrid{grid-template-columns:1fr}
}


/* ===== 810 monitor pages ===== */
/* 页面组样式 · 排名监控:page-perf, page-highlights(数据异动,含超常/异常两标签), page-compkw, page-compete, page-rankkw —— 归属「排名监控」页面组 agent,基础组件见 020-all.css 与 DESIGN_SPEC.md */
/* 只做页面级布局/组件覆盖,颜色一律用 020 令牌;选择器以 #page-xxx 限定作用域。 */

/* ================= 1. 筛选工具栏分组 ================= */

/* 竞品词:搜索框占满工具栏剩余宽度 */
#page-compkw .albar.ckbar input#ckq{flex:1;min-width:240px}

/* 关键词列表:搜索区 / 操作区两段分组,操作区左侧细分隔 */
#page-rankkw .rkwbar .fgroup{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}
#page-rankkw .rkwbar .fgroup.grow{flex:1;min-width:260px}
#page-rankkw .rkwbar .fgroup.grow #rkwq{flex:1;min-width:0;width:100%}
#page-rankkw .rkwbar .fgroup.acts{border-left:1px solid var(--rule);padding-left:var(--sp-3)}
/* 关键词列表筛选行:状态组与条件组之间细分隔,清除按钮挤到最右 */
#page-rankkw .rkwfilters .fgroup{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}
#page-rankkw .rkwfilters .fgroup+.fgroup{border-left:1px solid var(--rule);padding-left:var(--sp-3);margin-left:2px}
#page-rankkw .rkwfilters #rkwf-clear{margin-left:auto}
/* 隐藏的文件选择器(JS 触发) */
#page-rankkw #rkwfile{display:none}

/* 数据异动·异常标签:方向 / 维度 / 状态 / 量级同行分组,带标签与分隔 */
#page-highlights .anmbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px}
#page-highlights .anmbar .fl{font-size:12px;color:var(--muted);white-space:nowrap}
#page-highlights .anmbar .ilseg{margin:0}
#page-highlights .anmbar .ilseg+.fl,
#page-highlights .anmbar .da-seg+.fl{border-left:1px solid var(--rule);padding-left:var(--sp-3)}
/* 方向切换(超常/异常)与维度切换并排 */
#page-highlights .ilsegrow .da-seg{margin:0}
/* 异常类型徽章(下行配色)与紧凑徽章列 */
#page-highlights .hltag.down{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}
#page-highlights .anmbdgs{white-space:nowrap}
#page-highlights .anmbdgs .ibadge.anmst{margin-left:2px}
#page-highlights .anmwhat{max-width:340px}
/* 站点级异常行的补充说明 */
#page-highlights .anmsite{margin-left:6px}

/* ================= 2. 数据表格:粘性表头 + 斑马纹 + 数字对齐 ================= */

/* 表头底色(沿用 020 表头暖白,与表体用细影分隔);表本身不再卡内限高,整页一起滚 */
#page-rankkw .rkwtbl thead th,
#page-compkw .cktbl thead th,
#page-highlights .tblwrap thead th,
#page-perf .tblwrap thead th,
#page-compete .tblwrap thead th{background:var(--paper);box-shadow:0 1px 0 var(--rule2)}

/* 斑马纹:隔行暖白,展开行/选中行不吃斑马 */
#page-rankkw .rkwt tbody tr:nth-child(even):not(.open):not(.anmexp) td,
#page-compkw .cktbl tbody tr:nth-child(even) td,
#page-highlights .urlt2 tbody tr:nth-child(even):not(.open):not(.anmexp) td,
#page-compete .perft tbody tr:nth-child(even):not(.open):not(.candexp) td,
#page-perf .perft tbody tr:nth-child(even) td{background:var(--paper)}
/* 斑马行保留 hover 反馈与选中态优先级 */
#page-rankkw .rkwt tbody tr:nth-child(even):not(.open):not(.anmexp):hover td,
#page-compkw .cktbl tbody tr:nth-child(even):hover td,
#page-highlights .urlt2 tbody tr:nth-child(even):not(.open):not(.anmexp):hover td,
#page-compete .perft tbody tr:nth-child(even):not(.open):not(.candexp):hover td,
#page-perf .perft tbody tr:nth-child(even):hover td{background:var(--hover)}
/* 选中行与 020「减淡选中态」定调一致(暖灰底 + 首列蓝标记);hlrow 在 020 无选中底色,在此补齐 */
#page-highlights .urlt2 tbody tr.anmrow.open td,
#page-highlights .urlt2 tbody tr.hlrow.open td,
#page-compete .perft tbody tr.candrow.open td{background:var(--soft)}
#page-highlights .urlt2 tbody tr.hlrow.open td:first-child,
#page-highlights .urlt2 tbody tr.anmrow.open td:first-child{box-shadow:inset 3px 0 0 var(--blue)}

/* 关键词列表:勾选列收窄居中;日期列弱化不换行 */
#page-rankkw .rkwt .selc{width:36px;text-align:center}
#page-rankkw .rkwt td.rkwdate{white-space:nowrap;color:var(--muted);font-size:12px}
/* 日期来源标记:排名观测日 vs 词库最近导入日,不标注会被读成「排名是这天的」 */
#page-rankkw .rkwt td.rkwdate .rkwdatekind{margin-left:4px;padding:0 4px;border-radius:3px;
  background:var(--soft);color:var(--ink2);font-size:10px;line-height:16px;display:inline-block}
#page-rankkw .rkwt td.rkwurl{max-width:280px}

/* ================= 3. 数据表现 perf:KPI 卡片 + 区块卡片化 ================= */

#page-perf .perfscope{display:flex;gap:6px;margin:0 0 var(--sp-3)}
#page-perf .pstoggle{font-size:13px;padding:6px 14px;border:1px solid var(--rule);background:var(--panel);
  color:var(--ink2);border-radius:999px;cursor:pointer;transition:background .15s ease,color .15s ease}
#page-perf .pstoggle:hover{background:var(--paper)}
#page-perf .pstoggle.active{background:var(--ink);color:var(--panel);border-color:var(--ink)}
#page-perf .perfcards{margin:0 0 var(--sp-4)}
#page-perf .perfcard{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);padding:var(--sp-4) 18px;transition:box-shadow .15s ease}
#page-perf .perfcard:hover{box-shadow:var(--shadow-raise)}
#page-perf .perfcard .pcl{font-size:12px;color:var(--muted)}
#page-perf .perfcard .pcv{font-family:var(--mono);font-variant-numeric:tabular-nums;font-weight:600}
#page-perf .perfsec{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);padding:var(--sp-4) var(--sp-5);margin:0}
#page-perf .perfgrid+.perfsec{margin-top:var(--sp-4)}
#page-perf .perfsec h3{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
#page-perf .perfsec .tblwrap{margin:0;border-radius:var(--r-md);box-shadow:none}
#page-perf .perfsec .empty{margin:0}

/* ================= 4. 竞争维护 compete:三段卡片 ================= */

#page-compete .perfsec{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);padding:var(--sp-4) var(--sp-5);margin:0 0 var(--sp-4)}
#page-compete .perfsec:last-child{margin-bottom:0}
#page-compete .perfsec h3{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
#page-compete .perfsec h3 .expbtn{margin-left:auto}
#page-compete .cmadd{margin:var(--sp-3) 0}
#page-compete .perfsec .tblwrap{margin:0;border-radius:var(--r-md);box-shadow:none}
#page-compete .perfsec .empty{margin:var(--sp-2) 0 0}
/* 候选展开依据盒:与展开行底衬对齐,内部统一节奏 */
#page-compete .candexp>td{background:var(--paper)}
#page-compete .candbox{padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--rule);
  display:flex;flex-direction:column;gap:10px}
#page-compete .candsum{align-items:baseline}
#page-compete .candsum b{flex:none;color:var(--ink);font-size:12px}
#page-compete .candacts{margin-top:0}

/* ================= 5. 数据异动·异常标签:证据面板层级与留白 ================= */

/* 轻微波动分区 */
#page-highlights .anmprimary-empty{padding:14px 16px;text-align:left}
#page-highlights .anmminor{margin-top:12px;border:1px solid var(--rule);border-radius:var(--r-md);
  background:var(--paper);overflow:hidden}
#page-highlights .anmminor>summary{padding:11px 14px;font-size:12.5px;font-weight:600;color:var(--ink2)}
#page-highlights .anmminor>summary span{margin-left:8px;font-weight:400;color:var(--muted)}
#page-highlights .anmminor[open]>summary{border-bottom:1px solid var(--rule)}
#page-highlights .anmminor .anmminor-table{margin:0;border:0;border-radius:0}

/* 站点级证据完整性 */
#page-highlights .anmevidence-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:5px;
  color:var(--review);font-size:11px;line-height:1.4}
#page-highlights .anmevidence-bdg{font-size:10.5px}
#page-highlights .anmevidence-tech{color:var(--review);font-family:inherit}
#page-highlights .anmevidence-alert{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  border:1px solid var(--review-line);border-radius:var(--r-md);background:var(--review-bg);
  color:var(--review);padding:10px 12px;font-size:12px}
#page-highlights .anmimpact-missing{line-height:1.65}
#page-highlights .anmdiagwarn{font-size:11.5px;color:var(--review)}

/* 展开区节奏:技术明细 → 证据盒 → 诊断 → 动作,层层递进 */
#page-highlights .anmexpwrap{gap:12px}
#page-highlights .anmtech{background:var(--panel)}
/* 证据盒内分节卡片化:时序图与文本证据同为白卡 */
#page-highlights .anmevgrid{gap:14px}
#page-highlights .anmevsec{background:var(--panel);border:1px solid var(--rule);
  border-radius:var(--r-md);padding:14px 16px}
#page-highlights .anmevsec .anmevt{font-size:11px;font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muted);margin-bottom:8px}
#page-highlights .anmevsec .anmevt.anmmt{margin-top:14px}
/* 死码已删:#page-highlights .anmspark{background:var(--paper)} —— 基础层 .anmspark 的底色
   已就是 --paper(见该规则注释),本页覆盖与它同值,是纯重复。 */
/* 证据加载态压缩默认 40px 大留白 */
#page-highlights .anmevload,
#page-highlights .hlload{padding:20px}
#page-highlights .hlmsg{padding:14px;color:var(--muted);font-size:12.5px}
/* 操作提示与动作区:细分隔,动作贴底 */
#page-highlights .anmnote{margin-top:8px}
#page-highlights .anmevacts{border-top:1px solid var(--rule);padding-top:12px;margin-top:2px}
/* 诊断结论折叠块与证据盒对齐 */
#page-highlights .anmexpwrap details.diagx>summary{font-size:12px}

/* ================= 6. 超常 highlights ================= */

#page-highlights .urlasof{margin:2px 0 12px}
#page-highlights .anmevgrid{margin:0}

/* ================= 7. 窄屏兜底 ================= */

/* 表的窄屏放开已经无从谈起:第 4 批取消了数据表的内部限高,窄屏和宽屏一样整表随页面滚;
   剩下的是排名监控组自己的工具条折行。 */
@media (max-width:900px){
  #page-rankkw .rkwbar .fgroup.acts{border-left:0;padding-left:0}
  #page-rankkw .rkwfilters .fgroup+.fgroup{border-left:0;padding-left:0;margin-left:0}
  #page-highlights .anmbar .ilseg+.fl{border-left:0;padding-left:0}
}


/* ===== 820 links pages ===== */
/* 页面组样式 · 内链规划:page-clusters, page-alllinks, page-linkstruct, page-links, page-confirmed —— 归属「内链规划」页面组 agent,基础组件见 020-all.css 与 DESIGN_SPEC.md */

/* ---------- 共享:筛选 / 工具条卡片化分组 ---------- */
#page-clusters .filterbar,
#page-links .ilfbar,
#page-alllinks .albar,
#page-linkstruct .albar{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  padding:10px 14px;box-shadow:var(--shadow-card);
}

/* ---------- 共享:长表格表头底色(内链现状 / 内链结构 / 已确认;表随页面整体滚动) ---------- */
#page-alllinks .tblwrap thead th,
#page-linkstruct .tblwrap thead th,
#page-confirmed .tblwrap thead th{
  background:var(--panel);box-shadow:0 1px 0 var(--rule2);
}

/* ---------- 意图集群 #page-clusters ---------- */
/* 品类徽章(替代旧雾紫内联样式):暖中性分类标签,与深青意图徽章区分 */
#page-clusters .ibadge.icat{background:var(--soft);color:var(--ink2)}
/* 承接状态徽章(替代旧硬编码内联样式) */
#page-clusters .ibadge.ils-conflict,
#page-links .ibadge.ils-conflict{background:var(--halt-bg);color:var(--halt)}
#page-clusters .ibadge.ils-newpage,
#page-links .ibadge.ils-newpage{background:var(--review-bg);color:var(--review)}
/* 集群卡内表格与承接行之间的分隔 */
#page-clusters .cluster .tblwrap.flat{border-top:1px solid var(--rule)}
/* 关键词详情里的意图编辑区:虚线分组分隔 */
#page-clusters .kwintent{border-top:1px dashed var(--rule);padding-top:8px}
/* 筛选条内的新建意图按钮保持醒目 */
#page-clusters .filterbar #newcluster{font-weight:600}

/* ---------- 内链优化 #page-links ---------- */
/* 阶段 / 视图 / 导出工具行(原内联 flex 下沉到样式层) */
#page-links .ilsegrow{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
#page-links .ilexport{margin-left:auto;display:inline-flex;gap:6px;align-items:center}
#page-links .ilexport .exlbl{font-size:12px;color:var(--muted)}
/* KPI 概览条卡片化,数字等宽对齐 */
#page-links .lnsum{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  padding:9px 14px;box-shadow:var(--shadow-card);font-variant-numeric:tabular-nums;
}
/* 链接视图(平铺大表):卡片外观保留,表体不限高,随页面整体滚动 */
#page-links .ltarget>.tblwrap.flat{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
}
#page-links .ltarget>.tblwrap.flat thead th{
  background:var(--panel);box-shadow:0 1px 0 var(--rule2);
}
/* 平铺表空态行:居中留白,不再缩成一角 */
#page-links table.flatt td.twi{text-align:center;padding:26px 12px;font-size:12px}
/* 锚文本列:允许换行,长锚文本不把表格撑爆 */
#page-links table.lkt td.anc{white-space:normal;word-break:break-word;min-width:96px}
/* 六列动作表给定位说明、原因和下发状态保留稳定宽度，窄桌面在卡内横向滚动。 */
#page-links table.ilactt{table-layout:fixed;min-width:1310px}
/* 状态列固定在右侧，1280 桌面首屏也能直接看到领取结论；其余列仍可在表格内横向浏览。 */
#page-links table.ilactt th:last-child,
#page-links table.flatt th:last-child{position:sticky;right:0;z-index:3;background:var(--panel);box-shadow:-10px 0 14px -12px rgba(35,49,59,.55)}
#page-links table.ilactt td:last-child,
#page-links table.flatt td:last-child{position:sticky;right:0;z-index:1;background:var(--panel);box-shadow:-10px 0 14px -12px rgba(35,49,59,.45)}
#page-links table.ilactt tbody tr:hover td:last-child,
#page-links table.flatt tbody tr:hover td:last-child{background:var(--hover)}
/* 工单主行直接展示锚点区域；区域未知与非正文不能使用正文的绿色结论。 */
#page-links .lkplacement{
  display:grid;grid-template-columns:max-content minmax(0,1fr);gap:2px 7px;
  margin-top:7px;padding:6px 8px;border-left:3px solid var(--rule2);border-radius:0 6px 6px 0;
  background:var(--soft);color:var(--ink2);font-size:12px;line-height:1.45;white-space:normal;overflow-wrap:anywhere;
}
#page-links .lkplacement span{font-weight:600;color:var(--muted)}
#page-links .lkplacement b{font-weight:600;color:inherit}
#page-links .lkplacement small{grid-column:1/-1;font-size:12px;color:inherit}
#page-links .lkplacement.body{border-left-color:var(--pass);background:var(--pass-bg);color:var(--pass)}
#page-links .lkplacement.blocked{border-left-color:var(--review);background:var(--review-bg);color:var(--review)}
#page-links .lkplacement.unknown{border-left-color:var(--muted);background:var(--soft);color:var(--ink2)}
/* 待优化状态由后端领取门禁生成，按钮只与状态说明分组，不在前端计算规则。 */
#page-links .lkdispatch{
  min-width:0;max-width:none;margin-bottom:7px;padding:7px 9px;border:1px solid var(--rule);
  border-radius:7px;background:var(--soft);font-size:12px;line-height:1.45;white-space:normal;overflow-wrap:anywhere;
}
#page-links .lkdispatch b{display:block;margin-bottom:2px;font-size:12px}
#page-links .lkdispatch span{display:block;color:var(--muted)}
#page-links .lkdispatch ul{margin:3px 0 0;padding-left:17px;color:inherit}
#page-links .lkdispatch li+li{margin-top:2px}
#page-links .lkdispatch.ready{border-color:#accfb6;background:var(--pass-bg);color:var(--pass)}
#page-links .lkdispatch.blocked{border-color:#e3c781;background:var(--review-bg);color:var(--review)}
#page-links .lkdispatch.unknown{color:var(--ink2)}
#page-links .lkdispatch-actions{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
#page-links .lkdispatch-actions .bstat.ghost{margin-left:0}
/* 分组明细头 hover 反馈 */
#page-links details.lk summary{transition:background .12s}
#page-links details.lk summary:hover{background:var(--hover)}
/* 待规划卡:白卡浮起 */
#page-links .plancard{background:var(--panel);box-shadow:var(--shadow-card)}
/* 样本区批量操作条卡片化 */
#page-links .samplebar{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  padding:8px 14px;box-shadow:var(--shadow-card);
}

/* ---------- 内链现状 #page-alllinks ---------- */
#page-alllinks table.alt th.sortable:hover{color:var(--blue-deep)}

/* ---------- 内链结构 #page-linkstruct ---------- */
#page-linkstruct .lscard{background:var(--panel);box-shadow:var(--shadow-card)}
#page-linkstruct .lsdist{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);padding:8px 14px;
}

/* ---------- 窄屏:工具条内边距收敛 ---------- */
@media (max-width:900px){
  #page-clusters .filterbar,
  #page-links .ilfbar,
  #page-alllinks .albar,
  #page-linkstruct .albar{padding:8px 10px}
}


/* ===== 830 audit-data pages ===== */
/* 页面组样式 · 技术审计+数据底座:page-urls, page-pagechg, page-keywords, page-pipeline, page-jobs, page-datadict —— 归属「审计与数据」页面组 agent,基础组件见 020-all.css 与 DESIGN_SPEC.md */
/* 本文件只做页面级布局/层级增强:粘性表头与首列、工具栏分组、URL 截断与复制、展开区层级、空态/加载态。颜色一律用 020 令牌。 */

/* ============================================================
   页面资产 #page-urls
   ============================================================ */

/* —— 数据时间条:点分隔,弱化为一行元信息 —— */
#page-urls .urlasof{gap:6px;align-items:center}
#page-urls .urlasof span+span::before{content:"·";margin:0 8px;color:var(--rule2)}

/* —— 筛选工具栏:条件组之间细分隔线,搜索区挤到最右 —— */
#page-urls .urlbar{row-gap:10px}
#page-urls .urlbar-grp{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding-right:14px;border-right:1px solid var(--rule)}
#page-urls .urlbar-search{display:flex;gap:8px;align-items:center;margin-left:auto;flex:1 1 300px;min-width:260px;justify-content:flex-end}
#page-urls .urlbar-search #urlq{flex:1 1 200px;min-width:160px;max-width:360px}

/* —— 宽表:横向滚动 + 粘性首列(URL);纵向不限高,整表随页面滚 —— */
#page-urls table.urlt thead th{background:var(--panel);box-shadow:0 1px 0 var(--rule2)}
#page-urls table.urlt thead th:first-child{position:sticky;left:0;z-index:6;background:var(--panel)}
#page-urls table.urlt tbody td:first-child:not([colspan]){position:sticky;left:0;z-index:3;background:var(--panel);box-shadow:1px 0 0 var(--rule)}
/* 行 hover / 展开态下,粘性首列底色跟随行态(与 020 的行色保持一致) */
#page-urls table.urlt tbody tr.urlrow:hover td:first-child:not([colspan]){background:var(--hover)}
#page-urls table.urlt tbody tr.urlrow.open td:first-child:not([colspan]){background:var(--sel)}

/* —— URL 单元格:单行截断,完整 URL 悬停 title 可见;复制按钮行 hover 才出现 —— */
#page-urls table.urlt .urlcell .urlmain{display:flex;align-items:center;gap:4px;min-width:0}
#page-urls table.urlt .urlcell .urlout{display:block;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:normal}
#page-urls .urlcp{flex:none;border:0;background:transparent;color:var(--muted);cursor:pointer;font-size:12px;line-height:1;padding:3px 4px;border-radius:var(--r-sm);min-height:auto;opacity:0}
#page-urls tr.urlrow:hover .urlcp,#page-urls .urlcp:focus-visible{opacity:1}
#page-urls .urlcp:hover{color:var(--blue);background:var(--blue-bg)}
#page-urls table.urlt td:nth-child(9),#page-urls table.urlt td:nth-child(10){white-space:nowrap}
/* ISSUE-030:nowrap 在大数值(10,917 + ↑190,745)下把环比徽标顶出单元格压到相邻列;
   允许换行让徽标落到数值下一行,列宽不再被撑爆 */
#page-urls .urlclicks{display:inline-flex;flex-wrap:wrap;align-items:baseline;justify-content:flex-end;gap:2px 7px;max-width:100%}
#page-urls .urlclicks-current{font-weight:600;color:var(--ink)}
#page-urls .urldelta{display:inline-flex;flex-direction:column;align-items:flex-end;gap:0;margin-left:0;line-height:1.2}
#page-urls .urldelta-v{font-weight:600}
#page-urls .urldelta-window{font-size:9.5px;color:var(--muted);font-weight:400}

/* —— 空态行:撑高、居中 —— */
#page-urls tr.urlnorow td{padding:28px 16px}
#page-urls tr.urlnorow .empty{margin:0;display:flex;align-items:center;justify-content:center;gap:10px}

/* —— 展开行:体检面板 + 标注编辑器两栏,实时数据整宽在下;横向滚动时内容钉在可视区 —— */
#page-urls tr.urlexp>td>.urlexpbox{position:sticky;left:16px;max-width:min(1180px,calc(100vw - var(--side) - 112px))}
#page-urls .urlexptop{display:grid;grid-template-columns:minmax(0,3fr) minmax(300px,2fr);gap:14px;align-items:start;margin-bottom:14px}
#page-urls .urlexptop .auditbox,#page-urls .urlexptop .utgbox{margin:0}
@media(max-width:1100px){#page-urls .urlexptop{grid-template-columns:1fr}}
@media(max-width:900px){
  header.topbar,.main,.page{min-width:0}
  #page-overview{width:100%;max-width:100%;overflow-x:hidden}
  #page-overview .tblwrap{width:100%;max-width:100%;overflow-x:auto}
  #page-overview .kpis .kpi{flex-basis:150px}
  #page-urls .urlcp{opacity:1}
}
#page-urls .urlliveload{display:flex;align-items:center;justify-content:center;gap:10px;padding:22px}

/* —— URL 详情页层级 —— */
#page-urls .urldhead h2{font-size:16px;line-height:1.5;word-break:break-all;margin:8px 0 4px}
#page-urls .urlsec{margin-top:18px}
#page-urls .urlsourcegrid{margin-bottom:14px}

/* ============================================================
   关键词视图 #page-keywords
   ============================================================ */

/* —— 批量操作条:已选数量做成白底计数丸 —— */
#page-keywords .kwmonbar b{background:var(--panel);border-radius:999px;padding:3px 10px;font-size:12px;font-weight:600;color:var(--blue-deep)}

/* —— 长表:纵向不限高,整表随页面滚;表头保留底色 —— */
#page-keywords table.cfmt thead th{background:var(--panel);box-shadow:0 1px 0 var(--rule2)}

/* —— 承接 URL 列:单行截断(完整 URL 在 link title) —— */
#page-keywords table.cfmt td.eurl a{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:normal}

/* —— SERP 监控列:副信息弱化换行 —— */
#page-keywords .moncell small{display:block;font-size:11px;color:var(--muted);margin-top:2px}
#page-keywords .moncell small.bad{color:var(--halt)}

/* —— 展开详情加载态 —— */
#page-keywords .kwd .spinner{vertical-align:-3px}

/* ============================================================
   内容更新 #page-pagechg
   ============================================================ */

/* —— 工具栏白卡化 —— */
#page-pagechg .albar{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-md);padding:10px 14px}

/* —— 表头底色;纵向不限高,整表随页面滚 —— */
#page-pagechg table.lkt thead th{background:var(--panel);box-shadow:0 1px 0 var(--rule2)}

/* —— 页面列:URL 单行截断,完整地址在 td title —— */
#page-pagechg td.pcpage a{display:block;max-width:560px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* —— 空态 / 加载态 —— */
#page-pagechg td .empty{margin:12px 0}
#page-pagechg .pcload{display:flex;align-items:center;justify-content:center;gap:10px}

/* ============================================================
   数据说明 #page-datadict
   ============================================================ */

/* —— 页首:心跳 chip 行 + 粘性锚点导航 —— */
#page-datadict .ddtop{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:10px 0 2px}
#page-datadict .ddnav{position:sticky;top:0;z-index:4;display:flex;gap:8px;flex-wrap:wrap;padding:10px 0;margin:6px 0 2px;background:var(--paper)} /* .main 本身在顶栏下方独立滚动(020-all.css),粘性导航无需再叠 --hd 偏移 */
#page-datadict .ddsecnav{cursor:pointer;font-size:12.5px;color:var(--blue);border:1px solid var(--blue-soft);background:var(--panel);border-radius:999px;padding:4px 12px;line-height:1.5}
#page-datadict .ddsecnav:hover{background:var(--blue-bg);color:var(--blue-deep)}
#page-datadict .ddsec{scroll-margin-top:60px} /* 避开约 49px 高的粘性页内导航 */

/* —— 数据集卡片:悬停微浮起 + 右侧展开箭头 —— */
#page-datadict .ddcard{transition:border-color .15s,box-shadow .15s}
#page-datadict .ddcard:hover{border-color:var(--rule2);box-shadow:var(--shadow-card)}
#page-datadict .ddcard summary::after{content:"▸";margin-left:auto;color:var(--muted);font-size:12px;transition:transform .15s}
#page-datadict .ddcard[open] summary::after{transform:rotate(90deg)}

/* —— 品牌较多时新鲜度表横向滚动:首列(数据集名)钉住 —— */
#page-datadict .tblwrap table.lkt thead th:first-child{position:sticky;left:0;z-index:2;background:var(--panel)}
#page-datadict .tblwrap table.lkt tbody td:first-child{position:sticky;left:0;z-index:1;background:var(--panel);box-shadow:1px 0 0 var(--rule)}
#page-datadict .tblwrap table.lkt tbody tr:hover td:first-child{background:var(--hover)}


/* ===== 840 delivery pages ===== */
/* 页面组样式 · 交付运营:page-execution, page-opportunities, page-reviewqueue, page-strategy, page-tasklist, page-kpi, page-mcp —— 归属「交付运营」页面组 agent,基础组件见 020-all.css 与 DESIGN_SPEC.md */

/* ===== 通用:本组表格表头底色(表体不限高,随页面整体滚动;基础层 .tblwrap overflow-x:auto 保持不变) ===== */
#page-reviewqueue .tblwrap table thead th,
#page-opportunities .tblwrap table thead th,
#page-mcp .tblwrap table thead th,
#page-tasks .tblwrap table thead th{
  background:var(--panel);
  box-shadow:0 1px 0 var(--rule2);
}

/* 表格内空态(替代原 twi 单行灰字) */
#page-reviewqueue .tblempty,
#page-reasoning .tblempty,
#page-opportunities .tblempty{padding:30px 12px}

/* ===== MCP 接入 #page-mcp ===== */
#page-mcp .mcpform{align-items:flex-end;gap:var(--sp-3)}
#page-mcp .mcpform .fld2{gap:4px}
#page-mcp .mcpform .fld2.mcpf-grow{flex:1;min-width:220px}
#page-mcp .mcpform .fld2.mcpf-grow input{width:100%}
#page-mcp .mcpform button{flex:none}
#page-mcp .mcptok{align-items:center}
#page-mcp .mcptbl td code{font-family:var(--mono);font-size:12px;color:var(--ink2)}

/* ===== 统一裁决 #page-reviewqueue =====
   领取式清单那套组件(子页签/勾选框/可排序列头/批量条/分页/指令弹窗)由推理任务页 #page-reasoning
   同选择器复用:仅把页 id 加进选择器,不另起一份样式,避免两页视觉漂移。 */
/* 筛选工具栏卡片化分组 */
#page-reviewqueue .p1bar,
#page-reasoning .p1bar{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-md);
  padding:8px 12px;margin:0 0 var(--sp-3);display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
#page-reviewqueue .p1bar #rq-q{min-width:260px;max-width:420px;flex:1}
#page-reviewqueue .rqgates{grid-template-columns:repeat(4,minmax(0,1fr))}
#page-reasoning .rqgates{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
#page-reviewqueue .rqgates .p1card .twi,
#page-reasoning .rqgates .p1card .twi{margin-top:5px;line-height:1.4}
#page-reviewqueue .rqconflicts{margin:-4px 0 var(--sp-3);border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel);padding:9px 12px}
#page-reviewqueue .rqconflicts summary{cursor:pointer;color:var(--ink2);font-size:12.5px;font-weight:600}
#page-reviewqueue .rqconflictlist{display:grid;gap:8px;margin-top:10px}
#page-reviewqueue .rqconflict{display:grid;grid-template-columns:minmax(100px,.7fr) minmax(180px,1.2fr) minmax(220px,1.5fr);gap:5px 12px;border-top:1px solid var(--rule);padding-top:8px;font-size:11.5px}
#page-reviewqueue .rqconflict>a,#page-reviewqueue .rqconflict>span{min-width:0;overflow-wrap:anywhere}
#page-reviewqueue .rqconflict code{white-space:normal;overflow-wrap:anywhere}
#page-reviewqueue .rqbatch,
#page-reasoning .rqbatch{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:0 0 var(--sp-3);font-size:12.5px;color:var(--ink2);
}
#page-reviewqueue .rqbatch .cnt,
#page-reasoning .rqbatch .cnt{color:var(--muted)}
#page-reviewqueue .rqblocked td{background:var(--review-bg)}
/* 领取式执行清单:二级子页签 + 待执行行内勾选 + 可排序列头 + 领取指令弹窗 */
#page-reviewqueue .rqsubrow .ilseg,
#page-reasoning .rqsubrow .ilseg{margin:-6px 0 12px;border-bottom:none;padding-left:2px}
#page-reviewqueue .rqsubrow .ilseg-b,
#page-reasoning .rqsubrow .ilseg-b{font-size:12.5px;padding:5px 12px}
#page-reviewqueue .rqcck,
#page-reasoning .rqcck{width:14px;height:14px;cursor:pointer;vertical-align:middle}
#page-reviewqueue .rqcck:disabled,
#page-reasoning .rqcck:disabled{cursor:not-allowed;opacity:.4}
#page-reviewqueue th.rqsort,
#page-reasoning th.rqsort{cursor:pointer;user-select:none;white-space:nowrap}
#page-reviewqueue th.rqsort:hover,#page-reviewqueue th.rqsort.on,
#page-reasoning th.rqsort:hover,#page-reasoning th.rqsort.on{color:var(--ink)}
.oppmodal:has(.rqclaimbox){width:min(860px,94vw);max-width:860px}
.oppmodal .rqclaimbox textarea{font-family:var(--mono);font-size:11.5px;line-height:1.55;min-height:340px;white-space:pre}
.oppmodal .rqclaimacts{display:flex;justify-content:flex-end;margin-top:6px}
/* 摘要列截断,整文走 title */
#page-reviewqueue .rqreason,
#page-reasoning .rqreason{
  max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* 证据展开行:弱化衬底,与主行视觉分层 */
#page-reviewqueue .rqevrow>td{background:var(--soft);padding:14px 16px}
#page-reviewqueue .lkevbox{background:var(--panel);box-shadow:var(--shadow-card)}
#page-reviewqueue .lkevline.warn{color:var(--halt)}
#page-reviewqueue .rqevacts{margin-top:var(--sp-3)}

/* ===== 机会队列 #page-opportunities ===== */
#page-opportunities .oppbar{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-md);
  padding:8px 12px;margin:0 0 var(--sp-3);
}
#page-opportunities .oppexp>td{background:var(--soft);padding:14px 16px}
#page-opportunities .oppvcard{box-shadow:var(--shadow-card)}
/* 判定卡与指标区间的分隔节奏 */
#page-opportunities .oppexpbox{margin-top:var(--sp-3)}

/* ===== 系统KPI #page-kpi:数字卡片化(压过基础层末尾的扁条样式) ===== */
#page-kpi .kpicards{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:var(--sp-4);margin:var(--sp-4) 0 0;
  background:transparent;border:0;border-radius:0;overflow:visible;
}
#page-kpi .kpicard{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);padding:18px 20px;min-width:0;
  transition:box-shadow .15s ease;
}
#page-kpi .kpicard:hover{box-shadow:var(--shadow-raise)}
#page-kpi .kpicard .kl{font-size:12px;font-weight:500;color:var(--muted);margin-bottom:8px}
#page-kpi .kpicard .kv{
  font-size:32px;font-weight:650;line-height:1.15;letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;color:var(--ink);
}
#page-kpi .kpicard .kv .kvna{font-size:15px;font-weight:500;color:var(--muted);letter-spacing:0}
#page-kpi .kpicard .ks{font-size:12.5px;color:var(--ink2);margin-top:8px}
#page-kpi .kpicard .kn{
  font-size:11px;color:var(--muted);margin-top:10px;line-height:1.6;
  border-top:1px dashed var(--rule);padding-top:8px;
}
/* 负向事件>0 时给暖砖红语义强调 */
#page-kpi .kpicard.neg{border-left:3px solid var(--halt)}
#page-kpi .kpicard.neg .kv{color:var(--halt)}

/* ===== 任务 #page-tasks ===== */
#page-tasks .tform{
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);
}
/* 阶段多选改 chip 组,选中态用主色浅底 */
#page-tasks .tstages{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin-top:6px}
#page-tasks .tstages .ck{
  display:inline-flex;align-items:center;gap:6px;
  border:1px solid var(--rule2);border-radius:999px;padding:5px 12px;
  background:var(--panel);font-size:12.5px;color:var(--ink2);cursor:pointer;
  transition:background .12s ease,border-color .12s ease,color .12s ease;
}
#page-tasks .tstages .ck:hover{border-color:var(--blue-soft);color:var(--ink)}
#page-tasks .tstages .ck:has(input:checked){
  background:var(--blue-bg);border-color:var(--blue-soft);color:var(--blue-deep);font-weight:500;
}
#page-tasks #t_minv:disabled{background:var(--soft);color:var(--muted);cursor:not-allowed}

/* ===== 策略 #page-strategy ===== */
#page-strategy .stgcard{background:var(--panel);box-shadow:var(--shadow-card);border-radius:var(--r-lg)}
#page-strategy .stgcard .lh{border-bottom:1px solid var(--rule)}
/* 控制行独立成带:开关/样本/试跑与标题徽章分层 */
#page-strategy .stgtools{
  display:flex;align-items:center;gap:var(--sp-4);flex-wrap:wrap;
  padding:9px 14px;border-bottom:1px solid var(--rule);background:var(--paper);
}
#page-strategy .stgtools .okck{font-size:12.5px}
#page-strategy .stgtools .stg-samples{cursor:pointer;color:var(--blue);font-size:12.5px}
#page-strategy .stgtools .stg-samples:hover{color:var(--blue-deep);text-decoration:underline}
#page-strategy .stgtools .stg-run.u-right{margin-left:auto}

/* ===== 窄屏兜底 ===== */
@media (max-width:900px){
  #page-mcp .mcpform{flex-direction:column;align-items:stretch}
  #page-mcp .mcpform .fld2.mcpf-grow{min-width:0}
  #page-mcp .mcpform button{align-self:flex-start}
  #page-strategy .stgtools .stg-run.u-right{margin-left:0}
  #page-kpi .kpicards{grid-template-columns:1fr 1fr}
  #page-reviewqueue .rqreason{max-width:180px}
  #page-reviewqueue .p1bar #rq-q{min-width:0;width:100%}
}
@media (max-width:640px){
  #page-kpi .kpicards{grid-template-columns:1fr}
  #page-reviewqueue .rqgates{grid-template-columns:1fr 1fr}
  #page-reviewqueue .rqconflict{grid-template-columns:1fr}
}


/* ===== 850 content pages ===== */
/* 页面组样式 · 内容优化:page-content(页面优化/内容规划) · 博客:page-blogwriter(博客写作) · page-blogresearch(博客研究补充)
   —— 基础组件见 020-all.css 与 DESIGN_SPEC.md;博客研究主样式在 022-content-blog-research.css */

/* ---------- 页面优化 / 内容规划(#page-content) ---------- */
#page-content{--co-sticky-head:76px}
/* 长列表表头底色(表体不限高,随页面整体滚动) */
#page-content .tblwrap thead th{background:var(--paper);box-shadow:0 1px 0 var(--rule2)}
/* 区块节奏:模式切换、说明、计数 chips、工具栏之间的呼吸感 */
#page-content .ilsegrow{margin:0 0 var(--sp-3)}
#page-content .clintro{max-width:980px}
#page-content .lnsum{margin:0 0 var(--sp-3)}
#page-content .ctbar{margin:0 0 var(--sp-3)}
#page-content .introfold{margin:0 0 var(--sp-3)}
/* 筛选 chips 区与表格间距 */
#page-content .co-decision-chips,#page-content .co-map-filters{margin:0 0 var(--sp-3)}
/* 表格内空态:去掉虚线卡与表格的叠加重盒感 */
#page-content .tblwrap td>.empty{border:0;background:transparent;padding:28px 16px}
/* 优化档案长页:档案头吸附,回退按钮与状态始终可见 */
#page-content .codossierhead{position:sticky;top:0;z-index:6;background:var(--paper);
  padding:10px 0 12px;margin:0 0 10px;border-bottom:1px solid var(--rule)}
#page-content .cosec{scroll-margin-top:calc(var(--co-sticky-head) + var(--sp-2))}
/* 产出编辑态:保存/取消操作条吸附,长表单不用滚回顶部 */
#page-content .coartifactactions{position:sticky;top:var(--co-sticky-head);z-index:5;align-items:center;
  background:var(--panel);padding:8px 0;border-bottom:1px dashed var(--rule)}
#page-content .coartifactactions>span{margin-right:auto}
/* 编辑态字段输入更舒展 */
#page-content .coeditfield textarea{line-height:1.65}
/* 数据收集项栅格收紧 */
#page-content .coevopts{margin-bottom:4px}

/* ---------- 博客写作(#page-blogwriter) ---------- */
/* 覆盖 020-all.css 中 .bwfdetail 的 overflow:hidden:sticky 子元素会被 overflow:hidden 祖先裁剪而失效,
   作用域放开为 visible,让 .bwfeditbar 相对 .main 正常吸附 */
#page-blogwriter .bwfdetail{overflow:visible}
/* 产物编辑器:操作条吸附在详情卡上沿 */
#page-blogwriter .bwfeditbar{position:sticky;top:-18px;z-index:6;background:var(--panel);
  margin:-18px -18px 14px;padding:14px 18px 12px;border-bottom:1px solid var(--rule);
  border-radius:11px 11px 0 0}
/* 正文分段写作区:更高、行距更宽松的 textarea */
#page-blogwriter .bwfeditfield textarea[data-bwf-field^="section-body"]{min-height:260px;line-height:1.8}
#page-blogwriter .bwfeditfield textarea[data-bwf-field="writer_notes"],
#page-blogwriter .bwfeditfield textarea[data-bwf-field="excerpt"]{min-height:110px;line-height:1.7}
/* 详情加载/空态撑满卡片,避免左侧列表旁出现塌陷 */
#page-blogwriter .bwfdetail>.empty,#page-blogwriter .bwfdetail>.loading{margin:40px 0}
/* 证据/产物页签下分区锚点 */
#page-blogwriter #bwf-tab-body .bwfsectionhead.second{scroll-margin-top:16px}

/* ---------- 博客研究(#page-blogresearch)补充 ---------- */
/* 加载中的标签页主体保持高度,避免页签跳动 */
#page-blogresearch #br-body>.empty,#page-blogresearch #br-body>.loading{min-height:220px;
  display:flex;align-items:center;justify-content:center}

/* ===== v5 桌面端视觉系统 ===== */
:root{
  --paper:#f4f7f9;
  --panel:#ffffff;
  --ink:#17212b;
  --ink2:#45515f;
  --muted:#74808e;
  --rule:#e3e8ee;
  --rule2:#cfd7df;
  --hover:#eef3f6;
  --soft:#f7f9fb;
  --sel:#edf4f5;
  --blue:#176b75;
  --blue-deep:#115761;
  --blue-bg:#e8f2f3;
  --blue-soft:#c4dfe1;
  --pass:#27835b;
  --pass-bg:#e8f4ee;
  --halt:#c34949;
  --halt-deep:#a93c3c;
  --halt-bg:#fbeded;
  --halt-line:#efcccc;
  --review:#a66b16;
  --review-bg:#fbf1df;
  /* 前端规范第 1 批:补齐此前被引用却从未定义的语义令牌。
     引用处一律不动,取值对齐同语义的现行令牌 —— 别再新造第 8 套色。
     --canvas/--panel2/--teal 是 v2/v3 期遗留别名。第 2 批-4 已把 026 的 --ok-*/--warn-*
     四个别名改直引 --pass-*/--review-* 正名并删除,语义色只剩一套名字。 */
  --canvas:var(--paper);
  --panel2:var(--soft);
  /* 前端规范第 2 批-4:徽标语义边框 + 中性底 + 分类色。收敛前边框色是 12 个散落硬编码
     (警告黄一种语义 5 个值:#eadcb6/#e6d8ae/#e9d6a8/#ecd894/#e5d1ae),同语义跨页对不上。 */
  --pass-line:#c2ddc9;
  --review-line:#e6d8ae;
  --info-line:var(--blue-soft);
  --mute-bg:var(--soft);
  --mute-line:var(--rule2);
  /* 分类色(非状态):导航型意图 / canonical 指向他页 / 重复页标注 / 品牌词 —— 刻意不进
     成功-警告-失败三色,免得把"分类"读成"出问题" */
  --mark:#7a6f96;
  --mark-bg:#eeeaf1;
  --mark-line:#ddd5e4;
  --teal:var(--blue);
  --font-ui:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif;
  --text-caption:12px;
  --text-body:14px;
  --text-section:16px;
  --text-page:24px;
  --line-caption:16px;
  --line-body:20px;
  --line-section:24px;
  --space-1:4px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-6:24px;
  --space-8:32px;
  --control-sm:32px;
  --control-md:36px;
  --content-pad-x:32px;
  --content-pad-y:28px;
  --side:240px;
  --hd:64px;
  --shadow-card:0 1px 2px rgba(18,35,52,.04),0 6px 20px rgba(18,35,52,.035);
  --shadow-raise:0 8px 28px rgba(18,35,52,.10),0 2px 6px rgba(18,35,52,.05);
  --focus:0 0 0 3px rgba(23,107,117,.18);
  /* ---------- 高度限制:数据表一律不限高(前端规范第 4 批)----------
     此前表体高度走 --tbl-h-main / --tbl-h-tall / --tbl-h-nested 三档令牌,表卡在
     calc(100vh - N) 里自带一层纵向滚动条 —— 每页 100 条数据要在一个半屏高的窗口里滚,
     页面本身反而不滚,列表看不完、打印/截图也只截到一屏。本批按用户要求全站数据表
     取消内部限高:表体自然全高展开,100 条一次铺完,纵向滚动交回页面,横向仍由
     .tblwrap 的 overflow-x:auto 承担。

     只剩一档留给**非数据表**的例外(弹窗内表、折叠浮层这类不该跟着页面无限长的容器):
       --tbl-h-nested  min(60vh,520px):小屏按 60vh 自动收,大屏 520px 封顶。
     数据表(含嵌套表、展开卡内表、页内分节表)一律不许再引它,也不许就地写 max-height ——
     check-ui-conventions.mjs 的检查 I 钉的就是这条,例外要进它的 HEIGHT_EXEMPT 名单。 */
  --tbl-h-nested:min(60vh,520px);
}

body{font-family:var(--font-ui);font-size:var(--text-body);line-height:var(--line-body);letter-spacing:0}
.main{background:var(--paper)}
.page{min-height:100%}
/* 逐页 padding 已删:这条 27 个 ID 的名单就是全站实收的页面边距,本批把它原值提到
   第 18.2 段的全局默认 .page 上 —— 名单里 27 页的计算值不变,名单外的页面(新建页与
   loopruns/taskmcp/catboard/catbattle/projectstrategy/rankkw/guide)从此与它们一致。 */

aside.side{background:#f7f9fb;border-right-color:#dfe5eb;padding:12px 10px 16px}
aside .brandmark{padding:2px 8px 14px;gap:10px}
aside .brandmark .logo{width:28px;height:28px;border-radius:8px;box-shadow:0 2px 6px rgba(23,107,117,.18)}
aside .brandmark .brandname{font-size:14px;line-height:18px;letter-spacing:0}
aside .brandmark .brandsub{margin-top:1px;font-size:10px;line-height:12px;letter-spacing:.08em;color:#7c8996}
.navsearch{height:var(--control-md);margin:0 2px 10px;padding:0 10px;background:#fff;border-color:#d7dfe6;border-radius:8px}
.navsearch input{height:32px;font-size:14px;line-height:20px}
.navsearch kbd{background:#f5f7f9;border-color:#dce2e7}
.navbulk{margin:0 2px 6px;padding:0 4px}
.navbulk>span{font-size:12px;line-height:16px}
.navbulk button{min-height:28px;padding:4px 6px;font-size:12px;line-height:18px}
aside nav{gap:0;padding:2px 0 12px;scrollbar-gutter:stable}
aside nav a{min-height:var(--control-sm);padding:6px 11px;border-radius:7px;color:#465463;font-size:14px;line-height:20px}
aside nav a:hover{background:#eef3f6;color:var(--ink)}
aside nav a.on{background:#e6f0f1;color:#145f68;box-shadow:inset 3px 0 0 var(--blue)}
aside nav .navgrp{min-height:28px;padding:8px 11px 4px;font-size:12px;line-height:16px;letter-spacing:.04em;color:#7a8794}
aside nav::-webkit-scrollbar{width:8px}
aside nav::-webkit-scrollbar-thumb{background:#c9d2da;background-clip:padding-box;border:2px solid transparent;border-radius:999px}
aside nav::-webkit-scrollbar-thumb:hover{background:#aebbc6;background-clip:padding-box}

header.topbar{padding:0 32px;background:rgba(255,255,255,.96);border-bottom-color:#e3e8ee;box-shadow:0 1px 0 rgba(18,35,52,.02)}
.topbar .meta{font-size:13px;font-weight:600;color:#344250;white-space:nowrap}
.topbar .controls{gap:7px}
.topbar .controls>button,.topbar .controls>a.toplink{height:36px;min-height:36px;border-radius:8px;background:#fff;border-color:#dbe2e8}
.topbar .controls .fld,.topbar .controls .fld select,.topbar .controls .whoami{height:36px;min-height:36px}
.topbar #portal,.topbar #logout{min-width:auto;background:transparent;border-color:transparent;box-shadow:none}
.topbar #portal:hover,.topbar #logout:hover{background:var(--hover);border-color:transparent}
.rolebadge{background:var(--blue-bg);border-color:var(--blue-soft);color:var(--blue-deep)}

button{border-color:#d7dfe6;border-radius:8px;background:#fff;box-shadow:0 1px 2px rgba(18,35,52,.035)}
button:hover{background:#f5f8fa;border-color:#bdc8d2}
input,select,textarea{border-color:#d5dde5;background:#fff;border-radius:8px}
.tblwrap{background:#fff;border-color:var(--rule);border-radius:12px;box-shadow:var(--shadow-card)}
.tblwrap table th{background:#f8fafb;color:#667381;font-weight:600}
.tblwrap table tbody tr:hover td{background:#f8fbfc}
.pagehead{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin:0 0 18px;padding:0 2px}
.pagehead>div{display:flex;flex-direction:column;gap:4px}
.pagehead .pageeyebrow{font-size:10px;font-weight:700;letter-spacing:.14em;color:var(--blue)}
.pagehead h2{margin:0;font-size:24px;line-height:1.25;font-weight:680;letter-spacing:-.025em;color:var(--ink)}
.pagehead p{margin:0;font-size:var(--text-body);line-height:var(--line-body);color:var(--muted)}
.ilseg{background:#edf1f4;border-color:#dce3e9}
.ilseg-b.on{background:#fff;color:var(--blue-deep);box-shadow:0 1px 3px rgba(18,35,52,.08)}
.filterbar{background:#fff;border-color:var(--rule);box-shadow:var(--shadow-card)}
.fbtn{background:#f6f8fa;border-color:#e2e7ec;color:var(--ink2)}
.fbtn.on{background:var(--blue-bg);border-color:var(--blue-soft);color:var(--blue-deep)}

#page-overview{max-width:1500px}
#page-overview .ovhead{align-items:flex-start;justify-content:space-between;margin:0 0 22px;padding:0 2px}
#page-overview .ovtitleblock{display:flex;flex-direction:column;gap:4px}
#page-overview .oveyebrow{font-size:10px;font-weight:700;letter-spacing:.14em;color:var(--blue)}
#page-overview .ovhead .ovh{font-size:26px;line-height:1.25;letter-spacing:-.025em;color:var(--ink)}
#page-overview .ovsub{font-size:var(--text-body);line-height:var(--line-body);color:var(--muted)}
#page-overview .ovfresh{display:inline-flex;align-items:center;gap:7px;padding:6px 10px;border:1px solid #d9e6df;border-radius:999px;background:#f5faf7;color:#47705b;font-size:11px;white-space:nowrap}
#page-overview .kpis{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:0 0 20px;background:transparent;border:0;border-radius:0;overflow:visible}
#page-overview .kpi{min-width:0;min-height:112px;padding:34px 18px 17px;border:1px solid var(--rule);border-radius:12px;background:#fff;box-shadow:var(--shadow-card);transition:transform .14s ease,border-color .14s ease,box-shadow .14s ease}
#page-overview .kpi:last-child{border-right:1px solid var(--rule)}
#page-overview .kpi:hover{transform:translateY(-1px);border-color:var(--blue-soft);box-shadow:var(--shadow-raise)}
#page-overview .kpi span{order:0;font-size:12px;font-weight:500;color:var(--muted)}
#page-overview .kpi b{order:1;margin-top:auto;font-size:28px;line-height:1.05;letter-spacing:-.025em;font-variant-numeric:tabular-nums}
#page-overview .kpi-method{order:2;width:100%}
#page-overview .ovsec{margin:0 0 18px;padding:18px;background:#fff;border:1px solid var(--rule);border-radius:14px;box-shadow:var(--shadow-card)}
#page-overview .ovsec-h{margin:0 0 14px;padding:0 2px}
#page-overview .ovsec-h>span:first-child{font-size:14px;font-weight:650;color:var(--ink)}
#page-overview .ovsec-hint{font-size:11.5px}
#page-overview .ovfunnel{counter-reset:ovstep;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;border:0;background:transparent}
#page-overview .ovfunnel .ovstp{counter-increment:ovstep;position:relative;min-width:0;min-height:102px;padding:15px 16px;border:1px solid var(--rule);border-radius:10px;background:var(--soft)}
#page-overview .ovfunnel .ovstp::before{content:"0" counter(ovstep);position:absolute;right:14px;top:12px;font:600 10px/1 var(--mono);color:#9aa5af}
#page-overview .ovfunnel .ovstp:hover{border-color:var(--blue-soft);background:var(--blue-bg);box-shadow:none}
#page-overview .ovfunnel .ovstp.has-pend{background:var(--halt-bg);border-color:var(--halt-line);box-shadow:none}
#page-overview .ovfunnel .ovstp .sn{font-size:12px;font-weight:600;color:var(--ink2)}
#page-overview .ovfunnel .ovstp .nums b{font-size:25px;letter-spacing:-.02em}
#page-overview .ovsec .tblwrap{box-shadow:none;border-radius:10px}
#page-overview .ovpipe{margin-top:18px;border-color:var(--rule);border-radius:12px;background:#fff;box-shadow:var(--shadow-card)}
#page-overview .ovpipe>summary{min-height:48px;padding:12px 16px;font-weight:600;color:var(--ink2)}

#page-clusters .introfold{margin-bottom:14px;padding:0 2px}
/* 通用筛选/工具条卡片:任务中心头部两行与数据亮点 anmbar 共用同一卡片风格 */
.barcard,#page-highlights .anmbar{padding:10px 12px;border:1px solid var(--rule);border-radius:12px;background:#fff;box-shadow:var(--shadow-card)}
.barcard{display:flex;align-items:center;gap:10px}
#page-highlights .tblwrap{border-radius:12px}
#page-clusters .taskentry{margin-bottom:14px;background:#eef6f7;border-color:#cfe2e4}

#page-pipeline .pbar{margin-bottom:16px;padding:0 2px}
#page-pipeline .pbar .ptitle{font-size:20px;font-weight:650;letter-spacing:-.02em}
#page-pipeline .pboard{gap:16px}
#page-pipeline .pcol{border-color:var(--rule);border-radius:13px;background:#fff;box-shadow:var(--shadow-card);overflow:hidden}
#page-pipeline .pcolh{min-height:48px;padding:12px 15px;background:#fff;border-bottom-color:var(--rule)}
#page-pipeline .s-imported{border-top:3px solid var(--review)}
#page-pipeline .s-clustered{border-top:3px solid var(--blue)}
#page-pipeline .s-confirmed{border-top:3px solid var(--pass)}
#page-pipeline .pcards{padding:11px;background:#f7f9fb}
#page-pipeline .pcard{border-color:#e0e6eb;background:#fff;border-radius:10px;box-shadow:0 1px 2px rgba(18,35,52,.025)}
#page-pipeline .pcard:hover{border-color:var(--blue-soft);box-shadow:0 5px 16px rgba(18,35,52,.07)}
#page-pipeline .pgr.ppg{background:#fff}
#page-pipeline .parch{padding:14px 16px;border:1px solid var(--rule);border-radius:12px;background:#fff;box-shadow:var(--shadow-card)}
#page-pipeline .parch .pcards{margin:12px -4px 0;padding:4px;background:#fff}

@media(max-width:1180px){
  #page-overview .kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  #page-overview .ovfunnel{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* 普通SEO人员工作台 */
#page-overview{max-width:1560px}
.ow-shell{display:flex;flex-direction:column;gap:18px;padding-bottom:48px;color:var(--ink)}
.ow-head{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;padding:2px 2px 4px}
.ow-head>div:first-child{max-width:760px}
.ow-eyebrow{display:block;margin-bottom:5px;color:var(--blue);font-size:11px;font-weight:750;letter-spacing:.12em;text-transform:uppercase}
.ow-head h1,.ow-panel h2,.ow-panel h3{margin:0;color:var(--ink);letter-spacing:-.025em}
.ow-head h1{font-size:30px;line-height:1.2;font-weight:720}
.ow-head p,.ow-panel-head p{margin:6px 0 0;color:var(--muted);font-size:13px;line-height:1.6}
.ow-head>div:last-child{display:grid;grid-template-columns:auto auto;align-items:center;gap:5px 12px;padding:10px 12px;border:1px solid var(--rule);border-radius:10px;background:#fff}
.ow-head>div:last-child span{font-size:11px;color:var(--muted)}
.ow-head>div:last-child b{font-size:12px;font-weight:650}
.ow-head>div:last-child button{grid-column:1/-1;height:30px;padding:0 10px;font-size:11px}
.ow-panel{padding:20px;border:1px solid var(--rule);border-radius:14px;background:#fff;box-shadow:var(--shadow-card)}
.ow-panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:16px}
.ow-panel-head h2{font-size:21px;line-height:1.3}
.ow-panel-head h3{font-size:16px;line-height:1.35}
.ow-panel-head>button{flex:none;min-height:34px;color:var(--blue-deep);border-color:var(--blue-soft);background:var(--blue-bg)}
.ow-goal{padding:22px;background:linear-gradient(135deg,#f7fbfb 0%,#fff 65%);border-color:#d6e6e7}
.ow-goal-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.ow-goal-grid>article{display:flex;flex-direction:column;min-height:142px;padding:17px;border:1px solid #dfe7ea;border-radius:11px;background:#fff}
.ow-goal-grid>article>span{font-size:12px;font-weight:650;color:var(--ink2)}
.ow-goal-grid>article>b{margin-top:10px;font-size:25px;line-height:1.1;font-weight:730;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.ow-goal-grid>article>small{margin-top:8px;min-height:32px;color:var(--muted);font-size:11.5px;line-height:1.45}
.ow-progress{margin-top:auto;padding-top:12px}
.ow-progress>div{display:flex;justify-content:space-between;gap:8px;margin-bottom:6px;font-size:10.5px;color:var(--muted)}
.ow-progress>div b{font-size:10.5px;color:var(--ink2)}
.ow-progress>i{display:block;height:6px;overflow:hidden;border-radius:999px;background:#e9eef0}
.ow-progress>i>em{display:block;height:100%;border-radius:999px;background:var(--blue)}
.ow-summary{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}
.ow-summary button{display:flex;flex-direction:column;align-items:flex-start;min-height:86px;padding:14px 15px;text-align:left;border-radius:11px}
.ow-summary button span{color:var(--muted);font-size:11.5px}
.ow-summary button b{margin-top:auto;font-size:24px;line-height:1;font-variant-numeric:tabular-nums}
.ow-summary button:nth-child(4),.ow-summary button:nth-child(5){border-color:#ecd4cf;background:#fffafa}
.ow-table-wrap{overflow:auto;border:1px solid var(--rule);border-radius:10px}
.ow-table{width:100%;border-collapse:collapse;table-layout:auto;font-size:12px}
.ow-table th{padding:10px 12px;text-align:left;white-space:nowrap;color:var(--muted);font-size:10.5px;font-weight:650;background:#f7f9fa;border-bottom:1px solid var(--rule)}
.ow-table td{padding:13px 12px;vertical-align:middle;border-bottom:1px solid #edf0f2}
.ow-table tr:last-child td{border-bottom:0}
.ow-table td:first-child{min-width:300px}
.ow-table td>b{display:block;font-size:12.5px;font-weight:650;color:var(--ink)}
.ow-table td small{display:block;margin-top:4px;color:var(--muted);font-size:10.5px;line-height:1.4}
.ow-table tr.is-overdue td{background:#fffafa}
.ow-overdue{color:#a94338!important}
.ow-level{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:22px;padding:0 7px;border-radius:999px;font-size:10px;font-weight:750;background:#eef2f4;color:var(--ink2)}
.ow-level.p0{background:#fae8e5;color:#9c342b}.ow-level.p1{background:#fff2d9;color:#8a5c00}.ow-level.p2{background:#e8f2f3;color:#176b75}
.ow-actions{display:flex;align-items:center;gap:6px;white-space:nowrap}
.ow-actions button{height:30px;padding:0 10px;font-size:11px}
.ow-list{display:flex;flex-direction:column;border:1px solid var(--rule);border-radius:10px;overflow:hidden}
.ow-list article{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:14px 15px;border-bottom:1px solid #edf0f2}
.ow-list article:last-child{border-bottom:0}.ow-list article>div{min-width:0}
.ow-list b{display:block;margin-top:3px;font-size:12.5px}.ow-list p{margin:4px 0;color:var(--ink2);font-size:11.5px;line-height:1.5}.ow-list small{color:var(--muted);font-size:10.5px}
.ow-list article>button{flex:none;height:32px;padding:0 12px;color:var(--blue-deep);border-color:var(--blue-soft)}
.ow-type{font-size:10px;font-weight:650;color:var(--blue);letter-spacing:.04em}
.ow-blockers{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.ow-blocker{display:flex;flex-direction:column;padding:15px;border:1px solid #ead9d5;border-left:3px solid #c45c50;border-radius:10px;background:#fffafa}
.ow-blocker-title{display:flex;align-items:flex-start;gap:10px}.ow-blocker-title b{display:block;font-size:13px}.ow-blocker-title p{margin:5px 0 0;color:var(--ink2);font-size:11.5px;line-height:1.5}
.ow-blocker dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px 16px;margin:14px 0}
.ow-blocker dl>div{min-width:0}.ow-blocker dt{font-size:10px;color:var(--muted)}.ow-blocker dd{margin:3px 0 0;font-size:11px;line-height:1.45;color:var(--ink2);overflow-wrap:anywhere}
.ow-blocker>button{align-self:flex-start;margin-top:auto;height:32px;color:#943d34;border-color:#e2b9b2;background:#fff}
.ow-empty{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:22px;border:1px dashed var(--rule2);border-radius:10px;background:var(--mute-bg)}
.ow-empty b{font-size:13px}.ow-empty span{color:var(--muted);font-size:11.5px;line-height:1.5}.ow-empty button{margin-top:5px;height:32px;color:var(--blue-deep);border-color:var(--blue-soft)}
@media(max-width:1280px){.ow-summary{grid-template-columns:repeat(3,minmax(0,1fr))}.ow-goal-grid{grid-template-columns:1fr}.ow-blockers{grid-template-columns:1fr}}

/* 意图规划清单面板(关键词页打「意图」标签的词),外框沿用 .mergefold 同一形态 */
details.planfold{border:1px solid var(--rule);border-radius:10px;padding:12px 14px;margin:0 0 14px;background:var(--panel)}
details.planfold>summary{font-size:13.5px;font-weight:650;color:var(--ink)}
details.planfold>summary::before{content:"▸ "}details.planfold[open]>summary::before{content:"▾ "}
details.planfold .tblwrap{margin-top:8px}
details.planfold .kwpick{width:28px;text-align:center}

/* 集群统一环节:同义集群归并面板(方案A,确定性规则,复用 .cluster/.ch/.cmeta/.ibadge/.filterbar 原语) */
details.mergefold{border:1px solid var(--rule);border-radius:10px;padding:12px 14px;margin:0 0 14px;background:var(--panel)}
details.mergefold>summary{font-size:13.5px;font-weight:650;color:var(--ink)}
details.mergefold>summary::before{content:"▸ "}details.mergefold[open]>summary::before{content:"▾ "}
.mrgcard{border:1px solid var(--rule);border-radius:8px;margin-top:10px;background:var(--paper)}
.mrgcard.mrgconflict{background:var(--halt-bg,#fdf4f3)}
.mrgclusters{padding:2px 14px 10px;display:flex;flex-direction:column;gap:4px}
.mrgcl{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px;padding:3px 0;border-bottom:1px dashed var(--rule)}
.mrgcl:last-child{border-bottom:0}
.mrgcl.primary .mrgtopic{font-weight:650}
.mrgtopic{flex:1;min-width:0;overflow-wrap:anywhere}

/* ---------- 共享折线图(112-core-charts.js 的 chartLine)---------- */
/* 颜色一律走变量:序列色由调用方传(默认 --blue/--pass/--review/--halt),
   网格与轴文字在这里定,将来加暗色主题只改变量不改这段。 */
.chartsvg{display:block;width:100%;overflow:visible}
.chartgrid{stroke:var(--rule);stroke-width:1}
.chartaxis{fill:var(--muted);font-size:10px}
.chartline{stroke-width:2.2;stroke-linejoin:round;stroke-linecap:round}
/* 柱序列(kind:'bar'):比同图折线略淡,让叠在它上面的线读得出来 */
.chartbar{opacity:.9}
.chartdot{opacity:.85}
.chartdot-last{opacity:1}
.chartlegend{display:flex;gap:14px;flex-wrap:wrap;margin-top:5px;font-size:11px;color:var(--ink2)}
.chartlegenditem{display:inline-flex;align-items:center;gap:5px}
.chartlegenditem i{width:9px;height:2.5px;border-radius:2px;flex:none}
/* 图例色块的形状要认得出图上的几何:线序列是线段,柱序列是方块 */
.chartlegenditem.bar i{height:9px;border-radius:2px}
.chartnote{color:var(--muted)}
/* 悬浮读数:命中层透明但要吃 pointer 事件(绘图区空白处也能触发);
   竖参考线比网格略深一点,以便与网格区分。 */
.charthit{fill:transparent;pointer-events:all}
.chartcross{stroke:var(--rule2,var(--rule));stroke-width:1;stroke-dasharray:3 3;pointer-events:none}
.chartpop{position:fixed;left:0;top:0;width:max-content;max-width:min(260px,calc(100vw - 16px));
  display:flex;flex-direction:column;gap:2px;padding:6px 9px;border-radius:var(--r-sm);
  background:var(--ink);color:var(--paper);font-size:11.5px;line-height:1.5;
  box-shadow:var(--shadow-raise);pointer-events:none;z-index:1000}
.chartpop[hidden]{display:none}
.chartpop-d{opacity:.75;font-size:11px}
.chartpop-r{display:flex;align-items:center;gap:6px}
.chartpop-r i{width:9px;height:2.5px;border-radius:2px;flex:none}
.chartpop-r.bar i{height:9px}
.chartpop-l{flex:1;min-width:0;opacity:.85;overflow-wrap:anywhere}
/* per-x 补充说明(opts.notes):第二梯队信息,压暗且允许折行 */
.chartpop-n{margin-top:2px;padding-top:3px;border-top:1px solid rgba(255,255,255,.16);
  opacity:.7;font-size:11px;overflow-wrap:anywhere;white-space:normal}

/* ---------- URL 视图:筛选行与行展开卡(425-data-urlview.js)---------- */
#page-urlview tr.upvrow{cursor:pointer}
#page-urlview tr.upvrow.on>td{background:var(--blue-bg)}
#page-urlview .upvcaret{display:inline-block;width:10px;color:var(--muted);font-size:10px}
#page-urlview tr.upvexprow>td{background:var(--soft);padding:14px 16px}
.upvexp{display:flex;flex-direction:column;gap:14px}
.upvexp h4{margin:0 0 6px;font-size:12.5px;font-weight:650;color:var(--ink2)}
.upvexpcharts{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:16px;align-items:start}
.upvexpchart{min-width:0;background:var(--panel);border:1px solid var(--rule);border-radius:8px;padding:10px 12px}
.upvexpkw{background:var(--panel);border:1px solid var(--rule);border-radius:8px;padding:10px 12px}
/* 承接词表随展开卡一起被页面滚动带走:不再卡内限高(限高时 20 条只露 7~14 行,
   用户点名过"过矮"),展开即整表可见。 */
.upvexpkw .lkt thead th{background:var(--panel)}
.upvexpkw .upvkwq{overflow-wrap:anywhere}
/* 词做成链接样式的按钮:表格里不适合再塞一个实体按钮,但它确实是可点的跨页入口 */
.upv-kw{border:0;background:none;padding:0;font:inherit;color:var(--blue);cursor:pointer;text-align:left}
.upv-kw:hover{text-decoration:underline}
.upvexpfoot{display:flex;align-items:center;gap:10px}
.upvexpload{display:flex;align-items:center;justify-content:center;gap:10px;padding:22px}
@media (max-width:1100px){ .upvexpcharts{grid-template-columns:1fr} }

/* ============================================================
   分页共享件(前端规范第 2 批-2)—— 全站唯一一套分页样式。
   收敛前是 7 套翻页 + 3 套「加载更多」共 10 个类名:.alpg/.rqpager/.co-pagination/
   .brownpagination/.ppg/.kwmore/.kwbmore/.rkwmore,外加 CSS 里根本没定义的死类
   .clpg/.anmpg。其中 .rqpager 的选择器只列了 reviewqueue 与 reasoning 两个页面 id,而实际
   有 4 个页面用它 —— techissues 与 urlview 的分页条一直裸奔无样式。类名不再绑页面 id,
   新页面接上就有样式。
   结构由 ui/scripts/113-core-pager.js 生成,改样式只改这一段。
   ============================================================ */
.pgr{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;margin:14px 0;font-size:12px;color:var(--muted)}
.pgr .pgrcount{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
.pgr button,.pgrmore button{font-size:12px;padding:4px 12px;border:1px solid var(--rule);border-radius:6px;background:var(--paper);color:var(--ink2);cursor:pointer}
.pgr button:disabled,.pgrmore button:disabled{opacity:.4;cursor:default}
.pgr .pgrsize{padding:4px 8px;border:1px solid var(--rule);border-radius:6px;background:var(--paper);color:var(--ink2);font-size:12px}
.pgrmore{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;padding:14px 0;font-size:12px;color:var(--muted)}
.pgrmore .pgrcount{color:var(--muted);font-variant-numeric:tabular-nums}
/* 静默截断的可见提示:表体之后一行小字,不抢内容视线但让用户知道自己看的不是全量 */
.pgrnote{margin:6px 0 0;color:var(--muted);font-size:11px;text-align:center}

/* ============================================================
   数据表归一(前端规范第 2 批-3)—— 全站表格只剩 .lkt 一族。
   收敛前:17 个类写作 class="lkt XXX"(本就是 lkt 皮肤,却各自重申 lkt 已有的属性),
   另有 6 套与 lkt 平行的独立实现(.cfmt/.kwt/.gsct/.cbleaf/.oqkw/.tlist)做同一件事,
   差别只在内边距(3px 6px ~ 9px 14px)与字号(11~13px)—— 属无意漂移,不是设计意图。
   收敛后:结构一律 <table class="lkt [密度档] [列宽/染色修饰]">,密度只此两档 + 默认。
   修饰类只许写 delta(列宽、特定列染色、页面级吸顶),不许再重申 lkt 已有的
   padding / font-size / border / hover / td.num 对齐。
   选择器特异性说明:下面两档写成 table.lkt.lkt-* 是为了压过第 18.11 段
   `.tblwrap table.lkt thead th`(同为 0,2,3),靠位置靠后取胜;页面级 #page-* 规则
   仍然更高,页面自有的列密度(如 #page-keywords 的 6px 8px)照旧生效。
   ============================================================ */
/* 紧凑档:卡内附表(SERP 抓取历史一类),行高比默认矮一档 */
table.lkt.lkt-compact{font-size:12px}
table.lkt.lkt-compact thead th{font-size:11px;padding:7px 10px}
table.lkt.lkt-compact tbody td{padding:7px 10px}
/* 密集档:展开行里的内嵌小表(GSC 分 URL、子类明细、承接词),信息密度优先 */
table.lkt.lkt-dense{font-size:12px}
table.lkt.lkt-dense thead th{font-size:11px;padding:5px 8px}
table.lkt.lkt-dense tbody td{padding:5px 8px}
/* 可排序表头:收敛前 .alt/.cfmt/.urlt/.kwbtable 各写一份同样的两条,现在只此一份 */
.lkt th.sortable{cursor:pointer;user-select:none}
.lkt th.sortable:hover{color:var(--blue)}
/* 等宽列:原 .tlist 的 td.mono,提到 lkt 一族公用 */
.lkt td.mono{font-family:var(--mono)}
/* 嵌套表的行分隔线。第 8 段那条 `.tblwrap table tbody tr:last-child td{border-bottom:0}`
   用的是后代组合子:展开行若正好是外层表的末行,它会把嵌套在那一行里的小表**整张**的分隔线
   一并抹掉。品类看板子类表原先靠 `#page-catboard .cbleaf td` 的 ID 特异性挡住,本批删掉那条
   平行实现后挡板没了,分隔线会消失 —— 这条把它按 lkt 的口径补回来(末行仍不画线)。
   同一个漏进问题也影响承接词表与 URL 视图展开表,但那两处在 main 上就已经是这样,属存量,
   不在本批一并改(改了是新的视觉变更),留给嵌套表专项。 */
#page-catboard .cbinner table.lkt tbody tr:not(:last-child) td{border-bottom:1px solid #edeae0}

/* ================================================================================
   色彩语义规范表(前端规范第 2 批-4 固化)
   --------------------------------------------------------------------------------
   规矩:一个语义 = 一组令牌 = 一条选择器列表(见本文件「6. 徽标统一族」)。
   新增状态类只许挂到已有的某一条语义列表上;需要新语义先在这张表里加一行,
   连令牌一起加,不许在页面段里就地写第 21 套色。CI 检查 G 钉的就是这条。

   语义      令牌组                                        用在什么状态上
   ------    ------------------------------------------    --------------------------------
   成功      --pass / --pass-bg / --pass-line               已完成、成功、已确认、已批准、
             (#27835b / #e8f4ee / #c2ddc9)                 已锁定、监测开启、已索引、
                                                           sitemap 收录、评分优、交易型意图
   警告      --review / --review-bg / --review-line         待审批、待复核、进行中需盯、
             (#a66b16 / #fbf1df / #e6d8ae)                 陈旧、降级、可重试失败、
                                                           noindex、评分中、商业型意图
   失败      --halt-deep / --halt-bg / --halt-line          失败、终态冲突、阻断、逾期、
             (#a93c3c / #fbeded / #efcccc)                 缺失、抓取错误、评分差
   进行中    --blue / --blue-bg / --blue-soft               排队中、采集中、运行中(蓝口径)、
             (#176b75 / #e8f2f3 / #c4dfe1)                 当前版本、已规划、集群标识
   信息      --info / --info-bg / --info-line               归因/来源类信息标签
             (#2b7d8a / #e0edee / #c4dfe1)                 (AIO 命中、诊断归因-内容侧)
   中性      --muted / --mute-bg / --mute-line              未开始、未规划、未知、已归档、
             (#74808e / #f7f9fb / #cfd7df)                 已取消、监测关闭、无数据
   分类      --mark / --mark-bg / --mark-line               **不是状态**:导航型意图、
             (#7a6f96 / #eeeaf1 / #ddd5e4)                 canonical 指向他页、重复页标注、
                                                           品牌词 —— 刻意不用红黄绿,
                                                           免得把「分类」读成「出问题」
   --------------------------------------------------------------------------------
   刻意保留、不并入的家族(语义确实不同,不是重复实现):
     .bdg            代码型标签(等宽 + 全大写 + 字距),用于意图/特征标记,几何刻意不同
     .st-* / .v-*    只染前景色的裸文字状态(表格里跟在文字后面,不占胶囊),
                     .st-* 用中文类名是存量(API 状态码直出),归类名英文化那一批
     .dtstatus       「色点 + 文字」形态,不是徽标;色点色仍走上面同一组令牌
     .dtdetailstate  整块状态条(卡片级),不是行内徽标
     .cause-bdg      诊断归因标签,等宽 + 六色分组,归因语义与状态语义不同轴
     .tagchip/.kwsystag/.ddchip/.co-filter-chip/.fbar-chip
                     可点选的 chip(有 hover/选中态,或带 × 的删除动作),是控件不是状态显示
   ================================================================================ */

/* ================================================================================
   筛选条统一族 .fbar(前端规范第 4 批-1;实现见 ui/scripts/114-core-filterbar.js)
   --------------------------------------------------------------------------------
   收敛前每页各写各的工具条:.kwfilters / .p1bar / .ilfbar / .albar / .urlbar 五套类名,
   控件一律平铺不折叠 —— 关键词视图那条要占四行(约 141px),表格还没开始就吃掉一屏的
   三分之一,而且"当前过滤成什么样"只能逐个控件回看。
   收敛后一族三件:.fbar-row(默认那一行)/ .fbar-pop(低频筛选的折叠浮层)/
   .fbar-chips(已选条件胶囊)。几何与颜色全部引既有令牌,不新造第 21 套色;
   控件本体复用既有统一族(段控件 .ilseg/.ilseg-b、多选 chip .fbtn),这里只出容器与间距。

   高度契约:默认态恰一行 = 控件 32px(--control-sm)+ 上下 padding 7px = 46px;
             有 chips 时多一行 26px + 行距 6px = 78px。四行平铺那条一去不返。
   ================================================================================ */
.fbar{display:flex;flex-direction:column;gap:6px;margin:0 0 10px;padding:7px 10px;
  background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-md);
  box-shadow:var(--shadow-card)}
.fbar-row{display:flex;align-items:center;gap:var(--sp-2);min-height:var(--control-sm);flex-wrap:wrap}
.fbar-row .ilseg{flex:0 0 auto}
.fbar-grp{display:inline-flex;align-items:center;gap:5px}
.fbar .lab{white-space:nowrap}
.fbar-q{flex:0 1 320px;min-width:180px}
.fbar-range{display:inline-flex;align-items:center;gap:4px}
.fbar-n-in{width:78px}
.fbar-dash{color:var(--muted);font-size:12px}
.fbar select,.fbar input,.fbar button{min-height:var(--control-sm)}
.fbar select:disabled,.fbar input:disabled{opacity:.55;cursor:not-allowed}
/* 「筛选 ▾」:低频筛选的入口。折叠区里有生效筛选时按钮上挂计数,收起来的筛选不会隐身。 */
.fbar-more{padding:5px 12px;border:1px solid var(--rule2);border-radius:var(--r-sm);
  background:var(--paper);color:var(--ink2);font-size:12.5px;cursor:pointer;white-space:nowrap}
.fbar-more:hover{border-color:var(--blue-soft);color:var(--blue)}
.fbar-more.on{border-color:var(--blue);color:var(--blue);background:var(--blue-bg)}
.fbar-n{display:inline-block;margin-left:4px;padding:0 6px;border-radius:999px;
  background:var(--blue-bg);color:var(--blue);font-size:11px;font-weight:600}
/* 动作按钮(新增 / 管理一类)贴右端:它们不是筛选,也不进 chips */
.fbar-acts{display:inline-flex;align-items:center;gap:var(--sp-2);margin-left:auto}
/* 折叠浮层:分组竖排,一行一个 label + 控件。不再是横向平铺后自动换行。 */
.fbar-pop[hidden]{display:none}
.fbar-pop{display:flex;flex-direction:column;gap:6px;padding:8px 10px;
  max-height:var(--tbl-h-nested);overflow:auto;
  background:var(--soft);border:1px solid var(--rule);border-radius:var(--r-sm)}
.fbar-pop .fbar-grp{align-items:flex-start;gap:8px}
.fbar-pop .lab{flex:0 0 68px;padding-top:6px;text-align:right}
.fbar-multi{display:flex;flex-wrap:wrap;gap:4px}
.fbar-multi .fbtn{padding:3px 9px;font-size:11px}
/* 已选条件胶囊:非默认值的筛选一枚一枚摆出来,当前过滤态一眼可见。
   .fbar-chip 是**可点选控件**(带 × 的删除动作),不是状态徽标 —— 与
   .tagchip/.kwsystag/.ddchip/.co-filter-chip 同一档,见末段色彩语义规范表。 */
.fbar-chips{display:flex;flex-wrap:wrap;align-items:center;gap:5px}
.fbar-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 6px 2px 9px;
  border:1px solid var(--blue-soft);border-radius:999px;background:var(--blue-bg);
  color:var(--blue);font-size:11.5px;line-height:18px}
.fbar-chip .x{font-style:normal;cursor:pointer;color:var(--blue);opacity:.66;padding:0 3px}
.fbar-chip .x:hover{opacity:1}
.fbar-clear{padding:2px 8px;border:1px solid var(--rule2);border-radius:999px;
  background:transparent;color:var(--muted);font-size:11.5px;cursor:pointer}
.fbar-clear:hover{border-color:var(--rule2);color:var(--ink2)}
/* 窄屏:默认那一行允许换行,搜索框吃满宽 */
@media (max-width:900px){
  .fbar-row{flex-wrap:wrap}
  .fbar-q{flex:1 1 100%}
}
/* 新博客研究(#page-blogresearch)—— v4 重构:全部限定页面作用域,颜色统一走 DESIGN_SPEC 令牌,组件对齐 020 基础层 */
/* 页头 */
#page-blogresearch .brhead{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin:0 0 16px}
#page-blogresearch .brhead h2{font-size:22px;line-height:1.25;margin:0 0 5px}
#page-blogresearch .brhead p{max-width:920px;margin:0;color:var(--muted);font-size:12.5px;line-height:1.65}
#page-blogresearch .brheadactions{display:flex;gap:8px;flex:none;flex-wrap:wrap;justify-content:flex-end}
/* 摘要指标条 */
#page-blogresearch .brsummary{display:grid;grid-template-columns:repeat(6,minmax(120px,1fr));gap:10px;margin-bottom:14px}
#page-blogresearch .brsummary article{display:grid;grid-template-columns:1fr auto;gap:2px 12px;padding:11px 13px;
  border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}
#page-blogresearch .brsummary span,#page-blogresearch .brsummary small{font-size:11px;color:var(--muted)}
#page-blogresearch .brsummary b{font:700 20px var(--mono);grid-row:1/3;grid-column:2}
/* 页签 */
#page-blogresearch .brtabs{display:flex;gap:4px;padding:4px;margin-bottom:12px;border:1px solid var(--rule);
  border-radius:var(--r-lg);background:var(--soft);width:max-content}
#page-blogresearch .brtab{border:0;background:transparent;padding:7px 14px;box-shadow:none;color:var(--ink2)}
#page-blogresearch .brtab.on{background:var(--panel);box-shadow:var(--shadow-card);color:var(--blue);font-weight:650}
/* 工具条 */
#page-blogresearch .brtoolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
#page-blogresearch .brtoolbar input{width:300px;max-width:42vw}
#page-blogresearch .brcount{font-size:11px;color:var(--muted);white-space:nowrap}
/* 缺口列表 + 候选详情双栏 */
#page-blogresearch .brgaplayout{display:grid;grid-template-columns:minmax(660px,1.5fr) minmax(350px,.8fr);gap:12px;align-items:start}
#page-blogresearch .brtablewrap{border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);
  box-shadow:var(--shadow-card);overflow-x:auto}
#page-blogresearch .brtable{width:100%;border-collapse:collapse;font-size:12px}
#page-blogresearch .brtable th{text-align:left;padding:9px 10px;
  background:var(--soft);color:var(--muted);font-size:10.5px;white-space:nowrap}
#page-blogresearch .brtable td{padding:10px;border-top:1px solid var(--rule);vertical-align:top}
#page-blogresearch .brtable tbody tr{cursor:pointer}
#page-blogresearch .brtable tbody tr:hover{background:var(--hover)}
#page-blogresearch .brtable tbody tr.on{background:var(--blue-bg);box-shadow:inset 2.5px 0 0 var(--blue)}
#page-blogresearch .brtable td b,#page-blogresearch .brtable td span{display:block}
#page-blogresearch .brtable td b{font-size:12px;margin-bottom:3px}
#page-blogresearch .brtable td span{font-size:10.5px;color:var(--muted);line-height:1.5}
#page-blogresearch .brtable td strong{font:700 18px var(--mono);color:var(--blue)}
#page-blogresearch .brtable td>.empty{border:0;background:transparent;box-shadow:none}
/* 状态丸(语义色一律用令牌) */
/* 语义色一律用令牌;原来 6 条 color 带 !important 是自压 —— 基类先把 color 钉成 !important,
   修饰类只好跟着钉。基类去掉后修饰类靠源序即可胜出,整族 !important 清零。 */
#page-blogresearch .brpill{display:inline-flex;width:max-content;align-items:center;padding:2px 8px;
  border:1px solid var(--mute-line);border-radius:999px;background:var(--mute-bg);color:var(--muted);
  font-size:10px;line-height:1.5;font-weight:600}
#page-blogresearch .brpill.pass,#page-blogresearch .brpill.selected,#page-blogresearch .brpill.approved,
#page-blogresearch .brpill.active,#page-blogresearch .brpill.succeeded,#page-blogresearch .brpill.completed{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}
#page-blogresearch .brpill.review,#page-blogresearch .brpill.candidate,#page-blogresearch .brpill.running,
#page-blogresearch .brpill.queued,#page-blogresearch .brpill.ready,#page-blogresearch .brpill.claimed,
#page-blogresearch .brpill.waiting{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
#page-blogresearch .brpill.blocked,#page-blogresearch .brpill.rejected,#page-blogresearch .brpill.error,
#page-blogresearch .brpill.failed{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}
#page-blogresearch .brpill.existing_update,#page-blogresearch .brpill.merged,#page-blogresearch .brpill.paused,
#page-blogresearch .brpill.new,#page-blogresearch .brpill.info{background:var(--info-bg);color:var(--info);border-color:var(--info-line)}
/* 候选详情侧栏 */
#page-blogresearch .brcandidate{position:sticky;top:10px;max-height:calc(100vh - 150px);overflow:auto;
  border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel);box-shadow:var(--shadow-card);padding:14px}
#page-blogresearch .brcandidate>.empty{border:0;border-radius:0;background:transparent;box-shadow:none;padding:48px 12px}
#page-blogresearch .brcandhead{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
#page-blogresearch .brcandhead span{font-size:10.5px;color:var(--muted)}
#page-blogresearch .brcandhead h3{font-size:16px;line-height:1.35;margin:3px 0}
#page-blogresearch .brcandhead p{margin:0;color:var(--muted);font-size:11px}
#page-blogresearch .brmetrics{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin:12px 0}
#page-blogresearch .brmetrics div{padding:8px;border-radius:var(--r-md);background:var(--soft)}
#page-blogresearch .brmetrics span,#page-blogresearch .brmetrics b{display:block}
#page-blogresearch .brmetrics span{font-size:10px;color:var(--muted)}
#page-blogresearch .brmetrics b{font:700 14px var(--mono);margin-top:2px}
#page-blogresearch .brchecks{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:10px}
#page-blogresearch .brchecks span{padding:3px 7px;border-radius:var(--r-sm);font-size:10px}
#page-blogresearch .brchecks .pass{background:var(--pass-bg);color:var(--pass)}
#page-blogresearch .brchecks .missing{background:var(--halt-bg);color:var(--halt)}
#page-blogresearch .brsupport{margin:0 0 10px}
#page-blogresearch .brsupport b{font-size:10.5px}
#page-blogresearch .brsupport p{margin:3px 0 0;color:var(--muted);font-size:10px;line-height:1.55}
#page-blogresearch .brbasis{padding:9px 10px;border-left:3px solid var(--blue);background:var(--blue-bg);border-radius:0 var(--r-md) var(--r-md) 0}
#page-blogresearch .brbasis b{font-size:10.5px}
#page-blogresearch .brbasis p{font-size:11px;line-height:1.6;margin:3px 0 0;color:var(--ink2)}
#page-blogresearch .bractions{display:flex;flex-wrap:wrap;gap:6px;margin:11px 0}
#page-blogresearch .bractions button{font-size:11px}
#page-blogresearch .brtasknotice{padding:8px 10px;margin:8px 0;border-radius:var(--r-md);background:var(--review-bg);color:var(--review);font-size:11px;line-height:1.55}
/* 折叠明细(任务进度 / 查重 / 竞品证据 / 快照) */
#page-blogresearch .brdetail{border-top:1px solid var(--rule);padding:9px 0}
#page-blogresearch .brdetail summary{font-size:11.5px;font-weight:650;cursor:pointer}
#page-blogresearch .brdetail article{padding:8px 0;border-bottom:1px dashed var(--rule)}
#page-blogresearch .brdetail article:last-child{border:0}
#page-blogresearch .brdetail article b,#page-blogresearch .brdetail article span,#page-blogresearch .brdetail article em{display:block}
#page-blogresearch .brdetail article b{font-size:11px}
#page-blogresearch .brdetail article span,#page-blogresearch .brdetail article em,#page-blogresearch .brdetail p{font-size:10px;line-height:1.55;color:var(--muted);font-style:normal;overflow-wrap:anywhere}
#page-blogresearch .brtasktimeline article>div{display:flex;align-items:center;justify-content:space-between;gap:8px}
#page-blogresearch .brtasktimeline article button{margin-top:6px;font-size:10px}
/* 分区标题 */
#page-blogresearch .brsectionhead{display:flex;align-items:flex-end;justify-content:space-between;gap:15px;margin:6px 0 11px}
#page-blogresearch .brsectionhead.second{margin-top:20px;padding-top:16px;border-top:1px solid var(--rule)}
#page-blogresearch .brsectionhead h3{font-size:16px;margin:0 0 3px}
#page-blogresearch .brsectionhead p{font-size:11px;color:var(--muted);margin:0}
#page-blogresearch .brsectionhead>span{font:600 12px var(--mono);color:var(--muted)}
/* 竞品内容:动态/内容库双视图 */
#page-blogresearch .brcomptools{display:flex;align-items:center;gap:8px;flex:1;flex-wrap:wrap}
#page-blogresearch .brcomptools input{width:260px;max-width:36vw}
#page-blogresearch .brcomptools select{min-width:170px}
#page-blogresearch .brownoverview .brscantime{font-size:12px}
#page-blogresearch .brscanfacts [data-br-domain-chip]{cursor:pointer}
#page-blogresearch .brscanfacts [data-br-domain-chip]:hover{background:var(--hover)}
#page-blogresearch .brscanfacts [data-br-domain-chip].on{background:var(--blue-bg);color:var(--blue);box-shadow:inset 0 0 0 1px var(--blue)}
#page-blogresearch .brscanfacts [data-br-source-articles]{cursor:pointer}
#page-blogresearch .brscanfacts [data-br-source-articles]:hover{background:var(--blue-bg);color:var(--blue)}
#page-blogresearch .browntable.compact{min-width:880px}
#page-blogresearch .browntable td b a{margin-top:0;font-size:11.5px}
#page-blogresearch .brownoverview.five{grid-template-columns:repeat(5,minmax(120px,1fr))}
#page-blogresearch .brownoverview [data-br-coverage-jump]{cursor:pointer}
#page-blogresearch .brownoverview [data-br-coverage-jump]:hover{background:var(--hover)}
#page-blogresearch .brpagecard .broppadd{display:flex;justify-content:flex-end;margin-top:8px}
#page-blogresearch .brpagecard .broppadd button{font-size:10px}
/* 机会清单 */
#page-blogresearch .broppgroup{margin-bottom:14px}
#page-blogresearch .broppgroup>header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 7px}
#page-blogresearch .broppgroup>header h4{font-size:12.5px;margin:0}
#page-blogresearch .broppgroup>header span{font:600 11px var(--mono);color:var(--muted)}
#page-blogresearch .bropprow{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:11px 13px;
  border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel);box-shadow:var(--shadow-card);margin-bottom:6px}
#page-blogresearch .broppmain{min-width:0}
#page-blogresearch .broppmain>div{display:flex;align-items:center;gap:6px;margin-bottom:5px}
#page-blogresearch .broppmain b{display:block;font-size:12.5px;line-height:1.4}
#page-blogresearch .broppmain>span{display:block;font-size:10.5px;color:var(--muted);margin-top:3px;overflow-wrap:anywhere}
#page-blogresearch .broppmain>span a{color:var(--blue)}
#page-blogresearch .broppmain small{display:block;font-size:10px;line-height:1.55;color:var(--muted);margin-top:5px}
#page-blogresearch .broppmain small.bropptrail{color:var(--ink2)}
#page-blogresearch .broppweek{font:650 10.5px var(--mono);color:var(--blue);background:var(--blue-bg);padding:2px 7px;border-radius:var(--r-sm)}
#page-blogresearch .broppside{display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex:none}
#page-blogresearch .broppside>span{font-size:10.5px;color:var(--muted)}
#page-blogresearch .broppside>span b{font:700 12px var(--mono);color:var(--ink)}
#page-blogresearch .broppside>div{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:5px}
#page-blogresearch .broppside button{font-size:10px}
.oppmodal .broppweekquick{display:flex;gap:6px;margin:-4px 0 8px}
.oppmodal .broppweekquick button{font-size:10.5px}
/* 竞品内容卡片 */
#page-blogresearch .brcards{display:grid;grid-template-columns:repeat(3,minmax(260px,1fr));gap:10px}
#page-blogresearch .brpagecard{display:flex;flex-direction:column;min-height:210px;padding:12px;border:1px solid var(--rule);
  border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}
#page-blogresearch .brpagecard>div:first-child,#page-blogresearch .brpagecard footer{display:flex;justify-content:space-between;gap:10px}
#page-blogresearch .brpagecard>div:first-child>span{font-size:10.5px;color:var(--muted)}
#page-blogresearch .brpagecard h3{font-size:13px;line-height:1.4;margin:8px 0 4px}
#page-blogresearch .brpagecard h3 a{color:inherit}
#page-blogresearch .brpagecard h3 a:hover{color:var(--blue)}
#page-blogresearch .brpagecard>p{font-size:11px;line-height:1.55;color:var(--muted);margin:0 0 10px}
#page-blogresearch .brpagefacts{display:grid;grid-template-columns:repeat(3,1fr);gap:5px;margin-top:auto}
#page-blogresearch .brpagefacts span{padding:6px;background:var(--soft);border-radius:var(--r-sm);font-size:9.5px;color:var(--muted)}
#page-blogresearch .brpagefacts b{display:block;font:650 12px var(--mono);color:var(--ink)}
#page-blogresearch .brpagecard footer{border-top:1px solid var(--rule);padding-top:8px;margin-top:10px;font-size:10px;color:var(--muted)}
/* 站内内容集群 */
#page-blogresearch .brtaxonomy{display:grid;grid-template-columns:repeat(2,minmax(300px,1fr));gap:10px}
#page-blogresearch .brtaxonomy>section{border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);
  box-shadow:var(--shadow-card);padding:12px}
#page-blogresearch .brtaxonomy>section>header{display:flex;justify-content:space-between;gap:10px;margin-bottom:8px}
#page-blogresearch .brtaxonomy h3{font-size:14px;margin:0}
#page-blogresearch .brtaxonomy header span{font-size:10.5px;color:var(--muted)}
#page-blogresearch .brtaxonomy article{padding:9px;border-radius:var(--r-md);background:var(--soft);margin-top:6px}
#page-blogresearch .brtaxonomy article>div{display:flex;justify-content:space-between;gap:10px;font-size:11px}
#page-blogresearch .brtaxonomy article p{display:flex;justify-content:space-between;gap:12px;border-top:1px dashed var(--rule);margin:7px 0 0;padding-top:7px;font-size:10px}
#page-blogresearch .brtaxonomy article p span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#page-blogresearch .brtaxonomy article em,#page-blogresearch .brtaxonomy article small{color:var(--muted);font-style:normal;white-space:nowrap}
#page-blogresearch .brunclassified{display:grid;gap:6px}
#page-blogresearch .brunclassified article{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:9px 11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel)}
#page-blogresearch .brunclassified b,#page-blogresearch .brunclassified span{display:block}
#page-blogresearch .brunclassified b{font-size:11px}
#page-blogresearch .brunclassified span{font-size:10px;color:var(--muted);overflow-wrap:anywhere}
/* 站内 Blog 总表 */
#page-blogresearch .brownoverview{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));gap:8px;margin-bottom:10px}
#page-blogresearch .brownoverview article{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;
  border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel);box-shadow:var(--shadow-card)}
#page-blogresearch .brownoverview span{font-size:11px;color:var(--muted)}
#page-blogresearch .brownoverview b{font:700 17px var(--mono)}
#page-blogresearch .browntoolbar{display:flex;align-items:center;gap:8px;margin-bottom:9px}
#page-blogresearch .browntoolbar>div{display:flex;gap:6px;flex:1}
#page-blogresearch .browntoolbar input{width:min(460px,100%)}
#page-blogresearch .browntoolbar select{min-width:170px}
/* 第 4 批取消数据表内部限高:「全部站内Blog」与竞品「全部文章」都不再卡在 calc(100vh - N)
   里自滚,100 条一次铺完,纵向滚动交回页面(用户原话是这张表"高度太低",一路升档也只是
   把窗口开大一点,现在直接不设窗口)。横向仍由本壳的 overflow-x 承担。 */
#page-blogresearch .browntablewrap{border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);
  box-shadow:var(--shadow-card);overflow-x:auto}
/* 时间列里没抽到发布时间时显示的采集日期:灰标,与真实发布时间区分开 */
#page-blogresearch .browntable td .brcollected{display:inline;margin:0;color:var(--muted);font-size:10.5px}
#page-blogresearch .browntable{width:100%;border-collapse:collapse;font-size:11px;min-width:1120px}
#page-blogresearch .browntable th{padding:9px 10px;text-align:left;white-space:nowrap;
  background:var(--soft);color:var(--muted);font-size:10.5px}
#page-blogresearch .browntable td{padding:9px 10px;border-top:1px solid var(--rule);vertical-align:top;max-width:280px}
#page-blogresearch .browntable tbody tr:hover{background:var(--hover)}
#page-blogresearch .browntable td b,#page-blogresearch .browntable td span,#page-blogresearch .browntable td a{display:block}
#page-blogresearch .browntable td b{font-size:11.5px;line-height:1.4}
#page-blogresearch .browntable td span,#page-blogresearch .browntable td a{margin-top:3px;font-size:10px;line-height:1.5;color:var(--muted);overflow-wrap:anywhere}
#page-blogresearch .browntable td a{color:var(--blue)}
#page-blogresearch .browntable td button{font-size:10px}
#page-blogresearch .browntable td>.empty{border:0;background:transparent;box-shadow:none}
/* 采集来源 */
#page-blogresearch .brsources{display:grid;grid-template-columns:repeat(2,minmax(360px,1fr));gap:10px}
#page-blogresearch .brsources article{padding:12px;border:1px solid var(--rule);border-radius:var(--r-lg);
  background:var(--panel);box-shadow:var(--shadow-card)}
#page-blogresearch .brsources header,#page-blogresearch .brsources footer{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
#page-blogresearch .brsources header b,#page-blogresearch .brsources header span{display:block}
#page-blogresearch .brsources header b{font-size:13px}
#page-blogresearch .brsources header span,#page-blogresearch .brsources>article>p,#page-blogresearch .brsources footer{font-size:10.5px;color:var(--muted)}
#page-blogresearch .brsources>article>p{overflow-wrap:anywhere}
#page-blogresearch .brsources>article>small{display:block;color:var(--halt);font-size:10px;margin:7px 0}
#page-blogresearch .brscanfacts{display:flex;flex-wrap:wrap;gap:5px;margin:9px 0}
#page-blogresearch .brscanfacts span{padding:4px 7px;border-radius:var(--r-sm);background:var(--soft);font-size:10px}
#page-blogresearch .brsources footer{align-items:center;border-top:1px solid var(--rule);padding-top:9px}
#page-blogresearch .brsources footer div{display:flex;gap:5px}
/* 研究任务卡片 */
#page-blogresearch .brtasklist{display:grid;grid-template-columns:repeat(3,minmax(280px,1fr));gap:10px}
#page-blogresearch .brtaskcard{display:flex;flex-direction:column;min-height:190px;padding:12px;border:1px solid var(--rule);
  border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}
#page-blogresearch .brtaskcard header,#page-blogresearch .brtaskcard footer{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
#page-blogresearch .brtaskcard header span{font:500 10px var(--mono);color:var(--muted)}
#page-blogresearch .brtaskcard h3{font-size:13px;margin:3px 0 0}
#page-blogresearch .brtaskcard>p b,#page-blogresearch .brtaskcard>p span{display:block}
#page-blogresearch .brtaskcard>p{margin:12px 0 8px}
#page-blogresearch .brtaskcard>p b{font-size:11.5px}
#page-blogresearch .brtaskcard>p span{font-size:10px;color:var(--muted);margin-top:3px}
#page-blogresearch .brtaskmeta{display:flex;flex-wrap:wrap;gap:5px}
#page-blogresearch .brtaskmeta span{padding:4px 6px;border-radius:var(--r-sm);background:var(--soft);font-size:9.5px;color:var(--muted)}
#page-blogresearch .brtaskcard>small{display:block;font-size:10px;line-height:1.5;color:var(--muted);margin-top:7px}
#page-blogresearch .brtaskcard>small.error{color:var(--halt)}
#page-blogresearch .brtaskcard footer{align-items:center;border-top:1px solid var(--rule);padding-top:9px;margin-top:auto}
#page-blogresearch .brtaskcard footer button{font-size:10px}
/* 弹窗表单栅格(oppModal 挂在 body 下,不能限定页面作用域) */
.oppmodal .brmodalgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.oppmodal .brmodalgrid .wide{grid-column:1/-1}
.oppmodal .brmodalgrid textarea{min-height:72px}
/* 响应式 */
@media(max-width:1250px){
  #page-blogresearch .brsummary{grid-template-columns:repeat(3,1fr)}
  #page-blogresearch .brgaplayout{grid-template-columns:1fr}
  #page-blogresearch .brcandidate{position:static;max-height:none}
  #page-blogresearch .brcards,#page-blogresearch .brtasklist{grid-template-columns:repeat(2,minmax(260px,1fr))}
}
@media(max-width:780px){
  #page-blogresearch .brhead,#page-blogresearch .brtoolbar,#page-blogresearch .browntoolbar{align-items:stretch;flex-direction:column}
  #page-blogresearch .brheadactions{justify-content:flex-start}
  #page-blogresearch .brsummary,#page-blogresearch .brownoverview{grid-template-columns:repeat(2,1fr)}
  #page-blogresearch .brtabs{max-width:100%;overflow:auto}
  #page-blogresearch .brgaplayout{display:block}
  /* 两张表已全站取消限高,窄屏这里只剩间距 */
  #page-blogresearch .brtablewrap{margin-bottom:10px}
  #page-blogresearch .brcards,#page-blogresearch .brtaxonomy,#page-blogresearch .brsources,#page-blogresearch .brtasklist{grid-template-columns:1fr}
  .oppmodal .brmodalgrid{grid-template-columns:1fr}
  .oppmodal .brmodalgrid .wide{grid-column:auto}
  #page-blogresearch .brtoolbar input{width:100%;max-width:none}
  #page-blogresearch .browntoolbar select{width:100%}
  #page-blogresearch .brcomptools{align-items:stretch;flex-direction:column}
  #page-blogresearch .brcomptools input,#page-blogresearch .brcomptools select{width:100%;max-width:none}
  #page-blogresearch .brownoverview.five{grid-template-columns:repeat(2,1fr)}
  #page-blogresearch .bropprow{flex-direction:column}
  #page-blogresearch .broppside{align-items:flex-start}
  #page-blogresearch .broppside>div{justify-content:flex-start}
}
/* 项目战略 v2 */
/* 边距吃全局默认(原 18px 24px 72px / max-width:none 已删);这里只留本页的画布底色 */
#page-projectstrategy{background:var(--canvas)}
.ps-head{display:flex;align-items:center;gap:16px;min-height:48px}
.ps-head-main{min-width:280px}
.ps-head-main>div{display:flex;align-items:center;gap:7px}
.ps-head h2{margin:0;font-size:21px}
.ps-sub{margin:4px 0 0;color:var(--muted);font-size:12px}
.ps-head-actions,.ps-inline-actions{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.ps-head-status,.ps-gate-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.ps-head-status{margin-left:auto}
.ps-fresh{display:flex;align-items:center;gap:7px;margin-left:auto;color:var(--muted);font-size:12px;white-space:nowrap}
.ps-fresh i{width:7px;height:7px;border-radius:50%;background:var(--pass)}
.ps-fresh.degraded i{background:var(--review)}
.ps-tag{display:inline-flex;align-items:center;padding:3px 7px;border:1px solid var(--mute-line);border-radius:999px;background:var(--mute-bg);color:var(--ink2);font-size:12px;font-weight:700;letter-spacing:.02em;white-space:nowrap}
.ps-tag.locked,.ps-tag.approved,.ps-tag.ready,.ps-tag.pass,.ps-tag.green{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}
.ps-tag.pending_approval,.ps-tag.warning,.ps-tag.degraded,.ps-tag.p1,.ps-tag.yellow{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
.ps-tag.p0,.ps-tag.failed,.ps-tag.blocked,.ps-tag.red,.ps-tag.critical{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}
.ps-tag.version,.ps-tag.e1,.ps-tag.e2,.ps-tag.e3,.ps-tag.positive,.ps-tag.low{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)}
.ps-decision{display:grid;grid-template-columns:1.35fr 1.7fr 1.5fr .9fr;margin-top:12px;overflow:hidden;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}
.ps-decision article{min-height:82px;padding:13px 15px;border-left:1px solid var(--rule)}
.ps-decision article:first-child{border-left:0}
.ps-decision span,.ps-decision b,.ps-decision small{display:block}
.ps-decision span{color:var(--muted);font-size:12px}
.ps-decision b{margin-top:6px;font-size:13px;line-height:1.45}
.ps-decision small{margin-top:4px;color:var(--blue);font-size:12px}
.ps-next-step{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:12px;padding:13px 15px;border:1px solid var(--blue-soft);border-radius:var(--r-lg);background:var(--blue-bg)}
.ps-next-step>div{display:grid;grid-template-columns:auto auto minmax(0,1fr);align-items:baseline;gap:7px;min-width:0}.ps-next-step span{color:var(--muted);font-size:12px}.ps-next-step b{color:var(--blue);font-size:14px}.ps-next-step p{margin:0;color:var(--ink2);font-size:12px}
.ps-strategy-gate{display:flex;align-items:flex-start;gap:14px;margin-top:10px;padding:11px 13px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel)}
.ps-strategy-gate.blocked{border-color:var(--halt);background:var(--halt-bg)}.ps-strategy-gate p{margin:2px 0;color:var(--muted);font-size:12px}.ps-strategy-gate>div:last-child{min-width:0}.ps-strategy-gate>div:last-child>b{font-size:12px}.ps-strategy-gate ul{display:flex;gap:5px;flex-wrap:wrap;margin:6px 0 0;padding:0;list-style:none}.ps-strategy-gate li{padding:4px 7px;border-radius:5px;background:var(--panel);color:var(--halt-deep);font-size:12px}
.ps-command-nav{position:sticky;top:0;z-index:8;display:flex;gap:4px;margin:12px 0;padding:5px;border:1px solid var(--rule);border-radius:10px;background:color-mix(in srgb,var(--panel) 94%,transparent);box-shadow:0 4px 14px rgb(30 42 56 / 6%);backdrop-filter:blur(10px)}
.ps-command-nav button{padding:6px 10px;border:0;background:transparent;box-shadow:none;color:var(--muted);font-size:12px}
.ps-command-nav button:hover{background:var(--soft);color:var(--ink)}
.ps-layout{display:grid;grid-template-columns:minmax(0,1fr) 174px;gap:12px;align-items:start}
.ps-layout main{min-width:0}
.ps-outline{position:sticky;top:55px;display:flex;flex-direction:column;padding:12px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}
.ps-outline b{padding:2px 6px 8px;font-size:12px}
.ps-outline a{padding:6px;border-radius:6px;color:var(--muted);font-size:12px;cursor:pointer}
.ps-outline a:hover{background:var(--soft);color:var(--ink)}
.ps-panel{min-width:0;margin-bottom:12px;padding:15px;background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-lg);box-shadow:var(--shadow-card);scroll-margin-top:58px}
.ps-section-fold{margin-bottom:12px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}
.ps-section-fold>summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 15px;cursor:pointer;list-style:none}.ps-section-fold>summary::-webkit-details-marker{display:none}.ps-section-fold>summary b{font-size:12px}.ps-section-fold>summary span{color:var(--muted);font-size:12px}.ps-section-fold>summary:after{content:"展开";color:var(--blue);font-size:12px}.ps-section-fold[open]>summary:after{content:"收起"}.ps-section-fold>.ps-panel{margin:0;border:0;border-top:1px solid var(--rule);border-radius:0 0 var(--r-lg) var(--r-lg);box-shadow:none}
.ps-section-fold>.ps-type-nav{margin:12px 15px 0}
.ps-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.ps-section-head h3{margin:0;font-size:14px}
.ps-section-head p{margin:3px 0 0;color:var(--muted);font-size:12px;line-height:1.5}
.ps-goal-summary{display:grid;grid-template-columns:1.2fr .85fr 1.1fr 1.1fr;margin-top:13px;border:1px solid var(--rule);border-radius:var(--r-md);overflow:hidden}
.ps-goal-summary>div{min-height:80px;padding:11px;border-left:1px solid var(--rule);background:var(--canvas)}
.ps-goal-summary>div:first-child{border-left:0}
.ps-goal-summary span,.ps-goal-summary b,.ps-goal-summary small{display:block}
.ps-goal-summary span{color:var(--muted);font-size:12px}
.ps-goal-summary b{margin-top:7px;font-size:12px;line-height:1.4}
.ps-goal-summary small{margin-top:3px;color:var(--ink2);font-size:12px}
.ps-details{margin-top:12px;border-top:1px solid var(--rule)}
.ps-details summary{padding:10px 2px 0;color:var(--blue);font-size:12px;cursor:pointer;list-style:none}
.ps-details summary:after{content:"展开";margin-left:6px;color:var(--muted)}
.ps-details[open] summary:after{content:"收起"}
.ps-details summary::-webkit-details-marker{display:none}
.ps-detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:10px}
.ps-detail-grid>div{padding:10px;border-radius:var(--r-md);background:var(--canvas)}
.ps-detail-grid span{color:var(--muted);font-size:12px}
.ps-detail-grid p{margin:4px 0 0;font-size:12px;line-height:1.5}
.ps-benchmark-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:13px}
.ps-benchmark-grid article{padding:11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-benchmark-grid span,.ps-benchmark-grid b,.ps-benchmark-grid em,.ps-benchmark-grid small{display:block}
.ps-benchmark-grid span{color:var(--muted);font-size:12px}
.ps-benchmark-grid b{margin-top:7px;font-size:20px;font-variant-numeric:tabular-nums}
.ps-benchmark-grid em{margin-top:3px;font-style:normal;font-size:12px}
.ps-benchmark-grid em.up{color:var(--pass)}
.ps-benchmark-grid em.down{color:var(--halt-deep)}
.ps-benchmark-grid small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-quality{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px;margin-top:8px}
.ps-quality>div{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;border-radius:7px;background:var(--soft)}
.ps-quality span{color:var(--muted);font-size:12px}
.ps-quality b{font-size:12px}
.ps-quality-issues{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.ps-quality-issues span{padding:5px 8px;border-radius:6px;background:var(--review-bg);color:var(--review);font-size:12px}
.ps-month-table{margin-top:10px;border:1px solid var(--rule);border-radius:var(--r-md);overflow:hidden}
.ps-month-row{display:grid;grid-template-columns:1fr repeat(3,1fr);align-items:center;min-height:31px;padding:0 10px;border-top:1px solid var(--rule);font-size:12px}
.ps-month-row:first-child{border-top:0}
.ps-month-row.head{background:var(--soft);color:var(--muted);font-size:12px}
.ps-month-row span,.ps-month-row b{font-variant-numeric:tabular-nums}
.ps-layer-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:13px}
.ps-layer-grid button{min-height:85px;padding:11px;text-align:left;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-layer-grid button:hover{border-color:var(--blue-soft);background:var(--blue-bg)}
.ps-layer-grid span,.ps-layer-grid b,.ps-layer-grid small{display:block}
.ps-layer-grid span{font-size:12px;font-weight:700}
.ps-layer-grid b{margin-top:6px;color:var(--blue);font-size:21px}
.ps-layer-grid small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-ledger-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:8px}
.ps-ledger-grid article{padding:10px;border-left:3px solid var(--rule2);border-radius:6px;background:var(--soft)}
.ps-ledger-grid span,.ps-ledger-grid b,.ps-ledger-grid small{display:block}
.ps-ledger-grid span{color:var(--muted);font-size:12px}
.ps-ledger-grid b{margin-top:5px;font-size:17px}
.ps-ledger-grid small{margin-top:3px;color:var(--ink2);font-size:12px;line-height:1.45}
.ps-scenario-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:13px}
.ps-scenario-grid article{padding:12px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-scenario-grid article.selected{border-color:var(--blue);background:var(--blue-bg);box-shadow:inset 0 0 0 1px var(--blue)}
.ps-scenario-grid span,.ps-scenario-grid b,.ps-scenario-grid em{display:block}
.ps-scenario-grid span{color:var(--muted);font-size:12px}
.ps-scenario-grid b{margin-top:6px;font-size:19px}
.ps-scenario-grid article>div{display:flex;gap:12px;margin-top:5px;color:var(--ink2);font-size:12px}
.ps-scenario-grid em{margin-top:8px;font-style:normal;color:var(--blue);font-size:12px}
.ps-assumptions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;margin-top:10px}
.ps-assumptions>div{padding:9px;border-radius:7px;background:var(--canvas)}
.ps-assumptions b,.ps-assumptions span,.ps-assumptions small{display:block}
.ps-assumptions b{font-size:12px}.ps-assumptions span{margin-top:4px;font-size:12px}.ps-assumptions small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-target-groups{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:12px}
.ps-target-groups>article{overflow:hidden;border:1px solid var(--rule);border-radius:var(--r-md)}
.ps-target-groups header{padding:10px;background:var(--soft)}
.ps-target-groups h4{margin:0;font-size:12px}.ps-target-groups p{margin:2px 0 0;color:var(--muted);font-size:12px}
.ps-target-list>div{display:grid;grid-template-columns:1.2fr .7fr 1fr;gap:8px;align-items:center;min-height:36px;padding:0 10px;border-top:1px solid var(--rule);font-size:12px}
.ps-target-list b{text-align:right;font-size:12px}.ps-target-list small{color:var(--muted);text-align:right}
.ps-opportunity-list{margin-top:12px;border:1px solid var(--rule);border-radius:var(--r-md);overflow:hidden}
.ps-opportunity-list article{display:grid;grid-template-columns:minmax(0,1fr) 190px 100px;gap:12px;align-items:center;padding:10px;border-top:1px solid var(--rule)}
.ps-opportunity-list article:first-child{border-top:0}
.ps-opp-main{display:flex;align-items:flex-start;gap:8px;min-width:0}
.ps-opp-main b{font-size:12px}.ps-opp-main p{margin:3px 0;color:var(--ink2);font-size:12px}.ps-opp-main small{color:var(--muted);font-size:12px}
.ps-manual-weight{display:grid;grid-template-columns:minmax(80px,1fr) 32px auto;align-items:center;gap:4px}
.ps-manual-weight span{grid-column:1/-1;color:var(--muted);font-size:12px}
.ps-manual-weight input{width:100%}
.ps-manual-weight output{text-align:right;font-size:12px;font-variant-numeric:tabular-nums}
.ps-manual-weight button{min-height:24px;padding:3px 7px;font-size:12px}
.ps-opp-score{text-align:right}.ps-opp-score span,.ps-opp-score b{display:block}.ps-opp-score span{color:var(--muted);font-size:12px}.ps-opp-score b{margin-top:2px;font-size:16px}.ps-opp-score button{margin-top:4px;padding:3px 6px;font-size:12px}
.ps-monitor-grid{display:grid;grid-template-columns:1.35fr 1fr;gap:8px;margin-top:12px}
.ps-monitor-grid>article{padding:11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-monitor-grid>article>span{color:var(--muted);font-size:12px}.ps-monitor-grid>article>b{display:block;margin:5px 0 8px;font-size:15px}
.ps-monitor-grid>article>div{display:grid;grid-template-columns:8px 1fr auto;gap:6px;align-items:center;margin-top:5px;font-size:12px}
.ps-monitor-grid i{width:6px;height:6px;border-radius:50%;background:var(--pass)}
.ps-monitor-grid div.triggered i{background:var(--review)}.ps-monitor-grid small{color:var(--muted)}
.ps-monitor-grid p{margin:5px 0;color:var(--ink2);font-size:12px;line-height:1.5}.ps-monitor-grid>article>small{color:var(--muted);font-size:12px}
.ps-version-list{margin-top:9px}.ps-version-list>div{display:grid;grid-template-columns:70px 1fr auto;gap:8px;padding:7px;border-top:1px solid var(--rule);font-size:12px}.ps-version-list small{color:var(--muted)}
.ps-validation-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:12px}
.ps-validation-grid>article{padding:11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-validation-grid>article>span,.ps-validation-grid>article>b,.ps-validation-grid>article>small{display:block}
.ps-validation-grid>article>span{color:var(--muted);font-size:12px}.ps-validation-grid>article>b{margin-top:6px;font-size:17px}.ps-validation-grid>article>small{margin-top:3px;color:var(--ink2);font-size:12px}
.ps-percentiles,.ps-models{display:flex;gap:4px;flex-wrap:wrap;margin-top:9px}.ps-percentiles i,.ps-models i{padding:3px 5px;border-radius:4px;background:var(--soft);font-style:normal;font-size:12px}
.ps-models i.approve{background:var(--pass-bg);color:var(--pass)}.ps-models i.review{background:var(--review-bg);color:var(--review)}
.ps-audit-bar{height:5px;margin-top:11px;overflow:hidden;border-radius:999px;background:var(--soft)}.ps-audit-bar i{display:block;height:100%;background:var(--pass)}
.ps-rule-list{margin-top:9px}.ps-rule-list>div{display:grid;grid-template-columns:55px 150px 1fr;gap:8px;align-items:center;padding:7px;border-top:1px solid var(--rule);font-size:12px}.ps-rule-list span:last-child{color:var(--muted)}
.ps-report-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:12px}
.ps-report-grid article{padding:10px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-report-grid article>div{display:flex;align-items:center;gap:6px}.ps-report-grid article>div span:last-child{font-size:12px}.ps-report-grid b,.ps-report-grid small{display:block}
.ps-report-grid b{margin-top:7px;font-size:12px}.ps-report-grid small{margin-top:3px;color:var(--muted);font-size:12px}.ps-report-grid button{margin-top:8px;padding:4px 7px;font-size:12px}
.ps-report-preview>div{display:inline-flex;flex-direction:column;margin-right:20px}.ps-report-preview span{color:var(--muted);font-size:12px}.ps-report-preview b{font-size:12px}.ps-report-preview h4{margin:18px 0 5px}.ps-report-preview p,.ps-report-preview li{font-size:12px;line-height:1.6}
.ps-type-nav{display:flex;gap:5px;margin:4px 0 8px;overflow-x:auto}.ps-type-nav button{display:flex;align-items:center;gap:6px;white-space:nowrap}.ps-type-nav button.on{border-color:var(--blue);background:var(--blue-bg);color:var(--blue)}.ps-type-nav span{padding:1px 5px;border-radius:999px;background:var(--soft);font-size:12px}
.ps-task-table{margin-top:11px}.ps-task-table table.lkt{min-width:720px}.ps-task-table thead th{background:var(--panel)}
.ps-task-title{display:flex;align-items:flex-start;gap:7px}.ps-task-title>div{min-width:0}.ps-task-title button{padding:0;text-align:left;background:transparent;border:0;color:var(--ink);font-weight:650;box-shadow:none}.ps-task-title button:hover{background:transparent;color:var(--blue)}
.ps-task-desc{max-width:390px;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:12px}
.ps-task-meta{display:flex;align-items:center;gap:7px;margin-top:4px;color:var(--muted);font-size:12px}.ps-task-meta span+span{padding-left:7px;border-left:1px solid var(--rule)}.ps-task-meta button{padding:0;background:transparent;border:0;color:var(--blue);font-size:12px;box-shadow:none}
.ps-status{display:inline-flex;align-items:center;gap:5px;padding:3px 7px;border:1px solid var(--mute-line);border-radius:999px;background:var(--mute-bg);font-size:12px;white-space:nowrap}.ps-status:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--muted)}
.ps-status.active{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)}.ps-status.active:before{background:var(--blue)}.ps-status.blocked{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}.ps-status.blocked:before{background:var(--halt)}.ps-status.done{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}.ps-status.done:before{background:var(--pass)}
.ps-due.overdue{color:var(--halt-deep);font-weight:650}
.ps-empty{padding:42px 20px;text-align:center;color:var(--muted)}.ps-empty.compact{padding:20px}.ps-empty b,.ps-empty span{display:block}.ps-empty b{color:var(--ink);font-size:13px}.ps-empty span{margin-top:4px;font-size:12px}
.ps-load-error{display:flex;min-height:360px;align-items:center;justify-content:center;flex-direction:column;gap:7px;color:var(--muted)}.ps-load-error b{color:var(--ink);font-size:16px}.ps-load-error span{font-size:12px}
.ps-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 10px}.ps-form-grid .wide{grid-column:1/-1}.ps-form-grid textarea{min-height:64px}.ps-form-note{margin:2px 0 9px;padding:8px;border-radius:6px;background:var(--blue-bg);color:var(--ink2);font-size:12px}
.ps-check-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 12px;margin-bottom:10px}.ps-check{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid var(--rule);border-radius:7px;background:var(--canvas)}.ps-check input{width:16px;height:16px;margin:0}.ps-check span{font-size:12px;color:var(--ink)}
.ps-v110{border-color:color-mix(in srgb,var(--blue) 22%,var(--rule))}
.ps-ledger-summary,.ps-authority-summary,.ps-tracking-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:12px}
.ps-ledger-summary article,.ps-authority-summary article,.ps-tracking-grid article{min-width:0;padding:10px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-ledger-summary span,.ps-ledger-summary b,.ps-ledger-summary small,.ps-authority-summary span,.ps-authority-summary b,.ps-authority-summary small,.ps-tracking-grid span,.ps-tracking-grid b,.ps-tracking-grid small{display:block}
.ps-ledger-summary span,.ps-authority-summary span,.ps-tracking-grid span{color:var(--muted);font-size:12px}
.ps-ledger-summary b,.ps-authority-summary b,.ps-tracking-grid b{margin-top:6px;font-size:18px}
.ps-ledger-summary small,.ps-authority-summary small,.ps-tracking-grid small{margin-top:3px;color:var(--ink2);font-size:12px;line-height:1.45}
.ps-tracking-grid button{margin-top:8px;padding:4px 7px;font-size:12px}
.ps-attribution-levels{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;margin-top:8px}
.ps-attribution-levels>div{padding:8px;border-radius:7px;background:var(--soft)}
.ps-attribution-levels span,.ps-attribution-levels b,.ps-attribution-levels small{display:block}
.ps-attribution-levels span{color:var(--muted);font-size:12px}.ps-attribution-levels b{margin-top:4px;font-size:12px}.ps-attribution-levels small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-center-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:8px}
.ps-center-columns>article{min-width:0;overflow:hidden;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-center-columns header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 10px;background:var(--soft)}
.ps-center-columns h4{margin:0;font-size:12px}.ps-center-columns header span,.ps-center-columns header small{color:var(--muted);font-size:12px}
.ps-asset-row{display:grid;grid-template-columns:minmax(120px,1.5fr) repeat(3,minmax(52px,.65fr)) auto;gap:7px;align-items:center;padding:8px 10px;border-top:1px solid var(--rule);font-size:12px}
.ps-asset-row>div{min-width:0}.ps-asset-row b,.ps-asset-row small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-asset-row b{font-size:12px}.ps-asset-row small{margin-top:2px;color:var(--muted);font-size:12px}.ps-asset-row span{color:var(--ink2)}.ps-asset-row em{font-style:normal;color:var(--blue)}
.ps-v110-detail{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin-top:9px}
.ps-v110-detail article{padding:9px;border-radius:7px;background:var(--canvas)}.ps-v110-detail article.warning{background:var(--review-bg)}
.ps-v110-detail b,.ps-v110-detail span,.ps-v110-detail small{display:block}.ps-v110-detail b{font-size:12px}.ps-v110-detail span{margin-top:3px;font-size:12px}.ps-v110-detail small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-event-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;padding:9px 10px;border-top:1px solid var(--rule)}
.ps-event-row>div{min-width:0}.ps-event-row b,.ps-event-row span,.ps-event-row small{display:block}.ps-event-row b{font-size:12px}.ps-event-row span{margin-top:2px;color:var(--ink2);font-size:12px}.ps-event-row small{margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:12px}.ps-event-row em{font-style:normal;color:var(--blue);font-size:12px}.ps-event-row button{padding:4px 6px;font-size:12px}
.ps-event-row.negative{box-shadow:inset 3px 0 var(--halt)}.ps-event-row.positive{box-shadow:inset 3px 0 var(--pass)}
.ps-sla-strip{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}.ps-sla-strip span{padding:5px 8px;border-radius:6px;background:var(--soft);color:var(--muted);font-size:12px}
.ps-candidate-list{margin-top:10px;border:1px solid var(--rule);border-radius:var(--r-md);overflow:hidden}
.ps-candidate-list article{display:grid;grid-template-columns:minmax(160px,.8fr) minmax(200px,1fr) auto;gap:8px;align-items:center;padding:8px 10px;border-top:1px solid var(--rule);font-size:12px}.ps-candidate-list article:first-child{border-top:0}.ps-candidate-list article.blocked{background:var(--halt-bg)}
.ps-candidate-list article>div{display:grid;grid-template-columns:auto 1fr;gap:5px;align-items:center}.ps-candidate-list article b{font-size:12px}.ps-candidate-list article small{grid-column:2;color:var(--muted);font-size:12px}.ps-candidate-list article>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}.ps-candidate-list em{font-style:normal;color:var(--blue)}
.ps-placement,.ps-deferral{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:8px;padding:10px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-placement>div,.ps-deferral>div{min-width:0}.ps-placement b,.ps-placement span,.ps-placement small,.ps-deferral b,.ps-deferral span,.ps-deferral small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-placement b,.ps-deferral b{font-size:12px}.ps-placement span,.ps-deferral span{margin-top:2px;font-size:12px}.ps-placement small,.ps-deferral small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-pacing-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:12px}.ps-pacing-grid article{padding:10px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas);box-shadow:inset 0 3px var(--rule)}.ps-pacing-grid article.green{box-shadow:inset 0 3px var(--pass)}.ps-pacing-grid article.yellow{box-shadow:inset 0 3px var(--review)}.ps-pacing-grid article.red,.ps-pacing-grid article.critical{box-shadow:inset 0 3px var(--halt)}
.ps-pacing-grid span,.ps-pacing-grid b,.ps-pacing-grid small{display:block}.ps-pacing-grid span{color:var(--muted);font-size:12px}.ps-pacing-grid b{margin-top:6px;font-size:19px}.ps-pacing-grid small{margin-top:3px;color:var(--ink2);font-size:12px}
.ps-weekly-categories{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px;margin-top:8px}.ps-weekly-categories article{padding:9px;border-radius:7px;background:var(--soft)}.ps-weekly-categories b,.ps-weekly-categories span,.ps-weekly-categories small{display:block}.ps-weekly-categories b{font-size:12px}.ps-weekly-categories span{margin-top:4px;font-size:12px}.ps-weekly-categories small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-capacity-list{margin-top:8px;border:1px solid var(--rule);border-radius:var(--r-md);overflow:hidden}.ps-capacity-list>div{display:grid;grid-template-columns:1fr repeat(3,minmax(65px,.6fr));gap:8px;padding:7px 10px;border-top:1px solid var(--rule);font-size:12px}.ps-capacity-list>div:first-child{border-top:0}.ps-capacity-list>div.gap{background:var(--review-bg)}.ps-capacity-list em{font-style:normal;color:var(--muted)}.ps-capacity-list .gap em{color:var(--review);font-weight:700}
.ps-v110-alert{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 10px;padding:11px 13px;border:1px solid var(--review);border-radius:var(--r-md);background:var(--review-bg)}.ps-v110-alert.error{border-color:var(--halt);background:var(--halt-bg)}.ps-v110-alert div{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}.ps-v110-alert b{font-size:12px}.ps-v110-alert span,.ps-v110-alert small{font-size:12px}.ps-v110-alert small{color:var(--muted)}
.ps-subtabs{display:flex;gap:5px;margin-top:11px;overflow-x:auto}.ps-subtabs button{display:flex;align-items:center;gap:6px;white-space:nowrap}.ps-subtabs button.on{border-color:var(--blue);background:var(--blue-bg);color:var(--blue)}.ps-subtabs button span{padding:1px 5px;border-radius:999px;background:var(--soft);font-size:12px}
.ps-v110-filters{display:flex;align-items:center;gap:7px;margin-top:8px}.ps-v110-filters input{min-width:180px;flex:1}.ps-v110-filters>span{color:var(--muted);font-size:12px}
.ps-asset-list,.ps-monitor-list,.ps-completion-list,.ps-anomaly-list,.ps-measurement-grid>article,.ps-weekly-task-list{margin-top:8px;overflow:hidden;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}
.ps-asset-list>header,.ps-anomaly-list>header,.ps-measurement-grid header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 10px;background:var(--soft)}.ps-asset-list h4,.ps-anomaly-list h4,.ps-measurement-grid h4{margin:0;font-size:12px}.ps-asset-list header small,.ps-anomaly-list header span,.ps-measurement-grid header span{color:var(--muted);font-size:12px}
.ps-asset-list .ps-asset-row{width:100%;border:0;border-top:1px solid var(--rule);border-radius:0;background:transparent;text-align:left}.ps-asset-list .ps-asset-row:hover{background:var(--soft)}
.ps-measurement-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.ps-measurement-grid>article>button,.ps-anomaly-list>button{display:block;width:100%;padding:9px 10px;border:0;border-top:1px solid var(--rule);border-radius:0;background:transparent;text-align:left}.ps-measurement-grid button b,.ps-measurement-grid button span,.ps-measurement-grid button small,.ps-anomaly-list button>span,.ps-anomaly-list button>small{display:block}.ps-measurement-grid button b,.ps-anomaly-list button b{font-size:12px}.ps-measurement-grid button span,.ps-anomaly-list button>span{margin-top:3px;font-size:12px}.ps-measurement-grid button small,.ps-anomaly-list button>small{margin-top:2px;color:var(--muted);font-size:12px}.ps-anomaly-list button.blocking{box-shadow:inset 3px 0 var(--halt);background:var(--halt-bg)}.ps-anomaly-list button>div{display:flex;align-items:center;gap:6px}
.ps-event-main{min-width:0;padding:0;border:0;background:transparent;text-align:left}.ps-event-main:hover{background:transparent}.ps-event-actions{display:flex;align-items:center;justify-content:flex-end;gap:5px}.ps-event-actions em{font-style:normal;color:var(--blue);font-size:12px}
.ps-completion-list article,.ps-weekly-task-list article{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;padding:9px 10px;border-top:1px solid var(--rule)}.ps-completion-list article:first-child,.ps-weekly-task-list article:first-child{border-top:0}.ps-completion-list article>button,.ps-weekly-task-list article>button{padding:0;border:0;background:transparent;text-align:left}.ps-completion-list article>button b,.ps-completion-list article>button span,.ps-completion-list article>button small,.ps-weekly-task-list article>button span,.ps-weekly-task-list article>button small{display:block}.ps-completion-list span,.ps-weekly-task-list span{margin-top:2px;font-size:12px}.ps-completion-list small,.ps-weekly-task-list small{margin-top:2px;color:var(--muted);font-size:12px}.ps-completion-list article>div{display:flex;align-items:center;gap:5px;font-size:12px}
.ps-report-timeline{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:7px;margin-top:8px}.ps-report-timeline article{padding:9px;border:1px solid var(--rule);border-radius:7px;background:var(--canvas)}.ps-report-timeline article>span,.ps-report-timeline article>b{display:block;font-size:12px}.ps-report-timeline article>span{color:var(--muted)}.ps-report-timeline article>button{display:block;width:100%;margin-top:5px;padding:4px;text-align:left;font-size:12px}.ps-report-timeline article>button+button{text-align:center}.ps-report-timeline button b,.ps-report-timeline button small{display:block}.ps-report-timeline button small{margin-top:2px;color:var(--muted);font-size:12px}
.ps-candidate-list article>button{display:grid;grid-template-columns:auto 1fr;gap:5px;align-items:center;padding:0;border:0;background:transparent;text-align:left}.ps-candidate-list article>button:hover{background:transparent}.ps-candidate-list article>button small{grid-column:2;color:var(--muted);font-size:12px}
.ps-pacing-grid button{padding:10px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas);text-align:left;box-shadow:inset 0 3px var(--rule)}.ps-pacing-grid button.green{box-shadow:inset 0 3px var(--pass)}.ps-pacing-grid button.yellow{box-shadow:inset 0 3px var(--review)}.ps-pacing-grid button.red,.ps-pacing-grid button.critical{box-shadow:inset 0 3px var(--halt)}.ps-pacing-grid button span,.ps-pacing-grid button b,.ps-pacing-grid button small{display:block}.ps-pacing-grid button span{color:var(--muted);font-size:12px}.ps-pacing-grid button b{margin-top:6px;font-size:19px}.ps-pacing-grid button small{margin-top:3px;color:var(--ink2);font-size:12px}
.ps-weekly-categories button{padding:9px;border:1px solid transparent;border-radius:7px;background:var(--soft);text-align:left}.ps-weekly-categories button.on{border-color:var(--blue);background:var(--blue-bg)}.ps-weekly-categories button b,.ps-weekly-categories button span,.ps-weekly-categories button small{display:block}.ps-weekly-categories button b{font-size:12px}.ps-weekly-categories button span{margin-top:4px;font-size:12px}.ps-weekly-categories button small{margin-top:2px;color:var(--muted);font-size:12px}.ps-weekly-task-list article.recovery{box-shadow:inset 3px 0 var(--halt)}.ps-weekly-task-list article>button>div{display:flex;align-items:center;gap:6px}.ps-no-plan{color:var(--muted);font-size:12px}
.ps-object-detail{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.ps-object-detail>div{padding:8px;border-radius:6px;background:var(--soft)}.ps-object-detail span,.ps-object-detail b{display:block}.ps-object-detail span{color:var(--muted);font-size:12px}.ps-object-detail b{margin-top:3px;overflow-wrap:anywhere;font-size:12px}.ps-object-detail section{grid-column:1/-1}.ps-object-detail section>span{font-weight:700;color:var(--ink)}.ps-object-detail li{margin-top:4px;font-size:12px}

/* v1.11 desktop readability and hierarchy */
#page-projectstrategy .ps-head h2{font-size:24px;line-height:30px;letter-spacing:-.015em}
#page-projectstrategy .ps-section-head h3{font-size:16px;line-height:24px}
#page-projectstrategy :is(.ps-target-groups,.ps-center-columns,.ps-asset-list,.ps-anomaly-list,.ps-measurement-grid) h4{font-size:14px;line-height:20px}
#page-projectstrategy :is(.ps-section-head p,.ps-sub,.ps-opp-main p,.ps-monitor-grid p,.ps-report-preview p,.ps-report-preview li){font-size:13px;line-height:20px}
#page-projectstrategy small{font-size:12px;line-height:16px}
#page-projectstrategy :is(button,input,select,textarea){font-size:13px;line-height:20px}
#page-projectstrategy :is(.ps-command-nav button,.ps-type-nav button,.ps-subtabs button){min-height:32px}
#page-projectstrategy :is(.ps-status,.ps-tag){font-size:12px;line-height:16px}
@media(max-width:1180px){
  .ps-layout{grid-template-columns:1fr}.ps-outline{display:none}.ps-decision{grid-template-columns:repeat(2,1fr)}.ps-decision article:nth-child(3){border-left:0;border-top:1px solid var(--rule)}.ps-decision article:nth-child(4){border-top:1px solid var(--rule)}
  .ps-benchmark-grid,.ps-ledger-summary,.ps-authority-summary,.ps-tracking-grid{grid-template-columns:repeat(2,1fr)}.ps-opportunity-list article{grid-template-columns:minmax(0,1fr) 160px 90px}
}
@media(max-width:760px){
  body:has(#page-projectstrategy.on) .main{width:100%;min-width:0;scrollbar-gutter:auto}
  body:has(#page-projectstrategy.on) header.topbar{width:100%;min-width:0;box-sizing:border-box}
  /* 有意保留的逐页边距:≤760px 时本页整体改成 100vw 布局(侧栏与滚动条让位),
     再叠一层 12px 侧边距才不至于把 11 列看板挤到贴边;不是漏删的存量。 */
  #page-projectstrategy{width:100vw;max-width:100vw;padding:14px 12px 56px;overflow-x:hidden}.ps-head{align-items:flex-start;flex-wrap:wrap}.ps-head-main{min-width:0;width:100%}.ps-head-status{width:100%;margin-left:0}.ps-fresh{order:3;width:100%;margin-left:0}.ps-command-nav{overflow-x:auto}.ps-next-step{align-items:flex-start;flex-direction:column}.ps-next-step>div{grid-template-columns:auto auto}.ps-next-step p{grid-column:1/-1}.ps-strategy-gate{flex-direction:column}
  .ps-decision,.ps-goal-summary,.ps-benchmark-grid,.ps-quality,.ps-layer-grid,.ps-ledger-grid,.ps-scenario-grid,.ps-target-groups,.ps-monitor-grid,.ps-validation-grid,.ps-report-grid,.ps-assumptions,.ps-detail-grid,.ps-ledger-summary,.ps-authority-summary,.ps-tracking-grid,.ps-attribution-levels,.ps-center-columns,.ps-v110-detail,.ps-pacing-grid,.ps-weekly-categories,.ps-check-grid,.ps-measurement-grid,.ps-report-timeline,.ps-object-detail{grid-template-columns:1fr}
  .ps-decision article,.ps-decision article:nth-child(3){border-top:1px solid var(--rule);border-left:0}.ps-decision article:first-child{border-top:0}
  .ps-goal-summary>div{min-height:auto;border-top:1px solid var(--rule);border-left:0}.ps-goal-summary>div:first-child{border-top:0}
  .ps-opportunity-list article{grid-template-columns:1fr}.ps-opp-score{text-align:left}.ps-manual-weight{max-width:240px}
  .ps-asset-row,.ps-candidate-list article,.ps-event-row,.ps-capacity-list>div,.ps-completion-list article,.ps-weekly-task-list article{grid-template-columns:1fr}.ps-candidate-list article>div{grid-template-columns:auto 1fr}.ps-event-row .ps-tag{justify-self:start}
  .ps-placement,.ps-deferral{align-items:flex-start;flex-direction:column}
  .ps-month-table{overflow-x:auto}.ps-month-row{min-width:520px}.ps-form-grid{grid-template-columns:1fr}.ps-form-grid .wide{grid-column:auto}
}
/* 死码已删:#page-loopruns 逐页 padding/max-width —— 边距吃全局默认 */
#page-loopruns .loophead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:14px}
#page-loopruns .loophead h2{margin:0;font-size:18px}
#page-loopruns .loophead .meta{font-size:12px;color:var(--muted)}
#page-loopruns .looptools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 14px}
#page-loopruns .looptable{min-width:900px}
#page-loopruns .looprow{cursor:pointer}
#page-loopruns .looprow:hover{background:var(--paper)}
#page-loopruns .looprow.open{background:var(--blue-bg)}
#page-loopruns .loopid{font-family:var(--mono);font-size:12px;color:var(--ink);white-space:nowrap}
#page-loopruns .loopgoal{font-family:var(--mono);font-size:11px;color:var(--ink2);overflow-wrap:anywhere;max-width:260px}
#page-loopruns .loopstagecn{font-weight:600;color:var(--ink)}
#page-loopruns .loopstagekey{font-family:var(--mono);font-size:10px;color:var(--muted);margin-top:2px}
#page-loopruns .loopage{font-family:var(--mono);font-size:11px;color:var(--ink2);white-space:nowrap}
#page-loopruns .loopprogress{display:grid;grid-template-columns:repeat(13,minmax(8px,1fr));gap:3px;width:min(260px,28vw);min-width:180px}
#page-loopruns .loopseg{height:8px;border-radius:2px;background:var(--rule2)}
#page-loopruns .loopseg.done{background:var(--pass);opacity:.72}
#page-loopruns .loopseg.current{background:var(--blue)}
#page-loopruns .loopseg.future{background:var(--rule)}
#page-loopruns .loopdetailcell{padding:0;background:var(--paper)}
#page-loopruns .loopdetail{padding:14px 18px 18px;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule)}
#page-loopruns .loopdetailhead{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px}
#page-loopruns .loopdetailhead b{font-family:var(--mono);font-size:12px}
#page-loopruns .loopstageitem{display:grid;grid-template-columns:minmax(170px,.6fr) 1fr;gap:14px;padding:12px 0;border-bottom:1px solid var(--rule)}
#page-loopruns .loopstageitem:last-child{border-bottom:0}
#page-loopruns .loopstageleft{min-width:0}
#page-loopruns .loopstagetitle{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
#page-loopruns .loopstageidx{font-family:var(--mono);font-size:10px;color:var(--muted)}
#page-loopruns .loopmeta{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 12px;margin-top:8px}
#page-loopruns .loopmeta span{min-width:0;color:var(--ink2);font-size:12px;overflow-wrap:anywhere}
#page-loopruns .loopmeta b{display:block;color:var(--muted);font-family:var(--mono);font-size:10px;font-weight:500}
#page-loopruns .loopartifact{margin-top:8px;border:1px solid var(--rule);border-radius:8px;background:var(--panel);padding:9px 10px}
#page-loopruns .loopartifact .loopref{font-family:var(--mono);font-size:11px;color:var(--ink2);overflow-wrap:anywhere}
#page-loopruns .loopartifact .loopref b{color:var(--muted);font-weight:500;margin-right:5px}
#page-loopruns .loopemptyline{margin-top:8px;padding:0}
#page-loopruns .loopapproval{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
#page-loopruns .loopapproval button{min-height:30px;padding:4px 12px;font-size:12px}
@media(max-width:900px){
  /* 死码已删:#page-loopruns 窄屏 padding —— 窄屏同样吃全局默认(16px 16px 56px) */
  #page-loopruns .loophead{display:block}
  #page-loopruns .loopprogress{width:220px}
  #page-loopruns .loopstageitem{grid-template-columns:1fr}
  #page-loopruns .loopmeta{grid-template-columns:1fr}
}
/* SEO规划与执行看板，桌面端 */
#page-projectstrategy:has(.psp-head){padding-top:0;overflow-x:hidden}
.psp-head{position:sticky;top:0;z-index:14;display:grid;grid-template-columns:minmax(220px,1fr) minmax(320px,1.45fr) auto auto;align-items:center;gap:18px;min-height:82px;margin:0 -24px;padding:0 24px;border-bottom:1px solid var(--rule);background:color-mix(in srgb,var(--canvas) 96%,transparent);backdrop-filter:blur(12px)}
.psp-title,.psp-head-summary{min-width:0}.psp-title>div{display:flex;align-items:center;gap:8px}.psp-title h2{margin:0;font-size:22px;line-height:28px;letter-spacing:-.015em}.psp-title>div>span{padding:3px 7px;border-radius:999px;background:var(--blue-bg);color:var(--blue);font-size:12px;font-weight:700}.psp-title p,.psp-head-summary span,.psp-head-summary small{margin:3px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:12px}.psp-head-summary>*{display:block}.psp-head-summary b{margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}.psp-head-state{display:flex;align-items:center;gap:6px}.psp-head-state>span:last-child{padding:3px 7px;border-radius:999px;background:var(--soft);color:var(--ink2);font-size:12px;white-space:nowrap}.psp-head-actions{display:flex;align-items:center;justify-content:flex-end;gap:7px}.psp-head-actions button{white-space:nowrap}
.psp-tabs{position:sticky;top:82px;z-index:13;display:flex;gap:4px;margin:0 -24px 16px;padding:8px 24px;border-bottom:1px solid var(--rule);background:var(--canvas);overflow-x:auto}.psp-tabs button{min-height:34px;padding:6px 12px;border-color:transparent;background:transparent;white-space:nowrap}.psp-tabs button.on{border-color:var(--blue-soft);background:var(--blue-bg);color:var(--blue);font-weight:700}
.psp-main{min-width:0}.psp-main :is(h3,p){margin-top:0}.psp-panel{min-width:0;margin-bottom:12px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}.psp-panel>header,.psp-capacity>header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid var(--rule)}.psp-panel>header h3,.psp-capacity h3{margin:0;font-size:15px}.psp-panel>header p,.psp-capacity header p{margin:3px 0 0;color:var(--muted);font-size:12px}.psp-panel>header>span,.psp-capacity header>span{color:var(--muted);font-size:12px;white-space:nowrap}
.psp-callout{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px;padding:14px 16px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel)}.psp-callout>div>*{display:block}.psp-callout span{color:var(--muted);font-size:12px}.psp-callout b{margin-top:3px;font-size:15px}.psp-callout p{margin:3px 0 0;color:var(--ink2);font-size:12px}.psp-callout.missing,.psp-callout.failed,.psp-callout.conflict{border-color:var(--halt);background:var(--halt-bg)}.psp-callout.stale,.psp-callout.waiting{border-color:var(--review);background:var(--review-bg)}.psp-callout.complete{border-color:color-mix(in srgb,var(--pass) 45%,var(--rule));background:var(--pass-bg)}
.psp-data-status{display:inline-flex;align-items:center;padding:3px 7px;border:1px solid var(--mute-line);border-radius:999px;background:var(--mute-bg);color:var(--ink2);font-size:12px;font-weight:700;white-space:nowrap}.psp-data-status.complete{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}.psp-data-status.stale,.psp-data-status.waiting{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}.psp-data-status.missing,.psp-data-status.conflict,.psp-data-status.failed{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}.psp-data-status.collecting{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)}
.psp-contract{margin-bottom:12px;overflow:hidden;border:1px solid color-mix(in srgb,var(--blue) 24%,var(--rule));border-radius:var(--r-lg);background:linear-gradient(135deg,color-mix(in srgb,var(--blue-bg) 74%,var(--panel)) 0,var(--panel) 46%);box-shadow:var(--shadow-card)}
.psp-contract>header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;padding:19px 20px 16px;border-bottom:1px solid color-mix(in srgb,var(--blue) 14%,var(--rule))}.psp-contract>header>div:first-child{min-width:0}.psp-contract>header span{color:var(--blue);font-size:13px;font-weight:750}.psp-contract>header h3{max-width:980px;margin:5px 0 4px;font-size:21px;line-height:29px;letter-spacing:-.015em}.psp-contract>header p{margin:0;color:var(--muted);font-size:13px}.psp-contract>header>div:last-child{display:flex;gap:8px;flex:0 0 auto}.psp-contract>header button{min-height:36px}
.psp-contract-windows{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;background:var(--rule)}.psp-contract-windows>div{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:11px 20px;background:color-mix(in srgb,var(--panel) 94%,var(--blue-bg))}.psp-contract-windows span{color:var(--muted);font-size:13px}.psp-contract-windows b{font-size:13px;font-variant-numeric:tabular-nums}
.psp-contract-sources{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:14px 14px 0}.psp-contract-sources>div{min-width:0;padding:12px 14px;border:1px solid var(--rule);border-radius:var(--r-md);background:color-mix(in srgb,var(--panel) 94%,var(--blue-bg))}.psp-contract-sources span,.psp-contract-sources b,.psp-contract-sources small{display:block}.psp-contract-sources span{color:var(--muted);font-size:12px}.psp-contract-sources b{margin-top:5px;font-size:14px;line-height:20px;font-variant-numeric:tabular-nums}.psp-contract-sources small{margin-top:4px;color:var(--ink2);font-size:12px;line-height:18px}
.psp-contract-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;padding:14px}.psp-contract-metrics article{min-width:0;padding:15px;border:1px solid var(--rule);border-radius:var(--r-md);background:color-mix(in srgb,var(--panel) 96%,transparent)}.psp-contract-metrics article>div:first-child{display:flex;align-items:center;justify-content:space-between;gap:9px}.psp-contract-metrics article>div:first-child>span:first-child{color:var(--ink2);font-size:13px;font-weight:650}.psp-contract-metrics article>div:first-child>b{font-size:18px}.psp-contract-metrics article>b{display:block;margin-top:12px;font-size:20px;line-height:26px;font-variant-numeric:tabular-nums}.psp-contract-metrics article>p{min-height:40px;margin:10px 0 0;color:var(--muted);font-size:13px;line-height:20px}
.psp-contract-progress{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;margin-top:12px}.psp-contract-progress i{height:9px;overflow:hidden;border-radius:999px;background:var(--soft)}.psp-contract-progress i b{display:block;height:100%;border-radius:inherit;background:var(--blue)}.psp-contract-progress.behind i b{background:var(--review)}.psp-contract-progress span{color:var(--ink2);font-size:13px;font-weight:700;font-variant-numeric:tabular-nums}
.psp-contract-blockers{margin:0 14px 14px;padding:13px 15px;border:1px solid var(--review);border-radius:var(--r-md);background:var(--review-bg)}.psp-contract-blockers>b{font-size:13px}.psp-contract-blockers ul{display:grid;gap:4px;margin:7px 0 0;padding-left:20px}.psp-contract-blockers li,.psp-contract-blockers p{color:var(--ink2);font-size:13px;line-height:19px}.psp-contract-blockers p{margin:8px 0 0}.psp-contract-empty{border-style:dashed}
.psp-goal{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(260px,.7fr);gap:24px;align-items:center;margin-bottom:12px;padding:18px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:var(--shadow-card)}.psp-goal span,.psp-goal p,.psp-progress small{color:var(--muted);font-size:12px}.psp-goal h3{margin:5px 0;font-size:20px;line-height:28px}.psp-goal p{margin:0}.psp-progress>*{display:block}.psp-progress i{height:8px;margin:8px 0;border-radius:999px;background:var(--soft);overflow:hidden}.psp-progress i b{display:block;height:100%;border-radius:inherit;background:var(--blue)}
.psp-stat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:12px}.psp-stat-grid article{padding:14px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel)}.psp-stat-grid span,.psp-stat-grid b,.psp-stat-grid small{display:block}.psp-stat-grid span,.psp-stat-grid small{color:var(--muted);font-size:12px}.psp-stat-grid b{margin:7px 0 4px;font-size:22px}
.psp-category-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:12px}.psp-category-summary>div{min-width:0;padding:15px 16px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel);box-shadow:var(--shadow-card)}.psp-category-summary span,.psp-category-summary b,.psp-category-summary small{display:block}.psp-category-summary span,.psp-category-summary small{color:var(--muted);font-size:12px}.psp-category-summary b{margin:7px 0 5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:17px}.psp-category-summary small{line-height:17px}.psp-category-note{display:flex;align-items:center;gap:10px;margin:12px 14px 0;padding:10px 12px;border:1px solid color-mix(in srgb,var(--blue) 18%,var(--rule));border-radius:var(--r-md);background:var(--blue-bg)}.psp-category-note b{font-size:12px;white-space:nowrap}.psp-category-note span{color:var(--ink2);font-size:12px}.psp-category-table{margin-top:12px}.psp-table-wrap.psp-category-table table.lkt{min-width:1500px}.psp-category-table td>b,.psp-category-table td>small{display:block}.psp-category-table td>small{margin-top:4px;color:var(--muted);font-size:11px}.psp-category-table tr.paused{background:color-mix(in srgb,var(--soft) 58%,var(--panel));color:var(--muted)}.psp-table-wrap table.lkt tbody tr.paused td{color:var(--muted)}.psp-category-state{display:inline-flex;padding:3px 7px;border:1px solid var(--mute-line);border-radius:999px;background:var(--mute-bg);font-size:11px;font-weight:700;white-space:nowrap}.psp-category-state.enabled{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}.psp-category-state.paused{background:var(--mute-bg);color:var(--muted);border-color:var(--mute-line)}
.psp-data-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;padding:12px}.psp-data-grid article{min-width:0;padding:11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}.psp-data-grid article>div{display:flex;align-items:center;gap:7px}.psp-data-grid article b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.psp-data-grid article p{min-height:34px;margin:8px 0;color:var(--ink2);font-size:12px;line-height:17px}.psp-data-grid footer{display:flex;align-items:center;justify-content:space-between;gap:7px}.psp-data-grid footer span{color:var(--muted);font-size:12px}.psp-data-grid footer button{padding:3px 6px;font-size:12px}
.psp-card-list{display:grid;gap:7px;padding:12px}.psp-task-card{display:block;width:100%;min-width:0;padding:11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas);text-align:left}.psp-task-card:hover,.psp-task-card:focus-visible{border-color:var(--blue);background:var(--blue-bg)}.psp-task-card>span{display:flex;align-items:center;justify-content:space-between;gap:7px;color:var(--muted);font-size:12px}.psp-task-card b,.psp-task-card small,.psp-task-card em{display:block}.psp-task-card b{margin-top:7px;color:var(--ink);font-size:13px;line-height:18px}.psp-task-card small{margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:12px}.psp-task-card em{margin-top:7px;color:var(--review);font-size:12px;font-style:normal}.psp-task-card.compact{min-height:100px}
.psp-empty{display:flex;min-height:128px;align-items:center;justify-content:center;flex-direction:column;padding:20px;text-align:center}.psp-empty b{font-size:13px}.psp-empty span{max-width:520px;margin-top:5px;color:var(--muted);font-size:12px;line-height:18px}.psp-empty button{margin-top:11px}
/* 第 4 批:数据表取消内部限高。.psp-table-wrap 只留横滚(min-width:2100px 的宽表),
   纵向随页面滚;限高一撤,原来相对它吸顶的表头也没有滚动壳可参照,一并撤掉。

   前端规范第 3 批-3:本文件的三个壳(.psp-table-wrap / .psp-category-table /
   .psp-category-editor-table)原先各给壳内裸表一整套 border-collapse/padding/字号/分隔线/hover,
   是与 lkt 平行的第二套表实现。现在 168 的三张表都写成 <div class="tblwrap 壳"><table class="lkt lkt-compact">,
   壳只留 **delta**:min-width 横滚宽度、列宽上限、表单行垂直居中(弹窗内的编辑表另有限高+吸顶)。
   几何(内边距/字号/行高/分隔线/hover/圆角边框卡)一律由 .tblwrap + table.lkt.lkt-compact 出,
   壳里不许再重申 —— check-ui-conventions 的 F1/F2 钉的就是这条。 */
.psp-table-wrap{max-width:100%}.psp-table-wrap table.lkt{min-width:2100px}.psp-table-wrap table.lkt th,.psp-table-wrap table.lkt td{max-width:260px}.psp-task-link{padding:0;border:0;background:transparent;color:var(--blue);font-weight:700;text-align:left}.psp-table-wrap table.lkt td.psp-url{overflow-wrap:anywhere;color:var(--muted)}/* 并入 lkt 后 .lkt tbody td{color:var(--ink)} 特异性(0,1,2)高过原来的 .psp-url(0,1,0),目标页面列会被拉回正文色 —— 这里按 lkt 的作用域重写,弱化列仍是灰字 */
.psp-flow-wrap{width:100%;padding-bottom:8px;overflow-x:auto;overscroll-behavior-inline:contain}.psp-flow{display:grid;grid-template-columns:repeat(11,minmax(258px,1fr));gap:10px;min-width:2938px;padding-bottom:8px}.psp-flow-column{min-width:0;min-height:520px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--soft)}.psp-flow-column>header{position:sticky;top:0;z-index:1;display:flex;align-items:center;justify-content:space-between;padding:11px 12px;border-bottom:1px solid var(--rule);border-radius:var(--r-lg) var(--r-lg) 0 0;background:var(--panel)}.psp-flow-column>header b{font-size:13px}.psp-flow-column>header span{min-width:22px;padding:2px 6px;border-radius:999px;background:var(--soft);font-size:12px;text-align:center}.psp-flow-column>div{display:grid;gap:7px;padding:8px}.psp-column-empty{margin:14px 4px;line-height:18px;padding:0}
.psp-lanes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.psp-lane{margin-bottom:0}.psp-capacity{margin-bottom:12px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel)}.psp-capacity>div{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding:12px}.psp-capacity article{padding:10px;border-radius:var(--r-md);background:var(--soft)}.psp-capacity article>*{display:block}.psp-capacity article b{font-size:12px}.psp-capacity article span,.psp-capacity article small{margin-top:4px;color:var(--muted);font-size:12px}
.psp-week-category>div{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px;padding:12px}.psp-week-category article{min-width:0;padding:11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--canvas)}.psp-week-category article>div{display:flex;align-items:center;justify-content:space-between;gap:8px}.psp-week-category article>div>b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.psp-week-category article p,.psp-week-category article small{margin:7px 0 0;color:var(--muted);font-size:11px}.psp-week-category article i{display:block;height:6px;margin-top:7px;overflow:hidden;border-radius:999px;background:var(--soft)}.psp-week-category article i b{display:block;height:100%;border-radius:inherit;background:var(--blue)}.psp-week-category article.paused{opacity:.7}.psp-week-category article.paused i b{background:var(--muted)}
.oppmodal:has(.psp-category-editor){width:min(1180px,94vw);max-width:1180px}.psp-category-editor{min-width:0}.psp-category-editor-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 11px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--soft);font-size:12px}.psp-category-editor-summary span{color:var(--muted)}.psp-category-editor-table{max-height:var(--tbl-h-nested);overflow:auto}.psp-category-editor-table table.lkt{min-width:1040px}.psp-category-editor-table table.lkt thead th{position:sticky;top:0;z-index:2}.psp-category-editor-table table.lkt tbody td{vertical-align:middle}.psp-category-editor-table td:nth-child(1){width:52px;text-align:center}.psp-category-editor-table td:nth-child(2){width:160px}.psp-category-editor-table td:nth-child(3){width:72px}.psp-category-editor-table td:nth-child(4){width:84px}.psp-category-editor-table td:nth-child(5),.psp-category-editor-table td:nth-child(6){width:92px}.psp-category-editor-table td:nth-child(7){width:145px}.psp-category-editor-table td>b,.psp-category-editor-table td>small{display:block}.psp-category-editor-table td>b{font-size:12px}.psp-category-editor-table td>small{margin-top:3px;color:var(--muted);font-size:11px}.psp-category-editor-table input,.psp-category-editor-table select{min-height:32px;padding:5px 7px}.psp-category-editor-table tr.paused{background:var(--soft);opacity:.72}
.psp-drawer-layer{position:fixed;inset:0;z-index:90;display:flex;justify-content:flex-end;background:rgba(16,24,40,.36)}.psp-drawer{display:grid;grid-template-rows:auto minmax(0,1fr) auto;width:clamp(560px,46vw,640px);height:100%;border-left:1px solid var(--rule);background:var(--panel);box-shadow:-18px 0 42px rgba(16,24,40,.18);outline:0}.psp-drawer>header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 20px;border-bottom:1px solid var(--rule)}.psp-drawer>header span,.psp-drawer>header p{color:var(--muted);font-size:12px}.psp-drawer>header h2{margin:5px 0;font-size:18px;line-height:25px}.psp-drawer>header p{margin:0}.psp-drawer-close{width:34px;height:34px;padding:0;font-size:22px;line-height:1}.psp-drawer-body{overflow-y:auto;padding:4px 20px 24px}.psp-drawer-body>section{padding:14px 0;border-bottom:1px solid var(--rule)}.psp-drawer-body h3{margin:0 0 7px;font-size:13px}.psp-drawer-body p,.psp-drawer-body li{margin-top:5px;color:var(--ink2);font-size:12px;line-height:18px}.psp-drawer-body :is(ul,ol){margin:0;padding-left:20px}.psp-drawer-body li b,.psp-drawer-body li span,.psp-drawer-body li small{display:block}.psp-drawer-body li span{color:var(--ink2)}.psp-drawer-body li small{color:var(--muted)}.psp-drawer>footer{display:flex;justify-content:flex-end;gap:7px;padding:12px 20px;border-top:1px solid var(--rule);background:var(--panel)}.psp-technical{margin-top:14px;border:1px solid var(--rule);border-radius:var(--r-md)}.psp-technical summary{padding:10px 12px;color:var(--muted);font-size:12px;cursor:pointer}.psp-technical pre{max-height:260px;margin:0;padding:12px;border-top:1px solid var(--rule);background:var(--soft);font-size:12px;line-height:17px;white-space:pre-wrap;overflow:auto}.psp-operations>div{display:flex;flex-wrap:wrap;gap:8px;padding:12px 16px}.psp-operations button{min-height:34px}
.psp-state{display:flex;min-height:520px;align-items:center;justify-content:center;flex-direction:column;text-align:center}.psp-state>span{padding:3px 7px;border-radius:999px;background:var(--soft);color:var(--muted);font-size:12px}.psp-state>b{margin-top:12px;font-size:18px}.psp-state>p{max-width:520px;margin:7px 0 0;color:var(--muted);font-size:13px;line-height:20px}.psp-state>button{margin-top:16px}.psp-state.error>span{background:var(--halt-bg);color:var(--halt-deep)}
@media(max-width:1320px){
  .psp-head{grid-template-columns:minmax(220px,1fr) auto auto;gap:12px}.psp-head-summary{display:none}.psp-data-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.psp-stat-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.psp-contract-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}.psp-capacity>div{grid-template-columns:repeat(2,minmax(0,1fr))}
  .psp-category-summary,.psp-week-category>div{grid-template-columns:repeat(2,minmax(0,1fr))}
}
/* 目标执行计划，桌面端 */
.psgd-panel{margin:0 0 18px;border:1px solid var(--rule);border-radius:var(--r-lg);background:var(--panel);box-shadow:0 8px 24px rgba(16,24,40,.045);overflow:hidden}
.psgd-head{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;padding:18px 20px;border-bottom:1px solid var(--rule);background:linear-gradient(100deg,rgba(10,115,123,.075),rgba(255,255,255,0) 48%)}
.psgd-head>div:first-child{min-width:0}.psgd-head span{color:var(--muted);font-size:12px}.psgd-head h3{margin:4px 0 3px;color:var(--ink);font-size:19px;line-height:26px}.psgd-head p{max-width:760px;margin:0;color:var(--ink2);font-size:12px;line-height:18px}
.psgd-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-shrink:0}.psgd-actions button{min-height:34px}
.psgd-status{display:inline-flex;align-items:center;width:max-content;max-width:100%;padding:3px 8px;border:1px solid var(--mute-line);border-radius:999px;background:var(--mute-bg);color:var(--ink2);font-size:11px;line-height:17px;white-space:nowrap}.psgd-status.ready,.psgd-status.completed{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}.psgd-status.pending,.psgd-status.waiting_data,.psgd-status.waiting_keyword,.psgd-status.waiting_landing,.psgd-status.waiting_planning,.psgd-status.waiting_approval{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}.psgd-status.executing,.psgd-status.observing,.psgd-status.waiting_acceptance{background:var(--blue-bg);color:var(--blue);border-color:var(--blue-soft)}.psgd-status.needs_attention{background:var(--halt-bg);color:var(--halt-deep);border-color:var(--halt-line)}
.psgd-metrics{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:0;border-bottom:1px solid var(--rule)}.psgd-metrics article{min-width:0;padding:14px 16px;border-right:1px solid var(--rule)}.psgd-metrics article:last-child{border-right:0}.psgd-metrics span,.psgd-metrics b,.psgd-metrics small{display:block}.psgd-metrics span{color:var(--muted);font-size:11px}.psgd-metrics b{margin-top:5px;color:var(--ink);font-size:21px;line-height:27px}.psgd-metrics small{margin-top:3px;color:var(--ink2);font-size:11px;line-height:16px}
.psgd-tabs{display:flex;align-items:center;gap:4px;padding:10px 14px;border-bottom:1px solid var(--rule);background:var(--soft)}.psgd-tabs button{min-height:32px;padding:6px 12px;border-color:transparent;background:transparent;color:var(--ink2)}.psgd-tabs button:hover{background:var(--panel)}.psgd-tabs button.on{border-color:var(--rule);background:var(--panel);color:var(--ink);font-weight:700;box-shadow:0 1px 3px rgba(16,24,40,.06)}
.psgd-content{min-height:180px}
/* 死码已删:.psgd-table 壳(壳作用域裸表规则 2 条 + th/td/hover/b/small 一整套)与 .psgd-url ——
   全库无任何 JS 在这两个类里发过表,是从未接上的平行表实现(check-ui-conventions 检查 F2 的
   .psgd-table 白名单条目随之取消)。目标执行计划页实际渲染的是 .psgd-panel/.psgd-flow 那套卡片。 */
.psgd-definition{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:16px}.psgd-definition article{min-width:0;padding:13px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--soft)}.psgd-definition span,.psgd-definition b,.psgd-definition small{display:block}.psgd-definition span{color:var(--muted);font-size:11px}.psgd-definition b{margin-top:5px;color:var(--ink);font-size:14px;line-height:20px}.psgd-definition small{margin-top:4px;color:var(--ink2);font-size:11px;line-height:17px}.psgd-note{margin:0 16px 16px;padding:12px 14px;border-left:3px solid var(--teal);border-radius:0 var(--r-md) var(--r-md) 0;background:var(--blue-bg)}.psgd-note b{font-size:12px}.psgd-note p{margin:4px 0 0;color:var(--ink2);font-size:12px;line-height:18px}
.psgd-roadmap{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(260px,1fr);gap:10px;padding:14px;overflow-x:auto;overscroll-behavior-inline:contain}.psgd-roadmap>article{min-height:190px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--soft)}.psgd-roadmap header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:11px 12px;border-bottom:1px solid var(--rule);background:var(--panel)}.psgd-roadmap header b,.psgd-roadmap header span{display:block}.psgd-roadmap header b{font-size:13px}.psgd-roadmap header span,.psgd-roadmap header small{margin-top:2px;color:var(--muted);font-size:11px}.psgd-roadmap ul,.psgd-unscheduled ul{margin:0;padding:8px;list-style:none}.psgd-roadmap li,.psgd-unscheduled li{padding:9px;border-radius:var(--r-sm);background:var(--panel)}.psgd-roadmap li+li,.psgd-unscheduled li+li{margin-top:6px}.psgd-roadmap li b,.psgd-roadmap li span,.psgd-unscheduled li b,.psgd-unscheduled li span{display:block}.psgd-roadmap li b,.psgd-unscheduled li b{font-size:12px;line-height:17px}.psgd-roadmap li span,.psgd-unscheduled li span{margin-top:3px;color:var(--muted);font-size:11px}.psgd-roadmap>article>p{margin:22px 10px;color:var(--muted);font-size:12px;text-align:center}.psgd-unscheduled{margin:0 14px 14px;border:1px solid var(--rule);border-radius:var(--r-md)}.psgd-unscheduled summary{padding:10px 12px;color:var(--ink2);font-size:12px;cursor:pointer}.psgd-unscheduled ul{border-top:1px solid var(--rule)}
.psgd-roadmap header{display:block}.psgd-roadmap header>div{display:flex;align-items:baseline;gap:6px}.psgd-roadmap header b{white-space:nowrap}.psgd-roadmap header small{display:block;margin-top:6px;line-height:16px}
.psgd-empty,.psgd-loading{display:flex;min-height:190px;align-items:center;justify-content:center;flex-direction:column;padding:26px;text-align:center}.psgd-empty b,.psgd-loading b{font-size:15px}.psgd-empty p{max-width:600px;margin:6px 0 0;color:var(--muted);font-size:12px;line-height:18px}.psgd-empty button{margin-top:14px}.psgd-empty.error b{color:var(--halt-deep)}.psgd-loading{gap:10px;color:var(--ink2)}
.psgd-loading p{max-width:620px;margin:0;color:var(--muted);font-size:12px;line-height:18px}
.psgd-version{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid var(--rule)}.psgd-version>div{min-width:0;padding:15px 18px;border-right:1px solid var(--rule)}.psgd-version>div:last-child{border-right:0}.psgd-version span,.psgd-version b,.psgd-version small{display:block}.psgd-version span{color:var(--muted);font-size:11px}.psgd-version b{margin-top:4px;color:var(--ink);font-size:16px;line-height:22px}.psgd-version small{margin-top:3px;color:var(--ink2);font-size:11px;line-height:17px}
.psgd-flow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:0;padding:16px 18px;list-style:none;counter-reset:none}.psgd-flow li{display:grid;grid-template-columns:28px minmax(0,1fr);gap:10px;min-width:0;padding:14px;border:1px solid var(--rule);border-radius:var(--r-md);background:var(--soft)}.psgd-flow i{display:flex;width:28px;height:28px;align-items:center;justify-content:center;border-radius:50%;background:var(--panel);color:var(--muted);font-size:12px;font-style:normal;font-weight:700;box-shadow:inset 0 0 0 1px var(--rule)}.psgd-flow li.active{border-color:rgba(10,115,123,.38);background:var(--blue-bg)}.psgd-flow li.active i{background:var(--teal);color:#fff;box-shadow:none}.psgd-flow li.done i{background:var(--pass-bg);color:var(--pass);box-shadow:none}.psgd-flow b{display:block;color:var(--ink);font-size:13px;line-height:19px}.psgd-flow p{margin:4px 0 0;color:var(--ink2);font-size:11px;line-height:17px}
.psgd-boundary{display:flex;align-items:flex-start;gap:10px;padding:11px 18px;border-top:1px solid var(--rule);background:var(--soft);color:var(--ink2);font-size:11px;line-height:17px}.psgd-boundary b{flex:0 0 auto;color:var(--ink)}
@media(max-width:1480px){.psgd-metrics{grid-template-columns:repeat(3,minmax(0,1fr))}.psgd-metrics article:nth-child(3){border-right:0}.psgd-metrics article:nth-child(-n+3){border-bottom:1px solid var(--rule)}}
/* 死码已删:#page-taskmcp 逐页 padding/max-width —— 边距吃全局默认 */
#page-taskmcp .tm-head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin:0 0 18px}
#page-taskmcp .tm-title{margin:0;font-size:24px;line-height:1.25;font-weight:680;letter-spacing:-.02em}
#page-taskmcp .tm-sub{margin:6px 0 0;color:var(--ink2);font-size:13px;line-height:1.55;max-width:820px}
#page-taskmcp .tm-actions{display:flex;align-items:center;gap:8px;flex:none}
#page-taskmcp .tm-endpoint{display:flex;align-items:center;gap:10px;margin:0 0 12px;padding:10px 12px;background:var(--panel);border:1px solid var(--rule);border-radius:10px}
#page-taskmcp .tm-endpoint span{font-size:12px;color:var(--muted);white-space:nowrap}
#page-taskmcp .tm-endpoint code{font:12px/1.5 var(--mono);color:var(--ink);overflow-wrap:anywhere;flex:1}
#page-taskmcp .tm-boundary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;margin:0 0 16px;border:1px solid var(--rule);border-radius:12px;background:var(--panel);overflow:hidden}
#page-taskmcp .tm-boundary>div{padding:13px 15px;border-right:1px solid var(--rule)}
#page-taskmcp .tm-boundary>div:last-child{border-right:0}
#page-taskmcp .tm-boundary b{display:block;font-size:13px;margin-bottom:4px}
#page-taskmcp .tm-boundary span{display:block;font-size:12px;line-height:1.5;color:var(--ink2)}
#page-taskmcp .tm-summary{display:flex;align-items:center;gap:18px;min-height:38px;padding:8px 12px;margin:0 0 12px;background:var(--blue-bg);border:1px solid color-mix(in srgb,var(--blue) 20%,var(--rule));border-radius:10px;font-size:12px;color:var(--ink2)}
#page-taskmcp .tm-summary b{font-size:14px;color:var(--ink);margin-right:3px}
#page-taskmcp .tm-section{margin:20px 0 0}
#page-taskmcp .tm-section-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin:0 0 10px}
#page-taskmcp .tm-section-head h3{margin:0;font-size:16px;line-height:1.35}
#page-taskmcp .tm-section-head p{margin:3px 0 0;font-size:12px;color:var(--ink2)}
#page-taskmcp .tm-cap-table{width:100%;min-width:0;table-layout:fixed}
#page-taskmcp .tm-cap-table th,#page-taskmcp .tm-cap-table td{vertical-align:top;overflow-wrap:anywhere}
#page-taskmcp .tm-cap-table .tm-col-cap{width:17%}
#page-taskmcp .tm-cap-table .tm-col-state{width:8%}
#page-taskmcp .tm-cap-table .tm-col-mode{width:23%}
#page-taskmcp .tm-cap-table .tm-col-data{width:18%}
#page-taskmcp .tm-cap-table .tm-col-boundary{width:18%}
#page-taskmcp .tm-cap-table .tm-col-version{width:10%}
#page-taskmcp .tm-cap-table .tm-col-verification{width:6%}
/* 第 4 批:数据表取消内部限高,这张能力清单表随页面整体滚动(限高一去,吸顶就没有滚动壳
   可参照,一并撤掉,表头只保留底色)。 */
#page-taskmcp .tm-cap-table th{background:var(--panel)}
#page-taskmcp .tm-cap-name{min-width:0}
#page-taskmcp .tm-cap-name strong{display:block;font-size:13px;line-height:1.45;color:var(--ink)}
#page-taskmcp .tm-cap-id{display:block;margin-top:2px;font:11px/1.4 var(--mono);color:var(--muted)}
#page-taskmcp .tm-datasets{max-width:280px;font-size:12px;line-height:1.5;color:var(--ink2)}
#page-taskmcp .tm-datasets b{color:var(--ink)}
#page-taskmcp .tm-versions{font:11px/1.55 var(--mono);color:var(--ink2);white-space:nowrap}
#page-taskmcp details.tm-tech{margin-top:7px}
#page-taskmcp details.tm-tech summary{cursor:pointer;color:var(--teal);font-size:12px}
#page-taskmcp details.tm-tech pre{margin:7px 0 0;max-width:420px;padding:9px;border-radius:7px;background:var(--bg);font:10px/1.5 var(--mono);color:var(--ink2);white-space:pre-wrap;overflow-wrap:anywhere}
#page-taskmcp .tm-keyform{display:grid;grid-template-columns:minmax(220px,1fr) 160px 120px auto;gap:10px;align-items:end;padding:14px;margin:0 0 10px;background:var(--panel);border:1px solid var(--rule);border-radius:10px}
#page-taskmcp .tm-keyform label{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--ink2)}
#page-taskmcp .tm-keyform input,#page-taskmcp .tm-keyform select{width:100%}
#page-taskmcp .tm-token{margin:0 0 10px;padding:14px;border:1px solid var(--pass);border-radius:10px;background:var(--pass-bg)}
#page-taskmcp .tm-token strong{display:block;margin-bottom:8px;font-size:13px}
#page-taskmcp .tm-copyrow{display:flex;align-items:center;gap:8px}
#page-taskmcp .tm-copyrow code{display:block;flex:1;padding:8px 10px;background:var(--panel);border:1px solid var(--rule);border-radius:7px;font:11px/1.5 var(--mono);overflow-wrap:anywhere}
#page-taskmcp .tm-setup{margin-top:10px;font-size:12px;color:var(--ink2)}
#page-taskmcp .tm-checks{margin:0 0 12px;border:1px solid var(--rule);border-radius:10px;background:var(--panel);overflow:hidden}
#page-taskmcp .tm-check{display:grid;grid-template-columns:22px minmax(180px,1fr) 1fr;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid var(--rule2);font-size:12px}
#page-taskmcp .tm-check:last-child{border-bottom:0}
#page-taskmcp .tm-check i{font-style:normal;font-weight:700;color:var(--pass)}
#page-taskmcp .tm-check.bad i{color:var(--halt)}
#page-taskmcp .tm-check span:last-child{color:var(--ink2)}
#page-taskmcp .tm-help{margin-top:10px;padding:12px 14px;border-left:3px solid var(--teal);background:var(--panel);font-size:12px;line-height:1.65;color:var(--ink2)}
#page-taskmcp .tm-help b{color:var(--ink)}
/* 死码已删:#page-catboard 逐页 padding/max-width —— 边距吃全局默认 */
#page-catboard .cbhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:10px;flex-wrap:wrap}
#page-catboard .cbhead h2{margin:0;font-size:18px}
#page-catboard .cbhead .cbwin{font-size:12px;color:var(--muted);font-family:var(--mono)}
#page-catboard .cbtag{padding:0 7px;border-radius:9px;vertical-align:2px}
#page-catboard .cbtag.draft{background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
#page-catboard .cbtag.confirmed{background:var(--pass-bg);color:var(--pass);border-color:var(--pass-line)}
#page-catboard .cbtag.retired{background:var(--mute-bg);color:var(--muted);border-color:var(--mute-line)}
#page-catboard .cbnote{background:var(--paper);border:1px solid var(--rule);border-left:3px solid var(--review);border-radius:8px;padding:9px 13px;margin:0 0 12px;font-size:12px;color:var(--ink2);max-width:112ch}
#page-catboard .cbtable{min-width:920px}
#page-catboard .cbrow{cursor:pointer}
#page-catboard .cbrow:hover{background:var(--paper)}
#page-catboard .cbrow.open{background:var(--blue-bg)}
#page-catboard .cbcode{font-family:var(--mono);font-size:11px;color:var(--muted);margin-right:6px}
#page-catboard .cbname{font-weight:600;color:var(--ink)}
#page-catboard .cbcaret{display:inline-block;width:11px;color:var(--muted);font-size:10px}
#page-catboard .cbdelta{font-family:var(--mono);font-size:12px;white-space:nowrap}
#page-catboard .cbdelta.up{color:var(--pass)}
#page-catboard .cbdelta.down{color:var(--halt)}
#page-catboard .cbdelta.flat{color:var(--ink2)}
#page-catboard .cbdelta.na{color:var(--muted);cursor:help;border-bottom:1px dotted var(--rule2)}
#page-catboard .cbanchor{display:block;font-weight:400;font-size:10px;color:var(--muted);font-family:var(--mono);margin-top:1px}
#page-catboard .cbdetail{padding:0;background:var(--paper)}
#page-catboard .cbdetail .cbinner{padding:10px 14px 14px}
#page-catboard .cbtop{color:var(--ink2);font-size:11px;overflow-wrap:anywhere;max-width:360px}
#page-catboard .cbtop .kw{display:inline-block;background:var(--panel);border:1px solid var(--rule);border-radius:9px;padding:0 6px;margin:1px 3px 1px 0;line-height:1.7}
#page-catboard .cbtop .kw b{font-weight:600;color:var(--ink)}
#page-catboard .cbtop .vol{color:var(--muted);margin-left:3px}
#page-catboard .cbcomp{color:var(--muted);font-size:11px;margin-top:3px}
#page-catboard .cbloading{padding:8px 2px}
/* 死码已删:#page-catbattle 逐页 padding/max-width —— 边距吃全局默认 */
#page-catbattle .cbbhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:10px;flex-wrap:wrap}
#page-catbattle .cbbhead h2{margin:0;font-size:18px}
#page-catbattle .cbbhead .cbbwin{font-size:12px;color:var(--muted);font-family:var(--mono)}
#page-catbattle .cbbtag{padding:0 7px;border-radius:9px;vertical-align:2px;background:var(--review-bg);color:var(--review);border-color:var(--review-line)}
#page-catbattle .cbbstats{display:flex;gap:10px;flex-wrap:wrap;margin:0 0 12px}
#page-catbattle .cbbstat{border:1px solid var(--rule);border-radius:var(--r-md);background:var(--panel);padding:7px 14px;min-width:96px}
#page-catbattle .cbbstat b{display:block;font-family:var(--mono);font-size:19px;line-height:1.25;color:var(--ink)}
#page-catbattle .cbbstat span{font-size:11px;color:var(--muted)}
#page-catbattle .cbbstat.pend b{color:var(--review)}
#page-catbattle .cbbstat.na b{color:var(--muted)}
#page-catbattle .cbbnote{background:var(--paper);border:1px solid var(--rule);border-left:3px solid var(--review);border-radius:8px;padding:9px 13px;margin:0 0 12px;font-size:12px;color:var(--ink2);max-width:112ch}
/* 泳道横排,窄屏横向滚动。看板的形状必须稳定,故六条固定泳道即使 0 张卡也占位。 */
#page-catbattle .cbblanes{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(180px,1fr);gap:12px;align-items:start;overflow-x:auto;padding-bottom:10px}
/* 泳道色全部指向既有 UI 变量,本文件不引入任何新色值:每条道只设 --lane/--lane-bg 两个局部变量,
   泳道标头、卡片描边、抽屉左沿再从局部变量取色,换主题时跟着全站变量走。
   l-* 定义在泳道与抽屉的共同祖先下,故点开某张卡时抽屉自带该泳道的颜色。 */
#page-catbattle .cbblane,#page-catbattle .dtdrawer{--lane:var(--muted);--lane-bg:var(--soft)}
#page-catbattle .l-build{--lane:var(--info);--lane-bg:var(--info-bg)}
#page-catbattle .l-rectify{--lane:var(--review);--lane-bg:var(--review-bg)}
#page-catbattle .l-attack{--lane:var(--blue);--lane-bg:var(--blue-bg)}
#page-catbattle .l-cite{--lane:var(--pass);--lane-bg:var(--pass-bg)}
#page-catbattle .l-shrink{--lane:var(--halt);--lane-bg:var(--halt-bg)}
#page-catbattle .l-hold{--lane:var(--muted);--lane-bg:var(--soft)}
#page-catbattle .l-watch{--lane:var(--ink2);--lane-bg:var(--sel)}
#page-catbattle .l-other{--lane:var(--muted);--lane-bg:var(--soft)}
#page-catbattle .cbblane{border:1px solid var(--rule);border-radius:var(--r-md);background:var(--paper);min-width:0}
#page-catbattle .cbblanehd{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 11px;border-bottom:1px solid var(--rule);border-left:3px solid var(--lane);background:var(--lane-bg);border-radius:var(--r-md) var(--r-md) 0 0}
#page-catbattle .cbblanehd b{font-size:13px;color:var(--lane)}
#page-catbattle .cbblanehd .n{font-family:var(--mono);font-size:12px;color:var(--lane);opacity:.85}
#page-catbattle .cbblanebody{display:grid;gap:8px;padding:9px}
#page-catbattle .cbblaneempty{font-size:11px;padding:4px 2px}
#page-catbattle .cbbcard{display:block;width:100%;box-sizing:border-box;text-align:left;font:inherit;color:inherit;border:1px solid var(--rule2);border-radius:var(--r-sm);background:var(--panel);padding:8px 10px;cursor:pointer}
#page-catbattle .cbbcard:hover{border-color:var(--lane);box-shadow:var(--shadow-card)}
#page-catbattle .cbbcard:focus-visible{outline:0;box-shadow:var(--focus)}
/* focus=true 的作战单元:2px 主题色描边。内边距同步减 1px,加边不挤动卡片布局。 */
#page-catbattle .cbbcard.isfocus{border:2px solid var(--blue);padding:7px 9px}
#page-catbattle .cbbcard .cbbcode{font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-right:5px}
#page-catbattle .cbbcard .cbbname{font-weight:600;font-size:12.5px;color:var(--ink);overflow-wrap:anywhere}
#page-catbattle .cbbcard .cbbstar{color:var(--blue);font-size:10px;margin-left:4px}
#page-catbattle .cbbcard .cbbline{display:block;margin-top:4px;font-family:var(--mono);font-size:11px;color:var(--ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#page-catbattle .cbbcard .cbbtrend{margin-left:4px}
#page-catbattle .cbbcard .cbbtrend.up{color:var(--pass)}
#page-catbattle .cbbcard .cbbtrend.down{color:var(--halt)}
#page-catbattle .cbbcard .cbbtrend.flat{color:var(--muted)}
#page-catbattle .cbbcard .cbbreason{display:block;margin-top:5px;font-size:11px;line-height:1.5;color:var(--ink2);overflow-wrap:anywhere}
#page-catbattle .cbbcard .cbbdraft{display:inline-block;margin-top:5px;font-size:10px;line-height:1.6;padding:0 6px;border-radius:8px;background:var(--review-bg);color:var(--review)}
/* 抽屉沿用全站 .dtdrawer/.dtscrim 骨架,只补本页四块内容的排版。 */
#page-catbattle .cbbdstate{border:1px solid var(--rule);border-left:3px solid var(--lane);border-radius:var(--r-sm);background:var(--lane-bg);padding:9px 12px;margin-bottom:14px}
#page-catbattle .cbbdstate b{display:block;font-size:13px;color:var(--ink)}
#page-catbattle .cbbdstate span{display:block;margin-top:3px;font-size:12px;line-height:1.55;color:var(--ink2)}
#page-catbattle .cbbdsec{margin:0 0 16px}
#page-catbattle .cbbdsec h4{margin:0 0 6px;font-size:12px;color:var(--muted);font-weight:700}
#page-catbattle .cbbdkv{display:grid;grid-template-columns:minmax(88px,auto) 1fr;gap:4px 12px;margin:0;font-size:12px}
#page-catbattle .cbbdkv dt{color:var(--muted);font-family:var(--mono);font-size:11px;overflow-wrap:anywhere}
#page-catbattle .cbbdkv dd{margin:0;color:var(--ink);font-family:var(--mono);overflow-wrap:anywhere}
#page-catbattle .cbbdlist{margin:0;padding-left:20px;font-size:12px;line-height:1.6;color:var(--ink)}
#page-catbattle .cbbdlist li{margin-bottom:5px}
#page-catbattle .cbbdlist li small{display:block;color:var(--muted);font-size:11px}
#page-catbattle .cbbdtext{margin:0;font-size:12px;line-height:1.6;color:var(--ink2);overflow-wrap:anywhere}
#page-catbattle .cbbdro{margin:0;font-size:11px;color:var(--muted)}
/* 抽屉页脚沿用全站 .dtdrawer>footer(右对齐按钮条),说明文字靠 margin-right:auto 顶到左边。 */
#page-catbattle .dtdrawer>footer{align-items:center}
#page-catbattle .dtdrawer>footer .cbbdro{margin-right:auto;text-align:left}
/* 「调整打法」表单。摆在抽屉正文最上方(紧贴判定结论),填理由时判定依据仍在下方可滚动查看。 */
#page-catbattle .cbbadjust{border:1px solid var(--rule2);border-left:3px solid var(--lane);border-radius:var(--r-sm);background:var(--paper);padding:11px 13px}
#page-catbattle .cbbadjust label{display:grid;gap:5px;margin-bottom:9px}
#page-catbattle .cbbadjust label>span{color:var(--muted);font-size:11px;font-weight:600}
#page-catbattle .cbbadjust select,#page-catbattle .cbbadjust textarea{width:100%;box-sizing:border-box}
#page-catbattle .cbbadjust textarea{resize:vertical}
#page-catbattle .cbbadjustbtns{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
/* 优先级标注块。壳沿用 .cbbadjust 的形状(同是抽屉里的一块动作区),只加按钮组的排布 ——
   颜色/圆角/内边距一个都不另写,那些在 .cbbadjust 与统一按钮族里已经有了。 */
#page-catbattle .cbbprio{border:1px solid var(--rule2);border-left:3px solid var(--lane);border-radius:var(--r-sm);background:var(--paper);padding:11px 13px}
#page-catbattle .cbbpriobtns{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:8px}
/* 卡片上的优先级徽标靠右,与 .cbbstar 同一行尾 —— 卡片的信息序是「码 名 重点 优先级」。 */
#page-catbattle .cbbcard>.pill{justify-self:end;font-size:10px;padding:1px 7px}

/* 意图集群页信息架构:页头压一行 + 三页签(集群核对/同义归并/规划清单)。纯布局,无新交互原语。 */
#page-clusters .pagehead{position:relative;align-items:center;flex-wrap:wrap;margin-bottom:12px}
#page-clusters .pagehead>div{flex-direction:row;align-items:center;gap:10px;flex-wrap:wrap}
#page-clusters .pagehead h2{font-size:20px}
#page-clusters .clstats{font-size:12.5px;color:var(--muted)}
#page-clusters .clhead-r{margin-left:auto}
#page-clusters .clhelpbtn{width:26px;height:26px;padding:0;border-radius:50%;line-height:1;
  border:1px solid var(--rule);background:var(--panel);color:var(--ink2);cursor:pointer}
#page-clusters .clhelpbtn:hover{color:var(--ink);border-color:var(--rule2,var(--rule))}
/* 选择器带 .pagehead> 前缀,压过上面那条把页头子 div 排成一行的规则 */
#page-clusters .pagehead>.clhelppop{display:block;position:absolute;z-index:40;right:0;top:calc(100% + 6px);
  width:min(460px,88vw);padding:12px 14px;background:var(--panel);border:1px solid var(--rule);
  border-radius:10px;box-shadow:0 8px 26px rgba(16,35,38,.14)}
#page-clusters .pagehead>.clhelppop[hidden]{display:none}
#page-clusters .clhelppop h4{margin:0 0 4px;font-size:13px;font-weight:650;color:var(--ink)}
#page-clusters .clhelppop h4+p{margin:0 0 10px}
#page-clusters .clhelppop p:last-child{margin-bottom:0}

/* 口径段控件(规划中 / 全部聚类):排在三页签之上,几何全部复用 .ilseg 段控件,只给一行间距与标签色 */
#page-clusters .clscoperow{margin:0 0 8px}
#page-clusters .clscoperow .fl{font-size:12px;color:var(--muted)}

/* 集群状态筛选 + 前端搜索(只过滤已载数据,不下发后端参数) */
#page-clusters .clsubbar .clq{margin-left:12px;min-width:220px;font-size:12.5px;padding:5px 8px;
  border:1px solid var(--rule);border-radius:6px;background:var(--panel);color:var(--ink)}

/* 空态一行字,不撑大空盒 */
#page-clusters .clemptyline{margin:10px 0;padding:0}

/* 归并 / 规划清单页签的面板标题(原折叠 summary 的位置) */
#page-clusters .mrgpane>h3,#page-clusters .planpane>h3{margin:0 0 4px;font-size:15px;font-weight:650;color:var(--ink)}

/* 同义归并:批量操作条吸顶,组卡片默认折叠成一行 */
#page-clusters .mrgbar{position:sticky;top:0;z-index:6}
#page-clusters details.mrgcard>summary.ch{cursor:pointer;list-style:none;align-items:center}
#page-clusters details.mrgcard>summary.ch::-webkit-details-marker{display:none}
#page-clusters details.mrgcard>summary.ch::before{content:"▸";margin-right:2px;color:var(--muted);font-size:11px}
#page-clusters details.mrgcard[open]>summary.ch::before{content:"▾"}
#page-clusters details.mrgcard:not([open])>summary.ch{border-bottom:0}

/* 簇行内确认按钮(既有 .clconfirm,只是从详情里前置到簇头) */
#page-clusters .cluster>.ch .clconfirm{margin-left:8px;font-size:12px}

/* 确认口径写读对齐(2026-08-16):簇头徽标带词确认进度,已确认的簇徽标着色 */
#page-clusters .cluster>.ch .clstate.ok{color:var(--blue-deep)}
/* 批量确认集群:几何复用关键词视图的 .kwmonbar 一族,这里只补页面内的间距与计数 chip */
#page-clusters .clbulkbar{margin:0 0 10px}
#page-clusters .clbulkbar b{background:var(--panel);border-radius:999px;padding:3px 10px;font-size:12px;font-weight:600;color:var(--blue-deep)}
#page-clusters .clbulkbar .clselall{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:12px;color:var(--ink2)}
#page-clusters .cluster>.ch .clsel{margin-right:6px}
/* 簇底次要动作区:词批量是显式动作;取消确认降到文字链级,避免误触(确认按钮保持醒目) */
#page-clusters .clfoot{display:flex;align-items:center;gap:10px;padding:6px 14px 10px}
#page-clusters .clfoot .clrevoke{margin-left:auto;border:0;background:transparent;padding:0;
  font-size:11.5px;color:var(--muted);text-decoration:underline;cursor:pointer}
#page-clusters .clfoot .clrevoke:hover{color:var(--halt);background:transparent}
/* 词确认筛选下没有命中词的簇:保留簇头,表体给一行空态说明(整簇消失会被读成确认丢了) */
#page-clusters tr.kwempty td{color:var(--muted);font-size:12px}
/* 待优化队列行展开的 URL 体检卡(424-content-optqueue.js)。
   颜色一律走全站变量(--rule/--panel/--ink 等),不写死色值;字号不低于 12px。 */
.oqrow{cursor:pointer}
.oqrow.on>td{background:var(--panel)}
.oqexp>td{padding:0;background:var(--panel)}
.oqcard{padding:12px 14px 14px;border-top:1px solid var(--rule)}
.oqload{font-size:13px;color:var(--ink2);padding:10px 2px}
.oqbk{margin:0 0 12px}
.oqbk>h4{margin:0 0 6px;font-size:13px;line-height:20px;color:var(--ink)}
.oqbk.oqprimary{border:1px solid var(--rule);border-radius:8px;padding:10px 12px;background:var(--paper)}
.oqcols{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}
.oqgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 14px}
.oqkv{display:flex;gap:8px;align-items:baseline;font-size:13px;line-height:20px;padding:2px 0;
  border-bottom:1px dotted var(--rule);min-width:0}
.oqk{flex:0 0 auto;color:var(--muted);font-size:12px}
.oqv{flex:1 1 auto;min-width:0;color:var(--ink);overflow-wrap:anywhere}
.oqsub{margin:8px 0 4px;font-size:12px;color:var(--muted)}
.oqtdk .oqkv{border-bottom:1px solid var(--rule)}
.oqh2{margin:0;padding-left:20px;font-size:13px;line-height:20px;color:var(--ink)}
.oqmiss{font-size:13px;line-height:20px;color:var(--muted);background:var(--paper);
  border:1px dashed var(--rule);border-radius:6px;padding:8px 10px}
.oqwarn{font-size:13px;line-height:20px;color:var(--halt-deep);background:var(--halt-bg);
  border:1px solid var(--halt-line);border-radius:6px;padding:8px 10px;margin:0 0 8px}
.oqd{font-size:12px;font-weight:600}
.oqd.up{color:var(--pass)}
.oqd.down{color:var(--halt-deep)}
.oqdz{font-size:12px;color:var(--muted)}
.oqrs{margin:0 0 6px;padding-left:20px;font-size:13px;line-height:20px}
.oqjson{margin:0;padding:8px 10px;background:var(--paper);border:1px solid var(--rule);border-radius:6px;
  font-size:12px;line-height:18px;max-height:220px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}

/* 前置数据包 + 页面内容来源/大纲(2026-08-16 数据包可见化)。颜色一律走全站变量,不写死色值。 */
.oqbk.oqevbk{border:1px solid var(--rule);border-radius:8px;padding:10px 12px;background:var(--paper)}
.oqevs{list-style:none;margin:6px 0 0;padding:0;display:grid;
  grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:6px}
.oqev{border:1px solid var(--rule);border-radius:6px;background:var(--panel);min-width:0}
/* 卡片内部排版下沉到 .oqev-hit:可点的一类是 button、不可点的是 div,共用同一套内边距与行距,
   否则同一行里可点与不可点的卡片会高矮不一。 */
.oqev-hit{display:flex;flex-direction:column;gap:2px;min-width:0;width:100%;
  padding:6px 8px;border:0;border-radius:6px;background:transparent;
  font:inherit;color:inherit;text-align:left}
button.oqev-hit{cursor:pointer}
button.oqev-hit:hover{background:var(--paper)}
button.oqev-hit:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.oqev.on{border-color:var(--blue)}
/* 「核对 ›」提示只在卡片可点时出,右对齐到标题行末尾 */
.oqev-go{float:right;font-size:12px;color:var(--blue)}
/* 「还缺什么」标黄:未开始/过期/跳过/失败一眼可辨,已采与采集中不着色 */
.oqev.miss{border-color:var(--halt-line);background:var(--halt-bg)}
.oqev-h{font-size:13px;line-height:20px;color:var(--ink)}
.oqev-m{font-size:12px;line-height:18px;color:var(--ink2)}
.oqev-w{font-size:12px;line-height:18px;color:var(--muted);overflow-wrap:anywhere}
.oqev-e{font-size:12px;line-height:18px;color:var(--halt-deep);overflow-wrap:anywhere}
/* 证据健康红标(2026-08-20 去掉人工审批的配套):红标不拦流程,只保证"数据当时什么状态"在界面上跑不掉。
   标了红的证据卡走与"还缺"同一条 .miss 底色,徽标本身用 p1pill bad 的红档区分开。 */
.oqev-flag{margin-left:4px}
.oqevh{list-style:none;margin:6px 0 0;padding:0;display:grid;gap:4px}
.oqevh>li{overflow-wrap:anywhere}
/* 内容来源条:来源徽标 + 采集时间 + 刷新按钮(唯一会打外部 parser 的入口) */
.oqsrcbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 8px}
.oqsrcbar>button{margin-left:auto}
/* 大纲树:按层级缩进,H 标签占一小格 */
.oqol{list-style:none;margin:0;padding:0;font-size:13px;line-height:20px;color:var(--ink)}
.oqol>li{padding:1px 0;overflow-wrap:anywhere}
.oqol-l2{padding-left:0}
.oqol-l3{padding-left:16px}
.oqol-l4{padding-left:32px}
.oqol-l5{padding-left:48px}
.oqol-l6{padding-left:64px}
.oqol-lv{font-size:11px;color:var(--muted)}
/* 行内展开按钮:文字态,不与 ghost 按钮抢视觉 */
.oqmore{border:0;background:transparent;color:var(--blue);font-size:12px;padding:0 2px;cursor:pointer}

/* 任务进度块与承接范围确认弹窗(2026-08-16 集合页链路打通 + 作用域纠偏)。颜色一律走全站变量,不写死色值。 */
.oqbk.oqtaskbk{border:1px solid var(--rule);border-radius:8px;padding:10px 12px;background:var(--paper)}
.oqclusters{display:flex;flex-direction:column;gap:6px;margin:8px 0 0}
.oqcluster{display:grid;grid-template-columns:auto 1fr;gap:2px 8px;align-items:baseline;
  border:1px solid var(--rule);border-radius:6px;padding:8px 10px;background:var(--paper)}
/* 主簇/次簇角色标:承接范围是给人看的清单,不是选择控件,所以没有 input 那一列 */
.oqcl-role{grid-row:1 / span 3;align-self:center;font-size:11px;color:var(--muted);
  border:1px solid var(--rule);border-radius:4px;padding:1px 5px;white-space:nowrap}
.oqcluster.warn{border-color:var(--halt-line);background:var(--halt-bg)}
.oqcl-main{font-size:13px;line-height:20px;color:var(--ink);overflow-wrap:anywhere}
/* 优先级列:徽标在上、改档下拉在下。列宽收窄 —— 这一列的信息量是一个档位,
   给它和 URL 一样的伸缩权重会把整张表挤歪。 */
#page-optcollection .oqprio,#page-optproduct .oqprio,#page-optsingle .oqprio,#page-optblog .oqprio{white-space:nowrap;width:1%}
#page-optcollection .oq-prio,#page-optproduct .oq-prio,#page-optsingle .oq-prio,#page-optblog .oq-prio{display:block;margin-top:4px;font-size:11px;max-width:132px}

/* 证据核对侧滑(2026-08-20)。用户原话:「点击对应的证据卡片,可以从侧边展示,叠到页面上,
   我可以看到这个收集到对应的数据,方便我核对」。
   几何照仓内已有的侧滑先例(025 的 .psp-drawer):右侧贴边、遮罩压全屏、三段式(头/身/脚)。
   颜色一律走全站变量,不写死色值;字号不低于 12px。 */
.oqevd-scrim{position:fixed;inset:0;z-index:70;display:flex;justify-content:flex-end;
  background:rgba(32,29,25,.42)}
.oqevd{display:grid;grid-template-rows:auto minmax(0,1fr) auto;
  width:clamp(560px,52vw,860px);max-width:100vw;height:100%;
  border-left:1px solid var(--rule);background:var(--panel);outline:0}
.oqevd-h{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;
  padding:14px 16px;border-bottom:1px solid var(--rule)}
.oqevd-h h3{margin:4px 0 2px;font-size:16px;line-height:24px;color:var(--ink)}
.oqevd-h p{margin:0}
.oqevd-x{width:32px;height:32px;padding:0;font-size:20px;line-height:1}
/* 抽屉主体是唯一允许纵向滚动的一段:头脚固定,长证据表在这里滚 */
.oqevd-b{overflow-y:auto;padding:12px 16px 20px}
.oqevd-f{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;
  border-top:1px solid var(--rule);background:var(--panel)}
.oqevd-facts{margin:0 0 8px}
.oqevd-what{margin:0 0 8px;overflow-wrap:anywhere}
.oqevd-view>.tblwrap{margin:0 0 8px}
.oqevd-view table.lkt{min-width:100%}
.oqapproved{display:flex;flex-direction:column;gap:4px;margin:0 0 10px;padding:9px 10px;
  border:1px solid var(--pass-line);border-radius:6px;background:var(--pass-bg);font-size:12px;line-height:18px}
.oqapproved b{color:var(--pass)}
.oqapproved span{color:var(--ink2);overflow-wrap:anywhere}
.oqapproved-md{max-height:none;white-space:pre-wrap;overflow-wrap:anywhere}
/* 原始 JSON:永远在最后、永远可折叠。限高在这里是刻意的 —— 它是「兜底原文」不是数据表,
   check-ui-conventions 的 I 规则放行的正是这一类长文本块。 */
.oqevd-raw{margin:12px 0 0;border:1px solid var(--rule);border-radius:6px}
.oqevd-raw>summary{padding:8px 10px;font-size:12px;color:var(--muted);cursor:pointer}
.oqevd-pre{margin:0;border:0;border-top:1px solid var(--rule);border-radius:0;max-height:420px}
/* 可见内容 / 后台富文本的分块折叠卡:一块 = 一节正文或一个 metafield 字段,展开是链接与图片子表。
   不限高 —— 里面是数据表,按 I 规则纵向滚动交回页面。 */
.oqevd-blk{margin:0 0 6px;border:1px solid var(--rule);border-radius:6px}
.oqevd-blk>summary{padding:6px 10px;font-size:12px;cursor:pointer;overflow-wrap:anywhere}
.oqevd-blk>.tblwrap{margin:0 0 8px;padding:0 10px}
.oqevd-blk>.oqwarn{margin:0 10px 6px}
/* 未知结构兜底的 JSON 树 */
.oqtree{list-style:none;margin:0;padding:0 0 0 14px;font-size:12px;line-height:18px}
.oqtree>li{padding:1px 0;overflow-wrap:anywhere}
.oqtree summary{cursor:pointer}
.oqtree-k{color:var(--muted)}
.oqtree-v{color:var(--ink)}
.oqtree-n{color:var(--muted)}
@media (max-width:720px){
  .oqevd{width:100vw}
}
