/* ===========================================================
   投标全周期经营监控看板 — 商务浅蓝主题（白底清爽）
   三栏布局：左（漏斗/时间轴）· 中（投入产出/签约移交）· 右（风险/决策）
   =========================================================== */

:root{
  color-scheme: light;

  /* 底层与容器 */
  --bg:#F1F5FB;           /* 页面底：浅蓝灰 */
  --bg-elev:#FFFFFF;      /* 顶栏 / 抽屉头 */
  --surface:#FFFFFF;      /* 卡片 */
  --surface-2:#F8FAFC;    /* 卡片内嵌套块 */
  --surface-3:#EFF3F9;    /* hover / 表头 */

  /* 文字与边框 */
  --text:#334155;
  --text-strong:#0F172A;
  --muted:#54637A;      /* 次级文字（白底 6.1:1） */
  --muted-dim:#6B7C93;  /* 三级说明文字（白底 4.3:1） */
  --border:#E4EAF3;       /* 浅蓝调边框 */
  --border-strong:#C8D4E4;

  /* 主品牌与语义色（均为白底可读的深色版，兼顾边框与文字两种用法） */
  --brand:#2563EB;
  --brand-strong:#1D4ED8;
  --brand-soft:#EFF6FF;
  --brand-border:#BFDBFE;

  --opp:#2563EB;        /* 商机阶段 */
  --review:#4F46E5;     /* 评审决策 */
  --exec:#EA580C;       /* 投标执行 */
  --award:#16A34A;      /* 中标签约 */
  --watch:#B45309;      /* 关注 */
  --warn:#C2410C;       /* 预警 */
  --danger:#DC2626;     /* 严重风险 */
  --ok:#15803D;

  /* 语义色的浅底/浅框（用于标签、徽标底色） */
  --tint-danger-bg:#FEF2F2;  --tint-danger-fg:#B91C1C;  --tint-danger-bd:#FECACA;
  --tint-warn-bg:#FFF7ED;    --tint-warn-fg:#C2410C;    --tint-warn-bd:#FED7AA;
  --tint-watch-bg:#FFFBEB;   --tint-watch-fg:#B45309;   --tint-watch-bd:#FDE68A;
  --tint-ok-bg:#F0FDF4;      --tint-ok-fg:#15803D;      --tint-ok-bd:#BBF7D0;

  --radius:8px;
  --radius-sm:6px;
  --shadow:0 1px 2px rgba(15,23,42,.05), 0 1px 3px rgba(15,23,42,.04);
  --shadow-md:0 4px 14px rgba(15,23,42,.10);
  --shadow-lg:0 12px 32px rgba(15,23,42,.16);
}

*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{
  background:var(--bg);
  color:var(--text);
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Segoe UI",Roboto,sans-serif;
  font-size:13px;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4,p{margin:0;}
button{font-family:inherit;}
b,strong{font-weight:600;}
.icon{display:inline-block;vertical-align:-2px;flex:none;}

/* 滚动条 */
::-webkit-scrollbar{width:8px;height:8px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:4px;}
::-webkit-scrollbar-thumb:hover{background:#A9B6C9;}

/* ---------- 骨架 ---------- */
.app{max-width:2200px;margin:0 auto;padding:20px 22px 26px;}

/* ===========================================================
   驾驶舱栅格（自然高度 · 整页滚动，卡片内部不出现滚动条）
   说明：不再把页面锁死在一屏内——三栏按内容自然撑开，
        由浏览器主滚动条统一上下滚动，各栏/各卡片均不设内部滚动。
        左栏：全周期漏斗；中栏：经营分析；右栏：风险监控。
   =========================================================== */
.cockpit{
  display:grid;
  grid-template-columns:336px minmax(0,1fr) 380px;
  grid-template-areas:"left center right";
  gap:24px;
  margin-top:12px;
  align-items:start;
}
.col--left{grid-area:left;}
.col--center{grid-area:center;}
.col--right{grid-area:right;}
.col{display:flex;flex-direction:column;gap:24px;min-width:0;}
/* 左栏（漏斗）与右栏（风险）撑满行高：两列卡片等高，避免宽屏下大片留白 */
.col--left,.col--center,.col--right{align-self:stretch;}
.col--left .section,.col--center .section,.col--right .section{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;}
.col--left .card,.col--center > .section > .card,.col--right .card{flex:1 1 auto;display:flex;flex-direction:column;}
.col--left .funnel{flex:1 1 auto;display:flex;flex-direction:column;}
/* 单层层高有上限，避免行数少时被过度拉伸 */
.col--left .fnl-step{flex:1 1 0;height:auto;min-height:52px;max-height:104px;}
/* 风险内容不足行高时，把「更多」区推到卡片底部 */
.col--right .risk-more{margin-top:auto;}
@media (max-width:1599px){
  .cockpit{grid-template-columns:300px minmax(0,1fr) 320px;}
}
@media (max-width:1279px){
  .cockpit{grid-template-columns:320px minmax(0,1fr);grid-template-areas:"left right" "center center";}
  .col--center{grid-area:center;}
}
@media (max-width:1079px){
  .cockpit{grid-template-columns:minmax(0,1fr);grid-template-areas:"left" "center" "right";}
}

/* ---------- 底部通栏（重点投标项目表，占满整行） ----------
   不再限高、不做表体内部滚动：全部项目行一次性铺开，随整页滚动查看 */
/* 注意：必须写成 .section.board-full，否则会被后面的 .section{margin:0} 覆盖 */
.section.board-full{margin-top:12px;}

/* ---------- 通用面板 ---------- */
.section{margin:0;}
.section__head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:16px;flex-wrap:wrap;}
.section__title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;letter-spacing:.3px;color:var(--text-strong);}
.section__title .icon{color:var(--brand-strong);}
.section__desc{font-size:11px;color:var(--muted-dim);margin-top:2px;line-height:1.5;}
.section__tools{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}

.card,.panel{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow);
}
.card__pad{padding:16px 18px;}

/* ---------- 卡片标题区 ----------
   标题统一落在白底卡片上，作为卡片头部，与内容之间用一条分隔线区分 */
.card > .section__head{padding-bottom:11px;margin-bottom:13px;border-bottom:1px solid var(--border);}
/* 无内边距的卡片（如项目表）：标题区自带左右内边距 */
.card--flush > .section__head{padding:13px 16px 11px;}
/* 分组大卡：内部子卡不再重复投影，避免嵌套阴影堆叠 */
.card--group > .card,.card--group .roi-grid > .card{box-shadow:none;}

/* ============================ 顶部栏 ============================ */
.topbar{
  background:var(--bg-elev);
  border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:14px 18px;
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
}
.topbar__brand{display:flex;align-items:center;gap:11px;}
.topbar__logo{
  width:36px;height:36px;border-radius:var(--radius-sm);
  background:var(--brand-soft);border:1px solid var(--brand-border);
  color:var(--brand-strong);display:flex;align-items:center;justify-content:center;flex:none;
}
.topbar__title{font-size:18px;font-weight:650;letter-spacing:.4px;color:var(--text-strong);}
.topbar__sub{font-size:11px;color:var(--muted);display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:1px;}
.topbar__sub b{color:var(--text);font-weight:600;}
.dot{color:#B4C3D6;}
.topbar__right{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}

/* ---------- 控件 ---------- */
.btn{
  display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 11px;
  border-radius:var(--radius-sm);border:1px solid var(--border-strong);
  background:#fff;color:var(--text);font-size:12.5px;cursor:pointer;
  transition:all .15s ease;white-space:nowrap;
}
.btn:hover{background:var(--surface-3);border-color:var(--brand);}
.btn--primary{background:var(--brand);border-color:var(--brand);color:#fff;}
.btn--primary:hover{background:#1D4ED8;border-color:#1D4ED8;}
.btn--ghost{background:var(--surface-2);}
.btn--sm{height:26px;padding:0 9px;font-size:12px;}
.btn--danger{color:var(--tint-danger-fg);border-color:var(--tint-danger-bd);background:var(--tint-danger-bg);}
.btn--danger:hover{background:#FEE2E2;}
.btn--ok{color:var(--tint-ok-fg);border-color:var(--tint-ok-bd);background:var(--tint-ok-bg);}
.btn--ok:hover{background:#DCFCE7;}
.btn[disabled]{opacity:.5;cursor:not-allowed;}
.btn--link{border:none;background:none;color:var(--brand-strong);padding:0;height:auto;font-size:12px;}
.btn--link:hover{background:none;text-decoration:underline;}

.select,.input,.textarea{
  height:30px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);
  background:#fff;color:var(--text);font-size:12.5px;padding:0 8px;outline:none;
  font-family:inherit;min-width:120px;
}
.select:focus,.input:focus,.textarea:focus{border-color:var(--brand);box-shadow:0 0 0 2px rgba(59,130,246,.18);}
option{background:#fff;color:var(--text);}

.demo-picker{
  display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--muted);
  border:1px dashed var(--border-strong);border-radius:var(--radius-sm);padding:3px 8px;
}
.demo-picker select{border:none;background:transparent;color:var(--text);font-size:11.5px;outline:none;height:auto;min-width:auto;}

/* tooltip */
[data-tip]{position:relative;}
[data-tip]:hover::after{
  content:attr(data-tip);
  position:absolute;bottom:calc(100% + 8px);right:0;
  background:#0F172A;color:#F1F5F9;font-size:12px;line-height:1.45;
  padding:6px 9px;border-radius:6px;border:1px solid #334155;
  white-space:pre-wrap;max-width:270px;width:max-content;
  z-index:60;box-shadow:var(--shadow-md);pointer-events:none;
}
[data-tip]:hover::before{
  content:"";position:absolute;bottom:calc(100% + 3px);right:12px;
  border:5px solid transparent;border-top-color:#334155;z-index:60;pointer-events:none;
}

/* ---------- 筛选栏 ---------- */
.filters{
  margin-top:20px;background:var(--bg-elev);border:1px solid var(--border);
  border-radius:var(--radius);padding:14px 16px;
}
.filters__row{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-end;}
.filter-group{display:flex;flex-direction:column;gap:3px;min-width:118px;}
.filter-group--end{margin-left:auto;min-width:auto;}
.filter-label{font-size:10.5px;color:var(--muted-dim);letter-spacing:.4px;}
.segmented{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden;height:30px;}
.seg{border:none;background:var(--surface-2);padding:0 11px;font-size:12.5px;color:var(--muted);cursor:pointer;border-right:1px solid var(--border);}
.seg:last-child{border-right:none;}
.seg.is-active{background:var(--brand-soft);color:var(--brand-strong);font-weight:600;}
.filters__chips{display:flex;gap:7px;flex-wrap:wrap;margin-top:8px;}
.chip{
  display:inline-flex;align-items:center;gap:5px;font-size:11.5px;
  background:var(--brand-soft);color:var(--brand-strong);border:1px solid var(--brand-border);
  border-radius:999px;padding:2px 8px;
}
.chip button{border:none;background:none;color:inherit;cursor:pointer;padding:0;display:flex;}
.chip--stage{background:#EEF2FF;color:#4338CA;border-color:#C7D2FE;}
.chip--risk{background:var(--tint-danger-bg);color:var(--tint-danger-fg);border-color:var(--tint-danger-bd);}

/* ============================ 结论条 ============================ */
.conclusion{
  background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--brand);
  border-radius:var(--radius);box-shadow:var(--shadow);padding:13px 16px;
  display:flex;gap:12px;align-items:flex-start;margin-top:20px;
}
.conclusion__icon{color:var(--brand-strong);margin-top:2px;}
.conclusion__body{flex:1;min-width:0;}
.conclusion__text{font-size:13.5px;line-height:1.65;color:var(--text);}
.conclusion__meta{margin-top:6px;display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--muted);}
.conclusion__meta b{color:var(--text-strong);font-weight:600;}

/* 结论数字高亮（不同颜色提醒）：蓝=中性总量 · 绿=利好/上升 · 橙=临近/偏低 · 红=风险 */
.kc{font-weight:700;font-variant-numeric:tabular-nums;}
.kc--brand{color:var(--brand-strong);}
.kc--up{color:var(--ok);}
.kc--down{color:var(--danger);}
.kc--warn{color:var(--tint-warn-fg);}
.kc--danger{color:var(--tint-danger-fg);}

/* ============================ KPI 指标条 ============================ */
.kpi-strip{margin-top:20px;}
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:12px;}
.kpi{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  padding:8px 12px;display:flex;flex-direction:column;gap:3px;cursor:pointer;
  transition:border-color .15s ease,background .15s ease;position:relative;overflow:hidden;
}
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--brand);opacity:.55;}
.kpi:hover{border-color:var(--border-strong);background:var(--surface-2);}
.kpi__top{display:flex;align-items:center;justify-content:space-between;gap:5px;min-width:0;}
.kpi__label{font-size:11px;color:var(--muted);display:flex;align-items:center;gap:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.kpi__label .icon{color:var(--muted-dim);}
.kpi__value{font-size:19px;font-weight:700;letter-spacing:-.4px;line-height:1.12;color:var(--text-strong);font-variant-numeric:tabular-nums;white-space:nowrap;}
.kpi__value small{font-size:11px;font-weight:500;color:var(--muted);margin-left:2px;}
.kpi__row{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;min-width:0;overflow:hidden;font-size:11px;}
.kpi__compare{color:var(--muted-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.trend{display:inline-flex;align-items:center;gap:2px;font-weight:600;font-size:11.5px;}
.trend--up{color:var(--ok);}
.trend--down{color:var(--danger);}
.trend--flat{color:var(--muted);}
.kpi__note{font-size:11px;color:var(--muted-dim);line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.kpi__foot{display:flex;align-items:center;justify-content:space-between;gap:4px;margin-top:0;padding-top:4px;border-top:1px dashed var(--border);white-space:nowrap;overflow:hidden;}
.kpi__foot>span{font-size:11px;color:var(--brand-strong);overflow:hidden;text-overflow:ellipsis;}
.kpi__foot .tag{flex:none;font-size:10px;padding:0 5px;}

/* ---------- 标签 ---------- */
.tag{
  display:inline-flex;align-items:center;gap:4px;font-size:11px;line-height:1.55;
  padding:1px 7px;border-radius:4px;border:1px solid transparent;white-space:nowrap;
}
.tag--sample{background:#F1F5F9;color:var(--muted);border-color:var(--border);}
.tag--brand{background:var(--brand-soft);color:var(--brand-strong);border-color:var(--brand-border);}
.tag--opp{background:var(--brand-soft);color:var(--brand-strong);border-color:var(--brand-border);}
.tag--review{background:#EEF2FF;color:#4338CA;border-color:#C7D2FE;}
.tag--exec{background:var(--tint-warn-bg);color:var(--tint-warn-fg);border-color:var(--tint-warn-bd);}
.tag--award{background:var(--tint-ok-bg);color:var(--tint-ok-fg);border-color:var(--tint-ok-bd);}
.tag--watch{background:var(--tint-watch-bg);color:var(--tint-watch-fg);border-color:var(--tint-watch-bd);}
.tag--warn{background:var(--tint-warn-bg);color:var(--tint-warn-fg);border-color:var(--tint-warn-bd);}
.tag--danger{background:var(--tint-danger-bg);color:var(--tint-danger-fg);border-color:var(--tint-danger-bd);}
.tag--muted{background:#F1F5F9;color:var(--muted);border-color:var(--border);}
.tag--ok{background:var(--tint-ok-bg);color:var(--tint-ok-fg);border-color:var(--tint-ok-bd);}

.pill{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:1px 7px;border-radius:999px;border:1px solid var(--border);color:var(--muted);background:var(--surface-2);}

/* ---------- 漏斗（左栏·倒梯形分层漏斗，逐层收窄 + 每层纯色） ---------- */
.funnel{display:flex;flex-direction:column;gap:3px;padding:2px 0;}
.fnl-step{
  position:relative;height:46px;cursor:pointer;border-radius:2px;
  transition:transform .12s ease;
}
.fnl-step:hover{transform:scale(1.012);}
/* 梯形：--top / --bot 为该层顶边与底边宽度百分比，相邻层首尾相接形成连续漏斗 */
.fnl-band{
  position:absolute;inset:0;
  clip-path:polygon(
    calc(50% - var(--top) * .5%) 0,
    calc(50% + var(--top) * .5%) 0,
    calc(50% + var(--bot) * .5%) 100%,
    calc(50% - var(--bot) * .5%) 100%
  );
  transition:filter .15s ease;
}
.fnl-step:hover .fnl-band{filter:brightness(1.07);}
.fnl-step.is-active .fnl-band{filter:brightness(.92) saturate(1.06);}
/* 层内文字锁定在色块内（取该层中间高度处的可用宽度） */
.fnl-txt{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:calc((var(--top) + var(--bot)) / 2 * 1% - 12px);
  text-align:center;pointer-events:none;z-index:1;
  color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.28);
}
.fnl-txt__main{display:flex;align-items:baseline;justify-content:center;gap:5px;white-space:nowrap;overflow:hidden;}
.fnl-name{font-size:11.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;}
.fnl-step.is-active .fnl-name{font-weight:800;text-decoration:underline;text-underline-offset:2px;}
.fnl-count{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;flex:none;}
.fnl-count small{font-size:9.5px;font-weight:600;opacity:.72;margin-left:1px;}
.fnl-txt__sub{
  font-size:10px;font-weight:500;opacity:.85;margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* 超期角标：图标 + 文字，不依赖颜色单独表达 */
.fnl-badge{
  position:absolute;right:0;top:3px;z-index:2;display:inline-flex;align-items:center;gap:2px;
  font-size:9.5px;font-weight:600;height:15px;padding:0 4px;border-radius:3px;
  background:#FEE2E2;border:1px solid #FCA5A5;color:#B91C1C;
}
.fnl-check{
  position:absolute;left:0;top:3px;z-index:2;display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:3px;
  background:#DBEAFE;border:1px solid #93C5FD;color:#1D4ED8;
}

.countdown{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;padding:2px 7px;border-radius:4px;}
.countdown--danger{background:var(--tint-danger-bg);color:var(--tint-danger-fg);border:1px solid var(--tint-danger-bd);}
.countdown--warn{background:var(--tint-warn-bg);color:var(--tint-warn-fg);border:1px solid var(--tint-warn-bd);}
.countdown--watch{background:var(--tint-watch-bg);color:var(--tint-watch-fg);border:1px solid var(--tint-watch-bd);}
.countdown--flat{background:#F1F5F9;color:var(--muted);border:1px solid var(--border);}

/* ---------- 表格 ---------- */
.table-wrap{overflow-x:auto;}
table.tbl{width:100%;border-collapse:collapse;font-size:12.5px;}
table.tbl th,table.tbl td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border);white-space:nowrap;}
table.tbl thead th{
  background:var(--surface-3);color:var(--muted);font-weight:600;font-size:11.5px;
  position:sticky;top:0;z-index:2;border-bottom:1px solid var(--border-strong);
}
table.tbl th.sortable{cursor:pointer;user-select:none;}
table.tbl th.sortable:hover{color:var(--brand-strong);}
table.tbl th .sort-ind{opacity:.35;margin-left:3px;}
table.tbl th.is-sorted .sort-ind{opacity:1;color:var(--brand-strong);}
table.tbl tbody tr{cursor:pointer;}
table.tbl tbody tr:nth-child(even){background:#FAFBFE;}
table.tbl tbody tr:hover{background:var(--brand-soft);}
table.tbl tbody tr.is-selected{background:#DBEAFE;}
table.tbl td.num{text-align:right;font-variant-numeric:tabular-nums;}
table.tbl th.num{text-align:right;}
.tbl-name{display:flex;flex-direction:column;gap:1px;}
.tbl-name b{font-weight:600;color:var(--text-strong);}
.tbl-name span{font-size:11px;color:var(--muted-dim);white-space:normal;max-width:280px;}
.empty{padding:40px 16px;text-align:center;color:var(--muted-dim);font-size:12.5px;}
.empty .icon{display:block;margin:0 auto 8px;color:var(--border-strong);}

/* ---------- 风险 ---------- */
.risk-level{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;}
.risk-level--danger{color:var(--tint-danger-fg);}
.risk-level--warn{color:var(--tint-warn-fg);}
.risk-level--watch{color:var(--tint-watch-fg);}

/* ---------- 投入产出 ---------- */
.roi-grid{display:flex;flex-direction:column;gap:17px;}
.cost-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(146px,1fr));gap:13px;}
.cost-card{border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 13px;background:var(--surface-2);}
.cost-card__label{font-size:11px;color:var(--muted);display:flex;align-items:center;gap:5px;}
.cost-card__value{font-size:17px;font-weight:700;margin-top:3px;color:var(--text-strong);font-variant-numeric:tabular-nums;}
.cost-card__value small{font-size:11px;color:var(--muted);font-weight:500;margin-left:2px;}
.bars{display:flex;flex-direction:column;gap:12px;}
.bar-row{display:grid;grid-template-columns:76px 1fr 96px;gap:8px;align-items:center;font-size:11.5px;}
.bar-track{height:7px;background:#E2E8F0;border-radius:4px;overflow:hidden;}
.bar-fill{height:100%;border-radius:4px;background:var(--brand);}
.bar-fill--exec{background:var(--exec);}
.bar-fill--award{background:var(--award);}
.bar-fill--review{background:var(--review);}
.bar-row__val{text-align:right;color:var(--muted);font-variant-numeric:tabular-nums;}
.bar-row__val b{color:var(--text-strong);}

/* ---------- 中标率分析（页签卡片） ---------- */
.rate-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px;}
.rate-head .dsec__title{margin-bottom:0;padding-bottom:0;border-bottom:none;}
.rate-tabs{display:inline-flex;gap:3px;padding:3px;background:var(--surface-3);border:1px solid var(--border);border-radius:var(--radius-sm);}
.rate-tab{
  border:none;background:transparent;padding:5px 13px;font-size:12px;line-height:1.2;color:var(--muted);
  cursor:pointer;border-radius:5px;display:inline-flex;align-items:center;gap:5px;transition:all .15s ease;
}
.rate-tab:hover{color:var(--text);}
.rate-tab.is-active{background:var(--surface);color:var(--brand-strong);font-weight:600;box-shadow:0 1px 2px rgba(15,23,42,.10);}
.rate-panel.is-hidden{display:none;}
.rate-note{
  margin-top:12px;padding:9px 11px;border:1px dashed var(--border-strong);border-radius:var(--radius-sm);
  background:var(--surface-2);font-size:11.5px;line-height:1.7;color:var(--muted);
}
.rate-note b{color:var(--text-strong);font-variant-numeric:tabular-nums;}

/* ---------- 风险卡片清单（右栏） ---------- */
/* 精简版：项目+类型 / 问题（单行）/ 建议+责任人，控制卡片高度 */
.risk-list{display:flex;flex-direction:column;gap:9px;}
.risk-card{
  border:1px solid var(--border);border-left:3px solid var(--border-strong);border-radius:var(--radius-sm);
  background:var(--surface-2);padding:9px 12px;cursor:pointer;
  display:flex;flex-direction:column;gap:5px;transition:background .15s ease;
}
.risk-card:hover{background:var(--surface-3);border-color:var(--border-strong);}
.risk-card--danger{border-left-color:var(--danger);}
.risk-card--warn{border-left-color:var(--warn);}
.risk-card--watch{border-left-color:var(--watch);}
.risk-card__head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;}
.risk-card__head b{font-size:12.5px;color:var(--text-strong);}
.risk-card__problem{
  font-size:12px;color:var(--text);line-height:1.5;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.risk-card__meta{font-size:11px;color:var(--muted-dim);display:inline-flex;align-items:center;gap:4px;flex:none;}
.risk-card__foot{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:11px;min-width:0;}
.risk-card__action{
  font-size:11.5px;color:var(--brand-strong);display:flex;gap:5px;align-items:center;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.risk-card__action .icon{flex:none;}
/* ---------- 风险「更多」入口 ---------- */
.risk-more{
  margin-top:12px;padding-top:11px;border-top:1px dashed var(--border);
  display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
}
.risk-more__hint{font-size:11px;color:var(--muted-dim);}
.risk-list--modal{gap:11px;}

/* ============================ 抽屉 ============================ */
.drawer-mask{position:fixed;inset:0;background:rgba(15,23,42,.42);z-index:80;animation:fade .15s ease;}
.drawer{
  position:fixed;top:0;right:0;height:100%;width:min(580px,100%);background:var(--surface);
  border-left:1px solid var(--border-strong);
  z-index:81;box-shadow:var(--shadow-lg);display:flex;flex-direction:column;animation:slidein .2s ease;
}
@keyframes slidein{from{transform:translateX(24px);opacity:.6;}to{transform:translateX(0);opacity:1;}}
@keyframes fade{from{opacity:0;}to{opacity:1;}}
.drawer__head{padding:15px 18px;border-bottom:1px solid var(--border);display:flex;align-items:flex-start;justify-content:space-between;gap:12px;background:var(--bg-elev);}
.drawer__title{font-size:15.5px;font-weight:650;color:var(--text-strong);}
.drawer__sub{font-size:11.5px;color:var(--muted);margin-top:4px;display:flex;gap:7px;flex-wrap:wrap;align-items:center;}
.drawer__body{flex:1;overflow-y:auto;padding:16px 18px 36px;}
.drawer__foot{padding:10px 14px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end;background:var(--bg-elev);}
.icon-btn{
  width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);
  background:var(--surface-2);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--muted);
}
.icon-btn:hover{background:var(--surface-3);color:var(--text);}

.dsec{margin-bottom:22px;}
.dsec__title{
  font-size:11.5px;font-weight:600;color:var(--muted);letter-spacing:.5px;
  padding-bottom:5px;border-bottom:1px solid var(--border);margin-bottom:8px;
  display:flex;align-items:center;gap:6px;
}
.dgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 18px;font-size:12.5px;}
.dgrid div{display:flex;justify-content:space-between;gap:10px;}
.dgrid span{color:var(--muted);}
.dgrid b{font-weight:600;text-align:right;color:var(--text-strong);}
.kv-full{grid-column:1 / -1;}

.ms{position:relative;padding-left:16px;}
.ms::before{content:"";position:absolute;left:4px;top:4px;bottom:4px;width:1px;background:var(--border);}
.ms-item{position:relative;padding:0 0 15px;}
.ms-item::before{content:"";position:absolute;left:-16px;top:5px;width:9px;height:9px;border-radius:50%;background:var(--surface);border:2px solid var(--border-strong);}
.ms-item.is-done::before{border-color:var(--ok);background:var(--ok);}
.ms-item.is-current::before{border-color:var(--brand);background:var(--brand);box-shadow:0 0 0 3px rgba(59,130,246,.2);}
.ms-item.is-slow::before{border-color:var(--danger);background:var(--surface);}
.ms-item__name{font-size:12.5px;font-weight:500;color:var(--text-strong);display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.ms-item__meta{font-size:11px;color:var(--muted-dim);margin-top:2px;}

.check-list{display:flex;flex-direction:column;gap:9px;}
.check-item{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;padding:9px 11px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-2);}
.check-item__name{flex:1;color:var(--text);}
.check-item__meta{font-size:11px;color:var(--muted-dim);}
.mini-table{width:100%;border-collapse:collapse;font-size:12px;}
.mini-table th,.mini-table td{padding:8px 10px;border-bottom:1px solid var(--border);text-align:left;}
.mini-table th{color:var(--muted);font-weight:600;background:var(--surface-3);}
.mini-table td.num{text-align:right;font-variant-numeric:tabular-nums;}

/* ============================ 弹窗 ============================ */
.modal-mask{position:fixed;inset:0;background:rgba(15,23,42,.42);z-index:90;display:flex;align-items:center;justify-content:center;padding:20px;animation:fade .15s ease;}
.modal{
  background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius);
  width:min(680px,100%);max-height:90vh;display:flex;flex-direction:column;box-shadow:var(--shadow-lg);animation:slidein .2s ease;
}
.modal__head{padding:12px 14px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:flex-start;gap:12px;background:var(--bg-elev);}
.modal__body{padding:18px;overflow-y:auto;}
.modal__foot{padding:11px 14px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px;background:var(--bg-elev);}
.modal--risk{width:min(760px,100%);}
.modal--risk .modal__body{padding:14px 16px;}
.modal--risk .modal__foot{justify-content:space-between;align-items:center;}
.modal--roi{width:min(1000px,100%);}
.modal--roi .modal__body{padding:14px 16px;}
.modal--roi .modal__foot{justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;}

/* ---------- Toast ---------- */
.toast-root{position:fixed;right:18px;bottom:18px;z-index:120;display:flex;flex-direction:column;gap:8px;}
.toast{
  background:var(--surface-3);color:var(--text);font-size:12.5px;padding:9px 12px;border-radius:var(--radius-sm);
  border:1px solid var(--border-strong);box-shadow:var(--shadow-md);display:flex;align-items:center;gap:8px;
  animation:slidein .15s ease;max-width:340px;
}
.toast .icon{color:var(--ok);}

/* ---------- 骨架 / 错误 ---------- */
.skeleton{background:linear-gradient(90deg,#EDF1F7 25%,#F8FAFC 37%,#EDF1F7 63%);background-size:400% 100%;animation:shimmer 1.2s ease infinite;border-radius:6px;}
@keyframes shimmer{0%{background-position:100% 50%;}100%{background-position:0 50%;}}
.sk-block{height:14px;margin-bottom:12px;}
.sk-card{height:96px;border-radius:var(--radius);margin-bottom:20px;}
.error-panel{
  background:var(--surface);border:1px solid var(--tint-danger-bd);border-radius:var(--radius);padding:26px 16px;text-align:center;box-shadow:var(--shadow);
}
.error-panel .icon{color:var(--danger);}
.error-panel h3{font-size:15px;margin:10px 0 6px;color:var(--text-strong);}
.error-panel p{font-size:12.5px;color:var(--muted);margin-bottom:14px;}

/* ---------- 页脚 ---------- */
.footer{
  margin-top:10px;padding:8px 12px;border-top:1px solid var(--border);
  font-size:11.5px;color:var(--muted-dim);display:flex;gap:8px;align-items:center;flex-wrap:wrap;
}

/* ===========================================================
   密度切换：宽松（默认，桌面阅读）/ 紧凑（大屏投屏）
   =========================================================== */
body.is-compact .app{padding:10px 14px 14px;}
body.is-compact .cockpit{gap:12px;margin-top:8px;}
body.is-compact .col{gap:12px;}
body.is-compact .board-full{margin-top:8px;}
body.is-compact .section__head{margin-bottom:9px;}
body.is-compact .card__pad{padding:12px 13px;}
body.is-compact .topbar{padding:10px 14px;}
body.is-compact .filters{margin-top:10px;padding:9px 12px;}
body.is-compact .conclusion{margin-top:10px;padding:10px 14px;}
body.is-compact .kpi-strip{margin-top:10px;}
body.is-compact .kpi-grid{gap:9px;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));}
body.is-compact .kpi{padding:9px 11px;gap:3px;}
body.is-compact .funnel{gap:2px;}
body.is-compact .fnl-step{height:38px;}
body.is-compact .fnl-txt__sub{font-size:9.5px;}
body.is-compact table.tbl th,body.is-compact table.tbl td{padding:7px 9px;}
body.is-compact .risk-list{gap:8px;}
body.is-compact .risk-card{padding:9px 10px;gap:5px;}
body.is-compact .rate-head{margin-bottom:9px;}
body.is-compact .rate-tab{padding:4px 11px;}
body.is-compact .rate-note{margin-top:9px;padding:7px 9px;}
body.is-compact .roi-grid{gap:12px;}
body.is-compact .cost-cards{gap:9px;}
body.is-compact .cost-card{padding:9px 11px;}
body.is-compact .bars{gap:8px;}
body.is-compact .dsec{margin-bottom:16px;}
body.is-compact .drawer__body{padding:12px 14px 30px;}
body.is-compact .ms-item{padding:0 0 11px;}
body.is-compact .check-list{gap:6px;}
body.is-compact .sk-card{margin-bottom:12px;}

/* ---------- 响应式 ---------- */
@media (max-width:1079px){
  .topbar{flex-direction:column;align-items:flex-start;}
  .topbar__right{width:100%;}
  .btn{flex:1;justify-content:center;}
  .demo-picker{width:100%;justify-content:space-between;}
  .kpi-grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));}
  .dgrid{grid-template-columns:1fr;}
  .drawer{width:100%;}
  .filters__row{gap:10px;}
  .filter-group{width:100%;}
  .filter-group--end{margin-left:0;}
  .select{width:100%;}
}
@media (max-width:640px){
  .kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr));}
  .kpi__value{font-size:20px;}
}

/* ---------- 年度经营目标达成（老板视角卡片，位于漏斗右侧） ---------- */
.boss-donut{width:100%;height:188px;}
.boss-figs{display:flex;justify-content:space-between;gap:8px;margin-top:6px;}
.boss-fig{display:flex;flex-direction:column;align-items:center;gap:2px;flex:1;}
.boss-fig__label{font-size:11px;color:var(--muted);white-space:nowrap;}
.boss-fig__val{font-size:16px;font-weight:700;color:var(--text-strong);font-variant-numeric:tabular-nums;line-height:1.1;}
.boss-fig__val small{font-size:10px;font-weight:500;color:var(--muted);margin-left:1px;}
.boss-trend{width:100%;height:172px;margin-top:12px;}

/* ---------- 投标地理分布（中国地图卡片） ---------- */
.map-chart{width:100%;height:350px;max-width:1300px;margin:0 auto;}
/* 单列布局（≤1279px）下地图占据整行宽度，高度进一步收矮避免过扁 */
@media (max-width:1279px){ .map-chart{height:320px;} }
.map-legend{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;max-width:1300px;margin:10px auto 0;
  padding-top:10px;border-top:1px dashed var(--border);
  font-size:11.5px;color:var(--muted);
}
.map-legend__item{display:inline-flex;align-items:center;gap:5px;}
.map-legend__label{color:var(--muted);font-weight:600;}
.map-legend__item i{width:10px;height:10px;border-radius:50%;display:inline-block;flex:none;}
.map-legend__sep{width:1px;height:14px;background:var(--border-strong);}
.map-legend__hint{color:var(--muted-dim);}

/* 驾驶舱两栏：地图｜漏斗｜目标卡 / 投入产出｜风险监控 */
.duo{display:grid;gap:24px;margin-top:12px;align-items:start;}
.duo--top{grid-template-columns:1.25fr 1fr 0.9fr;align-items:stretch;}
.duo--top > .section{display:flex;}
.duo--top > .section > .card{flex:1 1 auto;display:flex;flex-direction:column;}
.duo--top #secFunnel .funnel{flex:1 1 auto;}
.duo--top #secFunnel .fnl-step{flex:1 1 0;height:auto;min-height:46px;}
.duo--bottom{grid-template-columns:1fr 1fr;}
@media (max-width:1279px){ .duo--top,.duo--bottom{grid-template-columns:1fr;} }
