/* ══════════════════════════════════════════════════════════════
   plan.css —— 预算与质量三页（plan.js）的样式。

   两条规矩，与 dept.js / mix.js 那几条线一样：
   · 类名一律 pl- 前缀，不覆盖 app.css 里的通用类（.panel / .tbl / .ktile /
     .caliber / .wbanner / .idn / .segbtn / .chip 全部原样复用）；
   · 颜色、圆角、字号一律走 app.css 已有的 CSS 变量与色卡，不发明配色。
     语义色（good/bad/warn/deny）在浅底工作区与 .ag 暖底两套中性族之间是
     同一个红同一个绿 —— 所以这里只用变量、不写死中性色，两态自动都对。

   ── 一处刻意的克制 ────────────────────────────────────────
   统计离群页在拟真集上 24 条里 17 条是「严重」（71%）。定档是后端的事，
   但排版不该再放大它：严重档只走 .al-sev 药丸 + 左缘一道 3px 竖条，
   **不铺红底**。一屏红底会让人当场停止阅读整个区块，连真的那条一起丢掉。
   ══════════════════════════════════════════════════════════════ */

/* ── 页眉软卡：复用 .cl-title，只补本组自己的排布 ───────────── */
.cl-title.pl-head{align-items:flex-start;gap:18px}
.pl-head .pl-hl{flex:1 1 420px;min-width:0}
.pl-head .pl-hl h2{margin:0 0 6px}
.pl-head .pl-hl .sub{display:block;font-size:11.5px;color:var(--dk-ink2);line-height:1.75;
                     max-width:76ch;padding-bottom:0}
.pl-head .pl-hl .sub b{color:var(--dk-ink);font-weight:650}
.pl-head .pl-hr{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-left:auto}
.pl-head .pl-hr .fl{font-size:10.5px;color:var(--ink2);letter-spacing:.08em;
                    background:var(--panel);border:1px solid var(--brand-border);
                    border-radius:var(--r-xs);padding:5px 8px}
.pl-head .pl-per{font-size:13px;background:var(--panel);border:1px solid var(--brand-border);
                 border-radius:var(--r-xs);padding:4px 10px;color:var(--brand)}
.pl-filters{display:flex;flex-wrap:wrap;align-items:center;gap:7px}

/* 页内 tab（差异桥 / 内生同比）。与页眉分开一行 —— 它换的是「问哪个问题」，
   不是页眉那种「看哪个范围」。 */
.pl-tabs{margin:-6px 0 14px}

/* ── critical 口径：钉在页顶，不折叠、不截断、不省略号 ────────
   「含预测数、非实际」与「价/量/结构不可用」都走这里。整段可见是硬约束，
   所以这里没有 max-height、没有 -webkit-line-clamp、没有 text-overflow。 */
.pl-pin{border:1px solid var(--deny-line);background:var(--deny-soft);
        border-radius:var(--r-md);padding:12px 16px;margin:0 0 14px}
.pl-pin p{margin:0;font-size:12.5px;line-height:1.85;color:var(--bad);
          overflow:visible;max-height:none}
.pl-pin p+p{margin-top:9px;padding-top:9px;border-top:1px solid var(--deny-line)}
.pl-pin-t{display:inline-block;font-size:9.5px;letter-spacing:.14em;font-weight:700;
          text-transform:uppercase;background:var(--bad);color:#fff;
          border-radius:var(--r-pill);padding:1px 8px;margin-right:9px;vertical-align:1px}

/* ── 块级拒答卡（整页 ok、其中一块 fail closed） ────────────── */
.panel.pl-deny{border-color:var(--deny-line);background:var(--deny-soft)}
.pl-deny h3{color:var(--bad)}
.pl-deny .pl-why{font-size:12.5px;line-height:1.85;color:var(--ink2);margin:0}
.pl-deny .pl-note{font-size:11.5px;line-height:1.8;color:var(--ink3);margin:8px 0 0}

/* ── 指标砖排（复用 .ktile 的内部结构） ─────────────────────── */
.pl-tiles{display:grid;gap:10px;margin:0 0 14px;
          grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}
.pl-tiles .ktile{background:var(--panel);border:1px solid var(--line);
                 border-radius:var(--r-md);box-shadow:var(--shadow-sm)}
.pl-tiles .ktile .sub{line-height:1.7}
.pl-subnote{display:block;color:var(--ink3);line-height:1.7}
.pl-eq{font-size:15px;font-weight:650;color:var(--ink3);letter-spacing:.04em}
.pl-hot{color:var(--bad)}
.pl-flag{color:var(--bad);font-weight:650}

/* ── 比较条：两侧版本各自点名 ──────────────────────────────── */
.pl-cmp{display:flex;flex-wrap:wrap;align-items:stretch;gap:10px;margin:0 0 14px}
.pl-cmp-s,.pl-cmp-m{background:var(--panel);border:1px solid var(--line);
                    border-radius:var(--r-md);padding:10px 14px;min-width:0;
                    display:flex;flex-direction:column;justify-content:center}
.pl-cmp-s{flex:1 1 220px}
.pl-cmp-m{flex:1 1 190px}
.pl-cmp-m.lock{border-color:var(--warn-line);background:var(--warn-soft)}
.pl-cmp .k,.pl-cmp span{font-size:10px;color:var(--ink3);letter-spacing:.08em}
.pl-cmp b{font-size:14px;font-weight:650;color:var(--ink);margin-top:4px;
          overflow-wrap:anywhere}
.pl-cmp em{font-style:normal;font-size:10.5px;color:var(--ink3);margin-top:3px;line-height:1.6}
.pl-cmp-ar{align-self:center;color:var(--ink3);font-size:16px;flex:none;padding:0 2px}

/* ── 粒度盒 ───────────────────────────────────────────────── */
.pl-grain b{font-weight:650}
.pl-grain .pl-drop{margin:6px 0 0;padding-left:16px}
.pl-grain .pl-drop li{margin:2px 0;line-height:1.75}
.pl-grain p{margin:6px 0 0;line-height:1.8}
.pl-tag{display:inline-block;font-size:9.5px;letter-spacing:.1em;font-weight:650;
        border-radius:var(--r-pill);padding:1px 8px;margin-left:8px;
        background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn-line)}
.pl-tag.ok{background:var(--good-soft);color:var(--good);border-color:var(--good-line)}

/* ── 收入桥的拒答块：这一页最该被读到的一段 ──────────────────
   它不是一条脚注，也不是一个 0 —— 所以给它整块的份量，但不用红底
   （红底留给真正的越权拒答），用赭石描边区分「算不出」与「不许看」。 */
.pl-refuse{border:1px solid var(--warn-line);background:var(--warn-soft);
           border-radius:var(--r-md);padding:14px 16px;margin:0 0 14px}
.pl-refuse-h{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.pl-refuse-t{font-size:13px;font-weight:650;color:var(--warn)}
.pl-refuse-w{margin:0;font-size:12.5px;line-height:1.9;color:var(--ink2);
             overflow:visible;max-height:none}
.pl-refuse-n{margin:9px 0 0;font-size:11.5px;line-height:1.85;color:var(--ink3)}
.pl-refuse-n b{color:var(--ink2);font-weight:650}

/* ── 图 ───────────────────────────────────────────────────── */
.pl-figs{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.pl-fig{min-width:0;border:1px solid var(--line);border-radius:var(--r-md);
        padding:10px 12px 6px;background:var(--panel)}
.pl-fig .fg-t{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--sp-2);margin-bottom:6px}
.pl-fig .fg-t b{font-size:12.5px;font-weight:650;color:var(--ink)}
.pl-fig .fg-t span{font-size:11px;color:var(--ink3);line-height:1.6}
.pl-dimbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 12px}
.pl-count{font-size:11px;color:var(--ink3)}
.pl-clo{margin:12px 0 0}

/* ── 表 ───────────────────────────────────────────────────── */
.pl-panel .tbl th.n,.pl-panel .tbl td.n{text-align:right}
.pl-panel .tbl td.n .dlt{white-space:nowrap}
.pl-panel .dim{color:var(--ink3);font-size:11px;margin-left:4px}
.pl-h4{margin:16px 0 8px;font-size:12.5px;font-weight:650;color:var(--ink2);
       letter-spacing:.02em}
.pl-h4:first-child{margin-top:0}
.pl-foot{margin:8px 0 0;font-size:11px;color:var(--ink3);line-height:1.8}
.pl-foot b{color:var(--ink2)}
.pl-nc td{background:var(--warn-soft)}
.pl-why-td{font-size:11.5px;line-height:1.75;color:var(--ink2);white-space:normal;min-width:260px}

/* 预测数：浅底 + 虚线下划，与 classic.js 滚动视图同一套语汇。
   颜色之外永远还有别的载体（表头写明、行标记、口径钉在页顶）—— 黑白打印
   与色觉障碍下这一屏的信息量不减。 */
.pl-fcast{background:var(--warn-soft);
          box-shadow:inset 0 -1px 0 var(--warn-line)}
.pl-locked td{opacity:.72}
.pl-instreak td{background:color-mix(in srgb,var(--warn-soft) 70%,transparent)}
.pl-mk{display:inline-block;font-size:9.5px;letter-spacing:.06em;border-radius:var(--r-pill);
       padding:1px 7px;margin-right:5px;border:1px solid var(--line-2);color:var(--ink3);
       background:var(--panel-2);white-space:nowrap}
.pl-mk.streak{background:var(--deny-soft);color:var(--bad);border-color:var(--deny-line);font-weight:650}
.pl-mk.lock{background:var(--panel-2);color:var(--ink3)}
.pl-mk.floor{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-line);font-weight:650}

/* ── 内生同比：同比桥的五行 ───────────────────────────────── */
.pl-obridge{display:flex;flex-direction:column;gap:1px;background:var(--line);
            border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.pl-obr{display:grid;grid-template-columns:170px 150px minmax(0,1fr);gap:12px;
        align-items:baseline;background:var(--panel);padding:10px 14px}
.pl-obr-l{font-size:12.5px;color:var(--ink);font-weight:600}
.pl-obr-v{font-size:14px}
.pl-obr-n{font-size:11px;color:var(--ink3);line-height:1.8}
.pl-obr.anch{background:var(--brand-soft)}
.pl-obr.anch .pl-obr-l{font-weight:700}
.pl-obr.nap{background:var(--panel-2)}
.pl-nap{font-size:12px;color:var(--ink3);border:1px dashed var(--line-2);
        border-radius:var(--r-pill);padding:1px 10px}
@media (max-width:760px){
  .pl-obr{grid-template-columns:1fr;gap:4px}
}
.pl-adjs{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
.pl-adj{border:1px solid var(--line);border-radius:var(--r-sm);padding:11px 13px;
        background:var(--panel-2)}
.pl-adj.no{border-color:var(--warn-line);background:var(--warn-soft)}
.pl-adj-h{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.pl-adj-h b{font-size:12.5px}
.pl-adj p{margin:0;font-size:11.5px;line-height:1.85;color:var(--ink2)}
.pl-reorg ul{margin:6px 0;padding-left:16px}
.pl-reorg li{margin:3px 0;line-height:1.8}
.pl-reorg p{margin:6px 0 0;line-height:1.8}

/* ── 统计离群：命中卡 ──────────────────────────────────────
   严重档只有左缘 3px 竖条 + 药丸，不铺底色（见文件头那一段）。 */
.pl-hit{border:1px solid var(--line);border-left:3px solid var(--line-2);
        border-radius:var(--r-sm);padding:12px 14px;background:var(--panel);
        margin:0 0 10px}
.pl-hit.warn{border-left-color:var(--warn)}
.pl-hit.crit{border-left-color:var(--bad)}
.pl-hit-h{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:7px}
.pl-hit.warn .al-sev{background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn-line)}
.pl-hit.crit .al-sev{background:var(--deny-soft);color:var(--bad);border:1px solid var(--deny-line)}
.pl-hit-r{font-size:11px;color:var(--ink3);letter-spacing:.02em}
.pl-hit-s{font-size:12.5px;font-weight:650;color:var(--ink)}
.pl-hit-p{font-size:11px;color:var(--ink3)}
.pl-hit-m{margin:0;font-size:12.5px;line-height:1.9;color:var(--ink)}
/* 方差下限那一段：措辞照响应给的原文，前端不拼「−17σ」式的结论。 */
.pl-floor{margin:8px 0 0;font-size:11.5px;line-height:1.85;color:var(--warn);
          background:var(--warn-soft);border:1px solid var(--warn-line);
          border-radius:var(--r-xs);padding:8px 11px}
.pl-hit .caliber{margin-top:10px}
.al-none.pl-blocked{background:var(--warn-soft);border-color:var(--warn-line);color:var(--warn);
                    display:block;line-height:1.85}
.al-none.pl-blocked p{margin:6px 0 0;color:var(--ink2);font-size:11.5px;line-height:1.9}
.al-none.pl-blocked b{font-weight:650}

/* 折叠开关 + 证据区 */
.pl-more{display:inline-flex;align-items:center;gap:7px;margin-top:9px;
         border:1px solid var(--line-2);background:var(--panel-2);color:var(--ink2);
         border-radius:var(--r-pill);padding:4px 12px;font-size:11.5px;cursor:pointer}
.pl-more:hover{border-color:var(--brand-border);color:var(--brand)}
.pl-more .pl-caret{transition:transform var(--dur-fast) var(--ease)}
.pl-more.on .pl-caret{transform:rotate(180deg)}
.pl-foldbox{margin-top:10px}
.pl-ev{display:grid;gap:1px;background:var(--line);border:1px solid var(--line);
       border-radius:var(--r-sm);overflow:hidden}
.pl-ev-r{display:grid;grid-template-columns:210px minmax(0,1fr);gap:12px;
         background:var(--panel);padding:8px 12px;align-items:baseline}
.pl-ev-r .k{font-size:11px;color:var(--ink3);line-height:1.7}
.pl-ev-r .v{font-size:12px;color:var(--ink2);line-height:1.8;min-width:0;overflow-wrap:anywhere}
@media (max-width:760px){
  .pl-ev-r{grid-template-columns:1fr;gap:3px}
}
/* 基线逐期值 / 对比成员 / 临界值表：可横滚，不换行挤成一团 */
.pl-seq{display:flex;flex-wrap:wrap;gap:6px}
.pl-seq>span{display:inline-flex;flex-direction:column;gap:1px;
             border:1px solid var(--line);border-radius:var(--r-xs);
             padding:3px 7px;background:var(--panel-2);min-width:74px}
.pl-seq>span.hit{border-color:var(--bad);background:var(--deny-soft)}
.pl-seq em{font-style:normal;font-size:9.5px;color:var(--ink3);letter-spacing:.02em}
.pl-seq b{font-size:11.5px;font-family:var(--mono);color:var(--ink)}
.pl-disc{display:block;color:var(--ink3);line-height:1.85}
.pl-bf{margin-top:4px}
.pl-und .pl-foldbox{margin-top:10px}

/* ── 窄屏 ─────────────────────────────────────────────────── */
@media (max-width:900px){
  .pl-head .pl-hr{margin-left:0;width:100%}
  .pl-tiles{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}
  .pl-cmp-s,.pl-cmp-m{flex:1 1 100%}
}

/* ══ 追加：两组口径并排 / 层级收敛 ══════════════════════════════ */

/* ── 预测质量：含锁定月 vs 剔除锁定月 ───────────────────────
   两张卡等宽并排，**谁也不是「默认」** —— 一旦有一张卡看起来更主要，
   另一张就等于没给。右边那张（事前预测能力）多一道靛蓝左缘，标的不是
   「更重要」而是「这一组才是证据」，与 caliber 里那句话对得上。 */
.pl-basis{display:grid;gap:10px;margin:0 0 12px;
          grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
.pl-basis-c{border:1px solid var(--line);border-radius:var(--r-md);
            background:var(--panel);padding:12px 14px;min-width:0;
            box-shadow:var(--shadow-sm)}
.pl-basis-c.evi{border-left:3px solid var(--brand)}
.pl-basis-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:9px;
            padding-bottom:8px;border-bottom:1px solid var(--line)}
.pl-basis-h b{font-size:12.5px;font-weight:650;color:var(--ink)}
.pl-basis-n{font-size:10.5px;color:var(--ink3);margin-left:auto}
.pl-basis-g{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}
.pl-bc{min-width:0}
.pl-bc .l{display:block;font-size:10px;color:var(--ink3);letter-spacing:.04em}
.pl-bc .v{display:block;font-size:19px;font-weight:650;letter-spacing:-.03em;margin-top:5px;
          color:var(--ink);font-family:var(--mono)}
.pl-bc .v .na{font-size:15px;font-weight:500}
.pl-bc .n{display:block;font-size:10px;color:var(--ink3);margin-top:4px;line-height:1.6}
.pl-basis-p{margin:8px 0 0;font-size:10.5px;color:var(--ink3);line-height:1.7}
.pl-basis-r{margin:8px 0 0;font-size:11.5px;line-height:1.85;color:var(--warn);
            background:var(--warn-soft);border:1px solid var(--warn-line);
            border-radius:var(--r-xs);padding:7px 10px}
.pl-basis-c2{margin:8px 0 0;font-size:10.5px;color:var(--ink3);line-height:1.8;
             padding-top:8px;border-top:1px solid var(--line)}
/* 分组排名表：两组口径各一段浅底，扫行时不会串组 */
.pl-gtbl th.pl-grp-a,.pl-gtbl td.pl-grp-a{background:var(--panel-2)}
.pl-gtbl th.pl-grp-b,.pl-gtbl td.pl-grp-b{background:var(--brand-soft)}
.pl-gtbl thead th{vertical-align:bottom}

/* ── 统计离群：收敛 ─────────────────────────────────────── */
.pl-conv{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px}
.pl-conv>b{font-size:12.5px;color:var(--ink);font-weight:650}
.pl-conv-n{font-size:11.5px;color:var(--ink2)}
.pl-conv-n b{color:var(--ink);font-weight:650}
.pl-conv p{flex:1 1 100%;margin:2px 0 0;font-size:11px;line-height:1.85;color:var(--ink3)}

.pl-rl{border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;
       background:var(--panel-2);margin:0 0 12px}
.pl-rl.crit{border-color:var(--deny-line)}
.pl-rl.warn{border-color:var(--warn-line)}
.pl-rl-top{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:7px}
.pl-rl.warn .al-sev{background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn-line)}
.pl-rl.crit .al-sev{background:var(--deny-soft);color:var(--bad);border:1px solid var(--deny-line)}
.pl-rl-rule{font-size:12.5px;font-weight:650;color:var(--ink)}
.pl-rl-dir{font-size:10.5px;color:var(--ink3);border:1px solid var(--line-2);
           border-radius:var(--r-pill);padding:1px 8px}
.pl-rl-lone{font-size:9.5px;letter-spacing:.08em;font-weight:650;color:var(--brand);
            background:var(--brand-soft);border:1px solid var(--brand-border);
            border-radius:var(--r-pill);padding:1px 8px}
.pl-rl-n{font-size:11px;color:var(--ink3);margin-left:auto}
.pl-rl-say{margin:0 0 10px;font-size:12.5px;line-height:1.9;color:var(--ink2)}
.pl-rl-cri{margin:8px 0 0;font-size:10.5px;line-height:1.8;color:var(--ink3)}
.pl-rl .pl-hit{background:var(--panel)}
/* 收起的那几条展开后压一档，读者一眼知道自己在看「下级表现」而不是新发现；
   但**只压背景不压内容**：证据、口径、数值一个不少。 */
.pl-hit.r-folded{background:var(--panel-2)}
.pl-role{font-size:9.5px;letter-spacing:.06em;border-radius:var(--r-pill);
         padding:1px 8px;border:1px solid var(--line-2);color:var(--ink3);
         background:var(--panel);white-space:nowrap}
.pl-role.lead{border-color:var(--brand-border);background:var(--brand-soft);
              color:var(--brand);font-weight:650}
.pl-role.standout{border-color:var(--deny-line);background:var(--deny-soft);
                  color:var(--bad);font-weight:650}

/* ── 导出条 ───────────────────────────────────────────────
   chip 旁边永远跟着「导的是这一份：…」那一行，两者由同一个参数列表渲染。
   它不是装饰：导出文件会离开系统流转，「这份文件是哪一版预算的差异」必须
   在点下去之前就看得见 —— 文件本身不会提示这件事。 */
.pl-exp{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 14px;
        border:1px solid var(--line);border-radius:var(--r-md);
        background:var(--panel);padding:9px 12px}
.pl-exp-w{font-size:10.5px;color:var(--ink3);letter-spacing:.06em}
.pl-exp-l{display:flex;flex-wrap:wrap;gap:6px;min-width:0}
.pl-exp-l>span{display:inline-flex;align-items:baseline;gap:5px;font-size:11px;
               color:var(--ink2);background:var(--panel-2);border:1px solid var(--line);
               border-radius:var(--r-xs);padding:2px 8px;font-family:var(--mono)}
.pl-exp-l em{font-style:normal;color:var(--ink3);font-size:9.5px;letter-spacing:.04em;
             font-family:-apple-system,BlinkMacSystemFont,"PingFang SC",sans-serif}
.pl-exp-n{flex:1 1 100%;font-size:10.5px;color:var(--ink3);line-height:1.7}

/* ── 两组同义时合成的那一张卡 ─────────────────────────────
   判据来自服务端（excluding.identical_to_including），不是前端比数字得出的。
   合成之后它是整行一张，不留一个空半栏 —— 空半栏会被读成「另一组没算出来」。 */
.pl-basis.one{grid-template-columns:minmax(0,1fr)}
/* 算不出的那一格：数值位仍然只放「—」，理由整段印在下面，不截断、不折进
   title。「为什么这一格没有数」和「这一格是多少」一样要能被逐字读到。 */
.pl-bc.na .v{color:var(--ink3);font-weight:500}
.pl-bc .r{display:block;font-size:10.5px;line-height:1.75;color:var(--warn);margin-top:5px;
          background:var(--warn-soft);border:1px solid var(--warn-line);
          border-radius:var(--r-xs);padding:5px 8px;overflow:visible;max-height:none}
.pl-basis-m{margin:0 0 10px;font-size:11px;line-height:1.85;color:var(--ink2);
            background:var(--brand-soft);border:1px solid var(--brand-border);
            border-radius:var(--r-xs);padding:7px 10px}
