*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
  --bg: #0d1117;
  --bg2: #161b22;
  --bg3: #21262d;
  --border: #30363d;
  --fg: #c9d1d9;
  --fg-dim: #8b949e;
  --green: #3fb950;
  --blue: #79c0ff;    /* info text, headings — lighter than before */
  --link: #56d4dd;    /* clickable links — teal, clearly distinct */
  --orange: #e3b341;
  --red: #f85149;
  --purple: #bc8cff;
  --font: "Cascadia Code", "Fira Code", "Consolas", monospace;
}

html, body { height: 100%; background: var(--bg); color: var(--fg); font-family: var(--font); font-size: 14px; }

/* Boot screen */
.boot-screen { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; gap: 1rem; }
/* Explicit Latin monospace stack: in a Japanese font environment U+005C (\)
   renders as ￥, which corrupts the ASCII-art backslashes. Pinning Western
   monospace fonts (with a generic monospace fallback) keeps the glyph as "\". */
.boot-logo { font-family: "Cascadia Code", "Fira Code", "Consolas", "Courier New", monospace; color: var(--green); font-size: 13px; line-height: 1.3; white-space: pre; }
.boot-msg { color: var(--fg-dim); font-size: 12px; }

/* ── Global link styles ─────────────────────────────────────────────────
   Applied globally because MarkupString-injected HTML doesn't receive
   Blazor's component scope attribute, so scoped CSS won't match it.   */

/* Source result links (.url class) */
a.url, .url {
  color: var(--link);
  text-decoration: underline;
  text-underline-offset: 2px;
}
a.url:hover { color: #7eecea; }

/* Inline spans */
.rank { color: var(--orange); }
.sim  { color: var(--green); }

/* Markdown-rendered links inside AI response blocks */
.line.ai a, .line.ai-stream a {
  color: var(--link);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.line.ai a:hover, .line.ai-stream a:hover { color: #7eecea; }

/* ── Markdown content styles (global — MarkupString bypasses Blazor scoping) ──
   ALL child elements of .line.ai / .line.ai-stream are injected via
   MarkupString and therefore do NOT receive Blazor's scope attribute.
   Selectors here must be unscoped to match them.                           */

/* Paragraphs */
.line.ai p, .line.ai-stream p { margin: 0; }
.line.ai p + p,         .line.ai-stream p + p,
.line.ai p + ul,        .line.ai-stream p + ul,
.line.ai p + ol,        .line.ai-stream p + ol,
.line.ai p + pre,       .line.ai-stream p + pre,
.line.ai p + blockquote,.line.ai-stream p + blockquote { margin-top: 0.55em; }

/* Headings */
.line.ai h1,.line.ai-stream h1,
.line.ai h2,.line.ai-stream h2,
.line.ai h3,.line.ai-stream h3,
.line.ai h4,.line.ai-stream h4,
.line.ai h5,.line.ai-stream h5,
.line.ai h6,.line.ai-stream h6 {
  font-weight: bold; margin: 0.9em 0 0.3em; line-height: 1.3; color: var(--fg);
}
.line.ai h1,.line.ai-stream h1 { font-size:1.25em; color:var(--purple); border-bottom:1px solid var(--border); padding-bottom:.2em; }
.line.ai h2,.line.ai-stream h2 { font-size:1.15em; color:var(--blue); }
.line.ai h3,.line.ai-stream h3 { font-size:1.05em; color:var(--blue); }
.line.ai h4,.line.ai-stream h4,
.line.ai h5,.line.ai-stream h5,
.line.ai h6,.line.ai-stream h6 { font-size:1em; color:var(--fg-dim); }

/* Lists — generous left indent */
.line.ai ul, .line.ai-stream ul,
.line.ai ol, .line.ai-stream ol { margin:.35em 0; padding-left:2.4em; }
.line.ai li, .line.ai-stream li { margin:.2em 0; }
.line.ai li > p, .line.ai-stream li > p { margin:0; }
.line.ai ul ul,.line.ai-stream ul ul,
.line.ai ol ol,.line.ai-stream ol ol,
.line.ai ul ol,.line.ai-stream ul ol,
.line.ai ol ul,.line.ai-stream ol ul { margin:.1em 0; }

/* Inline code */
.line.ai code,.line.ai-stream code {
  background:var(--bg3); color:#e6edf3;
  padding:.12em .4em; border-radius:4px;
  font-family:var(--font); font-size:.9em;
}

/* Code blocks */
.line.ai pre,.line.ai-stream pre {
  background:var(--bg2); border:1px solid var(--border);
  border-radius:6px; padding:.75em 1em;
  overflow-x:auto; margin:.5em 0; font-size:.88em;
}
.line.ai pre code,.line.ai-stream pre code {
  background:transparent; padding:0; border-radius:0;
  color:#e6edf3; font-size:inherit;
}

/* Blockquote */
.line.ai blockquote,.line.ai-stream blockquote {
  border-left:3px solid var(--blue);
  margin:.5em 0; padding:.2em 0 .2em 1em; color:var(--fg-dim);
}

/* Tables */
.line.ai table,.line.ai-stream table { border-collapse:collapse; margin:.5em 0; max-width:100%; }
.line.ai th,.line.ai-stream th { background:var(--bg3); color:var(--fg); font-weight:bold; padding:.3em .7em; border:1px solid var(--border); text-align:left; }
.line.ai td,.line.ai-stream td { padding:.3em .7em; border:1px solid var(--bg3); }
.line.ai tr:nth-child(even) td,.line.ai-stream tr:nth-child(even) td { background:var(--bg2); }

/* HR */
.line.ai hr,.line.ai-stream hr { border:none; border-top:1px solid var(--border); margin:.8em 0; }

/* Strong / em */
.line.ai strong,.line.ai-stream strong { color:#e6edf3; font-weight:bold; }
.line.ai em,.line.ai-stream em { color:var(--fg-dim); font-style:italic; }

/* First/last child margin collapse */
.line.ai > *:first-child,.line.ai-stream > *:first-child { margin-top:0 !important; }
.line.ai > *:last-child, .line.ai-stream > *:last-child  { margin-bottom:0 !important; }

/* Provisional streaming answer — dim + italic to signal in-progress */
.line.ai-stream { opacity: 0.7; font-style: italic; }
.line.ai-stream h1, .line.ai-stream h2, .line.ai-stream h3,
.line.ai-stream h4, .line.ai-stream h5, .line.ai-stream h6,
.line.ai-stream code, .line.ai-stream pre, .line.ai-stream pre code { font-style: normal; }

/* ── Error UI ───────────────────────────────────────────────────────────── */
#blazor-error-ui { position: fixed; bottom: 0; left: 0; right: 0; background: #550000; color: #fff; padding: .5rem 1rem; display: none; font-size: 13px; }
#blazor-error-ui.blazor-error-ui-show { display: block; }
#blazor-error-ui a { color: #ffc; }
