/* 秋招工作台 · visual-lab.css —— 交互式视觉实验室 */
/* ==========================================================================
   ✨ 交互式视觉实验室 (Visual Lab) & 动效沙盘样式
   ========================================================================== */

.vlab-wrapper {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--shadow);
  overflow: hidden;
  margin-bottom: 30px;
}

.vlab-header {
  padding: 18px 24px;
  background: linear-gradient(135deg, rgba(37,99,235,0.08), rgba(16,185,129,0.06));
  border-bottom: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.vlab-title-group {
  display: flex;
  align-items: center;
  gap: 12px;
}

.vlab-logo {
  font-size: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 12px;
  box-shadow: 0 4px 12px rgba(37,99,235,0.1);
  flex-shrink: 0;
}

.vlab-title {
  font-size: 19px;
  font-weight: 850;
  margin: 0;
  color: var(--ink);
  letter-spacing: -0.3px;
}

.vlab-subtitle {
  font-size: 13px;
  color: var(--muted);
  margin: 3px 0 0;
}

/* 顶部快速切换胶囊 */
.vlab-quick-tabs {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  padding-top: 6px;
  border-top: 1px dashed var(--line);
}

.vlab-tabs-label {
  font-size: 12px;
  font-weight: 700;
  color: var(--muted);
}

.vlab-tabs-scroll {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
}

.vlab-nav-tab {
  padding: 5px 11px;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 600;
  border: 1px solid var(--line);
  background: var(--panel);
  color: var(--ink);
  cursor: pointer;
  transition: all 0.15s ease;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.vlab-nav-tab:hover {
  border-color: var(--accent);
  color: var(--accent);
  background: var(--panel-sub);
}

.vlab-nav-tab.active {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  box-shadow: 0 2px 8px rgba(37,99,235,0.25);
}

/* 主内容双栏布局 */
.vlab-body {
  display: flex;
  min-height: 720px;
  background: var(--bg);
}

.vlab-sidebar {
  width: 320px;
  border-right: 1px solid var(--line);
  background: var(--panel);
  padding: 16px 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  overflow-y: auto;
  max-height: 860px;
  flex-shrink: 0;
}

.vlab-sidebar-title {
  font-size: 11px;
  font-weight: 800;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.8px;
  padding: 4px 8px 8px;
  border-bottom: 1px solid var(--line-soft);
}

.vlab-nav-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.vlab-nav-item {
  padding: 10px 12px;
  border-radius: 8px;
  border: 1px solid transparent;
  background: transparent;
  cursor: pointer;
  transition: all 0.15s ease;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.vlab-nav-item:hover {
  background: var(--panel-sub);
  border-color: var(--line);
}

.vlab-nav-item.active {
  background: var(--accent-soft);
  border-color: rgba(37,99,235,0.35);
  box-shadow: 0 2px 8px rgba(37,99,235,0.08);
}

.vlab-nav-item-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}

.vlab-nav-item-title {
  font-size: 13px;
  font-weight: 700;
  color: var(--ink);
  line-height: 1.4;
}

.vlab-nav-item.active .vlab-nav-item-title {
  color: var(--accent);
}

.vlab-nav-badge {
  font-size: 10.5px;
  padding: 2px 7px;
  border-radius: 4px;
  font-weight: 750;
  white-space: nowrap;
  flex-shrink: 0;
}

.vlab-nav-badge.p0 {
  background: rgba(239,68,68,0.14);
  color: #dc2626;
  border: 1px solid rgba(239,68,68,0.25);
}

.vlab-nav-badge.p1 {
  background: rgba(37,99,235,0.12);
  color: var(--accent);
  border: 1px solid rgba(37,99,235,0.25);
}

.vlab-nav-item-cat {
  font-size: 11.5px;
  color: var(--muted);
}

/* 舞台容器 */
.vlab-stage-container {
  flex: 1;
  padding: 20px;
  overflow-y: auto;
  max-height: 860px;
  background: var(--bg);
}

.vlab-stage-header {
  margin-bottom: 16px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--line);
}

.vlab-stage-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 6px;
}

.vlab-meta-cat {
  font-size: 11.5px;
  font-weight: 700;
  color: var(--muted);
}

.vlab-meta-badge {
  font-size: 11px;
  padding: 2px 8px;
  border-radius: 4px;
  font-weight: 750;
}

.vlab-meta-badge.p0 {
  background: rgba(239,68,68,0.12);
  color: #dc2626;
  border: 1px solid rgba(239,68,68,0.25);
}

.vlab-meta-badge.p1 {
  background: rgba(37,99,235,0.12);
  color: var(--accent);
  border: 1px solid rgba(37,99,235,0.25);
}

.vlab-stage-title {
  font-size: 17px;
  font-weight: 800;
  color: var(--ink);
  margin: 0 0 6px;
}

.vlab-stage-desc {
  font-size: 13px;
  color: var(--muted);
  line-height: 1.5;
  margin: 0;
}

.sandbox-box {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

/* 画布与沙盘工具栏 */
.sandbox-toolbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px;
  padding: 10px 14px;
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  margin-bottom: 14px;
}

.sandbox-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.vlab-btn {
  padding: 7px 14px;
  font-size: 12.5px;
  font-weight: 700;
  border-radius: 6px;
  border: 1px solid var(--line);
  background: var(--panel);
  color: var(--ink);
  cursor: pointer;
  transition: all 0.15s ease;
  display: inline-flex;
  align-items: center;
  gap: 5px;
}

.vlab-btn:hover {
  background: var(--panel-sub);
  border-color: var(--accent);
  color: var(--accent);
  transform: translateY(-1px);
}

.vlab-btn.primary {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  box-shadow: 0 2px 8px rgba(37,99,235,0.2);
}

.vlab-btn.primary:hover {
  background: var(--deep);
}

.sandbox-time-travel {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--ink);
}

.st-label {
  font-size: 12.5px;
  font-weight: 700;
  color: var(--ink);
}

.st-val {
  font-family: monospace;
  font-weight: 800;
  color: var(--accent);
}

.vlab-slider {
  accent-color: var(--accent);
  cursor: pointer;
  min-width: 130px;
}

.vlab-select, .vlab-input {
  padding: 6px 10px;
  border-radius: 6px;
  border: 1px solid var(--line);
  background: var(--panel);
  color: var(--ink);
  font-size: 12.5px;
}

/* 1. LangGraph 状态机画布 */
.lg-graph-canvas {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-around;
  background: #0b0f19;
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: 10px;
  padding: 24px 16px;
  margin-bottom: 14px;
  position: relative;
  overflow-x: auto;
  min-height: 120px;
}

.lg-node {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 10px 14px;
  background: #1a2234;
  border: 2px solid #334155;
  border-radius: 8px;
  color: #94a3b8;
  font-size: 12px;
  font-weight: 700;
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  min-width: 90px;
  text-align: center;
  z-index: 2;
}

.lg-node .node-icon {
  font-size: 20px;
}

.lg-node.active {
  background: #1e3a8a;
  border-color: #60a5fa;
  color: #ffffff;
  box-shadow: 0 0 20px rgba(96,165,250,0.5);
  transform: scale(1.1);
}

.lg-node.pulse-red {
  background: #7f1d1d;
  border-color: #f87171;
  color: #ffffff;
  box-shadow: 0 0 20px rgba(248,113,113,0.7);
  animation: nodeShake 0.4s ease-in-out;
}

.lg-edge {
  font-size: 18px;
  color: #475569;
  font-weight: bold;
  margin: 0 6px;
}

/* 2. MCP 报文管道 */
.mcp-pipe-stage {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  background: #0b0f19;
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: 10px;
  padding: 24px 20px;
  margin-bottom: 14px;
  position: relative;
  gap: 16px;
}

.mcp-box {
  flex: 1;
  max-width: 240px;
  background: #162032;
  border: 2px solid #334155;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 4px 12px rgba(0,0,0,0.3);
  z-index: 2;
}

.client-box { border-color: #3b82f6; }
.server-box { border-color: #10b981; }

.mcp-box-header {
  padding: 8px 12px;
  font-size: 12px;
  font-weight: 800;
  background: rgba(255,255,255,0.04);
  border-bottom: 1px solid rgba(255,255,255,0.08);
  color: #f1f5f9;
  text-align: center;
}

.mcp-box-body {
  padding: 12px;
  font-size: 12px;
  color: #94a3b8;
  display: flex;
  flex-direction: column;
  gap: 6px;
  text-align: center;
}

.mcp-balance b {
  color: #f59e0b;
  font-size: 14px;
}

.mcp-wire {
  flex: 2;
  height: 3px;
  background: #334155;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 200px;
}

.mcp-wire-label {
  position: absolute;
  top: -24px;
  font-size: 11px;
  color: #64748b;
  font-weight: 600;
  white-space: nowrap;
}

.mcp-packet {
  position: absolute;
  left: 10px;
  color: #0284c7;
  background: #e0f2fe;
  border: 1px solid #38bdf8;
  font-family: monospace;
  font-size: 11px;
  font-weight: 800;
  padding: 4px 10px;
  border-radius: 20px;
  white-space: nowrap;
  box-shadow: 0 0 12px rgba(56,189,248,0.6);
  transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  z-index: 3;
}

/* 3. Grammar-Guided Decoding */
.grammar-compare-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-bottom: 14px;
}

.grammar-col {
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  overflow: hidden;
}

.g-col-header {
  padding: 10px 14px;
  font-size: 13px;
  font-weight: 750;
  border-bottom: 1px solid var(--line);
}

.soft-col .g-col-header { background: var(--bad-soft); color: var(--bad); }
.hard-col .g-col-header { background: var(--ok-soft); color: var(--ok); }

.g-col-body {
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-height: 140px;
}

.g-output-box {
  font-family: monospace;
  font-size: 13px;
  padding: 12px;
  background: #0b0f19;
  color: #f87171;
  border-radius: 6px;
  border: 1px solid rgba(255,255,255,0.06);
  line-height: 1.5;
  min-height: 50px;
}

.g-output-box.active {
  color: #34d399;
  border-color: rgba(52,211,153,0.3);
}

.g-fail-tag {
  font-size: 11.5px;
  color: var(--bad);
  font-weight: 600;
}

.gm-title {
  font-size: 11.5px;
  font-weight: 700;
  color: var(--muted);
  margin-bottom: 6px;
}

.gm-chips {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
}

.gm-chip {
  font-family: monospace;
  font-size: 11.5px;
  padding: 3px 8px;
  border-radius: 4px;
  font-weight: 700;
}

.gm-chip.legal {
  background: rgba(16,185,129,0.15);
  color: #10b981;
  border: 1px solid rgba(16,185,129,0.3);
}

.gm-chip.illegal {
  background: rgba(239,68,68,0.15);
  color: #ef4444;
  border: 1px solid rgba(239,68,68,0.3);
  text-decoration: line-through;
  opacity: 0.6;
}

/* 4. vLLM PagedAttention */
.vllm-compare-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-bottom: 14px;
}

.vllm-gauge-card, .vllm-puzzle-card {
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.vg-title, .vp-title {
  font-size: 13px;
  font-weight: 750;
  color: var(--ink);
}

.vg-metrics {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  font-size: 12px;
  color: var(--muted);
}

.vg-metrics .total {
  grid-column: 1 / -1;
  font-size: 13px;
  font-weight: 800;
  color: var(--ink);
}

.vgm-bar-bg {
  height: 16px;
  background: #0b0f19;
  border-radius: 8px;
  overflow: hidden;
  border: 1px solid var(--line);
}

.vgm-bar-fill {
  height: 100%;
  transition: width 0.3s ease, background 0.3s ease;
  border-radius: 8px;
}

.vgm-tip {
  font-size: 12px;
  font-weight: 600;
  margin-top: 4px;
}

.vp-side-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}

.vp-box {
  background: #0b0f19;
  border-radius: 6px;
  padding: 10px;
  border: 1px solid rgba(255,255,255,0.06);
}

.vp-label {
  font-size: 11px;
  font-weight: 700;
  margin-bottom: 6px;
}

.vp-blocks {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.block-used {
  background: #3b82f6;
  color: #fff;
  font-size: 10.5px;
  padding: 3px 6px;
  border-radius: 3px;
}

.block-waste {
  background: rgba(239,68,68,0.2);
  color: #f87171;
  border: 1px dashed #ef4444;
  font-size: 10.5px;
  padding: 3px 6px;
  border-radius: 3px;
}

.block-used-p {
  background: #10b981;
  color: #fff;
  font-size: 10.5px;
  padding: 3px 6px;
  border-radius: 3px;
}

/* 5. RAG 流水线 */
.rag-pipeline-viz {
  display: grid;
  grid-template-columns: 1fr 1fr 1.2fr;
  gap: 14px;
  margin-bottom: 14px;
}

.rag-col {
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.rag-step-badge {
  font-size: 12px;
  font-weight: 750;
  padding: 4px 8px;
  border-radius: 4px;
  background: var(--accent-soft);
  color: var(--accent);
}

.rag-doc-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 12px;
}

.rag-doc {
  padding: 8px 10px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 6px;
  line-height: 1.4;
  color: var(--muted);
}

.rag-doc.hit {
  border-color: rgba(37,99,235,0.4);
  color: var(--ink);
  background: rgba(37,99,235,0.04);
  font-weight: 600;
}

.rag-doc.final {
  border-color: rgba(139,92,246,0.5);
  color: #7c3aed;
  background: rgba(139,92,246,0.08);
  font-weight: 700;
}

/* 6. NL2SQL 沙盘 */
.nl2sql-stage-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
  margin-bottom: 14px;
}

.n2s-step-card {
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 14px;
}

.n2s-title {
  font-size: 13px;
  font-weight: 750;
  margin-bottom: 10px;
  color: var(--ink);
}

.schema-pill {
  display: inline-block;
  padding: 4px 10px;
  border-radius: 20px;
  font-size: 12px;
  margin: 3px;
  font-weight: 600;
}

.schema-pill.active {
  background: var(--ok-soft);
  color: var(--ok);
  border: 1px solid rgba(16,185,129,0.3);
}

.schema-pill.dim {
  background: var(--panel);
  color: var(--faint);
  border: 1px dashed var(--line);
}

.sql-preview {
  background: #0b0f19;
  color: #38bdf8;
  font-family: monospace;
  font-size: 12px;
  padding: 10px;
  border-radius: 6px;
  margin-bottom: 8px;
  white-space: pre-wrap;
  line-height: 1.5;
}

.sql-alert {
  font-size: 12px;
  font-weight: 700;
  padding: 8px 12px;
  border-radius: 6px;
}

.sql-alert.safe {
  background: var(--ok-soft);
  color: var(--ok);
  border: 1px solid rgba(16,185,129,0.3);
}

.sql-alert.danger {
  background: var(--bad-soft);
  color: var(--bad);
  border: 1px solid rgba(239,68,68,0.4);
  animation: nodeShake 0.4s ease-in-out;
}

/* 7. SQL Window 动画表 */
.sql-table-wrap {
  overflow-x: auto;
  margin-bottom: 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
}

.sql-anim-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12.5px;
  font-family: monospace;
}

.sql-anim-table th, .sql-anim-table td {
  padding: 10px 14px;
  text-align: center;
  border-bottom: 1px solid var(--line);
}

.sql-anim-table th {
  background: var(--panel-sub);
  font-weight: 700;
  color: var(--ink);
}

.col-dim {
  color: var(--faint);
  opacity: 0.5;
}

.col-active {
  color: var(--accent);
  font-weight: 800;
}

.td-rn.active {
  color: var(--accent);
  font-weight: bold;
  background: var(--accent-soft);
}

.td-grp.active {
  color: #d97706;
  font-weight: bold;
  background: var(--warn-soft);
}

.row-target.glow-gold {
  background: rgba(245,158,11,0.18) !important;
  font-weight: bold;
}

/* 8. 招投标战场 */
.bidding-battle-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-bottom: 14px;
}

.bidding-choice-card, .bidding-score-card {
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 14px;
}

.bc-title, .bsc-title {
  font-size: 13px;
  font-weight: 750;
  margin-bottom: 10px;
  color: var(--ink);
}

.bsc-score {
  font-size: 18px;
  font-weight: 800;
  margin-bottom: 8px;
}

.bsc-feedback {
  font-size: 12.5px;
  line-height: 1.6;
  color: var(--muted);
}

/* 9. 国企红头公文 */
.soe-doc-interactive {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: 16px;
  margin-bottom: 14px;
}

.soe-paper {
  background: #ffffff;
  color: #111827;
  border-radius: 6px;
  padding: 24px 30px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.1);
  border: 1px solid #e5e7eb;
  font-family: "SimSun", "Songti SC", serif;
  cursor: pointer;
}

.soe-red-head {
  color: #dc2626;
  font-size: 20px;
  font-weight: 900;
  text-align: center;
  letter-spacing: 2px;
  font-family: "SimHei", sans-serif;
  padding: 4px;
  border-radius: 4px;
  transition: background 0.2s;
}

.soe-red-head:hover, .soe-doc-num:hover, .soe-doc-title:hover, .soe-doc-to:hover, .soe-doc-body:hover {
  background: #fef08a;
}

.soe-doc-num {
  font-size: 12px;
  color: #374151;
  text-align: right;
  margin-top: 6px;
  padding: 2px 4px;
  border-radius: 4px;
}

.soe-doc-divider {
  height: 2px;
  background: #dc2626;
  margin: 10px 0 16px;
}

.soe-doc-title {
  font-size: 16px;
  font-weight: 800;
  text-align: center;
  margin-bottom: 14px;
  padding: 4px;
  border-radius: 4px;
  font-family: "SimHei", sans-serif;
}

.soe-doc-to {
  font-size: 13px;
  font-weight: 700;
  margin-bottom: 8px;
  padding: 2px 4px;
}

.soe-doc-body {
  font-size: 13px;
  line-height: 1.8;
  text-indent: 2em;
  padding: 6px;
  border-radius: 4px;
}

.soe-doc-stamp-wrap {
  text-align: right;
  margin-top: 20px;
  font-size: 13px;
}

.soe-rule-panel {
  background: var(--panel-sub);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.srp-title {
  font-size: 13px;
  font-weight: 750;
  color: var(--ink);
}

.srp-detail {
  padding: 12px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 6px;
  font-size: 12.5px;
  line-height: 1.6;
  color: var(--ink);
  min-height: 80px;
}

.srp-diff {
  padding: 12px;
  background: rgba(37,99,235,0.06);
  border: 1px solid rgba(37,99,235,0.2);
  border-radius: 6px;
  font-size: 12px;
  line-height: 1.6;
  color: var(--ink);
}

/* 技能卡片中的直通沙盘入口按钮 */
.skill-sandbox-entry {
  margin: 10px 0 6px;
}

.btn-open-sandbox {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 8px 12px;
  background: linear-gradient(135deg, rgba(37,99,235,0.08), rgba(16,185,129,0.08));
  border: 1px solid rgba(37,99,235,0.25);
  border-radius: 6px;
  color: var(--accent);
  font-size: 12.5px;
  font-weight: 700;
  cursor: pointer;
  transition: all 0.2s ease;
}

.btn-open-sandbox:hover {
  background: linear-gradient(135deg, rgba(37,99,235,0.18), rgba(16,185,129,0.18));
  border-color: var(--accent);
  transform: translateY(-1px);
  box-shadow: 0 3px 10px rgba(37,99,235,0.12);
}

@media (max-width: 900px) {
  .vlab-body {
    flex-direction: column;
  }
  .vlab-sidebar {
    width: 100%;
    border-right: none;
    border-bottom: 1px solid var(--line);
    max-height: 200px;
  }
  .grammar-compare-grid, .rag-dual-stream, .sandbox-inspector {
    grid-template-columns: 1fr;
    flex-direction: column;
  }
}
