/* ──────────────────────────────────────────────────────────
   启发式上市企业年报点评智能体 · 专业深色主题 v2
   参考: Bloomberg · Notion · Linear · Terminal
   ────────────────────────────────────────────────────────── */

:root {
  /* Canvas */
  --ir-bg: #0a0d14;
  --ir-bg-elev: #12161f;
  --ir-bg-elev-2: #1a1f2c;
  --ir-bg-code: #0d1117;
  /* Borders */
  --ir-border: #1e2533;
  --ir-border-subtle: #161b26;
  /* Text */
  --ir-text: #e8ebf0;
  --ir-text-secondary: #b3bac7;
  --ir-text-dim: #8a93a3;
  --ir-text-muted: #5f6875;
  /* Accent: warm gold for financial pro feel */
  --ir-accent: #c9a063;
  --ir-accent-hover: #d8b070;
  --ir-accent-faint: rgba(201, 160, 99, 0.08);
  --ir-accent-soft: rgba(201, 160, 99, 0.15);
  /* Semantic */
  --ir-success: #10b981;
  --ir-warning: #e8a033;
  --ir-danger: #e85c5c;
  --ir-info: #5b8dee;
  /* Typography */
  --ir-mono: "JetBrains Mono", ui-monospace, "SF Mono", "IBM Plex Mono", "Fira Code", Menlo, Consolas, monospace;
  --ir-sans: "Inter", "Helvetica Neue", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", system-ui, sans-serif;
}

/* ── Base ──────────────────────────────────────────────── */
html, body, #root, .dark {
  font-family: var(--ir-sans) !important;
  font-size: 17px;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  letter-spacing: -0.005em;
}

body, .dark body {
  background: var(--ir-bg) !important;
  color: var(--ir-text) !important;
}

/* 顶栏右上角用户头像 (auth 给 identifier='local' 后自动出现). 单用户场景隐掉.
   结构: <button><div class="rounded-full h-8 w-8"><span>L</span></div></button> */
button:has(> [class*="rounded-full"][class*="h-8"][class*="w-8"]) {
  display: none !important;
}

/* Chainlit 内置的 thread sidebar (class "group peer hidden md:block ...")
   在 data_layer 启用后自动出现在 main 左侧, 和我们的 #ir-left 重复且抢位置.
   直接隐掉 + 消除其 peer 留下的布局偏移. */
.group\/sidebar-wrapper > .group.peer,
.group\/sidebar-wrapper > [class*="text-sidebar-foreground"] {
  display: none !important;
}
.group\/sidebar-wrapper > main {
  margin-left: 0 !important;
  width: 100% !important;
  background: var(--ir-bg) !important;
}
/* 所有 Chainlit 的 bg-background 色 (默认 rgb(33,33,33)) 改成我们的 --ir-bg */
main, main *[class*="bg-background"], [class*="bg-sidebar"] {
  background-color: var(--ir-bg) !important;
}

/* Remove Chainlit's default chat bubble feel */
div[class*="Message"], [data-step-type="assistant_message"] {
  padding: 0 !important;
  margin: 12px 0 !important;
}

/* ── Typography ─────────────────────────────────────────── */
[data-step-type="assistant_message"], .message-content {
  line-height: 1.7;
  font-size: 16.5px;
  color: var(--ir-text);
}

[data-step-type="assistant_message"] h1, .message-content h1 {
  font-size: 26px;
  font-weight: 600;
  color: var(--ir-text);
  border-bottom: 1px solid var(--ir-border);
  padding-bottom: 12px;
  margin: 24px 0 16px;
  letter-spacing: -0.02em;
  line-height: 1.3;
}

[data-step-type="assistant_message"] h2, .message-content h2 {
  font-size: 18px;
  font-weight: 600;
  color: var(--ir-accent);
  margin: 20px 0 10px;
  letter-spacing: -0.01em;
}

[data-step-type="assistant_message"] h3, .message-content h3 {
  font-size: 17px;
  font-weight: 600;
  color: var(--ir-text);
  margin: 16px 0 8px;
  letter-spacing: -0.005em;
}

[data-step-type="assistant_message"] h4, .message-content h4 {
  font-size: 13px;
  font-weight: 600;
  color: var(--ir-text-secondary);
  margin: 12px 0 6px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

[data-step-type="assistant_message"] p, .message-content p {
  margin: 10px 0;
  color: var(--ir-text);
}

[data-step-type="assistant_message"] ul, [data-step-type="assistant_message"] ol,
.message-content ul, .message-content ol {
  padding-left: 24px;
  margin: 10px 0;
}

[data-step-type="assistant_message"] li, .message-content li {
  margin: 6px 0;
  color: var(--ir-text);
}

[data-step-type="assistant_message"] li::marker, .message-content li::marker {
  color: var(--ir-accent);
}

[data-step-type="assistant_message"] strong, .message-content strong {
  color: var(--ir-accent);
  font-weight: 600;
}

[data-step-type="assistant_message"] em, .message-content em {
  color: var(--ir-text-secondary);
  font-style: italic;
}

/* ── Inline code ───────────────────────────────────────── */
[data-step-type="assistant_message"] code:not(pre code), .message-content code:not(pre code) {
  background: var(--ir-bg-elev-2);
  color: var(--ir-accent);
  padding: 1px 7px;
  border-radius: 4px;
  font-size: 13px;
  font-family: var(--ir-mono);
  border: 1px solid var(--ir-border-subtle);
}

/* ── Code block (progress bar, etc.) ──────────────────── */
[data-step-type="assistant_message"] pre, .message-content pre {
  background: var(--ir-bg-code) !important;
  border: 1px solid var(--ir-border);
  border-radius: 8px;
  padding: 14px 18px;
  font-family: var(--ir-mono);
  font-size: 13px;
  line-height: 1.55;
  overflow-x: auto;
  margin: 12px 0;
}

[data-step-type="assistant_message"] pre code, .message-content pre code {
  background: none;
  border: none;
  padding: 0;
  color: var(--ir-text-secondary);
}

/* ── Tables (财务指标) ────────────────────────────────── */
[data-step-type="assistant_message"] table, .message-content table {
  border-collapse: collapse;
  width: 100%;
  margin: 14px 0;
  font-size: 13px;
  font-variant-numeric: tabular-nums;
  border: 1px solid var(--ir-border);
  border-radius: 8px;
  overflow: hidden;
}

[data-step-type="assistant_message"] th, .message-content th {
  background: var(--ir-bg-elev);
  color: var(--ir-accent);
  font-weight: 600;
  text-align: left;
  padding: 10px 14px;
  border-bottom: 1px solid var(--ir-accent);
  letter-spacing: 0.04em;
  font-size: 11px;
  text-transform: uppercase;
}

[data-step-type="assistant_message"] td, .message-content td {
  padding: 10px 14px;
  border-bottom: 1px solid var(--ir-border-subtle);
  color: var(--ir-text);
}

[data-step-type="assistant_message"] tr:last-child td, .message-content tr:last-child td {
  border-bottom: none;
}

[data-step-type="assistant_message"] tr:hover td, .message-content tr:hover td {
  background: var(--ir-accent-faint);
}

/* ── Blockquote — progress / status feed (matches option font size) ── */
[data-step-type="assistant_message"] blockquote, .message-content blockquote {
  border-left: 3px solid var(--ir-accent);
  padding: 6px 0 6px 16px;
  margin: 12px 0;
  color: var(--ir-text-secondary);
  font-family: var(--ir-mono) !important;
  font-size: 13.5px !important;
  font-variant-numeric: tabular-nums;
  font-style: normal;
  letter-spacing: 0;
  line-height: 1.55;
  background: var(--ir-accent-faint);
  border-radius: 0 6px 6px 0;
}
[data-step-type="assistant_message"] blockquote p,
.message-content blockquote p {
  font-family: var(--ir-mono) !important;
  font-size: 13.5px !important;
  margin: 0 !important;
}

[data-step-type="assistant_message"] hr, .message-content hr {
  border: 0;
  border-top: 1px solid var(--ir-border);
  margin: 24px 0;
}

/* ── Action buttons ───────────────────────────────────── */
button[data-testid="action-button"],
.action-button,
button[class*="Action"],
[role="button"][class*="action"] {
  border: 1px solid var(--ir-border) !important;
  background: var(--ir-bg-elev) !important;
  color: var(--ir-text-secondary) !important;
  font-family: var(--ir-mono) !important;
  font-size: 13.5px !important;
  font-weight: 500 !important;
  font-variant-numeric: tabular-nums !important;
  padding: 9px 16px !important;
  border-radius: 6px !important;
  letter-spacing: 0 !important;
  transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1) !important;
  cursor: pointer;
  margin: 4px 6px 4px 0 !important;
}

button[data-testid="action-button"]:hover,
.action-button:hover,
button[class*="Action"]:hover,
[role="button"][class*="action"]:hover {
  background: var(--ir-accent-soft) !important;
  border-color: var(--ir-accent) !important;
  color: var(--ir-accent) !important;
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(201, 160, 99, 0.2);
}

button[data-testid="action-button"]:active {
  transform: translateY(0);
}

/* ── Action buttons — all styling keyed on .ir-action / .ir-action-wrap
   (tagged by hero.js at runtime; stable across Chainlit internal class changes). */
.ir-action-wrap {
  display: flex !important;
  flex-direction: column !important;
  flex-wrap: nowrap !important;
  align-items: stretch !important;
  gap: 6px !important;
  margin-top: 10px !important;
  padding-top: 10px !important;
  border-top: 1px dashed var(--ir-border) !important;
}

.ir-action {
  display: flex !important;
  justify-content: flex-start !important;
  align-items: center !important;
  text-align: left !important;
  width: 100% !important;
  max-width: 640px !important;
  margin: 0 !important;
  padding: 9px 14px 9px 10px !important;
  border-left: 3px solid var(--ir-accent) !important;
  border-top: 1px solid var(--ir-border) !important;
  border-right: 1px solid var(--ir-border) !important;
  border-bottom: 1px solid var(--ir-border) !important;
  border-radius: 4px !important;
  background: rgba(26, 31, 44, 0.6) !important;
  color: var(--ir-text-secondary) !important;
  font-family: var(--ir-mono) !important;
  font-size: 13.5px !important;
  font-weight: 500 !important;
  font-variant-numeric: tabular-nums !important;
  letter-spacing: 0 !important;
  white-space: normal !important;
  line-height: 1.45 !important;
  transition: background 0.15s, border-left-color 0.15s, color 0.15s, transform 0.15s !important;
  height: auto !important;
  min-height: 40px !important;
}

.ir-action * {
  font-family: var(--ir-mono) !important;
  font-size: 13.5px !important;
  font-variant-numeric: tabular-nums !important;
  letter-spacing: 0 !important;
}

.ir-action::before {
  content: "▸";
  color: var(--ir-accent) !important;
  margin-right: 10px !important;
  font-size: 11px !important;
  line-height: 1 !important;
  transition: transform 0.15s, color 0.15s !important;
  flex-shrink: 0 !important;
}

.ir-action:hover {
  background: var(--ir-accent-soft) !important;
  border-left-color: var(--ir-accent-hover) !important;
  border-left-width: 4px !important;
  color: var(--ir-text) !important;
  transform: translateX(2px) !important;
  box-shadow: 0 2px 8px rgba(201, 160, 99, 0.15) !important;
}

.ir-action:hover::before {
  color: var(--ir-accent-hover) !important;
  transform: translateX(2px) !important;
}

/* ── Primary/继续 action — 让"推进流程"的按钮脱颖而出 ───────────
   匹配规则由 hero.js tagActions 负责 (label 含 继续/完成/定稿/下一步/确认).
   视觉: 金色填充 + 白金字 + 右侧 → 箭头 + 柔光 pulse, 区分于灰底次级. */
.ir-action.ir-action-primary {
  background: linear-gradient(90deg,
    rgba(201, 160, 99, 0.22) 0%,
    rgba(201, 160, 99, 0.12) 100%) !important;
  border-left: 3px solid var(--ir-accent-bright, #e0b878) !important;
  border-top: 1px solid rgba(201, 160, 99, 0.45) !important;
  border-right: 1px solid rgba(201, 160, 99, 0.45) !important;
  border-bottom: 1px solid rgba(201, 160, 99, 0.45) !important;
  color: var(--ir-accent-bright, #e0b878) !important;
  font-weight: 600 !important;
  box-shadow: 0 0 0 1px rgba(201, 160, 99, 0.15),
              0 2px 10px rgba(201, 160, 99, 0.12) !important;
  position: relative !important;
}
.ir-action.ir-action-primary::before {
  content: "▶" !important;
  color: var(--ir-accent-bright, #e0b878) !important;
  text-shadow: 0 0 8px rgba(201, 160, 99, 0.45) !important;
}
.ir-action.ir-action-primary::after {
  content: "→" !important;
  position: absolute !important;
  right: 14px !important;
  color: var(--ir-accent-bright, #e0b878) !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  opacity: 0.85 !important;
  transition: transform 0.18s, opacity 0.18s !important;
}
.ir-action.ir-action-primary:hover {
  background: linear-gradient(90deg,
    rgba(201, 160, 99, 0.34) 0%,
    rgba(201, 160, 99, 0.22) 100%) !important;
  border-left-color: var(--ir-accent-bright, #e0b878) !important;
  box-shadow: 0 0 0 1px rgba(201, 160, 99, 0.3),
              0 4px 18px rgba(201, 160, 99, 0.3) !important;
  transform: translateX(3px) !important;
}
.ir-action.ir-action-primary:hover::after {
  transform: translateX(3px) !important;
  opacity: 1 !important;
}
/* 轻微呼吸: 让"唯一能推进"这个按钮暗中召唤用户点击 */
@keyframes ir-action-primary-pulse {
  0%, 100% { box-shadow: 0 0 0 1px rgba(201, 160, 99, 0.15),
                          0 2px 10px rgba(201, 160, 99, 0.12); }
  50%      { box-shadow: 0 0 0 1px rgba(201, 160, 99, 0.3),
                          0 2px 18px rgba(201, 160, 99, 0.28); }
}
.ir-action.ir-action-primary:not(:hover):not(.ir-action-selected) {
  animation: ir-action-primary-pulse 2.4s ease-in-out infinite;
}

/* ── Selected state — user's chosen option stays highlighted ── */
.ir-action.ir-action-selected {
  background: rgba(201, 160, 99, 0.18) !important;
  border-left: 4px solid var(--ir-accent-hover) !important;
  color: var(--ir-accent) !important;
  box-shadow: 0 2px 12px rgba(201, 160, 99, 0.25) !important;
  transform: translateX(2px) !important;
}
.ir-action.ir-action-selected::before {
  content: "✓" !important;
  color: var(--ir-accent-hover) !important;
  font-weight: 700 !important;
  font-size: 13px !important;
}

/* ── Disabled state — sibling options after selection, still clickable
   (so user can switch), but dimmed to de-emphasize. ── */
.ir-action.ir-action-disabled {
  opacity: 0.45 !important;
  color: var(--ir-text-dim) !important;
  border-left-color: var(--ir-text-muted) !important;
  background: rgba(26, 31, 44, 0.3) !important;
  box-shadow: none !important;
  transform: none !important;
}
.ir-action.ir-action-disabled::before {
  color: var(--ir-text-muted) !important;
}
.ir-action.ir-action-disabled:hover {
  opacity: 0.7 !important;
  color: var(--ir-text-secondary) !important;
  border-left-color: var(--ir-accent) !important;
  background: rgba(26, 31, 44, 0.5) !important;
  transform: translateX(2px) !important;
}

/* ── .ir-material — non-clickable option-style list (fetched reports) ── */
.ir-material-wrap {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px dashed var(--ir-border);
}
.ir-material {
  display: flex;
  align-items: baseline;
  gap: 12px;
  width: 100%;
  max-width: 640px;
  padding: 8px 12px 8px 10px;
  border-left: 3px solid var(--ir-text-dim);
  border-top: 1px solid var(--ir-border-subtle);
  border-right: 1px solid var(--ir-border-subtle);
  border-bottom: 1px solid var(--ir-border-subtle);
  border-radius: 4px;
  background: rgba(26, 31, 44, 0.35);
  font-family: var(--ir-mono);
  font-size: 13.5px;
  font-variant-numeric: tabular-nums;
  line-height: 1.45;
}
.ir-material::before {
  content: "·";
  color: var(--ir-text-dim);
  margin-right: 8px;
  font-size: 14px;
  line-height: 1;
  flex-shrink: 0;
}
.ir-material-title {
  color: var(--ir-text);
  font-weight: 400;
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ir-material-date {
  color: var(--ir-text-dim);
  font-size: 12.5px;
  flex-shrink: 0;
}

/* ── .ir-insight — 分析摘要卡片 (我读到了什么) ── */
.ir-insight-wrap {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px dashed var(--ir-border);
}
.ir-insight {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: 720px;
  padding: 10px 14px 10px 12px;
  border-left: 3px solid var(--ir-accent);
  border-top: 1px solid var(--ir-border);
  border-right: 1px solid var(--ir-border);
  border-bottom: 1px solid var(--ir-border);
  border-radius: 4px;
  background: rgba(26, 31, 44, 0.45);
  font-family: var(--ir-mono);
  font-size: 13.5px;
  font-variant-numeric: tabular-nums;
  line-height: 1.5;
}
.ir-insight-head {
  display: flex;
  align-items: baseline;
  gap: 10px;
}
.ir-insight-num {
  flex-shrink: 0;
  color: var(--ir-accent);
  font-weight: 500;
  font-size: 12.5px;
  min-width: 14px;
}
.ir-insight-finding {
  color: var(--ir-text);
  font-weight: 400;
}
.ir-insight-meta {
  color: var(--ir-text-secondary);
  font-size: 12.5px;
  padding-left: 24px;
  line-height: 1.5;
}
.ir-insight-label {
  color: var(--ir-text-dim);
  margin-right: 6px;
}

/* ── .ir-eval — AI 自评评分卡片 ── */
.ir-eval-wrap {
  display: flex;
  flex-direction: column;
  gap: 4px;
  max-width: 560px;
  margin-top: 10px;
  padding: 10px 12px;
  border-left: 3px solid var(--ir-accent);
  border-top: 1px solid var(--ir-border);
  border-right: 1px solid var(--ir-border);
  border-bottom: 1px solid var(--ir-border);
  border-radius: 4px;
  background: rgba(26, 31, 44, 0.45);
}
.ir-eval-overall {
  display: grid;
  grid-template-columns: 7em 1fr auto;
  align-items: center;
  gap: 12px;
  padding: 6px 4px;
  border-bottom: 1px dashed var(--ir-border);
  margin-bottom: 4px;
  font-family: var(--ir-mono);
  font-size: 13.5px;
  color: var(--ir-accent);
  font-weight: 500;
}
.ir-eval-row {
  display: grid;
  grid-template-columns: 7em 1fr auto;
  align-items: center;
  gap: 12px;
  padding: 4px 4px;
  font-family: var(--ir-mono);
  font-size: 13.5px;
  color: var(--ir-text-secondary);
}
.ir-eval-label {
  color: var(--ir-text-dim);
  font-size: 13px;
}
.ir-eval-overall .ir-eval-label {
  color: var(--ir-accent);
  font-weight: 600;
}
.ir-eval-stars {
  color: var(--ir-accent);
  font-size: 14px;
  letter-spacing: 1px;
  font-family: var(--ir-sans);
}
.ir-eval-value {
  color: var(--ir-text-dim);
  font-size: 12.5px;
  font-variant-numeric: tabular-nums;
}

/* ── .ir-flag — 反面模式警示 ── */
.ir-flag-wrap {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: 8px;
}
.ir-flag {
  padding: 8px 12px 8px 10px;
  max-width: 640px;
  border-left: 3px solid var(--ir-warning, #e8a033);
  border-top: 1px solid var(--ir-border);
  border-right: 1px solid var(--ir-border);
  border-bottom: 1px solid var(--ir-border);
  border-radius: 4px;
  background: rgba(232, 160, 51, 0.06);
  font-family: var(--ir-mono);
  font-size: 13.5px;
  color: var(--ir-text-secondary);
  line-height: 1.5;
}
.ir-flag::before {
  content: "⚠ ";
  color: var(--ir-warning, #e8a033);
  margin-right: 4px;
}

/* ── .ir-diff — 改动详情卡片 (改前 / 改后) ── */
.ir-diff-wrap {
  display: flex;
  flex-direction: column;
  gap: 16px;
  margin-top: 10px;
}
.ir-diff {
  max-width: 720px;
  padding: 12px 14px 10px;
  border-left: 3px solid var(--ir-accent);
  border-top: 1px solid var(--ir-border);
  border-right: 1px solid var(--ir-border);
  border-bottom: 1px solid var(--ir-border);
  border-radius: 4px;
  background: rgba(26, 31, 44, 0.45);
  font-family: var(--ir-mono);
  font-size: 13.5px;
  line-height: 1.5;
}
.ir-diff-head {
  color: var(--ir-accent);
  font-family: var(--ir-sans);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.01em;
  padding-bottom: 6px;
  border-bottom: 1px dashed var(--ir-border);
  margin-bottom: 10px;
}
.ir-diff-reason {
  color: var(--ir-text-secondary);
  font-size: 12.5px;
  margin-bottom: 10px;
  line-height: 1.5;
}
.ir-diff-label {
  display: inline-block;
  color: var(--ir-text-dim);
  margin-right: 8px;
}
.ir-diff-panel {
  padding: 8px 10px;
  margin: 6px 0;
  border-radius: 4px;
  border-left: 2px solid var(--ir-border);
}
.ir-diff-before {
  background: rgba(46, 46, 46, 0.35);
  border-left-color: var(--ir-text-muted, #5f6875);
}
.ir-diff-after {
  background: rgba(201, 160, 99, 0.08);
  border-left-color: var(--ir-accent);
}
.ir-diff-kind {
  font-family: var(--ir-mono);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ir-text-dim);
  margin-bottom: 4px;
}
.ir-diff-after .ir-diff-kind {
  color: var(--ir-accent);
}
.ir-diff-sum {
  font-family: var(--ir-sans);
  font-size: 13.5px;
  font-weight: 600;
  color: var(--ir-text);
  margin-bottom: 6px;
  line-height: 1.5;
}
.ir-diff-body {
  font-family: var(--ir-sans);
  font-size: 13px;
  color: var(--ir-text-secondary);
  line-height: 1.65;
}

/* ── Input / textarea: 保留 Chainlit 默认样式 (不加金色覆盖) ── */

/* ── Send 按钮 (Chainlit 用 id="chat-submit", 默认是红色) ── */
#chat-submit,
button#chat-submit,
button[id="chat-submit"],
button[type="submit"],
button[aria-label*="Send" i],
button[aria-label*="发送" i] {
  background: var(--ir-bg-elev-2) !important;
  background-color: var(--ir-bg-elev-2) !important;
  color: var(--ir-text) !important;
  border: 1px solid var(--ir-border) !important;
  font-weight: 500 !important;
  box-shadow: none !important;
  transition: all 0.15s !important;
}

#chat-submit:hover,
button#chat-submit:hover,
button[id="chat-submit"]:hover,
button[type="submit"]:hover,
button[aria-label*="Send" i]:hover,
button[aria-label*="发送" i]:hover {
  background: var(--ir-bg-elev) !important;
  background-color: var(--ir-bg-elev) !important;
  border-color: var(--ir-text-dim) !important;
}

#chat-submit:disabled,
button#chat-submit:disabled,
button[id="chat-submit"]:disabled {
  opacity: 0.4 !important;
}

/* Chainlit 的 send 按钮可能有子 svg 图标, 确保颜色继承 */
#chat-submit svg,
button#chat-submit svg {
  color: var(--ir-text) !important;
  fill: currentColor !important;
}

/* ── Step (tool / llm calls) ────────────────────────── */
[data-step-type="tool"], [data-step-type="llm"], .step-container {
  background: var(--ir-bg-elev) !important;
  border: 1px solid var(--ir-border) !important;
  border-radius: 8px !important;
  margin: 8px 0 !important;
  padding: 2px 4px !important;
}

/* Hide Chainlit's "Used" prefix on Step names */
[data-step-type="tool"] > *:first-child::before,
[data-step-type="llm"] > *:first-child::before,
.step-name::before {
  content: "" !important;
}

/* Step header: pure mono small caps */
[data-step-type="tool"] > *:first-child,
[data-step-type="llm"] > *:first-child {
  font-family: var(--ir-mono) !important;
  font-size: 11px !important;
  color: var(--ir-text-dim) !important;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  padding: 6px 10px !important;
}

/* ── Sidebar (chat history / thread list) ─────────── */
[data-testid="sidebar"], aside, .sidebar {
  background: var(--ir-bg) !important;
  border-right: 1px solid var(--ir-border) !important;
}

/* ── File upload area ─────────────────────────────── */
[data-testid="file-upload"],
.file-upload-zone,
div[class*="dropzone"] {
  background: var(--ir-bg-elev) !important;
  border: 2px dashed var(--ir-border) !important;
  border-radius: 12px !important;
  transition: all 0.2s !important;
  padding: 32px !important;
}

[data-testid="file-upload"]:hover,
.file-upload-zone:hover,
div[class*="dropzone"]:hover {
  border-color: var(--ir-accent) !important;
  background: var(--ir-accent-faint) !important;
}

/* File chip */
div[class*="FileElement"], div[class*="file-element"] {
  background: var(--ir-bg-elev) !important;
  border: 1px solid var(--ir-border) !important;
  border-radius: 8px !important;
  padding: 12px !important;
}

/* ── Header ───────────────────────────────────────── */
header, [data-testid="header"] {
  background: rgba(10, 13, 20, 0.85) !important;
  border-bottom: 1px solid var(--ir-border) !important;
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
}

[data-testid="logo"] {
  font-family: var(--ir-mono);
  font-weight: 600;
  color: var(--ir-accent);
  letter-spacing: 0.02em;
}

/* ── Scrollbars ───────────────────────────────────── */
::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}
::-webkit-scrollbar-track {
  background: var(--ir-bg);
}
::-webkit-scrollbar-thumb {
  background: var(--ir-border);
  border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
  background: var(--ir-text-muted);
}

/* ── Images (workflow, 华创样本, etc.) ────────────────────
   融合深色主题: 居中 + 金色 ambient glow + 边缘羽化 fade-to-bg
   ──────────────────────────────────────────────────────── */
[data-step-type="assistant_message"] img,
.message-content img,
div[class*="InlinedImage"] img,
div[class*="image-element"] img {
  display: block !important;
  margin: 24px auto !important;
  max-width: min(640px, 86%) !important;
  /* 严控高度: portrait 长图 (例: 华创样本 1191×1684 → 等比 640×905)
     仍可能超 60vh, 用 min() 取 viewport 与绝对像素的小者, 防止任何屏幕
     比例下都溢出气泡盖到下条消息 (用户截图 block.jpg 的根因). */
  max-height: min(60vh, 540px) !important;
  width: auto;
  height: auto;
  object-fit: contain;
  border-radius: 14px;
  border: 1px solid var(--ir-border-subtle);
  box-shadow:
    0 0 0 1px rgba(201, 160, 99, 0.1),
    0 24px 56px -12px rgba(0, 0, 0, 0.6),
    0 0 80px rgba(201, 160, 99, 0.08);
  /* 边缘羽化 → 白底图片平滑融入深色背景
     （椭圆半径 >120% 确保过渡区全部落在图片外, 不吞边缘内容） */
  mask-image: radial-gradient(
    ellipse 130% 125% at center center,
    black 82%,
    rgba(0, 0, 0, 0.6) 96%,
    transparent 100%
  );
  -webkit-mask-image: radial-gradient(
    ellipse 130% 125% at center center,
    black 82%,
    rgba(0, 0, 0, 0.6) 96%,
    transparent 100%
  );
  transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1),
              box-shadow 0.3s cubic-bezier(0.2, 0.8, 0.2, 1);
}

[data-step-type="assistant_message"] img:hover,
.message-content img:hover {
  transform: translateY(-2px) scale(1.005);
  box-shadow:
    0 0 0 1px rgba(201, 160, 99, 0.25),
    0 32px 72px -10px rgba(0, 0, 0, 0.7),
    0 0 120px rgba(201, 160, 99, 0.14);
}

/* ambient 金色光晕: 围绕 image 容器加一层径向 gradient 背景 */
div[class*="InlinedImage"],
div[class*="image-element"] {
  position: relative;
  padding: 20px 0 !important;
}

div[class*="InlinedImage"]::before,
div[class*="image-element"]::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    ellipse 70% 60% at center,
    rgba(201, 160, 99, 0.06),
    transparent 75%
  );
  z-index: 0;
  pointer-events: none;
}

div[class*="InlinedImage"] img,
div[class*="image-element"] img {
  position: relative;
  z-index: 1;
}

/* ── Unclamp Chainlit's tailwind max-h-[450px] / max-h-[300px] on inline images
   so tall portrait images (华创样本 1191×1684 etc.) show in full. Scope only
   to containers that actually hold an <img>, keep side-panel scrollbars intact. */

/* 1. Direct parent-of-img: most Chainlit image wrappers are div>img. Kill any
   max-height clamp so the parent can grow to fit the image natural height.
   ★ 不要 overflow: visible ★ — 那会让 portrait 长图 (760×1074) 溢出气泡盖到
   下一条 message (用户截图 block.jpg). 让 parent 长度自适应 image 高度即可,
   image 自己已被 max-height: 70vh 卡住, 不会无限长. */
main div:has(> img[src]),
main a:has(> img[src]) {
  max-height: none !important;
  height: auto !important;
}

/* 2. Tailwind arbitrary-value classes Chainlit emits for images. */
main [class*="max-h-[450px]"],
main [class*="max-h-[300px]"],
main .custom-scrollbar:has(img) {
  max-height: none !important;
  height: auto !important;
}

/* 3. Img itself — release tailwind max-h-[300/450px] clamp but cap absolutely
   so portrait images can't push 1000+px into next message. */
main img[src] {
  max-height: min(60vh, 540px) !important;
}
main [data-step-type] img[src],
main .message-content img[src] {
  max-width: min(640px, 86%) !important;
  max-height: min(60vh, 540px) !important;
  width: auto !important;
  height: auto !important;
  object-fit: contain !important;
}

/* ── 思考动画 (进行中状态的 emoji 呼吸 + 文字省略号) ── */
@keyframes ir-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.45; transform: scale(1.08); }
}
@keyframes ir-dots {
  0%, 20% { content: "."; }
  40% { content: ".."; }
  60%, 100% { content: "..."; }
}
@keyframes ir-bounce {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-3px); }
}

.ir-thinking {
  display: inline-block;
  animation: ir-pulse 1.2s ease-in-out infinite;
}

.ir-bounce {
  display: inline-block;
  animation: ir-bounce 1.0s ease-in-out infinite;
}

.ir-dots::after {
  display: inline-block;
  content: ".";
  animation: ir-dots 1.4s steps(3) infinite;
  color: var(--ir-accent);
  font-weight: 600;
  margin-left: 2px;
}

.ir-progress-text {
  color: var(--ir-accent);
  font-weight: 500;
}

/* ── Progress indicator in interview ──────────────── */
.ir-progress {
  display: inline-flex;
  gap: 6px;
  vertical-align: middle;
  align-items: center;
}
.ir-progress .ir-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--ir-border);
  border: 1px solid var(--ir-border);
  display: inline-block;
  transition: all 0.2s;
}
.ir-progress .ir-dot.done {
  background: var(--ir-accent);
  border-color: var(--ir-accent);
  opacity: 0.9;
}
.ir-progress .ir-dot.current {
  background: var(--ir-bg-elev);
  border-color: var(--ir-accent);
  box-shadow: 0 0 0 3px var(--ir-accent-faint);
}
.ir-progress-label {
  display: inline-block;
  font-family: var(--ir-mono);
  font-size: 12px;
  color: var(--ir-text-dim);
  margin-left: 10px;
  letter-spacing: 0.05em;
}

/* ── Author labels ────────────────────────────────── */
[data-testid="message-author"], [class*="MessageAuthor"] {
  font-family: var(--ir-mono) !important;
  font-size: 10px !important;
  text-transform: uppercase;
  color: var(--ir-text-muted) !important;
  letter-spacing: 0.12em;
  opacity: 0.7;
}

/* Hide Chainlit watermark */
a[href*="chainlit.io"] {
  display: none !important;
}

/* Hide Chainlit default empty-state (#welcome-screen) — 里面有
   <img src="/logo"> 渲染的是 Chainlit 字样 logo, 会在 _render_welcome()
   的自定义首屏消息到达前淡入 300-800ms 造成闪现. 我们自己的 welcome
   已经承担全部首屏职责, 这块空状态整体隐掉. */
#welcome-screen,
.welcome-screen {
  display: none !important;
}

/* 兜底: 即使上面的 #welcome-screen 规则被缓存/特殊情况跳过,
   只要 img 指向 Chainlit /logo 端点, 直接隐. */
img.logo,
img[src*="/logo?theme="] {
  display: none !important;
}

/* ──────────────────────────────────────────────────────────
   三列布局: 左 title (竖版) | 中 chat | 右 workflow (竖版)
   ────────────────────────────────────────────────────────── */
:root {
  --ir-col-w: 260px;    /* 左右列等宽 */
  --ir-left-w: var(--ir-col-w);
  --ir-right-w: var(--ir-col-w);
}

/* 左侧面板: 上 32% title + 下 68% agent flow ─────── */
#ir-left {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  width: var(--ir-left-w);
  z-index: 1000;
  background: var(--ir-bg);
  border-right: 1px solid var(--ir-border);
  display: flex;
  flex-direction: column;
  box-shadow: 2px 0 12px rgba(0, 0, 0, 0.25);
  overflow: hidden;
}

/* 上半 · 品牌 title (横排) */
#ir-left .ir-left-top {
  flex: 0 0 auto;
  min-height: 88px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-bottom: 1px dashed var(--ir-border);
  padding: 22px 16px 20px;
}

#ir-left .ir-left-title {
  margin: 0;
  writing-mode: horizontal-tb;
  text-orientation: mixed;
  text-align: center;
  font-family: "Noto Serif SC", "Source Han Serif SC", "STSong", "Songti SC",
               "Microsoft YaHei", Georgia, serif;
  font-size: 22px;
  font-weight: 500;
  letter-spacing: 0.16em;
  line-height: 1.2;
  background: linear-gradient(
    90deg,
    var(--ir-text) 0%,
    var(--ir-accent) 50%,
    var(--ir-text) 100%
  );
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  text-shadow: 0 0 28px rgba(201, 160, 99, 0.18);
}

/* 中段 · agent flow */
#ir-left .ir-left-agents {
  flex: 0 0 auto;
  overflow-y: auto;
  padding: 14px 18px 12px;
  border-bottom: 1px dashed var(--ir-border);
  scrollbar-width: thin;
  scrollbar-color: var(--ir-border) transparent;
}
#ir-left .ir-left-agents::-webkit-scrollbar { width: 6px; }
#ir-left .ir-left-agents::-webkit-scrollbar-thumb { background: var(--ir-border); border-radius: 3px; }

/* 下段 · session history */
#ir-left .ir-left-history {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 160px;
  padding: 10px 14px 14px;
  overflow: hidden;
}
/* 历史搜索框 (替代旧 .ir-history-head): "历史研究" 占位 + 搜索图标 */
#ir-left .ir-history-search {
  position: relative;
  margin-bottom: 8px;
  padding-top: 6px;
  border-top: 1px solid var(--ir-border);
}
/* 搜索框用 contenteditable div (不是 <input>/<textarea>), 彻底绕开 autofill.
   视觉样式照搬原 input, 行为由 hero.js 里的 input/keydown/paste handler 管. */
#ir-left .ir-history-search-input {
  width: 100%;
  min-height: 32px;
  padding: 7px 32px 7px 10px;   /* 7px × 2 + line-height ≈ 32 整体高 */
  background: var(--ir-bg-elev);
  border: 1px solid var(--ir-border);
  border-radius: 4px;
  color: var(--ir-text);
  font-family: var(--ir-sans);
  font-size: 12.5px;
  line-height: 1.35;
  letter-spacing: 0.02em;
  outline: none;
  box-sizing: border-box;
  transition: border-color 120ms ease, background 120ms ease;
  /* 单行外观: 用户输入超长不换行, 溢出隐藏 (搜索关键词通常很短) */
  white-space: nowrap;
  overflow-x: auto;
  overflow-y: hidden;
  /* 禁止用户看到 contenteditable 的"拖拽" outline */
  -webkit-user-modify: read-write-plaintext-only;
  user-select: text;
  cursor: text;
}
/* 占位符: hero.js 维护 data-empty="1"/"0", 借 ::before 画出 placeholder */
#ir-left .ir-history-search-input[data-empty="1"]::before {
  content: attr(data-placeholder);
  color: var(--ir-text-dim);
  letter-spacing: 0.04em;
  pointer-events: none;
}
#ir-left .ir-history-search-input:focus {
  border-color: var(--ir-accent);
  background: var(--ir-bg-elev-2);
}
#ir-left .ir-history-search-icon {
  position: absolute;
  right: 10px;
  top: 50%;
  transform: translateY(calc(-50% + 3px));
  color: var(--ir-text-dim);
  pointer-events: none;
  display: inline-flex;
}
#ir-left .ir-history-search-input:focus ~ .ir-history-search-icon {
  color: var(--ir-accent);
}

/* 底部 "+ 新建研究" 全宽按钮 */
#ir-left .ir-left-bottom {
  flex: 0 0 auto;
  padding: 12px 14px 14px;
  border-top: 1px solid var(--ir-border);
  background: var(--ir-bg);
}
#ir-left .ir-history-new {
  width: 100%;
  height: 38px;
  padding: 0 14px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  background: rgba(201, 160, 99, 0.10);
  border: 1px solid var(--ir-accent);
  border-radius: 4px;
  color: var(--ir-accent);
  font-family: var(--ir-mono);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.16em;
  cursor: pointer;
  transition: background 140ms ease, color 140ms ease, box-shadow 140ms ease;
}
#ir-left .ir-history-new:hover {
  background: var(--ir-accent);
  color: var(--ir-bg);
  box-shadow: 0 0 0 1px var(--ir-accent), 0 0 14px rgba(201, 160, 99, 0.35);
}
#ir-left .ir-history-new:active {
  transform: translateY(1px);
}
#ir-left .ir-history-new-plus {
  font-size: 16px;
  font-weight: 700;
  line-height: 1;
}
#ir-left .ir-history-new-label {
  letter-spacing: 0.18em;
}
#ir-left .ir-history-list {
  flex: 1 1 auto;
  overflow-y: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--ir-border) transparent;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
#ir-left .ir-history-list::-webkit-scrollbar { width: 5px; }
#ir-left .ir-history-list::-webkit-scrollbar-thumb { background: var(--ir-border); border-radius: 3px; }

.ir-hist-item {
  position: relative;
  padding: 7px 8px 8px;
  border-left: 2px solid transparent;
  border-radius: 3px;
  transition: background 0.15s, border-left-color 0.15s, opacity 0.15s;
  font-family: var(--ir-mono);
}
.ir-hist-item:hover {
  background: rgba(26, 31, 44, 0.55);
  border-left-color: var(--ir-text-muted);
}
.ir-hist-item.is-active {
  background: rgba(201, 160, 99, 0.1);
  border-left-color: var(--ir-accent);
}
.ir-hist-body {
  cursor: pointer;
  /* 为右上角 24×24 删除按钮留出足够横向空间, 所有内部文本都不越界 */
  padding-right: 34px;
}
.ir-hist-row1,
.ir-hist-row2 {
  max-width: 100%;
  overflow: hidden;
}
.ir-hist-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
  max-width: 100%;
}
.ir-hist-row2 .ir-hist-badge {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 90px;
  flex-shrink: 1;
}
.ir-hist-row2 .ir-hist-time {
  flex-shrink: 0;
}

/* 右上角删除按钮: 默认只在 hover 时出现 */
.ir-hist-del {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 20px;
  height: 20px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--ir-text-muted);
  font-size: 12px;
  line-height: 1;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.15s, color 0.15s;
  border-radius: 3px;
}
.ir-hist-item:hover .ir-hist-del {
  opacity: 0.7;
}
.ir-hist-del:hover {
  opacity: 1 !important;
  color: var(--ir-danger, #e85c5c);
  background: rgba(232, 92, 92, 0.1);
}

/* 确认删除状态: body 收回, confirm 条目占满整行 */
.ir-hist-item.is-confirming .ir-hist-body { display: none; }
.ir-hist-item.is-confirming .ir-hist-del  { display: none; }
.ir-hist-item.is-confirming {
  background: rgba(232, 92, 92, 0.08) !important;
  border-left-color: var(--ir-danger, #e85c5c) !important;
}
.ir-hist-confirm {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 2px;
}
.ir-hist-confirm-text {
  flex: 1;
  color: var(--ir-text);
  font-size: 12px;
  letter-spacing: 0.02em;
}
.ir-hist-confirm-yes,
.ir-hist-confirm-no {
  width: 22px;
  height: 22px;
  padding: 0;
  border: 1px solid var(--ir-border);
  background: transparent;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  border-radius: 3px;
  cursor: pointer;
  transition: all 0.15s;
}
.ir-hist-confirm-yes {
  color: var(--ir-danger, #e85c5c);
  border-color: var(--ir-danger, #e85c5c);
}
.ir-hist-confirm-yes:hover {
  background: var(--ir-danger, #e85c5c);
  color: #fff;
}
.ir-hist-confirm-no {
  color: var(--ir-text-secondary);
}
.ir-hist-confirm-no:hover {
  background: var(--ir-bg-elev);
  color: var(--ir-text);
  border-color: var(--ir-text-secondary);
}

/* ── 设置按钮 (挂在 #ir-right 顶部, workflow 上方) ─────────── */
/* 宽度与下面 workflow 图框 (92%) 对齐, 居中 */
#ir-settings {
  position: relative;
  width: 92%;
  margin: 0 auto;
  display: flex;
  justify-content: center;
  box-sizing: border-box;
  z-index: 1500;   /* 让 dropdown 压住下面的 workflow */
}
.ir-settings-trigger {
  width: 100%;           /* 和父容器 #ir-settings 一样宽 = workflow 宽度 */
  padding: 9px 13px;
  background: rgba(20, 26, 38, 0.85);
  backdrop-filter: blur(8px);
  border: 1px solid var(--ir-border);
  border-radius: 1px;
  color: var(--ir-text-secondary);
  font-family: var(--ir-mono);
  font-size: 11.5px;
  letter-spacing: 0.16em;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;   /* 文字在按钮内居中 */
  gap: 8px;
  transition: color 0.15s, border-color 0.15s;
}
.ir-settings-trigger-text { letter-spacing: 0.16em; }
.ir-settings-trigger:hover { color: var(--ir-text); border-color: var(--ir-text-muted); }
.ir-settings-trigger.open { color: var(--ir-accent); border-color: var(--ir-accent); }

.ir-settings-drop {
  position: absolute;
  top: calc(100% + 6px);
  /* 与设置按钮居中对齐 (按钮已 100% 宽度填满 92% 的 #ir-settings 容器) */
  left: 50%;
  transform: translateX(-50%);
  min-width: 180px;
  background: var(--ir-bg-elev);
  border: 1px solid var(--ir-border);
  box-shadow: 0 12px 32px rgba(0,0,0,0.6);
  display: none;
}
.ir-settings-drop.open { display: block; }
.ir-settings-drop::before {
  content: ""; position: absolute;
  top: -1px; left: 0; right: 0; height: 2px;
  background: linear-gradient(90deg, transparent, var(--ir-accent), transparent);
}
.ir-settings-item {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px;
  font-family: var(--ir-mono);
  font-size: 12px;
  color: var(--ir-text);
  cursor: pointer;
  background: transparent;
  border: none;
  width: 100%;
  text-align: left;
  letter-spacing: 0.06em;
  transition: background 0.12s, color 0.12s;
}
.ir-settings-item:hover { background: rgba(201, 160, 99, 0.1); color: var(--ir-accent); }
.ir-settings-item.danger:hover { color: #c56b6b; background: rgba(197, 107, 107, 0.08); }
.ir-settings-sep { height: 1px; background: var(--ir-border); margin: 2px 0; }
.ir-settings-icon { font-size: 14px; width: 16px; text-align: center; }

/* modal (hero.js 注入, 独立命名空间避免跟 .modal 类冲突) */
.ir-modal-backdrop {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, 0.65);
  backdrop-filter: blur(4px);
  z-index: 9998;
  display: none;
  align-items: center; justify-content: center;
}
.ir-modal-backdrop.active { display: flex; }
.ir-modal {
  background: var(--ir-bg-elev);
  border: 1px solid var(--ir-border);
  width: 100%; max-width: 440px;
  position: relative;
}
.ir-modal::before {
  content: ""; position: absolute;
  top: -1px; left: -1px; right: -1px; height: 2px;
  background: linear-gradient(90deg, transparent, var(--ir-accent), transparent);
}
.ir-modal-head {
  padding: 20px 28px 14px;
  border-bottom: 1px dashed var(--ir-border);
}
.ir-modal-eyebrow {
  font-family: var(--ir-mono);
  font-size: 10px;
  letter-spacing: 0.28em;
  color: var(--ir-accent);
  margin-bottom: 6px;
}
.ir-modal-title {
  font-family: "Noto Serif SC", Georgia, serif;
  font-size: 18px; font-weight: 500;
  letter-spacing: 0.12em;
  color: var(--ir-text);
}
.ir-modal-body { padding: 20px 28px; }
.ir-modal-field { margin-bottom: 14px; }
.ir-modal-field label {
  display: block;
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: var(--ir-text-secondary);
  margin-bottom: 6px;
}
.ir-modal-field input {
  width: 100%; padding: 9px 12px;
  background: var(--ir-bg);
  border: 1px solid var(--ir-border);
  color: var(--ir-text);
  font-family: var(--ir-mono);
  font-size: 13px;
}
.ir-modal-field input:focus { outline: none; border-color: var(--ir-accent); }
.ir-modal-error {
  min-height: 18px;
  font-family: var(--ir-mono);
  font-size: 11px;
  color: #c56b6b;
  margin: 4px 0 8px;
}
.ir-modal-foot {
  padding: 14px 28px 20px;
  display: flex; justify-content: flex-end; gap: 10px;
}
.ir-modal-btn {
  padding: 8px 16px;
  border-radius: 1px;
  font-family: var(--ir-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  cursor: pointer;
}
.ir-modal-btn.ghost {
  background: transparent;
  border: 1px solid var(--ir-border);
  color: var(--ir-text-secondary);
}
.ir-modal-btn.ghost:hover { color: var(--ir-text); border-color: var(--ir-text-muted); }
.ir-modal-btn.primary {
  background: var(--ir-accent);
  border: 1px solid var(--ir-accent);
  color: #1a1207;
  font-weight: 600;
}
.ir-modal-btn.primary:hover { background: #e0b878; }

/* ── 后台管理 · 用户表格 ───────────────────────────────────────── */
.ir-admin-header {
  margin: 12px 0 14px;
  padding: 10px 14px;
  border-left: 2px solid var(--ir-accent);
  background: rgba(201, 160, 99, 0.05);
}
.ir-admin-title {
  font-family: var(--ir-mono);
  font-size: 14px;
  letter-spacing: 0.08em;
  color: var(--ir-text);
  margin-bottom: 4px;
}
.ir-admin-filters {
  font-family: var(--ir-mono);
  font-size: 11.5px;
  color: var(--ir-text-secondary);
  letter-spacing: 0.04em;
}
.ir-admin-filters b {
  color: var(--ir-accent);
  font-weight: 600;
}

.ir-admin-table {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--ir-mono);
  font-size: 12.5px;
  margin: 8px 0 12px;
}
.ir-admin-table thead tr {
  border-bottom: 1px solid var(--ir-border);
}
.ir-admin-th {
  padding: 8px 10px;
  text-align: left;
  letter-spacing: 0.06em;
  color: var(--ir-text-secondary);
  font-weight: 500;
  white-space: nowrap;
}
.ir-admin-th-sorted {
  color: var(--ir-accent);
}
.ir-admin-table tbody tr {
  border-bottom: 1px solid rgba(201, 160, 99, 0.08);
}
.ir-admin-table tbody tr:hover {
  background: rgba(201, 160, 99, 0.04);
}
.ir-admin-table td {
  padding: 8px 10px;
  vertical-align: middle;
  color: var(--ir-text);
}
.ir-admin-ts {
  color: var(--ir-text-secondary);
  font-size: 11.5px;
  white-space: nowrap;
}
.ir-admin-empty {
  text-align: center;
  color: var(--ir-text-muted);
  padding: 16px !important;
  font-style: italic;
}

.ir-admin-role, .ir-admin-st {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 3px;
  font-size: 11px;
  letter-spacing: 0.04em;
  border: 1px solid transparent;
}
.ir-admin-role-admin {
  color: var(--ir-accent);
  border-color: rgba(201, 160, 99, 0.4);
  background: rgba(201, 160, 99, 0.08);
}
.ir-admin-role-user {
  color: var(--ir-text-secondary);
  border-color: var(--ir-border);
}
.ir-admin-st-active {
  color: #7ed68a;
  border-color: rgba(126, 214, 138, 0.35);
  background: rgba(126, 214, 138, 0.08);
}
.ir-admin-st-frozen {
  color: #6ca8d8;
  border-color: rgba(108, 168, 216, 0.35);
  background: rgba(108, 168, 216, 0.08);
}
.ir-admin-st-deleted {
  color: #c56b6b;
  border-color: rgba(197, 107, 107, 0.35);
  background: rgba(197, 107, 107, 0.08);
}
.ir-admin-me {
  font-size: 10px;
  color: var(--ir-accent);
  background: rgba(201, 160, 99, 0.15);
  padding: 1px 5px;
  border-radius: 2px;
  margin-left: 4px;
  letter-spacing: 0.04em;
}

.ir-admin-pager {
  font-family: var(--ir-mono);
  font-size: 11.5px;
  color: var(--ir-text-secondary);
  padding: 6px 2px;
  letter-spacing: 0.04em;
}
.ir-admin-pager b {
  color: var(--ir-accent);
  font-weight: 600;
}

/* ── Welcome screen · Hero + capability pills + 常用标的卡 ─────── */
/* Welcome / role menu / admin home 共享首屏宽度规则 */
[class*="ai-message"]:has(.ir-welcome),
[class*="ai-message"]:has(.ir-role-menu),
[class*="ai-message"]:has(.ir-admin-home),
[class*="message-content"]:has(.ir-welcome),
[class*="message-content"]:has(.ir-role-menu),
[class*="message-content"]:has(.ir-admin-home),
[class*="prose"]:has(.ir-welcome),
[class*="prose"]:has(.ir-role-menu),
[class*="prose"]:has(.ir-admin-home) {
  max-width: 880px !important;
  width: 100% !important;
  margin-left: auto !important;
  margin-right: auto !important;
  justify-content: center !important;
  align-self: center !important;
}
/* ai-message 是 flex-row, 第一个 child 是 avatar 槽. welcome 不需要头像,
   直接隐藏 avatar 槽, 内容占整行 */
[class*="ai-message"]:has(.ir-welcome) > :first-child,
[class*="ai-message"]:has(.ir-role-menu) > :first-child,
[class*="ai-message"]:has(.ir-admin-home) > :first-child {
  display: none !important;
}

/* 老 role-menu / admin-home 仍走旧 narrow card 样式 */
.ir-role-menu,
.ir-admin-home {
  display: block;
  text-align: center;
  width: 100%;
  max-width: 540px;
  margin: 24px auto 16px;
  padding: 22px 28px 20px;
  background: transparent;
  border-top: 1px solid rgba(201, 160, 99, 0.4);
  border-bottom: 1px solid rgba(201, 160, 99, 0.4);
}

/* welcome (新 hero) ─────────────────────────── */
.ir-welcome {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 820px;
  margin: 56px auto 12px;
  padding: 32px 24px 20px;
  background: transparent;
  text-align: center;
  margin-left: auto !important;
  margin-right: auto !important;
}
/* 防 Chainlit 的 flex-row message wrapper 把 welcome 推到左侧:
   parent (ai-message / message-content / prose) 改成竖直 flex 居中. */
[class*="ai-message"]:has(.ir-welcome),
[class*="message-content"]:has(.ir-welcome),
[class*="prose"]:has(.ir-welcome) {
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
}
/* brand mark (3 颗暗金小点) */
.ir-hero-mark {
  display: inline-flex;
  gap: 5px;
  margin-bottom: 20px;
  opacity: 0.55;
}
.ir-hero-mark span {
  width: 5px; height: 5px;
  border-radius: 50%;
  background: var(--ir-accent);
}
.ir-hero-mark span:nth-child(2) { opacity: 0.65; }
.ir-hero-mark span:nth-child(3) { opacity: 0.4; }

.ir-hero-eyebrow {
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.42em;
  color: var(--ir-text-muted);
  text-transform: uppercase;
  position: relative;
  padding: 0 28px;
}
.ir-hero-eyebrow::before,
.ir-hero-eyebrow::after {
  content: "";
  position: absolute;
  top: 50%;
  width: 18px;
  height: 1px;
  background: var(--ir-border);
}
.ir-hero-eyebrow::before { left: 0; }
.ir-hero-eyebrow::after  { right: 0; }

.ir-hero-title {
  margin: 26px 0 0;
  font-family: "Noto Serif SC", "Source Han Serif SC", Georgia, serif !important;
  font-size: 54px;
  font-weight: 500;
  letter-spacing: 0.08em;
  line-height: 1.22;
  color: #ffffff;
  border: 0 !important;
  padding: 0 !important;
}
/* "到一份研报" 金色: 用 span.ir-hero-gold 而非 em, 绕过 Chainlit 对 em 的
   markdown sanitize / 颜色覆盖. 选用 #d4af37 (经典金属黄金, 非 amber 偏橙),
   配 vertical 高光 → 哑光 渐变, 模拟金箔/黄金质感.
   !important + 多 selector 抗一切上游样式. */
.ir-welcome .ir-hero-title .ir-hero-gold,
.ir-hero-title .ir-hero-gold,
[data-step-type="assistant_message"] .ir-hero-gold,
.ir-hero-gold {
  color: #d4af37 !important;
  background: linear-gradient(180deg, #f4d77a 0%, #e0c068 35%, #d4af37 65%, #b8860b 100%) !important;
  -webkit-background-clip: text !important;
  background-clip: text !important;
  -webkit-text-fill-color: transparent !important;
  font-style: normal !important;
}

.ir-hero-lede {
  margin-top: 22px;
  max-width: 620px;
  font-family: var(--ir-sans);
  font-size: 15px;
  letter-spacing: 0.02em;
  color: var(--ir-text-dim);
  line-height: 1.7;
}

/* capability pills (5 个,纯视觉) */
.ir-cap-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  margin-top: 22px;
}
.ir-cap-pill {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 6px 14px;
  border: 1px solid var(--ir-border);
  border-radius: 999px;
  background: rgba(20, 26, 38, 0.4);
  font-family: var(--ir-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  color: var(--ir-text-secondary);
  user-select: none;
}

/* 3 张常用标的卡片 (clickable) */
.ir-preset-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
  width: 100%;
  margin-top: 26px;
}
.ir-preset-card {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  padding: 16px 18px;
  border: 1px solid var(--ir-border);
  border-radius: 8px;
  background: var(--ir-bg-elev);
  color: inherit;
  cursor: pointer;
  font-family: inherit;
  transition: all 200ms ease;
  position: relative;
}
.ir-preset-card::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 8px;
  border: 1px solid transparent;
  pointer-events: none;
  transition: border-color 200ms ease;
}
.ir-preset-card:hover {
  background: var(--ir-bg-elev-2);
  border-color: var(--ir-accent-soft);
  transform: translateY(-1px);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
}
.ir-preset-card:hover::before {
  border-color: var(--ir-accent);
}
.ir-preset-title {
  font-family: var(--ir-sans);
  font-size: 14px;
  font-weight: 500;
  color: var(--ir-text);
  letter-spacing: 0.02em;
  line-height: 1.45;
}
.ir-preset-sub {
  margin-top: 8px;
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.06em;
  color: var(--ir-text-muted);
  text-transform: lowercase;
}

.ir-hero-hint {
  margin-top: 22px;
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.16em;
  color: var(--ir-text-muted);
  text-transform: uppercase;
}

/* 窄屏 3 卡 → 1 卡 */
@media (max-width: 760px) {
  .ir-preset-row { grid-template-columns: 1fr; }
  .ir-hero-title { font-size: 34px; }
  .ir-hero-lede  { font-size: 13.5px; }
}

/* ── Welcome 态 composer 描金 + 隐藏不支持的功能 ─────────────
   仅当 chat 区还存在 .ir-welcome 时,把底部输入条强调成主行动. */
body:has(.ir-welcome) #chat-input-container,
body:has(.ir-welcome) div[class*="composer" i],
body:has(.ir-welcome) div[class*="Composer" i] {
  border: 1px solid var(--ir-accent-soft) !important;
  border-radius: 10px !important;
  background: var(--ir-bg-elev) !important;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.4), 0 0 0 1px var(--ir-accent-faint) !important;
  transition: border-color 220ms ease, box-shadow 220ms ease !important;
}
body:has(.ir-welcome) #chat-input-container:focus-within,
body:has(.ir-welcome) div[class*="composer" i]:focus-within,
body:has(.ir-welcome) div[class*="Composer" i]:focus-within {
  border-color: var(--ir-accent) !important;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5), 0 0 0 1px var(--ir-accent-soft) !important;
}

/* ── 等待用户输入 (data-ir-input-mode != default): composer 描金强调 ── */
body[data-ir-input-mode="review"] #chat-input-container,
body[data-ir-input-mode="review"] div[class*="composer" i],
body[data-ir-input-mode="review"] div[class*="Composer" i],
body[data-ir-input-mode="answer"] #chat-input-container,
body[data-ir-input-mode="answer"] div[class*="composer" i],
body[data-ir-input-mode="answer"] div[class*="Composer" i] {
  border: 1px solid var(--ir-accent) !important;
  border-radius: 10px !important;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.45),
              0 0 0 1px var(--ir-accent-soft),
              0 0 0 4px var(--ir-accent-faint) !important;
  transition: border-color 220ms ease, box-shadow 220ms ease !important;
}
body[data-ir-input-mode="review"] .ir-composer-textarea::placeholder,
body[data-ir-input-mode="answer"] .ir-composer-textarea::placeholder {
  color: var(--ir-accent) !important;
  opacity: 0.9 !important;
}

/* ── Composer placeholder + 底部 footer 文案改字体 ─────── */
/* Chainlit 默认 placeholder 用 sans 太"消息软件"感, 这里换成 mono +
   字距 + 暗金, 跟整体研报终端风一致. */
.ir-composer-textarea::placeholder,
.ir-composer-textarea::-webkit-input-placeholder,
textarea.ir-composer-textarea::placeholder {
  font-family: var(--ir-mono) !important;
  font-size: 12.5px !important;
  letter-spacing: 0.04em !important;
  color: var(--ir-text-muted) !important;
  opacity: 0.85 !important;
}
.ir-composer-textarea {
  font-family: var(--ir-sans) !important;
  font-size: 15px !important;
  letter-spacing: 0.01em !important;
  color: var(--ir-text) !important;
}

/* 底部 "AI 输出可能存在偏差" 免责文案 */
.ir-watermark {
  font-family: var(--ir-mono) !important;
  font-size: 10px !important;
  letter-spacing: 0.18em !important;
  color: var(--ir-text-muted) !important;
  text-transform: uppercase !important;
  opacity: 0.72 !important;
  font-weight: 400 !important;
}

/* 隐藏不支持的语音 / 联网搜索按钮 (composer 内) */
div[class*="composer" i] button[aria-label*="voice" i],
div[class*="composer" i] button[aria-label*="audio" i],
div[class*="composer" i] button[aria-label*="microphone" i],
div[class*="composer" i] button[aria-label*="语音"],
div[class*="composer" i] button[aria-label*="speech" i],
div[class*="Composer" i] button[aria-label*="voice" i],
div[class*="Composer" i] button[aria-label*="audio" i],
div[class*="Composer" i] button[aria-label*="microphone" i],
div[class*="Composer" i] button[aria-label*="语音"],
div[class*="Composer" i] button[aria-label*="speech" i],
#chat-input-container button[aria-label*="voice" i],
#chat-input-container button[aria-label*="microphone" i],
#chat-input-container button[aria-label*="audio" i],
#chat-input-container button[aria-label*="speech" i],
#chat-input-container button[aria-label*="语音"],
#chat-input-container button[aria-label*="search" i],
#chat-input-container button[aria-label*="web" i],
#chat-input-container button[aria-label*="联网"] {
  display: none !important;
}
.ir-hist-row1 {
  display: flex;
  align-items: baseline;
  gap: 6px;
  font-size: 12.5px;
  color: var(--ir-text);
  line-height: 1.3;
}
.ir-hist-marker {
  color: var(--ir-text-muted);
  font-size: 10px;
  flex-shrink: 0;
}
.ir-hist-item.is-active .ir-hist-marker { color: var(--ir-accent); }
.ir-hist-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  flex: 1;
  font-weight: 500;
}
.ir-hist-row2 {
  display: flex;
  align-items: center;
  justify-content: flex-start;  /* time + badge 紧邻左边, 不靠右撞删除图标 */
  gap: 10px;                    /* 约 2 个空格的间距 */
  margin-top: 2px;
  padding-left: 16px;
  font-size: 10.5px;
  color: var(--ir-text-muted);
  font-variant-numeric: tabular-nums;
}
.ir-hist-badge {
  color: var(--ir-text-dim);
}
.ir-hist-item.is-active .ir-hist-badge { color: var(--ir-accent); }
.ir-hist-empty {
  color: var(--ir-text-muted);
  font-size: 12px;
  text-align: center;
  padding: 20px 8px;
}
#ir-left .ir-history-toggle {
  margin-top: 6px;
  background: transparent;
  border: 0;
  color: var(--ir-text-dim);
  font-family: var(--ir-mono);
  font-size: 11px;
  cursor: pointer;
  padding: 6px 4px;
  text-align: center;
}
#ir-left .ir-history-toggle:hover {
  color: var(--ir-accent);
}

/* ════════════════════════════════════════════════════════════════
   Agent 列表 — 1:1 移植自 UI-template
   外层 .ir-agent + .ir-agent-active/done/pending 是 hero.js markCurrentAgent 钩子, 不动.
   ════════════════════════════════════════════════════════════════ */

/* .sec-head 区段标题 ("智能体" / "会话" 这类), 模板原文样式 */
.ir-section-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
  padding-top: 6px;
  border-top: 1px solid var(--ir-border);
}
.ir-section-title {
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ir-text-dim);
  font-weight: 500;
}

.ir-agent-flow {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

/* .agent — 模板原文: padding 9px 8px, radius 4px, hover bg-1, active bg-2 + line border */
.ir-agent {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 9px 8px;
  border-radius: 4px;
  cursor: default;
  border: 1px solid transparent;
  transition: all 120ms ease;
}
.ir-agent:hover { background: var(--ir-bg-elev); }
.ir-agent.ir-agent-active {
  background: var(--ir-bg-elev-2);
  border-color: var(--ir-border);
}

/* .ir-agent-avatar — 默认浅灰圆圈 (圆圈边 + initials 都灰), active 时一起变金色.
   宽高 / display 用 !important, 防 Chainlit 全局 reset 把它压扁 */
.ir-agent .ir-agent-avatar {
  flex-shrink: 0 !important;
  width: 28px !important;
  height: 28px !important;
  min-width: 28px;
  border-radius: 50% !important;
  border: 1px solid var(--ir-text-dim);
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  font-family: var(--ir-mono);
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--ir-text-dim);
  background: var(--ir-bg-elev-2);
  position: relative;
  box-sizing: border-box;
  transition: border-color 120ms ease, color 120ms ease;
}
.ir-agent.ir-agent-active .ir-agent-avatar {
  border-color: var(--ir-accent);
  color: var(--ir-accent);
}
.ir-agent.ir-agent-done .ir-agent-avatar {
  border-color: rgba(201, 160, 99, 0.45);
  color: rgba(201, 160, 99, 0.65);
}

/* .ir-agent-status — 模板 ok 绿色 dot, 描 canvas bg 边 */
.ir-agent .ir-agent-avatar .ir-agent-status {
  position: absolute;
  bottom: -1px;
  right: -1px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--ir-success);
  border: 2px solid var(--ir-bg);
  box-sizing: content-box;
}

/* .ir-agent-meta — 模板: flex 1 + min-width 0 */
.ir-agent .ir-agent-meta {
  flex: 1;
  min-width: 0;
}

/* .ir-agent-name — 模板: base 字号, 主文本色, 中等字重, ellipsis */
.ir-agent .ir-agent-name {
  font-family: var(--ir-sans);
  font-size: 13px;
  font-weight: 500;
  color: var(--ir-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  letter-spacing: 0.01em;
  line-height: 1.3;
}

/* .ir-agent-desc — 模板: xs, dim, margin-top 2, ellipsis */
.ir-agent .ir-agent-desc {
  font-family: var(--ir-sans);
  font-size: 10.5px;
  color: var(--ir-text-dim);
  margin-top: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  letter-spacing: 0.01em;
  line-height: 1.4;
}

/* 右侧竖版 workflow (上下居中) ──────────────────── */
#ir-right {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  width: var(--ir-right-w);
  z-index: 1000;
  background: var(--ir-bg);
  border-left: 1px solid var(--ir-border);
  display: flex;
  flex-direction: column;
  padding: 12px 0;
  box-shadow: -2px 0 12px rgba(0, 0, 0, 0.25);
  /* overflow:visible 让 设置 dropdown 能溢出显示, workflow 自身限高 */
  overflow: visible;
}
/* 顶部槽位 (设置按钮), workflow 上方 */
.ir-right-head {
  flex: 0 0 auto;
  padding-bottom: 10px;
  border-bottom: 1px dashed var(--ir-border);
  margin-bottom: 10px;
}
/* workflow 主体容器: 撑满剩余空间, 改为纵向列表 (从上往下流) */
.ir-right-workflow {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 0;
  padding: 0 14px 14px 14px;
  box-sizing: border-box;
  overflow: hidden;
}

/* ── Pipeline 头: 标题 + 计数 pill ──────────────── */
.ir-pipeline-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 0 4px 12px 4px;
  border-bottom: 1px solid var(--ir-border-subtle);
  margin-bottom: 12px;
  flex: 0 0 auto;
}
.ir-pipeline-kicker {
  font-family: var(--ir-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  color: var(--ir-text-muted);
  text-transform: uppercase;
}
.ir-pipeline-status {
  font-family: var(--ir-sans);
  font-size: 14px;
  color: var(--ir-text);
  margin-top: 3px;
  letter-spacing: 0.02em;
}
.ir-pipeline-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 9px;
  border: 1px solid var(--ir-border);
  border-radius: 999px;
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  color: var(--ir-text-dim);
  background: rgba(20, 26, 38, 0.5);
}
.ir-pipeline-pill-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--ir-text-muted);
  transition: background 200ms ease, box-shadow 200ms ease;
}
.ir-pipeline-pill.is-live .ir-pipeline-pill-dot {
  background: var(--ir-accent);
  box-shadow: 0 0 8px var(--ir-accent);
  animation: ir-pipeline-pulse 1.6s ease-out infinite;
}
.ir-pipeline-pill.is-live {
  color: var(--ir-accent);
  border-color: var(--ir-accent-soft);
}
@keyframes ir-pipeline-pulse {
  0%   { opacity: 1; }
  50%  { opacity: 0.55; }
  100% { opacity: 1; }
}

/* ── Pipeline 列表 ──────────────────────────── */
.ir-pipeline-list {
  flex: 1 1 auto;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 0 2px 8px 2px;
  /* 细滚动条 */
  scrollbar-width: thin;
  scrollbar-color: var(--ir-border) transparent;
}
.ir-pipeline-list::-webkit-scrollbar { width: 4px; }
.ir-pipeline-list::-webkit-scrollbar-thumb { background: var(--ir-border); border-radius: 4px; }

/* 单个 step ───────────────────────────────── */
.ir-step {
  position: relative;
  display: flex;
  gap: 10px;
  padding: 0 4px 12px 4px;
}
.ir-step:last-child { padding-bottom: 4px; }

/* rail: 圆形 node + 上下连线 */
.ir-step-rail {
  position: relative;
  width: 22px;
  flex: 0 0 22px;
  display: flex;
  justify-content: center;
}
.ir-step-rail::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 22px;
  bottom: -12px;
  width: 1px;
  background: var(--ir-border);
  transform: translateX(-0.5px);
  transition: background 200ms ease;
}
.ir-step:last-child .ir-step-rail::before { display: none; }

.ir-step-node {
  position: relative;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1px solid var(--ir-border);
  background: var(--ir-bg);
  display: grid;
  place-items: center;
  font-family: var(--ir-mono);
  font-size: 9.5px;
  letter-spacing: 0.04em;
  color: var(--ir-text-muted);
  z-index: 1;
  transition: all 220ms ease;
  flex-shrink: 0;
}
.ir-step-num { display: inline; }
.ir-step-check { display: none; color: var(--ir-bg); }

/* body */
.ir-step-body {
  flex: 1 1 auto;
  min-width: 0;
  padding-top: 1px;
}
.ir-step-label {
  font-family: var(--ir-sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ir-text-secondary);
  letter-spacing: 0.01em;
  line-height: 1.35;
}
.ir-step-sub {
  font-family: var(--ir-mono);
  font-size: 10.5px;
  color: var(--ir-text-muted);
  margin-top: 2px;
  letter-spacing: 0.02em;
  line-height: 1.4;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ── 状态: pending / done / current ──────────── */
.ir-step.ir-step-pending .ir-step-node { /* 默认 */ }
.ir-step.ir-step-pending .ir-step-label { color: var(--ir-text-dim); }

.ir-step.ir-step-done .ir-step-node {
  background: var(--ir-accent);
  border-color: var(--ir-accent);
  color: var(--ir-bg);
}
.ir-step.ir-step-done .ir-step-num { display: none; }
.ir-step.ir-step-done .ir-step-check { display: block; }
.ir-step.ir-step-done .ir-step-rail::before { background: var(--ir-accent); }
.ir-step.ir-step-done .ir-step-label { color: var(--ir-text); }

.ir-step.ir-step-current .ir-step-node {
  border-color: var(--ir-accent);
  color: var(--ir-accent-hover);
  background: var(--ir-accent-soft);
  box-shadow: 0 0 0 4px var(--ir-accent-faint);
}
.ir-step.ir-step-current .ir-step-node::after {
  content: "";
  position: absolute;
  inset: -5px;
  border: 1px solid var(--ir-accent);
  border-radius: 50%;
  animation: ir-step-ping 1.8s ease-out infinite;
  pointer-events: none;
}
@keyframes ir-step-ping {
  0%   { opacity: 0.9; transform: scale(1); }
  100% { opacity: 0;   transform: scale(1.85); }
}
.ir-step.ir-step-current .ir-step-label { color: var(--ir-accent-hover); font-weight: 600; }
.ir-step.ir-step-current .ir-step-sub { color: var(--ir-text-dim); }

/* 中间 chat 区: 让位给两侧 (Chainlit 内部样式会重置 body padding, 需 !important) */
body {
  padding-left: var(--ir-left-w) !important;
  padding-right: var(--ir-right-w) !important;
}

/* 窄屏 (< 1100px) 折叠两侧, 顶部显示品牌横条 */
@media (max-width: 1100px) {
  #ir-left {
    position: fixed;
    top: 0; left: 0; right: 0; bottom: auto;
    width: 100%;
    height: 44px;
    border-right: 0;
    border-bottom: 1px solid var(--ir-border);
    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.25);
    flex-direction: row;
    align-items: center;
    padding: 0 16px;
  }
  #ir-left .ir-left-top {
    flex: 0 0 auto;
    border-bottom: 0;
    padding: 0;
    justify-content: flex-start;
  }
  #ir-left .ir-left-title {
    writing-mode: horizontal-tb;
    text-orientation: mixed;
    font-size: 15px;
    letter-spacing: 0.08em;
    line-height: 1.2;
    text-shadow: none;
  }
  #ir-left .ir-left-agents,
  #ir-left .ir-left-history {
    display: none;
  }
  #ir-right {
    display: none !important;
  }
  body {
    padding-left: 0;
    padding-right: 0;
    padding-top: 44px;
  }
}

#ir-hero .ir-hero-title {
  text-align: center;
  font-family: "Noto Serif SC", "Source Han Serif SC", "STSong", "Songti SC",
               "Microsoft YaHei", Georgia, serif;
  font-size: 36px;
  font-weight: 500;
  letter-spacing: 0.1em;
  color: var(--ir-text);
  margin: 0 0 4px;   /* title 和 workflow 间距缩到 4px */
  padding: 0;
  line-height: 1.2;
  background: linear-gradient(
    135deg,
    var(--ir-text) 0%,
    var(--ir-accent) 55%,
    var(--ir-text) 100%
  );
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  border: 0 !important;
}

/* workflow 图: 单行 8 步 横向条带 */
#ir-hero .ir-hero-img {
  display: block;
  max-width: min(1000px, 98%);
  width: 100%;
  height: auto;
  margin: 0 auto;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  mask-image: none !important;
  -webkit-mask-image: none !important;
  filter: none !important;
}

/* 历史 class name, 兼容保留 */
.ir-welcome-title {
  text-align: center;
  font-family: "Noto Serif SC", "Source Han Serif SC", "Microsoft YaHei", Georgia, serif;
  font-size: 40px;
  font-weight: 500;
  letter-spacing: 0.08em;
  background: linear-gradient(135deg, var(--ir-text) 0%, var(--ir-accent) 60%, var(--ir-text) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}

/* Hide assistant/user avatar circles entirely (left-side gray dot) */
div[class*="avatar" i],
div[class*="Avatar" i],
img[class*="avatar" i],
[data-testid*="avatar" i] {
  display: none !important;
}

/* Also hide author labels ("Assistant" / "User") since avatars are gone */
[data-testid="message-author"],
[class*="MessageAuthor"],
div[class*="author" i] > span {
  display: none !important;
}

/* Hide the "Assistant is thinking..." label chrome */
div[class*="Loading"] {
  color: var(--ir-text-dim) !important;
  font-family: var(--ir-mono) !important;
  font-size: 11px !important;
  letter-spacing: 0.05em;
}

/* Clean up message spacing */
main > div, main section {
  max-width: 920px !important;
  margin: 0 auto !important;
}

/* 聊天输入框保持 Chainlit 默认样式 (不再覆盖) */

/* 隐藏所有消息级 hover 复制按钮 — 交互式 flow 不需要复制单条消息。
   Chainlit 的 data-step-type 是动态值 (tool/run/action/...), 不能只针对
   assistant_message。全局 aria-label 匹配最稳。
   Composer/chat-input 区域的复制按钮不在此范围 (isInComposer via JS 已排除). */
button[aria-label="复制到剪贴板"],
button[aria-label*="Copy to clipboard" i],
button[aria-label*="复制代码"],
[role="button"][aria-label="复制到剪贴板"],
[role="button"][aria-label*="Copy to clipboard" i] {
  display: none !important;
}

/* 隐藏代码块的 raw/copy 按钮 (Chainlit 给每个 pre 加的工具栏) */
pre button,
pre ~ button,
[class*="CodeBlock" i] button,
[class*="codeblock" i] button,
[class*="code-block" i] button,
div[class*="rehype-raw" i],
div[class*="toolbar" i] button[aria-label*="copy" i],
div[class*="toolbar" i] button[aria-label*="raw" i],
button[aria-label*="copy code" i],
button[aria-label*="view raw" i],
button[aria-label*="复制代码" i],
button[aria-label*="查看原始" i],
button[aria-label*="raw code" i] {
  display: none !important;
}

/* 隐藏 Chainlit 默认的消息动作条: 复制 / 有帮助 (👍) / 没有帮助 (👎) /
 * 编辑反馈. 启用 @cl.data_layer 后 Chainlit 硬性挂, 没有 toml config 能关.
 * Chainlit 2.11+ 把 i18n 文案挪到了 tooltip 内容里, button 本身没 aria-label,
 * 必须用 class / lucide icon class 来选:
 *   - 👍 👎: button class 含 positive-feedback-(on|off) / negative-feedback-(on|off)
 *   - 📋 复制: button 内 <svg class="lucide-copy">  (lucide-react 约定)
 *   - ✏️ 编辑反馈: <svg class="lucide-square-pen"> / lucide-pencil
 * 旧的 aria-label 选择器保留做向后兼容 (老 chainlit 版本回滚). */
button[aria-label="复制到剪贴板"],
button[aria-label="Copy to clipboard"],
button[aria-label="有帮助"],
button[aria-label="Good response"],
button[aria-label="没有帮助"],
button[aria-label="Bad response"],
button[aria-label="编辑反馈"],
button[aria-label="Edit feedback"],
button.positive-feedback-on,
button.positive-feedback-off,
button.negative-feedback-on,
button.negative-feedback-off,
button:has(> svg.lucide-copy),
button:has(> svg.lucide-square-pen),
button:has(> svg.lucide-pencil),
button:has(> svg.lucide-pencil-line) {
  display: none !important;
}

/* Auto-finalize 代理 button 本身直接藏掉 — 它的 id 前缀是 "auto-finalize-"
 * (Python 侧 _emit_auto_finalize_proxy 里 act_id 构造).
 * `.click()` 在 display:none 元素上仍会触发 React onClick, 所以功能不受影响.
 * 同时藏掉它的父 message 容器 (Chainlit 各版本 DOM 结构可能用不同
 * wrapper, 这里覆盖常见几种, 有:has() 的浏览器一键到顶). */
button[id^="auto-finalize-"] {
  display: none !important;
}
/* 藏掉包含代理 button 的整条 assistant message (避免空白 step 卡片闪现) */
[data-step-type="assistant_message"]:has(button[id^="auto-finalize-"]),
[data-step]:has(button[id^="auto-finalize-"]),
[class*="step"]:has(button[id^="auto-finalize-"]),
div:has(> button[id^="auto-finalize-"]) {
  display: none !important;
}

/* ──────────────────────────────────────────────────────────
   隐藏 Chainlit 默认 chrome: 左侧 new chat / 右侧说明 / 主题切换
   ────────────────────────────────────────────────────────── */
/* 左侧 sidebar: 线程 + 新对话按钮 */
aside,
[data-testid="sidebar"],
nav[class*="sidebar" i],
button[aria-label*="new chat" i],
button[aria-label*="新对话" i],
button[aria-label*="threads" i],
button[aria-label*="历史" i],
div[class*="threadHistory" i],
div[class*="ChatThreadHistory" i] {
  display: none !important;
}

/* 右侧: readme / 关于 / 说明 */
button[aria-label*="readme" i],
button[aria-label*="说明" i],
button[aria-label*="about" i],
div[class*="readme" i]:not(#ir-hero *),
[data-testid*="readme" i] {
  display: none !important;
}

/* 主题切换 (dark/light 按钮) — 我们强制深色 */
button[aria-label*="theme" i],
button[aria-label*="主题" i],
button[aria-label*="dark" i],
button[aria-label*="light" i],
[data-testid*="theme" i] {
  display: none !important;
}

/* 汉堡菜单 (左上角打开 sidebar 的按钮) */
button[aria-label*="menu" i],
button[aria-label*="sidebar" i] {
  display: none !important;
}

/* header 右侧工具栏整体瘦身 */
header [class*="right" i],
header nav {
  gap: 6px !important;
}

/* ──────────────────────────────────────────────────────────
   聊天区 vertical 间距压缩 (question → input box 太远)
   ────────────────────────────────────────────────────────── */
/* 消息之间的间距 */
div[class*="MessageRow" i],
div[class*="message-row" i],
[data-step-type="assistant_message"],
[data-step-type="user_message"] {
  margin-top: 4px !important;
  margin-bottom: 4px !important;
  padding-top: 2px !important;
  padding-bottom: 2px !important;
}

/* 消息区容器底部的 padding (Chainlit 默认有 40px+) */
main,
[role="main"],
div[class*="MessageContainer" i],
div[class*="messagesContainer" i],
div[class*="chat-container" i] {
  padding-top: 8px !important;
  padding-bottom: 12px !important;
}

/* composer (输入框) 之上的多余空白 */
div[class*="Composer" i],
div[class*="ChatInput" i],
form[class*="chat" i] {
  margin-top: 0 !important;
  padding-top: 4px !important;
  padding-bottom: 6px !important;
}

/* Cursor / caret in chat input */
.cm-cursor {
  border-left-color: var(--ir-accent) !important;
}

/* Text selection */
::selection {
  background: var(--ir-accent-soft);
  color: var(--ir-text);
}

/* ── Remove default Chainlit chrome we don't want ─── */
/* Small label above each message saying "Assistant" or "User" - subtle */
div[class*="author"] {
  margin-bottom: 4px !important;
}

/* Chain of thought / steps collapse indicator */
button[class*="collapsible"], [class*="CollapsibleTrigger"] {
  font-family: var(--ir-mono) !important;
  font-size: 11px !important;
  color: var(--ir-text-muted) !important;
}

/* ── Icon button min-size (WCAG 2.5.5: ≥44px touch target) ── */
button[aria-label],
#chat-input-container button,
div[class*="composer" i] button,
div[class*="Composer" i] button {
  min-width: 40px;
  min-height: 40px;
}

/* ── Neutralize Chainlit default hot-pink accent ── */
[style*="rgb(245, 20, 95)"],
[style*="#f51450"],
[style*="#F51450"] {
  color: var(--ir-accent) !important;
  background-color: var(--ir-accent-soft) !important;
  border-color: var(--ir-accent) !important;
}
/* Stop/cancel buttons often use the pink. Redirect to gold. */
button[aria-label*="stop" i],
button[aria-label*="cancel" i],
button[aria-label*="取消"] {
  color: var(--ir-accent) !important;
}

/* ── Image lightbox: 中间区图片点击 → 全屏大图 + 右上 X 关闭 ── */
.ir-lightbox-overlay {
  position: fixed;
  inset: 0;
  z-index: 99999;
  background: rgba(0, 0, 0, 0.92);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px;
  cursor: zoom-out;
  animation: ir-lightbox-fade-in 0.18s ease-out;
}
@keyframes ir-lightbox-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.ir-lightbox-img {
  max-width: 96vw !important;
  max-height: 92vh !important;
  width: auto !important;
  height: auto !important;
  margin: 0 !important;
  border-radius: 6px;
  box-shadow: 0 24px 80px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(201, 160, 99, 0.3);
  cursor: default;
  /* 必须显式覆盖前面 main img 的 mask, 否则边缘羽化在 lightbox 里很怪 */
  mask-image: none !important;
  -webkit-mask-image: none !important;
}
.ir-lightbox-close {
  position: fixed;
  top: 16px;
  right: 20px;
  width: 40px;
  height: 40px;
  background: rgba(20, 20, 20, 0.85);
  border: 1px solid rgba(201, 160, 99, 0.4);
  border-radius: 50%;
  color: var(--ir-accent);
  font-size: 26px;
  font-weight: 300;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 0 2px 0;
  transition: background 0.15s, border-color 0.15s, transform 0.15s;
  z-index: 100000;
}
.ir-lightbox-close:hover {
  background: rgba(201, 160, 99, 0.18);
  border-color: var(--ir-accent-hover);
  color: var(--ir-text);
  transform: scale(1.05) rotate(90deg);
}

/* ── 后台 async task 进度卡片 ── */
.ir-task-progress {
  margin: 8px 0;
  padding: 14px 18px;
  background: rgba(26, 31, 44, 0.5);
  border-left: 3px solid var(--ir-accent);
  border-radius: 4px;
  font-family: var(--ir-mono);
}
.ir-task-progress-head {
  font-size: 13px;
  color: var(--ir-accent);
  font-weight: 600;
  margin-bottom: 6px;
  display: flex;
  align-items: center;
  gap: 6px;
}

/* 头部动态点 (... 跳动) */
.ir-task-dots::after {
  display: inline-block;
  content: ".";
  animation: ir-dots 1.4s steps(3, end) infinite;
  width: 1em;
  text-align: left;
  color: var(--ir-accent);
}

/* 头部小光圈 (持续旋转) */
.ir-task-spinner {
  display: inline-block;
  width: 10px;
  height: 10px;
  border: 2px solid rgba(201, 160, 99, 0.25);
  border-top-color: var(--ir-accent);
  border-radius: 50%;
  animation: ir-task-spin 0.9s linear infinite;
}
@keyframes ir-task-spin {
  to { transform: rotate(360deg); }
}

/* progress-body 顶部一条扫描线, 让"在跑" 视觉上明显 */
.ir-task-progress {
  position: relative;
  overflow: hidden;
}
.ir-task-progress::after {
  content: "";
  position: absolute;
  top: 0; left: -40%;
  width: 40%;
  height: 2px;
  background: linear-gradient(
    90deg,
    transparent,
    var(--ir-accent) 50%,
    transparent
  );
  animation: ir-task-scan 1.6s ease-in-out infinite;
  pointer-events: none;
}
@keyframes ir-task-scan {
  0%   { left: -40%; }
  100% { left: 100%; }
}

/* 完成 / 失败 时停止扫描线 + spinner */
.ir-task-progress.is-done::after,
.ir-task-progress.is-failed::after {
  display: none;
}
.ir-task-progress.is-done .ir-task-spinner,
.ir-task-progress.is-failed .ir-task-spinner {
  animation: none;
  border-color: currentColor;
  border-top-color: currentColor;
  opacity: 0.4;
}
.ir-task-progress.is-done .ir-task-dots::after,
.ir-task-progress.is-failed .ir-task-dots::after {
  animation: none;
  content: "";
}
.ir-task-progress.is-done .ir-thinking,
.ir-task-progress.is-failed .ir-thinking {
  animation: none;
}
.ir-task-progress-body {
  font-size: 13px;
  color: var(--ir-text);
  margin: 4px 0 8px;
  padding: 6px 10px;
  font-variant-numeric: tabular-nums;
  background: rgba(0, 0, 0, 0.18);
  border-radius: 3px;
  /* pre-line: 保留 \n 渲染换行, 合并连续空白. text-align:left 重置居中. */
  white-space: pre-line;
  text-align: left;
  line-height: 1.55;
  font-family: var(--ir-mono);
}
.ir-task-progress-hint {
  font-size: 11px;
  color: var(--ir-text-secondary);
  opacity: 0.75;
  font-style: italic;
}
.ir-task-progress.is-done {
  border-left-color: #4ec9b0;
}
.ir-task-progress.is-done .ir-task-progress-head {
  color: #4ec9b0;
}
.ir-task-progress.is-failed {
  border-left-color: #f48771;
}
.ir-task-progress.is-failed .ir-task-progress-head {
  color: #f48771;
}

/* ── 通用 LLM 等待卡片 (analyze / write / self-eval / refine / followup 都用) ── */
.ir-think-card {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 16px;
  margin: 8px 0;
  background: rgba(26, 31, 44, 0.5);
  border-left: 3px solid var(--ir-accent);
  border-radius: 4px;
  font-size: 13.5px;
  color: var(--ir-text);
  font-family: var(--ir-mono);
  position: relative;
  overflow: hidden;
}
.ir-think-card .ir-think-label {
  font-weight: 500;
}
.ir-think-card .ir-think-dur {
  color: var(--ir-text-secondary);
  font-size: 12px;
  margin-left: 4px;
}
/* 顶部扫描线 (与 task-progress 同款, 无差别) */
.ir-think-card::after {
  content: "";
  position: absolute;
  top: 0; left: -40%;
  width: 40%;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--ir-accent) 50%, transparent);
  animation: ir-task-scan 1.6s ease-in-out infinite;
  pointer-events: none;
}
.ir-think-card.is-done {
  border-left-color: #4ec9b0;
  color: #4ec9b0;
}
.ir-think-card.is-failed {
  border-left-color: #f48771;
  color: #f48771;
}
.ir-think-card.is-done::after,
.ir-think-card.is-failed::after { display: none; }
.ir-think-card.is-done .ir-task-spinner,
.ir-think-card.is-failed .ir-task-spinner {
  animation: none;
  border-color: currentColor;
  border-top-color: currentColor;
  opacity: 0.4;
}

/* ── Reload overlay (见 hero.js installReloadOverlay) ──────────
 * 后台 task 完成后 window.location.reload() 让 on_chat_resume 在
 * fresh turn 渲染结果. Chainlit bundle + resume_thread 有时要数十秒,
 * 这张遮罩盖在最上面, 防止用户看到空白 + 粉色 spinner 以为卡死.
 */
#ir-reload-overlay {
  position: fixed;
  inset: 0;
  z-index: 99999;
  background: rgba(14, 14, 16, 0.92);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 1;
  transition: opacity 0.3s ease;
}
#ir-reload-overlay.is-hide { opacity: 0; pointer-events: none; }
.ir-reload-card {
  background: #1a1a1d;
  border: 1px solid rgba(201, 160, 99, 0.45);
  border-radius: 4px;
  padding: 32px 40px;
  min-width: 340px;
  max-width: 440px;
  text-align: center;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(201, 160, 99, 0.15);
}
.ir-reload-spinner {
  display: inline-block;
  width: 28px;
  height: 28px;
  border: 2.5px solid rgba(201, 160, 99, 0.2);
  border-top-color: var(--ir-accent, #c9a063);
  border-radius: 50%;
  animation: ir-task-spin 0.9s linear infinite;
  margin-bottom: 18px;
}
.ir-reload-title {
  color: #e4dccf;
  font-size: 15px;
  font-weight: 500;
  letter-spacing: 0.5px;
  line-height: 1.5;
  margin-bottom: 8px;
}
.ir-reload-sub {
  color: #8a8578;
  font-size: 11px;
  letter-spacing: 0.8px;
  text-transform: uppercase;
  opacity: 0.85;
}

/* ──────────────────────────────────────────────────────────
   右下脚浮层设置 (主题色 + 侧栏密度 + 字号缩放)
   关闭态: ⚙ 设置 小按钮 (FAB)
   打开态: 280px 浮层 panel
   ────────────────────────────────────────────────────────── */
#ir-tweak-wrap {
  position: fixed;
  right: 20px;
  bottom: 20px;
  z-index: 2200;
  font-family: var(--ir-sans);
}

/* FAB 按钮 (永远可见) */
.ir-tweak-fab {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border: 1px solid var(--ir-border);
  border-radius: 999px;
  background: rgba(20, 26, 38, 0.92);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: var(--ir-text-secondary);
  font-family: var(--ir-mono);
  font-size: 11.5px;
  letter-spacing: 0.14em;
  cursor: pointer;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
  transition: all 200ms ease;
}
.ir-tweak-fab:hover {
  border-color: var(--ir-accent);
  color: var(--ir-accent);
  transform: translateY(-1px);
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.55), 0 0 0 1px var(--ir-accent-faint);
}
.ir-tweak-fab-gear { font-size: 13px; line-height: 1; }
.ir-tweak-fab-text { letter-spacing: 0.16em; }
#ir-tweak-wrap.is-open .ir-tweak-fab {
  border-color: var(--ir-accent-soft);
  color: var(--ir-accent);
}

/* Panel (默认 hidden, .is-open 时浮起) */
.ir-tweak-panel {
  position: absolute;
  right: 0;
  bottom: calc(100% + 10px);
  width: 280px;
  background: var(--ir-bg-elev);
  border: 1px solid var(--ir-border);
  border-radius: 8px;
  padding: 14px 16px 16px 16px;
  box-shadow: 0 16px 40px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(0, 0, 0, 0.25);
  display: none;
  flex-direction: column;
  gap: 14px;
  transform-origin: bottom right;
  animation: ir-tweak-pop 180ms cubic-bezier(0.2, 0.8, 0.4, 1);
}
.ir-tweak-panel::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--ir-accent), transparent);
  opacity: 0.7;
  border-radius: 8px 8px 0 0;
}
@keyframes ir-tweak-pop {
  from { opacity: 0; transform: translateY(8px) scale(0.96); }
  to   { opacity: 1; transform: translateY(0)   scale(1); }
}
#ir-tweak-wrap.is-open .ir-tweak-panel { display: flex; }

.ir-tweak-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-bottom: 1px solid var(--ir-border-subtle);
  padding-bottom: 10px;
}
.ir-tweak-title { display: flex; flex-direction: column; gap: 2px; }
.ir-tweak-kicker {
  font-family: var(--ir-mono);
  font-size: 9.5px;
  letter-spacing: 0.22em;
  color: var(--ir-text-muted);
  text-transform: uppercase;
}
.ir-tweak-h {
  font-family: var(--ir-sans);
  font-size: 14px;
  font-weight: 600;
  color: var(--ir-text);
  letter-spacing: 0.04em;
}
.ir-tweak-close {
  width: 22px; height: 22px;
  border: 1px solid var(--ir-border);
  background: transparent;
  color: var(--ir-text-dim);
  border-radius: 4px;
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
  display: grid; place-items: center;
  transition: all 160ms ease;
}
.ir-tweak-close:hover {
  border-color: var(--ir-accent);
  color: var(--ir-accent);
}

.ir-tweak-row { display: flex; flex-direction: column; gap: 7px; }
.ir-tweak-row > label {
  display: flex;
  justify-content: space-between;
  font-family: var(--ir-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: var(--ir-text-dim);
  text-transform: uppercase;
}
.ir-tweak-v {
  color: var(--ir-text);
  text-transform: none;
  letter-spacing: 0.04em;
  font-weight: 500;
}

/* Color swatches ─────────────── */
.ir-swatches { display: flex; gap: 8px; }
.ir-swatch {
  width: 26px; height: 26px;
  border-radius: 50%;
  background: var(--sw, #888);
  border: 1px solid var(--ir-border);
  cursor: pointer;
  position: relative;
  padding: 0;
  transition: transform 160ms ease, box-shadow 160ms ease;
}
.ir-swatch:hover { transform: scale(1.08); }
.ir-swatch.is-on {
  box-shadow: 0 0 0 2px var(--ir-bg), 0 0 0 3px var(--sw);
}
.ir-swatch.is-on::after {
  content: "";
  position: absolute;
  inset: 7px;
  border-radius: 50%;
  background: rgba(10, 13, 20, 0.55);
}

/* Segment buttons ─────────────── */
.ir-seg {
  display: flex;
  border: 1px solid var(--ir-border);
  border-radius: 4px;
  overflow: hidden;
}
.ir-seg button {
  flex: 1;
  padding: 7px 4px;
  font-family: var(--ir-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--ir-text-dim);
  background: transparent;
  border: 0;
  border-right: 1px solid var(--ir-border);
  cursor: pointer;
  transition: all 140ms ease;
}
.ir-seg button:last-child { border-right: 0; }
.ir-seg button:hover { color: var(--ir-text-secondary); background: rgba(255, 255, 255, 0.02); }
.ir-seg button.is-on {
  background: var(--ir-accent-faint);
  color: var(--ir-accent);
}

/* Range slider ─────────────── */
.ir-slider {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  height: 4px;
  background: var(--ir-border);
  border-radius: 999px;
  outline: none;
  cursor: pointer;
}
.ir-slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 14px; height: 14px;
  border-radius: 50%;
  background: var(--ir-accent);
  border: 2px solid var(--ir-bg-elev);
  cursor: pointer;
  box-shadow: 0 0 0 1px var(--ir-accent-soft);
  transition: transform 140ms ease;
}
.ir-slider::-webkit-slider-thumb:hover { transform: scale(1.15); }
.ir-slider::-moz-range-thumb {
  width: 14px; height: 14px;
  border-radius: 50%;
  background: var(--ir-accent);
  border: 2px solid var(--ir-bg-elev);
  cursor: pointer;
}
.ir-slider-ticks {
  display: flex;
  justify-content: space-between;
  font-family: var(--ir-mono);
  font-size: 9.5px;
  letter-spacing: 0.1em;
  color: var(--ir-text-muted);
  margin-top: 2px;
}

/* ── ① 确定标的 · autocomplete combobox ───────────────────────────────
   hero.js ensureCompanySearchCombobox() 注入, 位于 composer 上方.
   描金主题跟现有系统一致. */
.ir-cs-box {
  position: relative;
  margin: 10px 0 6px;
  border: 1px solid var(--ir-border, rgba(212, 175, 55, 0.25));
  border-radius: 8px;
  background: var(--ir-surface-2, rgba(20, 20, 24, 0.6));
  padding: 8px 10px 6px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
}
.ir-cs-input-wrap {
  display: flex;
  align-items: center;
  gap: 8px;
}
.ir-cs-icon {
  color: var(--ir-accent, #d4af37);
  opacity: 0.85;
  display: flex;
  align-items: center;
  flex-shrink: 0;
}
.ir-cs-input {
  flex: 1 1 auto;
  min-width: 0;
  background: transparent;
  border: none;
  outline: none;
  color: var(--ir-text, #e8e6df);
  font: inherit;
  font-size: 13.5px;
  padding: 4px 2px;
  letter-spacing: 0.01em;
}
.ir-cs-input::placeholder {
  color: var(--ir-text-muted, #8a8472);
  font-size: 13px;
}
.ir-cs-status {
  flex-shrink: 0;
  font-size: 11px;
  color: var(--ir-text-muted, #8a8472);
  white-space: nowrap;
  opacity: 0.85;
}
.ir-cs-list {
  margin-top: 6px;
  border-top: 1px dashed var(--ir-border, rgba(212, 175, 55, 0.2));
  padding-top: 4px;
  max-height: 320px;
  overflow-y: auto;
}
.ir-cs-item {
  padding: 6px 8px;
  border-radius: 6px;
  cursor: pointer;
  transition: background 0.12s ease, color 0.12s ease;
}
.ir-cs-item + .ir-cs-item {
  margin-top: 2px;
}
.ir-cs-item:hover,
.ir-cs-item.is-active {
  background: rgba(212, 175, 55, 0.12);
}
.ir-cs-main {
  display: flex;
  align-items: baseline;
  gap: 10px;
  font-size: 13.5px;
}
.ir-cs-code {
  color: var(--ir-accent, #d4af37);
  font-family: var(--ir-mono, ui-monospace, SFMono-Regular, monospace);
  font-size: 13px;
  flex-shrink: 0;
  min-width: 52px;
}
.ir-cs-name {
  color: var(--ir-text, #e8e6df);
  font-weight: 600;
  flex: 1 1 auto;
}
.ir-cs-market {
  color: var(--ir-text-muted, #8a8472);
  font-size: 11px;
  letter-spacing: 0.05em;
  flex-shrink: 0;
}
.ir-cs-reason {
  color: var(--ir-text-muted, #8a8472);
  font-size: 11px;
  margin-top: 2px;
  padding-left: 62px;
  letter-spacing: 0.02em;
}

/* ── composer 禁用态 (hero.js 按 stage / running task 自动切换) ──────
   body[data-ir-input-disabled] 时: 文字变灰, 边框去金边, 鼠标 not-allowed,
   send 按钮也配套样式. */
body[data-ir-input-disabled] .ir-composer-textarea,
body[data-ir-input-disabled] textarea.ir-composer-textarea {
  opacity: 0.55;
  cursor: not-allowed !important;
  color: var(--ir-text-muted, #8a8472) !important;
}
body[data-ir-input-disabled] .ir-composer-textarea::placeholder {
  color: var(--ir-text-muted, #8a8472);
  opacity: 0.9;
}
body[data-ir-input-disabled] #chat-input-container button[type="submit"],
body[data-ir-input-disabled] button[aria-label*="send" i],
body[data-ir-input-disabled] button[aria-label*="发送"] {
  opacity: 0.35;
  cursor: not-allowed !important;
  pointer-events: none;
}
body[data-ir-input-disabled] #chat-input,
body[data-ir-input-disabled] #chat-input-container {
  filter: saturate(0.4);
}

/* ── ④ 补充内部资料 · 四卡片网格 ────────────────────────────────
   server 在 _ask_optional_uploads 消息 content 里插 .ir-sup-grid.
   2x2 桌面 / 1x4 移动. 前两张带 priority 描金, 后两张 muted. */
.ir-sup-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  margin: 10px 0 14px;
}
@media (max-width: 640px) {
  .ir-sup-grid { grid-template-columns: 1fr; }
}
.ir-sup-card {
  position: relative;
  border: 1px solid var(--ir-border, rgba(212, 175, 55, 0.18));
  border-left-width: 3px;
  border-left-color: rgba(212, 175, 55, 0.3);
  border-radius: 6px;
  padding: 12px 14px 12px 18px;
  background: var(--ir-surface-2, rgba(20, 20, 24, 0.45));
  transition: border-color 0.15s ease, transform 0.15s ease;
}
.ir-sup-card:hover {
  border-color: rgba(212, 175, 55, 0.5);
  transform: translateY(-1px);
}
.ir-sup-card.ir-sup-priority {
  border-left-color: var(--ir-accent, #d4af37);
  box-shadow: inset 2px 0 0 var(--ir-accent, #d4af37), 0 2px 10px rgba(212, 175, 55, 0.08);
}
.ir-sup-badge {
  position: absolute;
  top: 10px;
  right: 12px;
  font-family: var(--ir-mono, ui-monospace, SFMono-Regular, monospace);
  font-size: 10px;
  letter-spacing: 0.1em;
  color: var(--ir-text-muted, #8a8472);
  opacity: 0.55;
}
.ir-sup-card.ir-sup-priority .ir-sup-badge {
  color: var(--ir-accent, #d4af37);
  opacity: 0.75;
}
.ir-sup-title {
  font-size: 14px;
  font-weight: 600;
  color: var(--ir-text, #e8e6df);
  letter-spacing: 0.02em;
  margin-bottom: 4px;
}
.ir-sup-card.ir-sup-priority .ir-sup-title {
  color: var(--ir-accent-strong, #e9c66a);
}
.ir-sup-tag {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 6px;
  border: 1px solid var(--ir-accent, #d4af37);
  border-radius: 3px;
  font-size: 10px;
  font-weight: 400;
  color: var(--ir-accent, #d4af37);
  letter-spacing: 0.05em;
  vertical-align: middle;
}
.ir-sup-desc {
  font-size: 12.5px;
  color: var(--ir-text-muted, #a89f84);
  line-height: 1.55;
  letter-spacing: 0.01em;
}

/* ── ④ 补充资料卡片的"已上传"态 + 计数徽章 ────────────────────── */
.ir-sup-card.ir-sup-uploaded {
  border-color: rgba(100, 180, 120, 0.45);
  background: rgba(60, 90, 70, 0.18);
}
.ir-sup-card.ir-sup-uploaded.ir-sup-priority {
  border-left-color: #7fc491;
  box-shadow: inset 2px 0 0 #7fc491, 0 2px 10px rgba(127, 196, 145, 0.12);
}
.ir-sup-card.ir-sup-uploaded .ir-sup-title {
  color: #b8e0c4 !important;
}
.ir-sup-count {
  display: inline-block;
  margin-top: 6px;
  padding: 2px 8px;
  font-size: 11px;
  font-family: var(--ir-mono, ui-monospace, SFMono-Regular, monospace);
  color: #b8e0c4;
  background: rgba(100, 180, 120, 0.18);
  border: 1px solid rgba(100, 180, 120, 0.4);
  border-radius: 3px;
  letter-spacing: 0.04em;
}

/* 上传 xlsx 与所选股票疑似不符的拦截警告框 */
.ir-warn-box {
  margin: 10px 0 4px;
  padding: 14px 16px 14px 16px;
  background: linear-gradient(135deg, rgba(220, 140, 60, 0.14), rgba(200, 100, 50, 0.08));
  border: 1px solid rgba(235, 170, 80, 0.55);
  border-left: 4px solid #eaa24d;
  border-radius: 6px;
  box-shadow: 0 0 0 1px rgba(235, 170, 80, 0.08) inset;
}
.ir-warn-title {
  font-size: 15px;
  font-weight: 600;
  color: #f2c48a;
  margin-bottom: 8px;
  letter-spacing: 0.02em;
}
.ir-warn-body {
  font-size: 14px;
  line-height: 1.65;
  color: #e5d6c4;
}
.ir-warn-body b {
  color: #fff3e0;
}
.ir-warn-body ul {
  margin: 6px 0 8px;
  padding-left: 22px;
}
.ir-warn-body li {
  margin: 2px 0;
}
