/* styles.css — IB Test Generator
   Tokens follow the mistercraig house style: dark by default, light via
   [data-theme="light"] on <html>. UI scales via --ui-scale (see zoom.js). */

/* ── Space Grotesk (self-hosted) ────────────────────
   Vendored deliberately: Google Fonts is unreliable behind the Great Firewall,
   and a render-blocking <link> to a blocked host stalls the whole page. */
@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-display: swap;
  font-weight: 400 700;
  src: url('../fonts/space-grotesk-latin-ext-wght-normal.woff2') format('woff2-variations');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-display: swap;
  font-weight: 400 700;
  src: url('../fonts/space-grotesk-latin-wght-normal.woff2') format('woff2-variations');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root {
  --ui-scale: 1;
  --accent: #22d3ee;
  --accent-dim: rgba(34, 211, 238, 0.12);
  --bg: #0b1120;
  --bg-card: #111827;
  --bg-inset: #0d1526;
  --border: rgba(255, 255, 255, 0.09);
  --border-hover: rgba(34, 211, 238, 0.35);
  --text: #e2e8f0;
  --text-dim: #94a3b8;
  --shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
  --ok: #4ade80;
  --warn: #fbbf24;
  --danger: #f87171;
  --hl: #34d399;
}

:root[data-theme='light'] {
  --accent: #0284c7;
  --accent-dim: rgba(2, 132, 199, 0.10);
  --bg: #f0f4f8;
  --bg-card: #ffffff;
  --bg-inset: #f8fafc;
  --border: rgba(0, 0, 0, 0.10);
  --border-hover: rgba(2, 132, 199, 0.40);
  --text: #0f172a;
  --text-dim: #64748b;
  --shadow: 0 8px 32px rgba(0, 0, 0, 0.10);
  --ok: #16a34a;
  --warn: #b45309;
  --danger: #dc2626;
  --hl: #0f9d67;
}

*, *::before, *::after { box-sizing: border-box; }
html { font-size: calc(16px * var(--ui-scale)); }
body {
  margin: 0;
  font-family: 'Space Grotesk', system-ui, -apple-system, sans-serif;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.2s ease, color 0.2s ease;
}
h1, h2, h3 { margin: 0; font-weight: 600; }
button { font-family: inherit; }
input, select { font-family: inherit; font-size: inherit; }

/* ── Topbar ─────────────────────────────────────────── */
.topbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; padding: 0.75rem 1.25rem;
  background: var(--bg-card); border-bottom: 1px solid var(--border);
  position: sticky; top: 0; z-index: 10;
  flex-wrap: wrap;
}
.topbar-left, .topbar-right { display: flex; align-items: center; gap: 0.9rem; flex-wrap: wrap; }
.brand { font-size: 1.05rem; letter-spacing: -0.01em; white-space: nowrap; }
.title-field { display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem; color: var(--text-dim); }
.title-field input {
  background: var(--bg-inset); color: var(--text); border: 1px solid var(--border);
  border-radius: 0.4rem; padding: 0.35rem 0.6rem; width: 15rem; font-size: 0.9rem;
}
.title-field input:focus { outline: none; border-color: var(--border-hover); }

.zoom-control { display: flex; align-items: center; gap: 0.25rem; background: var(--bg-inset);
  border: 1px solid var(--border); border-radius: 0.5rem; padding: 0.15rem; }
.zoom-control button {
  width: 1.8rem; height: 1.8rem; border: none; background: transparent; color: var(--text);
  border-radius: 0.35rem; cursor: pointer; font-size: 1rem; line-height: 1;
}
.zoom-control button:hover:not(:disabled) { background: var(--accent-dim); }
.zoom-control button:disabled { opacity: 0.35; cursor: default; }
#zoom-reset { font-size: 0.75rem; width: auto; padding: 0 0.5rem; color: var(--text-dim); }

#theme-toggle {
  border: 1px solid var(--border); background: var(--bg-inset); color: var(--text);
  border-radius: 0.5rem; width: 2.1rem; height: 2.1rem; cursor: pointer; font-size: 1rem;
}
#theme-toggle:hover { border-color: var(--border-hover); }

.btn-primary {
  background: var(--accent); color: #06131c; border: none; border-radius: 0.5rem;
  padding: 0.55rem 1rem; font-weight: 600; font-size: 0.9rem; cursor: pointer;
}
.btn-primary:hover { filter: brightness(1.08); }
.btn-block { width: 100%; }
.btn-secondary {
  background: var(--bg-inset); color: var(--text); border: 1px solid var(--border);
  border-radius: 0.5rem; padding: 0.55rem 1rem; font-weight: 600; font-size: 0.9rem; cursor: pointer;
}
.btn-secondary:hover { border-color: var(--border-hover); }

/* Import/Export/Save .tex/Print, grouped together in the topbar. */
.file-actions { display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; }

/* ── Layout ─────────────────────────────────────────── */
.layout {
  display: grid;
  grid-template-columns: 21rem 1fr;
  grid-template-rows: auto 1fr;
  grid-template-areas: "generate generate" "testbuilder batch";
  gap: 1rem;
  padding: 1rem;
  max-width: 100rem;
  margin: 0 auto;
}
.panel-generate { grid-area: generate; }
.panel-testbuilder { grid-area: testbuilder; }
.panel-batch { grid-area: batch; }

.panel-generate, .panel-testbuilder, .panel-batch {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: 0.75rem;
  padding: 1rem 1.1rem; min-width: 0;
}

/* ── Generate panel (full-width, top) ──────────────── */
.generate-row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 1.25rem 2rem; }
.field {
  display: flex; flex-direction: column; gap: 0.35rem; border: none; padding: 0; margin: 0;
  font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-dim);
  min-width: 0;
}
.field legend { padding: 0; font: inherit; color: inherit; }
.field-narrow { width: 6rem; }
.field-error { color: var(--danger); font-size: 0.72rem; text-transform: none; letter-spacing: normal; min-height: 1em; }

#count-input, #topic-select {
  background: var(--bg-inset); color: var(--text); border: 1px solid var(--border);
  border-radius: 0.4rem; padding: 0.4rem 0.55rem; font-size: 0.9rem; text-transform: none; letter-spacing: normal;
}
#topic-select { min-width: 14rem; }

.radio-row { display: flex; gap: 0.9rem; flex-wrap: wrap; }
.radio { display: flex; align-items: center; gap: 0.4rem; font-size: 0.86rem; text-transform: none;
  letter-spacing: normal; color: var(--text); cursor: pointer; }
.blurb { font-size: 0.78rem; color: var(--text-dim); margin: 0.7rem 0 0; line-height: 1.4; }

.type-panel { margin-top: 1rem; padding-top: 0.9rem; border-top: 1px solid var(--border); }
.type-panel-label { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-dim); margin-right: 0.9rem; }
.type-buttons { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.3rem; }
.type-buttons button {
  border: 1px solid var(--border); background: var(--bg-inset); color: var(--text);
  border-radius: 0.35rem; padding: 0.25rem 0.7rem; font-size: 0.78rem; cursor: pointer;
}
.type-buttons button:hover { border-color: var(--border-hover); }
.type-grid { columns: 15rem; column-gap: 1.75rem; margin-top: 0.5rem; }
.type-group { break-inside: avoid; font-size: 0.78rem; font-style: italic; color: var(--text-dim); margin: 0.6rem 0 0.2rem; }
.type-check { break-inside: avoid; display: flex; align-items: flex-start; gap: 0.45rem; font-size: 0.86rem; padding: 0.2rem 0; cursor: pointer; }
.type-check input:disabled + * { opacity: 0.4; }
.type-check:has(input:disabled) { opacity: 0.45; cursor: default; }

.generate-row + .blurb + .type-panel { margin-top: 0.5rem; }
#generate-btn { margin-top: 1.1rem; }

.hint { font-size: 0.78rem; color: var(--text-dim); line-height: 1.5; margin: 0.6rem 0 0; }

/* ── Test-builder panel (left) ─────────────────────── */
.panel-head { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; margin-bottom: 0.6rem; flex-wrap: wrap; }
.panel-head h2 { font-size: 1rem; }
.totals, .warn { font-size: 0.82rem; color: var(--text-dim); }
.warn { color: var(--warn); }
.warn:empty { display: none; }

.tb-list { list-style: none; margin: 0.6rem 0 0; padding: 0; max-height: 48vh; overflow-y: auto; }
.tb-row {
  display: flex; align-items: flex-start; gap: 0.5rem; padding: 0.55rem 0.3rem;
  border-bottom: 1px solid var(--border); font-size: 0.84rem;
}
.tb-row:last-child { border-bottom: none; }
.tb-row.dragging { opacity: 0.4; }
.tb-row.drop-before { box-shadow: inset 0 2px 0 var(--accent); }
.tb-row.drop-after { box-shadow: inset 0 -2px 0 var(--accent); }
.tb-handle { color: var(--text-dim); cursor: grab; user-select: none; padding-top: 0.15rem; touch-action: none; }
.tb-handle:active { cursor: grabbing; }
.tb-main { flex: 1; min-width: 0; }
.tb-topic { color: var(--text-dim); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.03em; }
.tb-label { display: block; line-height: 1.3; }
.tb-meta { display: flex; align-items: center; gap: 0.4rem; margin-top: 0.2rem; color: var(--text-dim); font-size: 0.76rem; flex-wrap: wrap; }
.tb-marks { font-weight: 600; }
.tb-btns { display: flex; flex-direction: column; gap: 0.2rem; flex: none; }
.tb-btn-row { display: flex; gap: 0.2rem; }
.tb-btn {
  border: 1px solid var(--border); background: var(--bg-inset); color: var(--text);
  border-radius: 0.3rem; width: 1.5rem; height: 1.5rem; font-size: 0.75rem; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; padding: 0; line-height: 1;
}
.tb-btn:hover:not(:disabled) { border-color: var(--border-hover); }
.tb-btn:disabled { opacity: 0.3; cursor: default; }
.tb-btn.danger:hover:not(:disabled) { border-color: color-mix(in srgb, var(--danger) 50%, var(--border)); color: var(--danger); }

.tb-actions { margin-top: 0.75rem; }
.tb-actions button {
  border: 1px solid var(--border); background: var(--bg-inset); color: var(--text);
  border-radius: 0.4rem; padding: 0.4rem 0.8rem; font-size: 0.82rem; cursor: pointer; width: 100%;
}
.tb-actions button:hover { border-color: var(--border-hover); }
.tb-output-opts { margin-top: 1rem; padding-top: 0.9rem; border-top: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 0.5rem; }
.opts-row { display: flex; gap: 0.8rem; flex-wrap: wrap; font-size: 0.82rem; color: var(--text-dim); }
.opts-row label { display: flex; align-items: center; gap: 0.35rem; cursor: pointer; }

/* ── Batch (candidate) panel (main) ────────────────── */
.answers-toggle { font-size: 0.82rem; color: var(--text-dim); display: flex; align-items: center; gap: 0.35rem; cursor: pointer; }

.batch-pane {
  background: var(--bg-inset); border: 1px solid var(--border); border-radius: 0.6rem;
  padding: 1rem 1.2rem; font-size: 0.92rem; line-height: 1.55;
}
.batch-pane .error { white-space: pre-wrap; color: var(--danger); font-size: 0.78rem; }
.batch-pane.hide-answers .prev-answer { display: none; }

.prev-q { position: relative; margin-bottom: 1.1rem; padding: 0 3rem 1.1rem 0; border-bottom: 1px dashed var(--border); }
.prev-q:last-child { border-bottom: none; }
.prev-num { font-weight: 700; }
.prev-type { color: var(--text-dim); font-style: italic; font-size: 0.85rem; }
.prev-hl { color: var(--hl); font-weight: 700; font-size: 0.78rem; margin-left: 0.3rem; }
.prev-marks { font-weight: 600; color: var(--text-dim); font-size: 0.85rem; margin-left: 0.4rem; }
.prev-stem, .prev-part { margin-top: 0.35rem; }
.prev-letter { font-weight: 700; }
.prev-answer { margin-top: 0.15rem; margin-left: 1.2rem; color: var(--danger); font-size: 0.88rem; }

.add-btn {
  position: absolute; top: 0; right: 0;
  border: 1px solid var(--border-hover); background: var(--accent-dim); color: var(--accent);
  border-radius: 999px; min-width: 2rem; height: 2rem; padding: 0 0.6rem; font-size: 1.1rem; font-weight: 700;
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
}
.add-btn:hover { background: var(--accent); color: #06131c; }
.add-btn.added {
  background: transparent; border-color: var(--ok); color: var(--ok); font-size: 0.7rem;
  font-weight: 600; border-radius: 999px; cursor: default;
}
.add-btn.added:hover { background: transparent; color: var(--ok); }

/* ── Calculator badge ───────────────────────────────── */
.calc-badge { display: inline-flex; align-items: center; gap: 0.25rem; margin-left: 0.5rem;
  padding: 0.05rem 0.4rem; border-radius: 999px; font-size: 0.72rem; border: 1px solid var(--border); vertical-align: middle; }
.calc-badge.calc-yes { color: var(--ok); border-color: color-mix(in srgb, var(--ok) 40%, var(--border)); }
.calc-badge.calc-no { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 40%, var(--border)); }
.calc-badge svg { flex: none; }
.calc-label { white-space: nowrap; }

.section-badge {
  display: inline-flex; align-items: center; margin-left: 0.35rem;
  padding: 0.05rem 0.4rem; border-radius: 999px; font-size: 0.72rem;
  border: 1px solid var(--border); color: var(--text-dim); vertical-align: middle;
}

/* ── Print document (hidden on screen, shown when printing) ───────────── */
.print-doc { display: none; }
.katex-error { color: var(--danger); font-family: monospace; font-size: 0.85em; }
.mspace { display: inline-block; width: 1em; }
.mspace2 { display: inline-block; width: 2em; }

@media (max-width: 60rem) {
  .layout { grid-template-columns: 1fr; grid-template-areas: "generate" "testbuilder" "batch"; }
  .tb-list { max-height: none; }
}

/* ═══════════════════════════════════════════════════════════════════════
   Print output — mirrors ibgen/core/render/latex.py's document layout.

   Deliberately NOT the classic "visibility:hidden on body *, visibility:
   visible on the print target" trick: with KaTeX's deeply-nested per-glyph
   markup that's thousands of visibility overrides for a full paper, and it's
   fragile enough in practice to render blank in some browsers' print/PDF
   pipeline. Hiding the interactive shell outright and showing the print
   target via display is simpler and doesn't depend on cascade specificity
   across a huge subtree.
   ═══════════════════════════════════════════════════════════════════════ */
@media print {
  :root { --ui-scale: 1; }
  #app-shell { display: none !important; }
  .print-doc {
    display: block !important; color: #111; background: #fff;
    font-size: 12pt; line-height: 1.4;
  }
}

/* Everything in the printed/saved output is 12pt -- deliberately uniform,
   no heading/label hierarchy by size. Bold/italic/color still differentiate
   titles, type labels and markscheme notes without a jumble of font sizes,
   which is what the old size-scaled version had, worst right at the top of
   the first page (title/course/subtitle/name-date row all different sizes). */
.print-doc { padding: 0 0.5cm; font-family: 'Space Grotesk', system-ui, sans-serif; font-size: 12pt; }
.doc-title { text-align: center; margin-bottom: 0.4cm; }
.doc-title h1 { font-size: 1em; }
.doc-course { margin-top: 0.1cm; }
.doc-subtitle { color: #555; margin-top: 0.15cm; }
.doc-namerow { display: flex; justify-content: space-between; gap: 1rem;
  border-top: 1px solid #999; border-bottom: 1px solid #999; padding: 0.25cm 0; margin-bottom: 0.5cm; }
.rule { display: inline-block; border-bottom: 1px solid #999; margin-left: 0.3rem; }
.rule.long { width: 6.5rem; }
.rule.short { width: 3.2rem; }

.q { margin-top: 0.5cm; page-break-inside: avoid; }
.q-head { display: flex; align-items: baseline; gap: 0.6rem; flex-wrap: wrap; margin-bottom: 0.15cm; }
.q-num { font-weight: 700; }
.q-maxmark { font-weight: 700; }
.q-type { color: #666; margin-left: auto; }
.q-hl { color: #0f9d67; font-weight: 700; }
.q-stem, .q-mid-stem { margin: 0.15cm 0; }
.q-parts { margin: 0.1cm 0 0 1.4em; padding: 0; }
.q-parts li { margin-bottom: 0.2cm; }
.q-part-prompt { position: relative; }
.q-marks { float: right; font-weight: 700; margin-left: 0.5rem; }
.q-workspace { border-bottom: none; }

.page-break { page-break-before: always; }
.doc-ms-title { text-align: center; margin: 0.3cm 0 0.4cm; border-top: 1px solid #999; padding-top: 0.4cm; }
.doc-ms-title h1 { font-size: 1em; }
.ms-legend { font-style: italic; margin-bottom: 0.4cm; }
.ms-block { margin-top: 0.4cm; page-break-inside: avoid; }
.ms-qhead { display: flex; gap: 0.6rem; align-items: baseline; border-bottom: 1px solid #ccc; padding-bottom: 0.1cm; }
.ms-total { margin-left: auto; color: #666; }
.ms-part-prompt { font-style: italic; margin-top: 0.2cm; }
.ms-line, .ms-note, .ms-head, .ms-answer { margin-top: 0.12cm; }
.ms-code { float: right; font-weight: 700; }
.ms-note { font-style: italic; color: #14508f; }
.ms-head { font-weight: 700; }
.ms-answer { color: #111; }
