/* 工厂和机会（开发面板，app/dev_panel.py）。颜色只用 tokens.css 已定义变量、不写裸 hex（UI 门禁）。 */
/* display:flex 的块会盖掉 hidden 属性（工厂待办 9-27 踩过），全页兜底 */
[hidden] { display: none !important; }
.dv-app { max-width: 1400px; margin: 0 auto; padding: 20px 16px 48px; }
.dv-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.dv-head h1 { margin: 0 0 6px; font-size: 22px; color: var(--ink); }
.dv-head p { margin: 0; max-width: 820px; color: var(--muted); font-size: 13px; line-height: 1.6; }
.dv-goto { display: flex; gap: 14px; flex-wrap: wrap; align-items: center; }
.dv-goto a, .dv-link { color: var(--accent); font-size: 13px; text-decoration: underline; text-underline-offset: 2px; white-space: nowrap; }

/* 全页筛选（不贴顶：大类一多有三四行，贴着会吃掉半屏；表头各自贴顶） */
.dv-filters { margin: 12px 0 6px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px;
  background: var(--surface); display: grid; gap: 8px; }
.dv-frow { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dv-frow.dv-sub { margin: 8px 2px 0; }
.dv-flabel { flex: 0 0 40px; font-size: 13px; color: var(--muted); }
.dv-chips { display: flex; flex-wrap: wrap; gap: 6px; flex: 1 1 0; min-width: 0; }
.dv-chips button { border: 1px solid var(--line); background: var(--surface); color: var(--ink-2); border-radius: 999px; padding: 3px 12px; font-size: 13px; cursor: pointer; }
.dv-chips button:hover { background: var(--surface-hover); }
.dv-chips button.on { background: var(--accent); border-color: var(--accent); color: var(--text-on-accent); }
.dv-chips button small { opacity: .75; margin-left: 4px; }
#dv-q { border: 1px solid var(--border-control); border-radius: 8px; padding: 6px 10px; font-size: 13px; min-width: 280px; background: var(--surface); color: var(--ink); }
.dv-msg { color: var(--muted); font-size: 14px; padding: 12px 4px; }
.dv-jump { display: flex; gap: 14px; flex-wrap: wrap; font-size: 13px; color: var(--muted); margin: 4px 2px 0; }
.dv-jump a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
.dv-msg.err { color: var(--danger-fg); }

/* 一块：标题一行，下面一张表 */
.dv-sec { margin-top: 22px; }
.dv-sec-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; padding: 6px 10px; border-left: 4px solid var(--accent);
  background: var(--surface-sunken); border-radius: 0 8px 8px 0; }
.dv-sec-head h2 { margin: 0; font-size: 16px; color: var(--ink); white-space: nowrap; }
.dv-sec-head h2 b { margin-left: 6px; color: var(--accent); }
.dv-sec-head p { margin: 0; font-size: 12px; color: var(--muted); line-height: 1.6; flex: 1 1 360px; }
.dv-more { margin: 6px 4px; font-size: 13px; color: var(--muted); }
.dv-more button { border: 0; background: none; color: var(--accent); cursor: pointer; font-size: 13px; text-decoration: underline; }

/* 表：定宽、一格一行、放不下「…」、悬停看全文；表头 sticky（祖先不能有 overflow） */
.dv-table { width: 100%; min-width: 980px; margin-top: 8px; border-collapse: separate; border-spacing: 0; table-layout: fixed; font-size: 13px; color: var(--ink-2); background: var(--surface); }
.dv-table th { position: sticky; top: 0; z-index: 2; background: var(--surface-sunken); color: var(--muted); font-weight: 600; font-size: 12px;
  text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--border); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dv-table th[data-sort] { cursor: pointer; }
.dv-table th[data-sort]:hover { color: var(--ink); }
.dv-table th.sorted::after { content: " ↓"; }
.dv-table td { padding: 0 8px; height: 38px; border-bottom: 1px solid var(--border-subtle); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; }
.dv-table tbody tr:hover td { background: var(--surface-hover); }
.dv-table tbody tr[data-id] { cursor: pointer; }
.dv-table tbody tr.cur td { background: var(--info-bg); }
.dv-table tbody tr.cur td:first-child { box-shadow: inset 3px 0 0 var(--info-fg); }
.dv-table td.num { font-variant-numeric: tabular-nums; }
.dv-name { font-weight: 600; color: var(--ink); }
.dv-zero { color: var(--border-strong); }
.dv-up { color: var(--success-fg); font-weight: 600; }
.dv-down { color: var(--warning-fg); }
.dv-late { color: var(--warning-fg); }

/* 信号小块：图标 + 名字，第一条后面跟一句依据 */
.dv-sig { display: inline-block; margin-right: 4px; border-radius: 4px; padding: 0 6px; font-size: 12px; line-height: 20px; border: 1px solid var(--neutral-border);
  background: var(--neutral-bg); color: var(--neutral-fg); }
.dv-sig.risk { background: var(--danger-bg); border-color: var(--danger-border); color: var(--danger-fg); }
.dv-sig.hot { background: var(--success-bg); border-color: var(--success-border); color: var(--success-fg); }
.dv-sig.new, .dv-sig.partner { background: var(--info-bg); border-color: var(--info-border); color: var(--info-fg); }
.dv-sig.cool, .dv-sig.quiet { background: var(--warning-bg); border-color: var(--warning-border); color: var(--warning-fg); }
.dv-why { color: var(--muted); margin-left: 4px; }
.dv-tag { display: inline-block; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; margin-right: 3px; font-size: 12px; font-weight: 600;
  background: var(--accent-soft-bg); color: var(--accent-soft-fg); border: 1px solid var(--accent-soft-border); }
.dv-st { display: inline-block; border-radius: 4px; padding: 0 6px; font-size: 12px; background: var(--neutral-bg); color: var(--neutral-fg); border: 1px solid var(--neutral-border); }
.dv-st.open { background: var(--warning-bg); color: var(--warning-fg); border-color: var(--warning-border); }
.dv-type { display: inline-block; border-radius: 4px; padding: 0 5px; margin-right: 6px; font-size: 11px; background: var(--danger-bg); color: var(--danger-fg); border: 1px solid var(--danger-border); }
.dv-type.ask { background: var(--info-bg); color: var(--info-fg); border-color: var(--info-border); }
.dv-single { color: var(--danger-fg); font-weight: 600; }

.dv-src { margin: 26px 2px 0; font-size: 12px; color: var(--muted); line-height: 1.7; }
.dv-src summary { cursor: pointer; }
.dv-src p { margin: 4px 0; }

/* 右侧详情（点一家）。顶栏 sticky；z-index 高过表头和筛选条 */
.dv-panel { position: fixed; top: 0; right: 0; bottom: 0; width: min(480px, 100vw); z-index: 20; background: var(--surface);
  border-left: 1px solid var(--border-strong); box-shadow: var(--shadow-3); overflow-y: auto; }
.dv-panel-top { position: sticky; top: 0; z-index: 1; display: flex; justify-content: space-between; align-items: flex-start; gap: 10px;
  padding: 12px 14px; background: var(--surface); border-bottom: 1px solid var(--border); }
.dv-panel-top b { font-size: 17px; color: var(--ink); }
.dv-panel-sub { margin-top: 2px; font-size: 12px; color: var(--muted); line-height: 1.5; }
.dv-x { border: 0; background: none; font-size: 22px; line-height: 1; color: var(--muted); cursor: pointer; padding: 0 4px; }
.dv-x:hover { color: var(--ink); }
.dv-panel-body { padding: 10px 14px 28px; font-size: 13px; color: var(--ink-2); line-height: 1.6; }
.dv-panel-body h3 { margin: 16px 0 6px; font-size: 13px; color: var(--muted); font-weight: 600; }
.dv-card { border-radius: 10px; padding: 8px 12px; margin-bottom: 8px; background: var(--surface-sunken); border-left: 4px solid var(--border-strong); }
.dv-card.risk { border-left-color: var(--danger-fg); }
.dv-card.hot { border-left-color: var(--success-fg); }
.dv-card.new, .dv-card.partner { border-left-color: var(--info-fg); }
.dv-card.cool, .dv-card.quiet { border-left-color: var(--warning-fg); }
.dv-card .t { font-weight: 600; color: var(--ink); }
.dv-card .a { margin-top: 2px; color: var(--ink-2); }
.dv-card .a::before { content: "怎么切入："; color: var(--muted); }
.dv-card ul { margin: 4px 0 0; padding-left: 18px; color: var(--muted); font-size: 12px; }
.dv-kv { display: grid; grid-template-columns: 64px 1fr; gap: 2px 8px; }
.dv-kv dt { color: var(--muted); }
.dv-kv dd { margin: 0; }
.dv-bars { display: flex; align-items: flex-end; gap: 2px; height: 56px; padding: 4px 0 0; border-bottom: 1px solid var(--border); }
.dv-bars i { flex: 1 1 0; background: var(--accent); border-radius: 2px 2px 0 0; min-height: 1px; opacity: .85; }
.dv-bars i.z { background: var(--border-subtle); }
.dv-bars-x { display: flex; justify-content: space-between; font-size: 11px; color: var(--muted); }
.dv-prods { display: grid; grid-template-columns: repeat(auto-fill, minmax(128px, 1fr)); gap: 8px; }
.dv-prod { border: 1px solid var(--border-subtle); border-radius: 8px; padding: 6px; font-size: 12px; line-height: 1.4; }
.dv-prod img, .dv-prod .none { width: 100%; height: 76px; object-fit: contain; background: var(--surface-sunken); border-radius: 6px; display: block; }
.dv-prod .none { display: flex; align-items: center; justify-content: center; color: var(--muted); }
.dv-prod b { display: block; font-family: var(--font-mono); font-weight: 600; color: var(--ink); margin-top: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dv-prod span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dv-topic { padding: 5px 0; border-bottom: 1px solid var(--border-subtle); }
.dv-topic small { color: var(--muted); margin-right: 6px; }
.dv-ai { font-size: 12px; color: var(--muted); }
.dv-links { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 16px; }

@media (max-width: 760px) {
  #dv-q { min-width: 0; width: 100%; }
  .dv-table th { position: static; }
}

/* 老板 10-04：可视化——顶上数字卡、小标题图标、表里的状态牌和空状态（零件在 shared/viz.css） */
#dv-kpis .sqv-kpis { margin: 10px 0 0; }
.dv-sec-head h2 { display: inline-flex; align-items: center; gap: 6px; }
.dv-sec-head h2 .sqv-ico { color: var(--accent); }
.dv-table td .sqv-pill { height: 20px; padding: 0 7px; }
.dv-table tr.dv-empty-row td { height: auto; white-space: normal; }
.dv-table tr.dv-empty-row:hover td { background: var(--surface); }
