/* Dashboard V2: console-style application shell. Loaded only by dashboard-v2.html. */
.dashboard-v2{
  --v2-accent:#00a870;
  --v2-accent-dark:#008a5c;
  --v2-accent-soft:#e8f8f3;
  --v2-ink:#18222d;
  --v2-muted:#788492;
  --v2-line:#e8edf2;
  --v2-canvas:#f3f6f8;
  --v2-sidebar:248px;
  background:var(--v2-canvas);
  color:var(--v2-ink);
}

.dashboard-v2 .v2-sidebar{
  position:fixed;inset:0 auto 0 0;width:var(--v2-sidebar);z-index:80;
  display:flex;flex-direction:column;background:#fff;border-right:1px solid var(--v2-line);
  box-shadow:4px 0 20px rgba(24,34,45,.025);transition:width .24s ease,transform .24s ease;
}
.dashboard-v2 .v2-brand{height:88px;padding:11px 18px;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:5px;border-bottom:1px solid #f0f3f5;overflow:hidden}
.dashboard-v2 .v2-brand-mark{width:150px;height:34px;padding:0;flex:none;display:flex;align-items:center;overflow:hidden;background:transparent;box-shadow:none}
.dashboard-v2 .v2-brand-logo{display:block;width:126px;height:auto;flex:none}
.dashboard-v2 .v2-brand-copy{max-width:185px;min-width:0;line-height:1.2;overflow:hidden}
.dashboard-v2 .v2-brand-copy strong{display:block;font-size:12.5px;letter-spacing:.04em;white-space:nowrap}
.dashboard-v2 .v2-brand-copy span{display:none}
.dashboard-v2 .v2-nav{padding:10px 10px 14px;overflow:auto;flex:1;scrollbar-width:thin}
.dashboard-v2 .v2-nav-group+.v2-nav-group{margin-top:8px}
.dashboard-v2 .v2-nav-group-toggle{width:100%;height:42px;padding:0 10px;border:0;border-radius:10px;display:flex;align-items:center;gap:10px;background:#f6f8fa;color:#35424e;text-align:left;font-size:12px;font-weight:700;letter-spacing:.01em}
.dashboard-v2 .v2-nav-group-toggle:hover{background:#eef5f2;color:var(--v2-accent-dark)}
.dashboard-v2 .v2-nav-group.has-active>.v2-nav-group-toggle{color:var(--v2-accent-dark);background:#f1f8f5}
.dashboard-v2 .v2-nav-group-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dashboard-v2 .v2-nav-chevron{width:18px;height:18px;margin-left:auto;display:grid;place-items:center;transition:transform .18s ease}
.dashboard-v2 .v2-nav-chevron svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.dashboard-v2 .v2-nav-group.is-collapsed .v2-nav-chevron{transform:rotate(-90deg)}
.dashboard-v2 .v2-nav-group.is-collapsed .v2-nav-group-items{display:none}
.dashboard-v2 .v2-nav-group-items{padding-top:3px}
.dashboard-v2 .v2-nav-item{width:100%;height:38px;margin:1px 0;padding:0 10px;border:0;border-radius:9px;display:flex;align-items:center;gap:10px;background:transparent;color:#4b5662;text-align:left;font-weight:500;transition:background .18s,color .18s,transform .18s}
.dashboard-v2 .v2-nav-item:hover{background:#f4f7f8;color:var(--v2-ink);transform:translateX(2px)}
.dashboard-v2 .v2-nav-item.active{background:var(--v2-accent-soft);color:var(--v2-accent-dark);font-weight:600}
.dashboard-v2 .v2-nav-icon{width:20px;height:20px;display:grid;place-items:center;flex:none}
.dashboard-v2 .v2-nav-icon svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.dashboard-v2 .v2-nav-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dashboard-v2 .v2-nav-dot{width:6px;height:6px;border-radius:50%;background:#ccd3da;margin-left:auto}
.dashboard-v2 .v2-nav-item.active .v2-nav-dot{background:var(--v2-accent);box-shadow:0 0 0 4px rgba(0,168,112,.11)}
.dashboard-v2 .v2-nav-target{scroll-margin-top:92px}
.dashboard-v2 .v2-sidebar-foot{margin:12px;padding:14px;border-radius:12px;background:#f6faf8;border:1px solid #e5f1ec;display:flex;align-items:center;gap:10px}
.dashboard-v2 .v2-live-dot{width:9px;height:9px;flex:none;border-radius:50%;background:var(--v2-accent);box-shadow:0 0 0 5px rgba(0,168,112,.1)}
.dashboard-v2 .v2-sidebar-foot strong{display:block;font-size:12px}.dashboard-v2 .v2-sidebar-foot span{display:block;font-size:11px;color:var(--v2-muted)}

.dashboard-v2 .wrap{max-width:none;margin:0 0 0 var(--v2-sidebar);padding:0 28px 56px;transition:margin-left .24s ease}
.dashboard-v2 .topbar{position:sticky;top:0;z-index:55;min-height:74px;margin:0 -28px 22px;padding:12px 28px;gap:10px;background:rgba(243,246,248,.9);backdrop-filter:blur(14px);border-bottom:1px solid rgba(223,230,235,.8)}
.dashboard-v2 .topbar h1{font-size:22px;font-weight:700;letter-spacing:-.02em;margin-right:4px}
.dashboard-v2 .topbar h1::before{content:"数据运营 /";display:block;font-size:11px;font-weight:500;color:var(--v2-muted);letter-spacing:.08em;margin-bottom:1px}
.dashboard-v2 .topbar .zonenav{display:none}
.dashboard-v2 .v2-menu-btn,.dashboard-v2 .v2-collapse-btn{width:36px;height:36px;padding:0;display:grid;place-items:center;border-color:var(--v2-line);background:#fff;color:#65717d}
.dashboard-v2 .v2-menu-btn{display:none}
.dashboard-v2 .v2-collapse-btn{position:fixed;left:230px;top:18px;z-index:90;width:34px;height:34px;border-radius:50%;box-shadow:0 4px 14px rgba(24,34,45,.1);transition:left .24s ease,transform .24s ease}
.dashboard-v2 .v2-menu-btn svg,.dashboard-v2 .v2-collapse-btn svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.dashboard-v2 .controls{gap:7px}
.dashboard-v2 button{border-color:#dde4e9;border-radius:9px;transition:border-color .18s,background .18s,color .18s,box-shadow .18s}
.dashboard-v2 button:hover{border-color:var(--v2-accent);color:var(--v2-accent-dark)}
.dashboard-v2 button.primary{background:var(--v2-accent);border-color:var(--v2-accent);box-shadow:0 6px 14px rgba(0,168,112,.16)}
.dashboard-v2 button.primary:hover{background:var(--v2-accent-dark);border-color:var(--v2-accent-dark)}
.dashboard-v2 select:focus{border-color:var(--v2-accent);box-shadow:0 0 0 3px rgba(0,168,112,.09)}
.dashboard-v2 .badge.ready,.dashboard-v2 .badge.logged-in{background:var(--v2-accent-soft);color:var(--v2-accent-dark);border-color:#c8ebdf}

.dashboard-v2 #loginCard{margin-bottom:16px;padding:13px 16px;border-radius:12px;background:#fff;box-shadow:none}
.dashboard-v2 #loginCard .status-line{margin:0;align-items:center;gap:10px 24px}
.dashboard-v2 #loginCard .status-line span{position:relative;color:var(--v2-muted)}
.dashboard-v2 #loginCard .status-line span:not(:last-child)::after{content:"";position:absolute;right:-12px;top:4px;width:1px;height:14px;background:var(--v2-line)}
.dashboard-v2 #loginCard .status-line b{color:#3e4b57}
.dashboard-v2 #loginCard .actions{margin-top:10px;padding-top:10px;border-top:1px solid var(--v2-line)}

.dashboard-v2 .zone{margin-top:0;padding:0;border:0;background:transparent}
.dashboard-v2 .zone+.zone{margin-top:30px}
.dashboard-v2 .zone-head{align-items:center;margin:0 0 14px;padding:0}
.dashboard-v2 .zone-title{font-size:18px;color:var(--v2-ink)!important;letter-spacing:-.01em}
.dashboard-v2 .zone-title::before{content:"";display:inline-block;width:4px;height:18px;margin-right:9px;vertical-align:-3px;border-radius:99px;background:var(--v2-accent)}
.dashboard-v2 .zone-lp .zone-title::before{background:var(--v2-accent)}
.dashboard-v2 .lp-unavailable{margin-top:14px;padding:24px;border:1px solid #f0d9ad;background:#fffaf0}.dashboard-v2 .lp-unavailable h2{margin:0 0 8px;font-size:16px}.dashboard-v2 .lp-unavailable p{margin:0;color:#725d32;line-height:1.75}
.dashboard-v2 .zone-badge{border:0;background:transparent;padding:0;color:var(--v2-muted)}
.dashboard-v2 section.zone{scroll-margin-top:90px}
.dashboard-v2 .filters{position:sticky;top:76px;z-index:40;padding:10px 14px;border-color:var(--v2-line);border-radius:12px;box-shadow:0 8px 22px rgba(24,34,45,.045);background:rgba(255,255,255,.96);backdrop-filter:blur(12px)}
.dashboard-v2 .seg button.on{background:var(--v2-accent)}

.dashboard-v2 .card,.dashboard-v2 .metric{border-color:var(--v2-line);border-radius:14px;box-shadow:0 2px 5px rgba(24,34,45,.025),0 10px 28px rgba(24,34,45,.025)}
.dashboard-v2 .card{padding:19px 20px}
.dashboard-v2 .card h2{font-size:15px;color:#26313b}
.dashboard-v2 .cards,.dashboard-v2 .grid{gap:14px;margin-bottom:14px}
.dashboard-v2 .metric{padding:16px;background:linear-gradient(150deg,#fff 55%,#fafcfb)}
.dashboard-v2 .metric .label{color:var(--v2-muted)}
.dashboard-v2 .metric .value{font-size:26px;letter-spacing:-.025em;color:#17212b}
/* 装饰条颜色：默认按序号 4 色循环；若卡片带 --metric-stripe（KPI 网格按列配色），则该值优先 */
.dashboard-v2 .metric::before{content:"";display:block;width:22px;height:3px;border-radius:99px;background:var(--metric-stripe,#dfe6e9);margin-bottom:10px}
.dashboard-v2 .metric:nth-child(4n+1)::before{background:var(--metric-stripe,#00a870)}
.dashboard-v2 .metric:nth-child(4n+2)::before{background:var(--metric-stripe,#4c8eda)}
.dashboard-v2 .metric:nth-child(4n+3)::before{background:var(--metric-stripe,#b982d9)}
.dashboard-v2 .metric:nth-child(4n+4)::before{background:var(--metric-stripe,#dda142)}
.dashboard-v2 .roi-cards .metric{border-color:#e9edf0;background:#fff}
.dashboard-v2 .roi-cards .metric .value{font-size:25px}
/* 组合值分母的灰要跟 v2 的调色板（--v2-muted #788492），与卡片标题灰保持一致 */
.dashboard-v2 .metric .value .v-sub{color:var(--v2-muted)}
/* 补回被本文件「吃掉」的响应式降级：
 * dashboard.css 里有 @media (max-width:1100px){.metric .value{font-size:21px}}，但本文件上面
 * 两条 .dashboard-v2 … .value 规则的优先级更高（0,3,0 / 0,4,0 > 0,2,0），把窄屏降级整个盖掉了，
 * 于是窄屏仍按 26/25px 渲染 → 组合额度这类长值直接溢出卡片。这里按同一断点补一条 v2 作用域的规则。 */
@media (max-width:1100px){
  .dashboard-v2 .metric .value,
  .dashboard-v2 .roi-cards .metric .value{font-size:21px}
}
.dashboard-v2 .chart{min-height:260px}
.dashboard-v2 #usageStructureCard,.dashboard-v2 #deptTreeCard{display:flex;flex-direction:column;min-height:460px}
.dashboard-v2 #usageStructureCard>.chart,.dashboard-v2 #deptTreeCard>.chart{flex:1;height:auto;min-height:340px}
.dashboard-v2 .rank-bar{background:linear-gradient(90deg,var(--v2-accent),#58c9a2)}
.dashboard-v2 .rank-item .rank-no{width:25px;height:25px;line-height:25px;border-radius:8px;background:#edf2f5;color:#66727e}
.dashboard-v2 .rank-item .rank-no.top1{background:var(--v2-accent);color:#fff}
.dashboard-v2 .rank-item .rank-no.top2{background:#4c8eda;color:#fff}
.dashboard-v2 .rank-item .rank-no.top3{background:#dda142;color:#fff}
.dashboard-v2 tbody tr:hover{background:#f4faf7}
.dashboard-v2 tbody tr.active{background:var(--v2-accent-soft)}
.dashboard-v2 thead th{background:#fafbfc;position:sticky;top:0;z-index:1}
.dashboard-v2 .price-btn{border-color:#e6ded0;background:#fffaf1;color:#8f641e}
.dashboard-v2 footer{padding:18px 4px 0;border-top:1px solid var(--v2-line)}

.dashboard-v2.v2-sidebar-collapsed{--v2-sidebar:78px}
.dashboard-v2.v2-sidebar-collapsed .v2-brand{height:78px;padding:0 16px;display:flex;flex-direction:row;align-items:center}
.dashboard-v2.v2-sidebar-collapsed .v2-brand-mark{width:46px;height:40px;padding:0}
.dashboard-v2.v2-sidebar-collapsed .v2-brand-logo{width:126px}
.dashboard-v2.v2-sidebar-collapsed .v2-brand-copy,.dashboard-v2.v2-sidebar-collapsed .v2-nav-text,.dashboard-v2.v2-sidebar-collapsed .v2-nav-dot,.dashboard-v2.v2-sidebar-collapsed .v2-nav-group-title,.dashboard-v2.v2-sidebar-collapsed .v2-nav-chevron,.dashboard-v2.v2-sidebar-collapsed .v2-sidebar-foot>div{display:none}
.dashboard-v2.v2-sidebar-collapsed .v2-nav{padding-inline:10px}
.dashboard-v2.v2-sidebar-collapsed .v2-nav-item,.dashboard-v2.v2-sidebar-collapsed .v2-nav-group-toggle{justify-content:center;padding:0}
.dashboard-v2.v2-sidebar-collapsed .v2-sidebar-foot{justify-content:center;padding:14px 8px}
.dashboard-v2.v2-sidebar-collapsed .v2-collapse-btn{left:61px;transform:rotate(180deg)}

.dashboard-v2 .v2-overlay{display:none;position:fixed;inset:0;background:rgba(12,21,29,.32);z-index:70;backdrop-filter:blur(2px)}
@media(max-width:1180px){
  .dashboard-v2{--v2-sidebar:216px}.dashboard-v2 .wrap{padding-inline:18px}.dashboard-v2 .topbar{margin-inline:-18px;padding-inline:18px}
  .dashboard-v2 .v2-collapse-btn{left:199px}
}
@media(max-width:900px){
  .dashboard-v2{--v2-sidebar:248px}.dashboard-v2 .v2-sidebar{transform:translateX(-105%);box-shadow:14px 0 40px rgba(24,34,45,.16)}
  .dashboard-v2.v2-mobile-nav .v2-sidebar{transform:translateX(0)}.dashboard-v2.v2-mobile-nav .v2-overlay{display:block}
  .dashboard-v2 .wrap{margin-left:0;padding:0 12px 42px}.dashboard-v2 .topbar{margin:0 -12px 16px;padding:10px 12px;min-height:64px}
  .dashboard-v2 .v2-menu-btn{display:grid}.dashboard-v2 .v2-collapse-btn{display:none}.dashboard-v2 .topbar h1{font-size:18px}
  .dashboard-v2 .controls{width:100%;padding-left:46px}.dashboard-v2 .filters{top:64px;overflow-x:auto;flex-wrap:nowrap}.dashboard-v2 .filters .fg{flex:none}
  .dashboard-v2 .v2-sidebar-foot>div,.dashboard-v2 .v2-brand-copy,.dashboard-v2 .v2-nav-text,.dashboard-v2 .v2-nav-dot,.dashboard-v2 .v2-nav-group-title,.dashboard-v2 .v2-nav-chevron{display:block!important}
  .dashboard-v2 .v2-nav-item,.dashboard-v2 .v2-nav-group-toggle{justify-content:flex-start!important;padding:0 12px!important}
  .dashboard-v2 .v2-nav-chevron{margin-left:auto!important}
}
@media(max-width:620px){
  .dashboard-v2 .controls label,.dashboard-v2 #countdown{display:none}.dashboard-v2 .controls{padding-left:0}
  .dashboard-v2 .topbar .spacer{display:none}.dashboard-v2 .topbar{align-items:flex-start}.dashboard-v2 .topbar h1{flex:1}
  .dashboard-v2 .card{padding:15px}.dashboard-v2 #loginCard .status-line span::after{display:none}
}

/* ---------------- Link AI：与 WorkBuddy 一致的信息层级 ---------------- */
.dashboard-v2 .lp-dashboard{display:grid;grid-template-columns:minmax(0,1fr);gap:14px}
.dashboard-v2 .lp-filter-bar{margin-bottom:14px;box-shadow:0 8px 22px rgba(24,34,45,.06)}
.dashboard-v2 .lp-filter-bar #lpRangeHint{max-width:360px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dashboard-v2 .lp-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;padding:17px 20px;background:#fff;border:1px solid var(--v2-line);border-radius:14px;box-shadow:0 2px 5px rgba(24,34,45,.025),0 10px 28px rgba(24,34,45,.025)}
.dashboard-v2 .lp-toolbar-title{font-size:16px;font-weight:700;color:var(--v2-ink);margin-bottom:5px}
.dashboard-v2 .lp-toolbar .sub{margin:0;color:var(--v2-muted);line-height:1.65}
.dashboard-v2 .lp-window-control{display:flex;align-items:center;gap:10px;flex:none}
.dashboard-v2 .lp-status-panel{padding:12px 16px;background:#f8fbfa;border:1px solid #e2eee9;border-radius:12px}
.dashboard-v2 .lp-status-panel .sub{margin:0;color:var(--v2-muted);line-height:1.65}
.dashboard-v2 .lp-status-panel .roi-note{margin:8px 0 0;padding-top:8px;border-top:1px solid #e4ece9;color:#5e6b76}
.dashboard-v2 .lp-kpi-section{min-width:0}
.dashboard-v2 .lp-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:12px}
.dashboard-v2 .lp-section-head h2{margin:0;font-size:15px;font-weight:650;color:#26313b}
.dashboard-v2 .lp-section-head p{margin:4px 0 0;font-size:12px;line-height:1.5;color:var(--v2-muted)}
.dashboard-v2 .lp-kpi-grid{grid-template-columns:repeat(3,minmax(0,1fr));margin:0}
.dashboard-v2 .lp-balance-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
.dashboard-v2 .lp-panel{min-width:0;margin:0;padding:19px 20px;background:#fff}
.dashboard-v2 .lp-panel-wide{width:100%}
/* v22：Link AI 下半区改为「两列各自纵向堆叠」。
   旧结构是两个独立的 .lp-two 行，行内两卡必须顶部对齐 → 较矮的一侧下方出现整片灰底空洞。
   现在每列内部只按内容紧密堆叠，列与列之间用 stretch 对齐，最后一卡自动补满列高。 */
.dashboard-v2 .lp-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;margin:0;align-items:stretch}
.dashboard-v2 .lp-col{display:flex;flex-direction:column;gap:14px;min-width:0}
.dashboard-v2 .lp-col > .lp-panel{flex:0 0 auto}
.dashboard-v2 .lp-col > .lp-panel:last-child{flex:1 1 auto}
/* 被拉伸的末卡（行数少的那张，如供应商渠道）：内容自然高度，靠图表补足视觉重量；
   flex:1 只是让卡片边界与另一列对齐，不再靠拉伸表格行高来「填满」（那会把行距撑到 80px+）。 */
.dashboard-v2 .lp-col > .lp-panel:last-child{display:flex;flex-direction:column}
.dashboard-v2 .lp-col > .lp-panel:last-child .lp-table-scroll{flex:0 0 auto;overflow:visible}
.dashboard-v2 .lp-col > .lp-panel:last-child .lp-table-scroll > table{width:100%}
/* 半高图表（供应商渠道的横条图） */
.dashboard-v2 .lp-chart-sm{height:210px;margin:0 0 6px}
/* 空数据档位（如「今日」无调用）：左列内容本来就少，若仍按右列高度拉伸，
   会把供应商卡撑成一大片空白 —— 此时改为按各自内容高度排列。 */
.dashboard-v2 .lp-cols.lp-cols-start{align-items:start}
.dashboard-v2 .lp-cols.lp-cols-start .lp-col > .lp-panel:last-child{flex:0 0 auto}
.dashboard-v2 .lp-chart{height:240px;margin:0 0 10px}
.dashboard-v2 #lpTrendChart{height:300px;min-height:300px}
.dashboard-v2 #lpModelChart,.dashboard-v2 #lpKeyChart{height:240px}
.dashboard-v2 .lp-table-wrap{width:100%;overflow-x:auto}
/* v22：原先固定 320px，把 16 行模型表/15 行密钥表都压进滚动区，卡片高度远小于内容，
   两列又被迫等高 → 矮的一侧只剩大片空白。改为按内容自然展开（720px 兜底防极端行数）。 */
.dashboard-v2 .lp-table-scroll{max-height:720px;overflow-y:auto}
.dashboard-v2 .lp-table-wrap table{margin:0}
.dashboard-v2 .lp-center-rank-wrap{max-height:620px;overflow-y:auto}
.dashboard-v2 #lpCenterRankTable td,.dashboard-v2 #lpCenterRankTable th{padding:10px 12px}
.dashboard-v2 table .rank-no{display:inline-grid;place-items:center;width:25px;height:25px;line-height:1;border-radius:8px;background:#edf2f5;color:#66727e;font-size:12px;font-weight:700}
.dashboard-v2 table .rank-no.top1{background:var(--v2-accent);color:#fff}
.dashboard-v2 table .rank-no.top2{background:#4c8eda;color:#fff}
.dashboard-v2 table .rank-no.top3{background:#dda142;color:#fff}
.dashboard-v2 #lpCenterRankTable .lp-center-name{font-weight:600;color:#26313b}
/* v24：本期零消费零请求的密钥不隐藏，只做淡化 + 打标（用户要求“没使用的也要显示出来”） */
.dashboard-v2 #lpCenterRankTable tbody tr.lp-idle-row{opacity:.55}
.dashboard-v2 #lpCenterRankTable tbody tr.lp-idle-row .lp-center-name{font-weight:500;color:#66727e}
.dashboard-v2 #lpCenterRankTable .lp-idle-tag{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:6px;
  background:#eef2f5;color:#7a8794;font-size:11px;font-weight:500;vertical-align:1px}
/* v25：部门树整行可展开 —— 加大箭头热区 + 可点行给出手型与悬停反馈 */
.dashboard-v2 #deptTable tbody tr.expandable{cursor:pointer}
.dashboard-v2 #deptTable tbody tr.expandable:hover>td{background:#f2f7fb}
.dashboard-v2 #deptTable tbody tr.expandable:focus-visible{outline:2px solid var(--v2-accent);outline-offset:-2px}
.dashboard-v2 #deptTable .dept-toggle{width:22px;margin-left:-4px;padding:2px 3px;text-align:center;border-radius:4px}
.dashboard-v2 #deptTable .dept-toggle:hover{background:#e8eff5;color:#26313b}
.dashboard-v2 .lp-methodology{background:#fff;border:1px solid var(--v2-line);border-radius:12px;color:#53606c}
.dashboard-v2 .lp-methodology summary{padding:13px 16px;cursor:pointer;font-size:13px;font-weight:600;list-style-position:inside}
.dashboard-v2 .lp-methodology[open] summary{border-bottom:1px solid var(--v2-line)}
.dashboard-v2 .lp-methodology .roi-note{margin:0;padding:14px 16px;line-height:1.7}
@media (max-width:1100px){
  .dashboard-v2 .lp-kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dashboard-v2 .lp-balance-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:1000px){
  .dashboard-v2 .lp-cols{grid-template-columns:1fr}
  .dashboard-v2 .lp-col > .lp-panel:last-child{flex:0 0 auto}
  .dashboard-v2 .lp-chart,.dashboard-v2 #lpModelChart,.dashboard-v2 #lpKeyChart{height:210px}
}
@media (max-width:700px){
  .dashboard-v2 .lp-filter-bar{overflow-x:auto;flex-wrap:nowrap}
  .dashboard-v2 .lp-filter-bar .fg{flex:none}
  .dashboard-v2 .lp-toolbar{flex-direction:column;padding:15px}
  .dashboard-v2 .lp-window-control{width:100%;align-items:flex-start;flex-direction:column}
  .dashboard-v2 .lp-window-control .seg{width:100%;display:grid;grid-template-columns:repeat(3,1fr)}
  .dashboard-v2 .lp-window-control .seg button{min-width:0;padding-inline:6px}
  .dashboard-v2 .lp-kpi-grid,.dashboard-v2 .lp-balance-grid{grid-template-columns:1fr}
  .dashboard-v2 .lp-section-head{flex-direction:column}
}

/* ============================================================
 * v26：移动端适配（手机 / 钉钉内置浏览器，≤700px）
 * 根因：.dept-body 这类 grid 的子项默认 min-width:auto，会被内部宽表
 *       （#deptTable 773px、#deptRoiTable 773px）反向撑开，整页 scrollWidth
 *       变成 680px，右侧内容被裁掉。所以第一件事是所有 grid 子项 min-width:0。
 * ============================================================ */
.dashboard-v2 .card,
.dashboard-v2 section.zone{min-width:0}
/* 注意：min-width:0 只在「单列」断点下加。
 * 桌面两列时若也给 grid 子项 min-width:0，左列会被严格压成 1.7fr，
 * 部门表 7 列（708px）就被裁成横向滚动 —— 桌面反而变差。 */
@media (max-width:1100px){
  .dashboard-v2 .dept-body,
  .dashboard-v2 .dept-body>*,
  .dashboard-v2 .grid>*,
  .dashboard-v2 .lp-cols,
  .dashboard-v2 .lp-cols>*,
  .dashboard-v2 .lp-col>*{min-width:0}
}
/* 表格滚动容器（从 HTML 内联 style 提到这里，便于断点统一控制高度） */
.dashboard-v2 .dept-table-scroll{overflow:auto;max-height:520px;max-width:100%;-webkit-overflow-scrolling:touch}
.dashboard-v2 .dept-table-scroll.dept-roi-scroll{max-height:560px}

@media (max-width:700px){
  /* ---- 版面基础 ---- */
  .dashboard-v2 .wrap{padding:0 10px 32px;overflow-x:clip}
  .dashboard-v2 .card{padding:13px 12px;border-radius:12px}
  .dashboard-v2 section.zone{padding:10px 10px 8px;border-radius:12px;border-left-width:4px;margin-top:12px}
  .dashboard-v2 .zone-title{font-size:16px}
  .dashboard-v2 .zone-badge{font-size:11px;padding:2px 8px}
  .dashboard-v2 .card h2{font-size:14px}
  .dashboard-v2 .card .sub{font-size:11.5px;line-height:1.55;margin-bottom:10px}

  /* ---- 顶栏：标题一行 + 导航一行 + 控制条一行 ---- */
  /* 手机屏幕窄，topbar + filters 若继续 sticky 会吃掉 300px 视口并遮挡内容，改为随页滚动 */
  .dashboard-v2 .topbar{position:static;gap:8px;padding:9px 10px;margin:0 -10px 12px;min-height:0}
  .dashboard-v2 .topbar h1{font-size:16px;line-height:1.3;flex:1 1 auto;min-width:0;order:1}
  .dashboard-v2 .topbar .badge{order:2;font-size:11px;padding:2px 8px}
  .dashboard-v2 .topbar .spacer{display:none}
  .dashboard-v2 .zonenav{order:3;flex:1 1 100%;margin-left:0;gap:6px;flex-wrap:nowrap;overflow-x:auto;padding-bottom:2px}
  .dashboard-v2 .zonenav::-webkit-scrollbar{display:none}
  .dashboard-v2 .zonenav a{flex:none;font-size:11.5px;padding:3px 9px}
  .dashboard-v2 .topbar .meta{order:4;font-size:11px}
  .dashboard-v2 .controls{order:5;flex:1 1 100%;justify-content:flex-start;gap:6px;padding-left:0}
  .dashboard-v2 .controls button{padding:5px 11px;font-size:12.5px}
  .dashboard-v2 .controls select{padding:5px 8px;font-size:12.5px}
  .dashboard-v2 .controls label{font-size:12px;gap:4px}
  .dashboard-v2 .controls label,#countdown,.dashboard-v2 .controls #countdown{font-size:11.5px}

  /* ---- 筛选条：不再横向滚动，改为逐组换行 ---- */
  .dashboard-v2 .filters{position:static;top:auto;flex-wrap:wrap;overflow:visible;padding:10px 11px;gap:8px}
  .dashboard-v2 .filters .fg{flex:1 1 100%;min-width:0}
  .dashboard-v2 .filters .fg>span{flex:none;min-width:56px;font-size:12px}
  .dashboard-v2 .filters select{width:100%;min-width:0;font-size:13px}
  .dashboard-v2 .filters .seg{flex:0 0 auto}
  .dashboard-v2 #rangeSeg{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));flex:1 1 auto;min-width:0;width:auto}
  .dashboard-v2 #rangeSeg button{padding:6px 2px;font-size:12px;border-radius:0}
  .dashboard-v2 .filters .spacer{display:none}
  .dashboard-v2 .filters .meta{font-size:11px;line-height:1.5}
  .dashboard-v2 .filters>label{flex:1 1 100%}
  .dashboard-v2 .filters .range-picker{flex:1 1 auto;flex-wrap:wrap}
  .dashboard-v2 .filters .range-picker input[type=date]{flex:1 1 42%;min-width:0}

  /* ---- KPI：两列，字号降一档 ---- */
  .dashboard-v2 .cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dashboard-v2 .metric{padding:10px 11px}
  .dashboard-v2 .metric .label{font-size:11.5px}
  .dashboard-v2 .metric .value,
  .dashboard-v2 .roi-cards .metric .value{font-size:18px}

  /* ---- 图表：高度收窄，避免一屏塞满一个图 ---- */
  .dashboard-v2 .chart{min-height:200px}
  .dashboard-v2 #trendChart{height:240px}
  .dashboard-v2 #structureChart,
  .dashboard-v2 #deptShareChart,
  .dashboard-v2 #treemapChart{height:220px}
  .dashboard-v2 #deptStackChart{height:240px}
  .dashboard-v2 #usageStructureCard,
  .dashboard-v2 #deptTreeCard{min-height:0}
  .dashboard-v2 #usageStructureCard>.chart,
  .dashboard-v2 #deptTreeCard>.chart{min-height:220px}

  /* ---- 部门专区头部：控件换行 ---- */
  .dashboard-v2 .dept-head{flex-direction:column;align-items:stretch;gap:8px}
  .dashboard-v2 .dept-head .dh-item{font-size:12.5px}
  .dashboard-v2 .dept-head .dh-ctrl{margin-left:0;gap:8px;flex-wrap:wrap}
  .dashboard-v2 .dept-head .dh-ctrl .seg{flex:1 1 auto;min-width:0}
  .dashboard-v2 .dept-head .dh-ctrl .seg button{padding:5px 8px;font-size:12px}
  .dashboard-v2 .dept-head .dh-ctrl #btnCsv{padding:5px 10px;font-size:12px}
  .dashboard-v2 .roi-head{flex-direction:column;align-items:stretch;gap:8px}

  /* ---- 表格：整体降字号、压缩内边距 ---- */
  .dashboard-v2 table{font-size:12.5px}
  .dashboard-v2 th,.dashboard-v2 td{padding:7px 8px}
  .dashboard-v2 .dept-table-scroll{max-height:420px}
  /* 部门表只保留「部门 / 使用量 / 调用次数 / 活跃·成员」四列（第 5 列起在手机隐藏：
     人均、覆盖率、环比）。关掉「显示环比」时列数变 6，仍只隐藏 5、6 两列 → 前四列不变。 */
  .dashboard-v2 #deptTable th:nth-child(n+5),
  .dashboard-v2 #deptTable td:nth-child(n+5){display:none}
  /* 部门名允许换行（全局 th,td 是 nowrap），否则 4 列压不进 390 宽 */
  .dashboard-v2 #deptTable th:first-child,
  .dashboard-v2 #deptTable td:first-child{white-space:normal;word-break:break-word;line-height:1.35}
  .dashboard-v2 #deptTable th,.dashboard-v2 #deptTable td{padding:7px 6px}
  /* 列宽固定分配：部门名拿 39%，三个数字列各 23/20/18%，避免被数字挤成两行 */
  .dashboard-v2 #deptTable{table-layout:fixed;width:100%}
  .dashboard-v2 #deptTable th:nth-child(1),.dashboard-v2 #deptTable td:nth-child(1){width:37%}
  .dashboard-v2 #deptTable th:nth-child(2),.dashboard-v2 #deptTable td:nth-child(2){width:23%}
  .dashboard-v2 #deptTable th:nth-child(3),.dashboard-v2 #deptTable td:nth-child(3){width:20%}
  .dashboard-v2 #deptTable th:nth-child(4),.dashboard-v2 #deptTable td:nth-child(4){width:18%}
  .dashboard-v2 #deptTable th,.dashboard-v2 #deptTable td{padding:7px 4px}

  /* 部门 ROI 表 10 列：手机只留「部门 / 投入(积分) / 投入(¥) / 产出(¥) / ROI」，
     隐藏 AI代码行(4)、对话数(5)、净收益(8)、活跃人数(9)、环比(10) */
  .dashboard-v2 #deptRoiTable th:nth-child(4),
  .dashboard-v2 #deptRoiTable td:nth-child(4),
  .dashboard-v2 #deptRoiTable th:nth-child(5),
  .dashboard-v2 #deptRoiTable td:nth-child(5),
  .dashboard-v2 #deptRoiTable th:nth-child(n+8),
  .dashboard-v2 #deptRoiTable td:nth-child(n+8){display:none}
  .dashboard-v2 #deptRoiTable{font-size:11.5px;table-layout:fixed;width:100%}
  .dashboard-v2 #deptRoiTable th,.dashboard-v2 #deptRoiTable td{padding:6px 4px}
  .dashboard-v2 #deptRoiTable td:first-child,.dashboard-v2 #deptRoiTable th:first-child{white-space:normal;word-break:break-word;line-height:1.3;width:34%}
  .dashboard-v2 #deptRoiTable th:nth-child(2),.dashboard-v2 #deptRoiTable td:nth-child(2){width:18%}
  .dashboard-v2 #deptRoiTable th:nth-child(3),.dashboard-v2 #deptRoiTable td:nth-child(3){width:17%}
  .dashboard-v2 #deptRoiTable th:nth-child(6),.dashboard-v2 #deptRoiTable td:nth-child(6){width:18%}
  .dashboard-v2 #deptRoiTable th:nth-child(7),.dashboard-v2 #deptRoiTable td:nth-child(7){width:13%}
  .dashboard-v2 #lpCenterRankTable th:nth-child(5){white-space:normal}
  .dashboard-v2 #lpCenterRankTable td:nth-child(3),.dashboard-v2 #lpCenterRankTable td:nth-child(4),
  .dashboard-v2 #lpCenterRankTable td:nth-child(5){font-size:11.5px}

  /* 模型台账 6 列：保留模型名/积分/请求数/使用人数，隐藏「费用」「占全部用量」 */
  .dashboard-v2 #linkaiModelTable th:nth-child(3),
  .dashboard-v2 #linkaiModelTable td:nth-child(3),
  .dashboard-v2 #linkaiModelTable th:nth-child(6),
  .dashboard-v2 #linkaiModelTable td:nth-child(6){display:none}

  /* 中心消费排名 5 列（含「未使用」标签，内容 372px）：固定列宽压进一屏，密钥名换行 */
  .dashboard-v2 #lpCenterRankTable{table-layout:fixed;width:100%}
  .dashboard-v2 #lpCenterRankTable th:nth-child(1),.dashboard-v2 #lpCenterRankTable td:nth-child(1){width:34px}
  .dashboard-v2 #lpCenterRankTable th:nth-child(3),.dashboard-v2 #lpCenterRankTable td:nth-child(3){width:76px}
  .dashboard-v2 #lpCenterRankTable th:nth-child(4),.dashboard-v2 #lpCenterRankTable td:nth-child(4){width:58px}
  .dashboard-v2 #lpCenterRankTable th:nth-child(5),.dashboard-v2 #lpCenterRankTable td:nth-child(5){width:54px}
  .dashboard-v2 #lpCenterRankTable th{white-space:normal;line-height:1.25;font-size:11px}
  .dashboard-v2 #deptTable th{white-space:normal;line-height:1.25;font-size:11.5px}
  .dashboard-v2 #lpCenterRankTable .lp-center-name,
  .dashboard-v2 #lpCenterRankTable th:nth-child(2){white-space:normal;word-break:break-word;line-height:1.3}
  .dashboard-v2 #lpCenterRankTable .lp-idle-tag{margin-left:3px;padding:0 4px;font-size:10px}
  /* 中心产出表 9 列：只留 中心/组织、活跃人数、调用次数、总使用量，隐藏成员数/已授权/活跃率/环比/人均 */
  .dashboard-v2 #bdTable th:nth-child(2),.dashboard-v2 #bdTable td:nth-child(2),
  .dashboard-v2 #bdTable th:nth-child(3),.dashboard-v2 #bdTable td:nth-child(3),
  .dashboard-v2 #bdTable th:nth-child(5),.dashboard-v2 #bdTable td:nth-child(5),
  .dashboard-v2 #bdTable th:nth-child(8),.dashboard-v2 #bdTable td:nth-child(8),
  .dashboard-v2 #bdTable th:nth-child(9),.dashboard-v2 #bdTable td:nth-child(9){display:none}
  /* 成员明细表 7 列：只留 排名、成员、调用次数、总使用量、综合得分 */
  .dashboard-v2 #bd2Table th:nth-child(3),.dashboard-v2 #bd2Table td:nth-child(3),
  .dashboard-v2 #bd2Table th:nth-child(4),.dashboard-v2 #bd2Table td:nth-child(4){display:none}
  .dashboard-v2 #bd2Table td:nth-child(2),.dashboard-v2 #bdTable td:first-child{white-space:normal;word-break:break-word;line-height:1.3}

  /* 密钥表 6 列：手机隐藏「权限范围」与「最近使用」两列 */
  .dashboard-v2 #lpKeyTable th:nth-child(2),.dashboard-v2 #lpKeyTable td:nth-child(2),
  .dashboard-v2 #lpKeyTable th:nth-child(6),.dashboard-v2 #lpKeyTable td:nth-child(6){display:none}
  .dashboard-v2 #lpKeyTable{table-layout:fixed;width:100%;font-size:11.5px}
  .dashboard-v2 #lpKeyTable td:first-child,.dashboard-v2 #lpKeyTable th:first-child{white-space:normal;word-break:break-word;line-height:1.3;width:34%}

  /* 充值记录 4 列（内容 398px）：固定列宽，时间列自适应 */
  .dashboard-v2 #lpRechargeTable{table-layout:fixed;width:100%}
  .dashboard-v2 #lpRechargeTable th:nth-child(2),.dashboard-v2 #lpRechargeTable td:nth-child(2){width:22%}
  .dashboard-v2 #lpRechargeTable th:nth-child(3),.dashboard-v2 #lpRechargeTable td:nth-child(3){width:20%}
  .dashboard-v2 #lpRechargeTable th:nth-child(4),.dashboard-v2 #lpRechargeTable td:nth-child(4){width:26%}
  .dashboard-v2 #lpRechargeTable td:nth-child(4){white-space:normal;line-height:1.3;font-size:11px}
  .dashboard-v2 #lpRechargeTable td:first-child{white-space:normal;line-height:1.3}
  /* 首列吸顶，横向滚动时不丢部门名 */
  .dashboard-v2 #deptTable td:first-child{position:sticky;left:0;z-index:2;background:#fff}
  .dashboard-v2 #deptTable tr.d0 td:first-child{background:#fafbfc}
  .dashboard-v2 #deptTable thead th:first-child{z-index:3;background:#fafbfc}
  .dashboard-v2 #deptTable .dept-toggle{width:20px;margin-left:-2px}

  /* ---- Link AI：表格与控制条 ---- */
  .dashboard-v2 #lpCenterRankTable{font-size:11.5px}
  .dashboard-v2 #lpCenterRankTable th,
  .dashboard-v2 #lpCenterRankTable td{padding:6px 5px}
  .dashboard-v2 .lp-table-wrap{max-height:360px}
  .dashboard-v2 .lp-toolbar{padding:12px}
  .dashboard-v2 .lp-toolbar-title{font-size:15px}
  .dashboard-v2 .lp-status-panel{padding:10px 11px;font-size:12px}
  .dashboard-v2 .lp-kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dashboard-v2 .lp-balance-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dashboard-v2 .lp-range-bar{flex-wrap:wrap;gap:8px}
  /* Link AI 的 7 档时间范围按钮：小屏换成网格，避免整条 416px 撑破卡片 */
  .dashboard-v2 .lp-filter-bar{flex-wrap:wrap;overflow:visible}
  .dashboard-v2 #lpRangeSeg{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));flex:1 1 auto;min-width:0;width:auto}
  .dashboard-v2 #lpRangeSeg button{padding:6px 2px;font-size:12px;border-radius:0}
  .dashboard-v2 .lp-filter-bar .fg{flex:1 1 100%;min-width:0}
  .dashboard-v2 .lp-filter-bar .fg>span{flex:none;min-width:56px}
  /* 充值记录卡是「最后一列最后一张」，桌面刻意 overflow:visible；小屏必须改回可滚动 */
  .dashboard-v2 .lp-col > .lp-panel:last-child .lp-table-scroll{overflow:auto}
}

/* 更窄的机型（iPhone SE / 小屏安卓，≤380px）：KPI 与 Link AI 指标卡改单列，按钮再缩 */
@media (max-width:380px){
  .dashboard-v2 .cards,
  .dashboard-v2 .lp-kpi-grid,
  .dashboard-v2 .lp-balance-grid{grid-template-columns:1fr}
  .dashboard-v2 .topbar h1{font-size:15px}
  .dashboard-v2 #rangeSeg{grid-template-columns:repeat(3,minmax(0,1fr))}
  .dashboard-v2 .controls button{padding:5px 9px;font-size:12px}
  /* 320px 老机型：表格再降一档，尽量不出现横向滚动 */
  .dashboard-v2 table{font-size:11px}
  .dashboard-v2 th,.dashboard-v2 td{padding:6px 4px}
  .dashboard-v2 #deptTable td:first-child,.dashboard-v2 #bdTable td:first-child,
  .dashboard-v2 #bd2Table td:nth-child(2){white-space:normal;word-break:break-word;line-height:1.3}
}
