@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap');

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

:root {
  --bg:        oklch(0.11 0.022 148);
  --surface:   oklch(0.145 0.020 148);
  --raised:    oklch(0.175 0.018 148);
  --input:     oklch(0.085 0.015 148);
  --fg:        oklch(0.82 0.090 148);  /* was 0.76 — main body text, slightly brighter */
  --fg-hi:     oklch(0.93 0.070 148);  /* was 0.90 — headings */
  --fg-dim:    oklch(0.70 0.075 148);  /* was 0.54 — was the biggest issue, now reads cleanly */
  --fg-mute:   oklch(0.58 0.060 148);  /* was 0.34 — metadata/hints, now actually visible */
  --border:    oklch(0.28 0.045 148);  /* was 0.21 — also bumped for card edges */
  --border-hi: oklch(0.38 0.060 148);  /* was 0.30 */
  --green:     oklch(0.87 0.260 148);
  --green-bg:  oklch(0.18 0.065 148);
  --amber:     oklch(0.82 0.140 80);
  --amber-bg:  oklch(0.18 0.055 80);
  --red:       oklch(0.65 0.200 25);
  --red-bg:    oklch(0.18 0.070 25);
  --cyan:      oklch(0.80 0.100 200);
  --cyan-bg:   oklch(0.18 0.040 200);
  --blue:      oklch(0.72 0.120 245);
  --purple:    oklch(0.72 0.120 295);
  --purple-bg: oklch(0.18 0.045 295);
  --d1: oklch(0.78 0.100 200);
  --d2: oklch(0.87 0.260 148);
  --d3: oklch(0.72 0.120 245);
  --d4: oklch(0.82 0.140 80);
  --d5: oklch(0.68 0.180 30);
  --d6: oklch(0.72 0.120 295);
  --font: 'JetBrains Mono', ui-monospace, 'Courier New', monospace;
  --r: 3px; --r-md: 5px; --r-lg: 8px;
}

/* ===== Theme overrides — applied via <html data-theme="..."> =====
 * Default (green) is the :root values above. Each theme rotates the ENTIRE
 * palette to its primary hue H, not just the accent:
 *   - Neutrals (bg/surface/raised/input/fg*, border*) are re-tinted to H using
 *     the exact lightness + chroma of the green theme — only the hue changes.
 *     Because perceptual contrast is governed by lightness (which is held
 *     constant), every text/background pairing keeps the same contrast ratio
 *     it has in the green theme, while the whole UI picks up the theme tint.
 *   - The secondary/tertiary highlights (--cyan, --amber) are rotated by the
 *     same hue delta (H − 148) so they stay harmonious with the new accent
 *     instead of clashing as fixed green-era colors.
 *   - --red / --red-bg are intentionally NOT rotated: red is the error/danger
 *     semantic and must read as red in every theme.
 * Mono is a full grayscale palette (chroma 0) defined explicitly below.
 * The data-theme attribute is set by a tiny inline script in index.html
 * (before first paint) and re-set by window.ThemePicker (Profile → Appearance). */
html[data-theme="blue"] {   /* H = 250  (Δ +102) */
  --bg:        oklch(0.11 0.022 250);
  --surface:   oklch(0.145 0.020 250);
  --raised:    oklch(0.175 0.018 250);
  --input:     oklch(0.085 0.015 250);
  --fg:        oklch(0.82 0.090 250);
  --fg-hi:     oklch(0.93 0.070 250);
  --fg-dim:    oklch(0.70 0.075 250);
  --fg-mute:   oklch(0.58 0.060 250);
  --border:    oklch(0.28 0.045 250);
  --border-hi: oklch(0.38 0.060 250);
  --green:     oklch(0.78 0.180 250);
  --green-bg:  oklch(0.18 0.060 250);
  --cyan:      oklch(0.80 0.100 302);
  --cyan-bg:   oklch(0.18 0.040 302);
  --amber:     oklch(0.82 0.140 182);
  --amber-bg:  oklch(0.18 0.055 182);
}
html[data-theme="orange"] { /* H = 55  (Δ −93) */
  --bg:        oklch(0.11 0.022 55);
  --surface:   oklch(0.145 0.020 55);
  --raised:    oklch(0.175 0.018 55);
  --input:     oklch(0.085 0.015 55);
  --fg:        oklch(0.82 0.090 55);
  --fg-hi:     oklch(0.93 0.070 55);
  --fg-dim:    oklch(0.70 0.075 55);
  --fg-mute:   oklch(0.58 0.060 55);
  --border:    oklch(0.28 0.045 55);
  --border-hi: oklch(0.38 0.060 55);
  --green:     oklch(0.80 0.180 55);
  --green-bg:  oklch(0.18 0.060 55);
  --cyan:      oklch(0.80 0.100 107);
  --cyan-bg:   oklch(0.18 0.040 107);
  --amber:     oklch(0.82 0.140 347);
  --amber-bg:  oklch(0.18 0.055 347);
}
html[data-theme="red"] {    /* H = 25  (Δ −123) */
  --bg:        oklch(0.11 0.022 25);
  --surface:   oklch(0.145 0.020 25);
  --raised:    oklch(0.175 0.018 25);
  --input:     oklch(0.085 0.015 25);
  --fg:        oklch(0.82 0.090 25);
  --fg-hi:     oklch(0.93 0.070 25);
  --fg-dim:    oklch(0.70 0.075 25);
  --fg-mute:   oklch(0.58 0.060 25);
  --border:    oklch(0.28 0.045 25);
  --border-hi: oklch(0.38 0.060 25);
  --green:     oklch(0.72 0.220 25);
  --green-bg:  oklch(0.18 0.080 25);
  --cyan:      oklch(0.80 0.100 77);
  --cyan-bg:   oklch(0.18 0.040 77);
  --amber:     oklch(0.82 0.140 317);
  --amber-bg:  oklch(0.18 0.055 317);
}
html[data-theme="purple"] { /* H = 300  (Δ +152) */
  --bg:        oklch(0.11 0.022 300);
  --surface:   oklch(0.145 0.020 300);
  --raised:    oklch(0.175 0.018 300);
  --input:     oklch(0.085 0.015 300);
  --fg:        oklch(0.82 0.090 300);
  --fg-hi:     oklch(0.93 0.070 300);
  --fg-dim:    oklch(0.70 0.075 300);
  --fg-mute:   oklch(0.58 0.060 300);
  --border:    oklch(0.28 0.045 300);
  --border-hi: oklch(0.38 0.060 300);
  --green:     oklch(0.72 0.200 300);
  --green-bg:  oklch(0.18 0.070 300);
  --cyan:      oklch(0.80 0.100 352);
  --cyan-bg:   oklch(0.18 0.040 352);
  --amber:     oklch(0.82 0.140 232);
  --amber-bg:  oklch(0.18 0.055 232);
}
html[data-theme="mono"] {
  --bg:        oklch(0.05 0 0);
  --surface:   oklch(0.13 0 0);
  --raised:    oklch(0.17 0 0);
  --input:     oklch(0.08 0 0);
  --border:    oklch(0.30 0 0);
  --border-hi: oklch(0.45 0 0);
  --fg:        oklch(0.88 0 0);
  --fg-hi:     oklch(0.98 0 0);
  --fg-dim:    oklch(0.68 0 0);
  --fg-mute:   oklch(0.48 0 0);
  --green:     oklch(0.95 0 0);
  --green-bg:  oklch(0.22 0 0);
  --cyan:      oklch(0.78 0 0);
  --cyan-bg:   oklch(0.20 0 0);
  --amber:     oklch(0.85 0 0);
  --amber-bg:  oklch(0.20 0 0);
  --red:       oklch(0.65 0 0);
  --red-bg:    oklch(0.20 0 0);
}

html,body { height:100%; background:var(--bg); color:var(--fg); font-family:var(--font); font-size:15px; line-height:1.55; -webkit-font-smoothing:antialiased; transition: background-color 180ms ease, color 180ms ease; }
/* Prevent horizontal overflow from forcing Chrome on Android to widen
 * the viewport. Without this, any single element wider than the screen
 * causes Chrome to report a larger innerWidth (e.g. 685px on a 411px
 * device), which then prevents @media (max-width: 600px) from firing.
 *
 * overflow-x:hidden is applied to html only (not body) to avoid breaking
 * the sticky topbar — putting overflow on body would create a new scroll
 * context and detach position:sticky from window scroll. */
html { overflow-x: clip; }
body { max-width: 100vw; }
/* Let flex containers shrink their children. Without min-width: 0 on
 * flex items, children refuse to shrink below their content width. */
.topbar { min-width: 0; }
.topbar > * { min-width: 0; }
.nav-tabs { min-width: 0; flex-shrink: 1; }

/* ===== LAYOUT ===== */
.app { display:grid; grid-template-rows:auto 1fr auto; min-height:100vh; }

/* Site-wide footer (Privacy / Terms). Sits at the bottom of the .app grid
 * on routed pages. The chooser screen renders without .app so it doesn't
 * get this footer — that's intentional, the chooser is full-bleed. */
.app-footer {
  padding: 16px 20px;
  text-align: center;
  border-top: 1px solid var(--border);
  font-size: 12px;
  color: var(--fg-mute);
  background: var(--bg);
}
.app-footer a {
  color: var(--fg-dim);
  text-decoration: none;
  padding: 4px 10px;
  transition: color 120ms;
}
.app-footer a:hover { color: var(--green); }
.app-footer .footer-sep { color: var(--fg-mute); margin: 0 2px; }

.topbar {
  display:flex; align-items:center; gap:16px;
  padding:9px 22px; border-bottom:1px solid var(--border);
  background:var(--surface); position:sticky; top:0; z-index:40;
  font-size:12px;
  /* Hard guard: never exceed viewport. Combined with min-width:0 on flex
   * children (above), this catches any rigid-width child that wants to
   * push the topbar past the screen edge.
   *
   * NOTE: we used to set overflow:hidden here as a second guard, but that
   * CLIPPED the .user-menu dropdown (a child element). overflow:hidden on
   * a parent clips all absolutely-positioned descendants regardless of
   * z-index. min-width:0 on the topbar + its children is enough to keep
   * the topbar within viewport; we don't need overflow:hidden too. */
  max-width: 100vw;
}
/* Brand wrapper: flex container holding the (clickable) prompt, the cd ..
 * button, and the cursor. Keeps everything on one line and the cursor at
 * the end. */
.brand-wrap { display:flex; align-items:center; gap:0; white-space:nowrap; min-width:0; flex-shrink:1; overflow:hidden; }
.brand { display:flex; align-items:center; gap:0; color:var(--fg-hi); font-weight:700; letter-spacing:0.04em; background:transparent; border:0; padding:0; font:inherit; font-size:22px; cursor:pointer; white-space:nowrap; }
.brand:hover .b-user, .brand:hover .b-host, .brand:hover .b-path { filter:brightness(1.15); }
/* Root-level brand: not clickable. Drops the pointer cursor + hover effect
 * so the topbar prompt looks like a decoration, not a button. */
.brand.brand-noop { cursor: default; }
.brand.brand-noop:hover .b-user, .brand.brand-noop:hover .b-host, .brand.brand-noop:hover .b-path { filter: none; }
.brand .b-user  { color:var(--green); }
.brand .b-host  { color:var(--green); }
.brand .b-sep   { color:var(--fg-hi); margin:0 1px; font-weight:700; }
.brand .b-colon { color:var(--fg-hi); margin:0 1px; font-weight:700; }
.brand .b-path  { color:var(--cyan); transition: color 100ms; }
.brand .b-dollar { color:var(--fg-hi); font-weight:700; margin-left:2px; }
.brand-wrap .b-cursor { color:var(--green); animation:blink 1s step-end infinite; margin-left:4px; font-size:22px; line-height:1; }

/* "cd .." appended to the prompt — visual indicator, not a separate button.
 * The whole .brand <button> handles clicks (executes cdUp when this is
 * present, falls through to cert-switch at root where it isn't).
 * White text, like a real command being typed in a shell. */
.brand-cd-text {
  color: #ffffff;
  margin-left: 6px;
  font-weight: 700;
  letter-spacing: 0.04em;
  transition: text-shadow 100ms;
}
.brand:hover .brand-cd-text {
  text-shadow: 0 0 8px rgba(255, 255, 255, 0.6);
}

/* Chooser-screen brand uses the same selectors */
.cs-brand .b-user   { color:var(--green); }
.cs-brand .b-host   { color:var(--green); }
.cs-brand .b-sep,
.cs-brand .b-colon  { color:var(--fg-hi); margin:0 1px; }
.cs-brand .b-path   { color:var(--cyan); }
.cs-brand .b-dollar { color:var(--fg-hi); margin-left:2px; }

/* Nav tabs are right-anchored so they don't shift horizontally based on the
 * brand prompt's path length. brand-wrap takes whatever space the prompt
 * needs (truncating with ellipsis if too long), tabs sit flush with the
 * right-side nav-right cluster. */
.nav-tabs { display:flex; gap:2px; margin-left:auto; }
.nav-tab {
  background:transparent; border:1px solid transparent; color:var(--fg-dim);
  padding:4px 11px; border-radius:var(--r); font:inherit; font-size:12px;
  cursor:pointer; text-transform:uppercase; letter-spacing:0.08em; transition:all 90ms;
  white-space:nowrap;
}
.nav-tab:hover { color:var(--fg); border-color:var(--border); }
.nav-tab.active { color:var(--green); border-color:var(--green); background:var(--green-bg); }
/* Secondary "pillar" nav (Home/Certifications/Careers) shown alongside the
   study tabs when a cert is active — compact + muted so the study tabs read as
   primary, but always present so the user can leave the cert track. */
.nav-tab-pillar { font-size:11px; color:var(--fg-mute); padding:4px 8px; letter-spacing:0.06em; }
.nav-tab-pillar:hover { color:var(--fg); }
.nav-tab-pillar.active { color:var(--green); border-color:var(--green); background:var(--green-bg); }
.nav-divider { align-self:center; width:1px; height:16px; background:var(--border); margin:0 5px; flex-shrink:0; }
.nav-drawer-divider { height:1px; background:var(--border); margin:5px 4px; }

/* nav-right used to claim margin-left:auto, but now nav-tabs does. Just be
 * a normal flex cluster — sits to the right of the tabs by document order. */
.nav-right { display:flex; align-items:center; gap:14px; color:var(--fg-mute); min-width: 0; }
.nav-right > * { min-width: 0; }
/* User-menu trigger holds the username; cap and ellipsize so long names
 * don't push the topbar past the viewport edge at narrow widths. */
.user-menu-trigger {
  max-width: 160px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Wrapping div around trigger + dropdown — provides the positioning context
 * for the absolutely-positioned .user-menu below. */
.user-menu-wrap {
  position: relative;
  display: inline-block;
}
/* The dropdown panel itself. Sits BELOW the trigger button, right-aligned
 * so the right edge of the menu lines up with the right edge of the
 * trigger (instead of overflowing past the viewport on mobile). z-index is
 * high to clear .topbar (which is itself positioned) plus any sticky page
 * content. Border + background match the .term-win panel style. */
.user-menu {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  min-width: 200px;
  background: var(--surface);
  border: 1px solid var(--border-hi, var(--border));
  border-radius: var(--r-md);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
  z-index: 1000;
  padding: 4px 0;
  display: flex;
  flex-direction: column;
}
.user-menu-email {
  padding: 8px 14px;
  font-size: 11px;
  color: var(--fg-mute);
  border-bottom: 1px solid var(--border);
  margin-bottom: 4px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 280px;
}
.user-menu-item {
  background: none;
  border: none;
  color: var(--fg);
  text-align: left;
  padding: 8px 14px;
  font-size: 13px;
  font-family: inherit;
  cursor: pointer;
  width: 100%;
  transition: background 90ms, color 90ms;
}
.user-menu-item:hover {
  background: rgba(0, 188, 212, 0.08);
  color: var(--cyan);
}
.streak-badge { color:var(--amber); }
.timer-badge  { color:var(--cyan); font-weight:600; }

main { padding:24px 22px 80px; max-width:1080px; margin:0 auto; width:100%; }

/* ===== TERMINAL WINDOW ===== */
.term-win { background:var(--input); border:1px solid var(--border); border-radius:var(--r-md); overflow:hidden; }
.term-bar  { background:var(--surface); border-bottom:1px solid var(--border); padding:5px 12px; display:flex; align-items:center; gap:8px; }
.term-dots { display:flex; gap:5px; }
.term-dot  { width:9px; height:9px; border-radius:50%; }
.term-dot.r{ background:var(--red); opacity:0.7; }
.term-dot.y{ background:var(--amber); opacity:0.7; }
.term-dot.g{ background:var(--green); opacity:0.7; }
.term-bar-title { font-size:11px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.08em; }
.term-body { padding:12px 16px; font-size:12.5px; color:var(--fg); white-space:pre; overflow-x:auto; line-height:1.65; }

/* ===== HOME ===== */
.home-header { margin-bottom:24px; }
.home-h1 { font-size:20px; font-weight:700; color:var(--fg-hi); letter-spacing:0.03em; margin-bottom:3px; }
.home-h1 .ps1  { color:var(--green); }
.home-h1 .cmd  { color:var(--fg-hi); }
.home-sub { font-size:12px; color:var(--fg-mute); }

.stats-row { display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-bottom:22px; }
.stat-card { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:14px 16px; }
.stat-k { font-size:10px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.1em; margin-bottom:5px; }
.stat-v { font-size:24px; font-weight:700; color:var(--fg-hi); line-height:1; }
.stat-v.green  { color:var(--green); }
.stat-v.amber  { color:var(--amber); }
.stat-v.cyan   { color:var(--cyan); }

.sec-label { font-size:10px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.1em; margin-bottom:10px; display:flex; align-items:center; gap:8px; }
.sec-label::after { content:""; flex:1; height:1px; background:var(--border); }

.session-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:8px; margin-bottom:24px; }
.session-btn {
  background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md);
  padding:16px 18px; text-align:left; cursor:pointer; font:inherit; color:inherit;
  transition:all 90ms; display:flex; flex-direction:column; gap:4px;
}
.session-btn:hover { border-color:var(--green); background:var(--green-bg); }
.session-btn:hover .sb-title { color:var(--green); }
.sb-icon  { font-size:16px; margin-bottom:4px; color:var(--fg-mute); }
.sb-title { font-size:13px; font-weight:600; color:var(--fg-hi); }
.sb-desc  { font-size:12.5px; color:var(--fg-dim); }

.domain-list { display:flex; flex-direction:column; gap:7px; }
.domain-row {
  display:grid; grid-template-columns:24px 110px 1fr 90px 44px;
  gap:10px; align-items:center; padding:9px 13px;
  background:var(--surface); border:1px solid var(--border); border-radius:var(--r);
  cursor:pointer; transition:border-color 90ms; font-size:12px;
}
.domain-row:hover { border-color:var(--border-hi); }
.dom-num  { color:var(--fg-mute); text-align:center; font-size:11px; grid-column: 1; }
.dom-name { color:var(--fg); text-align:center; grid-column: 3; }
.dom-bar  { height:4px; background:var(--border); border-radius:99px; overflow:hidden; grid-column: 4; }
.dom-fill { height:100%; border-radius:99px; transition:width 400ms; }
.dom-pct  { color:var(--fg-mute); font-size:11px; text-align:right; grid-column: 5; }

/* ===== QUIZ ===== */
.quiz-layout { display:grid; grid-template-columns:1fr 310px; gap:18px; align-items:start; }

.q-meta { display:flex; align-items:center; justify-content:space-between; font-size:11px; color:var(--fg-mute); margin-bottom:10px; text-transform:uppercase; letter-spacing:0.08em; }
.q-prog  { height:2px; background:var(--border); border-radius:99px; margin-bottom:18px; }
.q-prog-fill { height:100%; background:var(--green); transition:width 300ms; border-radius:99px; }

.q-tags { display:flex; gap:6px; margin-bottom:12px; flex-wrap:wrap; }
.q-stem { font-size:15.5px; color:var(--fg-hi); line-height:1.55; margin-bottom:16px; }
.q-stem code { background:var(--surface); border:1px solid var(--border); padding:1px 5px; border-radius:2px; color:var(--cyan); font-size:0.9em; }
.q-multi-note { font-size:11px; color:var(--amber); margin-bottom:10px; text-transform:uppercase; letter-spacing:0.06em; }

.q-options { display:flex; flex-direction:column; gap:6px; }
.q-opt {
  display:grid; grid-template-columns:26px 1fr; gap:10px; align-items:start;
  padding:10px 13px; background:var(--surface); border:1px solid var(--border);
  border-radius:var(--r); cursor:pointer; font:inherit; text-align:left;
  color:var(--fg); font-size:13.5px; transition:all 90ms;
}
.q-opt:hover:not(.disabled) { border-color:var(--border-hi); color:var(--fg-hi); }
.q-opt .ltr {
  font-size:11px; font-weight:700; color:var(--fg-mute);
  background:var(--raised); border:1px solid var(--border);
  width:20px; height:20px; display:grid; place-items:center;
  border-radius:2px; flex-shrink:0; margin-top:1px;
}
.q-opt.selected { border-color:var(--cyan); background:var(--cyan-bg); }
.q-opt.selected .ltr { background:var(--cyan); border-color:var(--cyan); color:var(--bg); }
.q-opt.correct  { border-color:var(--green); background:var(--green-bg); }
.q-opt.correct .ltr  { background:var(--green); border-color:var(--green); color:var(--bg); }
.q-opt.wrong    { border-color:var(--red); background:var(--red-bg); }
.q-opt.wrong .ltr    { background:var(--red); border-color:var(--red); color:#fff; }
.q-opt.missed   { border-color:var(--green); border-style:dashed; }
.q-opt.disabled { cursor:default; }

.q-actions { display:flex; gap:8px; margin-top:16px; padding-top:14px; border-top:1px solid var(--border); align-items:center; flex-wrap:wrap; }

.q-feedback { margin-top:14px; padding:13px 15px; border-radius:var(--r-md); border:1px solid var(--border); background:var(--surface); font-size:13px; }
.fb-head { font-size:10px; text-transform:uppercase; letter-spacing:0.1em; margin-bottom:7px; display:flex; align-items:center; gap:5px; }
.fb-head.ok  { color:var(--green); }
.fb-head.bad { color:var(--red); }
.fb-text { color:var(--fg-dim); line-height:1.55; }
.fb-wrong-list { margin-top:10px; display:flex; flex-direction:column; gap:6px; }
.fb-wrong-item { display:grid; grid-template-columns:auto 1fr; gap:8px; font-size:12.5px; color:var(--fg-dim); }
.fb-ltr { color:var(--red); font-weight:700; font-size:10px; padding-top:2px; }

/* FITB */
.fitb-wrap { display:flex; flex-direction:column; gap:8px; margin-bottom:16px; }
.fitb-line { display:flex; align-items:stretch; }
.fitb-prompt { color:var(--green); font-weight:600; background:var(--input); border:1px solid var(--border); border-right:0; padding:7px 10px; border-radius:var(--r) 0 0 var(--r); font:inherit; font-size:12.5px; white-space:nowrap; display:flex; align-items:center; }
.fitb-input { flex:1; background:var(--input); border:1px solid var(--border); border-left:0; padding:7px 10px; border-radius:0 var(--r) var(--r) 0; font:inherit; font-size:12.5px; color:var(--amber); outline:none; }
.fitb-input:focus { border-color:var(--cyan); }
.fitb-input.ok  { border-color:var(--green); color:var(--green); }
.fitb-input.err { border-color:var(--red);   color:var(--red);   }

/* MATCH */
.match-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:16px; }
.match-col-label { font-size:10px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:6px; }
.match-col { display:flex; flex-direction:column; gap:5px; }
.match-item {
  padding:9px 11px; background:var(--surface); border:1px solid var(--border);
  border-radius:var(--r); cursor:pointer; font:inherit; font-size:12.5px;
  color:var(--fg); text-align:left; transition:all 90ms;
}
.match-item:hover { border-color:var(--border-hi); }
.match-item.active { border-color:var(--cyan); background:var(--cyan-bg); color:var(--fg-hi); }
.match-item.paired { border-color:var(--green); background:var(--green-bg); cursor:default; opacity:0.75; }
.match-item.paired:hover { border-color:var(--green); }
.match-ltr { color:var(--fg-mute); font-weight:700; font-size:11px; margin-right:5px; }
.match-item.paired .match-ltr { color:var(--green); }
.match-score { font-size:12px; color:var(--fg-mute); margin-top:6px; }

/* ===== HINT PANEL ===== */
.hint-panel { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:13px; position:sticky; top:68px; max-height:calc(100vh - 88px); display:flex; flex-direction:column; overflow:hidden; }
.hp-head { display:flex; align-items:center; justify-content:space-between; padding-bottom:10px; border-bottom:1px solid var(--border); margin-bottom:10px; flex-shrink:0; }
.hp-title { font-size:11px; color:var(--fg-dim); text-transform:uppercase; letter-spacing:0.1em; }
.hp-pill  { font-size:10px; background:var(--green-bg); color:var(--green); border:1px solid var(--green); padding:2px 7px; border-radius:99px; }
.hints-list { display:flex; flex-direction:column; gap:7px; margin-bottom:10px; flex-shrink:0; }
.hint-item { padding:9px 11px; background:var(--raised); border:1px dashed var(--border-hi); border-radius:var(--r); font-size:12.5px; color:var(--fg-dim); line-height:1.5; }
.hint-num  { font-size:9px; color:var(--amber); text-transform:uppercase; letter-spacing:0.1em; display:block; margin-bottom:3px; }
.hp-reveal { margin-bottom:10px; flex-shrink:0; }

.chat-area { display:flex; flex-direction:column; flex:1; min-height:0; }
.chat-log  { flex:1; overflow-y:auto; display:flex; flex-direction:column; gap:7px; padding-bottom:8px; min-height:60px; }
.chat-msg  { font-size:12.5px; line-height:1.5; padding:8px 10px; border-radius:var(--r); border:1px solid var(--border); }
.chat-msg.user { background:var(--cyan-bg); border-color:transparent; color:var(--cyan); align-self:flex-end; max-width:92%; }
.chat-msg.bot  { background:var(--raised); color:var(--fg-dim); }
.chat-msg.thinking { color:var(--fg-mute); font-style:italic; }
.chat-row { display:grid; grid-template-columns:1fr auto; gap:5px; padding-top:8px; border-top:1px solid var(--border); margin-top:8px; flex-shrink:0; }
.chat-in  { background:var(--input); border:1px solid var(--border); color:var(--fg); font:inherit; font-size:12.5px; padding:6px 9px; border-radius:var(--r); resize:none; outline:none; }
.chat-in:focus { border-color:var(--cyan); }

/* ===== RESULTS ===== */
.results-grid { display:grid; grid-template-columns:300px 1fr; gap:20px; align-items:start; }
.score-card { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:24px; text-align:center; }
.score-pct { font-size:54px; font-weight:700; line-height:1; margin:14px 0 6px; }
.score-pct.pass { color:var(--green); }
.score-pct.fail { color:var(--red); }
.score-verdict { font-size:12px; color:var(--fg-dim); margin-bottom:18px; }
.score-bars { display:flex; flex-direction:column; gap:7px; padding-top:16px; border-top:1px solid var(--border); }
.sb-row { display:grid; grid-template-columns:80px 1fr 34px; gap:8px; align-items:center; font-size:11px; }
.sb-label  { color:var(--fg-dim); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sb-bar    { height:4px; background:var(--border); border-radius:99px; overflow:hidden; }
.sb-fill   { height:100%; border-radius:99px; }
.sb-pct    { color:var(--fg-mute); text-align:right; }

.review-list { display:flex; flex-direction:column; gap:5px; max-height:460px; overflow-y:auto; }
.ri { display:grid; grid-template-columns:12px 1fr auto; gap:10px; align-items:center; padding:9px 12px; background:var(--surface); border:1px solid var(--border); border-radius:var(--r); font-size:12.5px; cursor:pointer; }
.ri:hover { border-color:var(--border-hi); }
.ri-pip { width:8px; height:8px; border-radius:2px; flex-shrink:0; }
.ri-pip.ok  { background:var(--green); }
.ri-pip.bad { background:var(--red); }
.ri-pip.skip { background:var(--fg-mute); }

.cp-block { transition: all 220ms; border-radius:var(--r-md); padding:2px 4px; }
.cp-block-hint {
  background: oklch(0.82 0.14 80 / 0.07);
  border-left: 3px solid var(--amber);
  padding: 8px 12px;
  box-shadow: 0 0 12px oklch(0.82 0.14 80 / 0.15);
  animation: hint-pulse 1.6s ease-out;
}

/* ===== NOTES ===== */
.note-mark {
  background: oklch(0.72 0.12 295 / 0.55) !important;
  color: var(--fg-hi) !important;
  padding: 1px 4px !important;
  border-radius: 3px !important;
  border-bottom: 2px solid var(--purple) !important;
  cursor: pointer !important;
  transition: background 80ms, box-shadow 80ms;
  box-shadow: 0 0 6px oklch(0.72 0.12 295 / 0.30);
  display: inline;
}
.note-mark:hover {
  background: oklch(0.72 0.12 295 / 0.80) !important;
  box-shadow: 0 0 12px oklch(0.72 0.12 295 / 0.65);
}
.sel-bubble {
  position: fixed;
  transform: translateX(-50%);
  z-index: 70;
  background: var(--green);
  color: var(--bg);
  border-radius: 4px;
  padding: 5px 11px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.03em;
  cursor: pointer;
  box-shadow: 0 4px 14px oklch(0.08 0.02 148 / 0.6);
  animation: bubble-in 140ms ease-out;
  user-select: none;
}
@keyframes bubble-in { from{opacity:0;transform:translate(-50%,6px);} to{opacity:1;transform:translateX(-50%);} }
.note-pop {
  position: fixed;
  transform: translateX(-50%);
  z-index: 66;
  background: var(--surface);
  border: 1px solid var(--border);
  border-left: 3px solid var(--purple);
  border-radius: var(--r-md);
  padding: 12px 14px;
  max-width: 360px;
  min-width: 240px;
  box-shadow: 0 10px 28px oklch(0.08 0.02 148 / 0.55);
  animation: bubble-in 160ms ease-out;
}
.notes-list { display:flex; flex-direction:column; gap:8px; }
.notes-item { padding:12px 14px; background:var(--surface); border:1px solid var(--border); border-left:3px solid var(--purple); border-radius:0 var(--r-md) var(--r-md) 0; }
.notes-item-hl { color:var(--purple); font-style:italic; font-size:12.5px; margin-bottom:6px; line-height:1.5; background:oklch(0.72 0.12 295 / 0.15); padding:6px 10px; border-radius:var(--r); }
.notes-item-txt { font-size:13.5px; color:var(--fg-hi); line-height:1.55; margin-bottom:8px; white-space:pre-wrap; }
.notes-item-meta { display:flex; align-items:center; gap:10px; font-size:11px; color:var(--fg-mute); }
.notes-item-topic { color:var(--cyan); cursor:pointer; }
.notes-item-topic:hover { text-decoration:underline; }
@keyframes hint-pulse {
  0%   { background: oklch(0.82 0.14 80 / 0.28); box-shadow: 0 0 24px oklch(0.82 0.14 80 / 0.5); }
  100% { background: oklch(0.82 0.14 80 / 0.07); box-shadow: 0 0 12px oklch(0.82 0.14 80 / 0.15); }
}
@keyframes expand-in {
  from { opacity:0; transform:translateY(-4px); }
  to   { opacity:1; transform:translateY(0); }
}
.osi-row:hover { background:var(--surface)!important; }
.ri-text { color:var(--fg-dim); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ri-dom  { font-size:10px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.06em; flex-shrink:0; }

/* ===== LEARN ===== */
.learn-layout { display:grid; grid-template-columns:210px 1fr; gap:18px; align-items:start; }
.learn-sidebar { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); overflow:hidden; position:sticky; top:68px; max-height:calc(100vh - 88px); overflow-y:auto; }
.ls-dom-hd { padding:7px 13px; font-size:10px; text-transform:uppercase; letter-spacing:0.1em; color:var(--fg-mute); background:var(--raised); border-bottom:1px solid var(--border); cursor:pointer; display:flex; justify-content:space-between; align-items:center; }
.ls-dom-hd:hover { color:var(--fg); }
.ls-topic { display:block; background:transparent; border:0; border-bottom:1px solid var(--border); width:100%; text-align:left; padding:7px 13px 7px 20px; font:inherit; font-size:12.5px; color:var(--fg-dim); cursor:pointer; transition:all 80ms; }
.ls-topic:hover { color:var(--fg); background:var(--raised); }
.ls-topic.active { color:var(--green); background:var(--green-bg); border-left:2px solid var(--green); padding-left:18px; }
.ls-topic.read { color:var(--green); opacity:0.8; }
.ls-topic.read.active { opacity:1; }

.cp-done-row { display:flex; align-items:center; justify-content:space-between; margin-top:36px; padding-top:22px; border-top:1px solid var(--border); }

.concept-page { max-width:740px; }
.cp-eyebrow { font-size:10px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.1em; margin-bottom:5px; }
.cp-title   { font-size:22px; font-weight:700; color:var(--fg-hi); letter-spacing:0.02em; margin-bottom:7px; }
.cp-summary { font-size:13.5px; color:var(--fg-dim); line-height:1.65; margin-bottom:20px; padding-bottom:18px; border-bottom:1px solid var(--border); }
.cp-body { display:flex; flex-direction:column; gap:14px; }
.cp-body h2 { font-size:14px; font-weight:600; color:var(--fg-hi); padding-top:6px; border-top:1px solid var(--border); }
.cp-body p  { font-size:13.5px; color:var(--fg-dim); line-height:1.65; }
.cp-body ul { padding-left:16px; display:flex; flex-direction:column; gap:3px; }
.cp-body li { font-size:13.5px; color:var(--fg-dim); line-height:1.55; }

.term { display:inline; cursor:pointer; color:var(--cyan); border-bottom:1px dashed oklch(0.80 0.1 200 / 0.5); font:inherit; background:transparent; transition:all 80ms; padding:0; }
.term:hover { background:var(--cyan-bg); }
.term.active { background:var(--cyan); color:var(--bg); border-bottom-color:transparent; }

.cp-table { width:100%; border-collapse:collapse; font-size:12.5px; margin:4px 0; }
.cp-table th { background:var(--raised); color:var(--fg-dim); text-align:left; padding:7px 10px; border:1px solid var(--border); font-weight:600; font-size:10px; text-transform:uppercase; letter-spacing:0.06em; }
.cp-table td { padding:7px 10px; border:1px solid var(--border); color:var(--fg-dim); vertical-align:top; }
.cp-table tr:nth-child(even) td { background:var(--raised); }

.cp-diagram { background:var(--input); border:1px solid var(--border); border-radius:var(--r-md); padding:16px; }
.cp-diagram svg { width:100%; display:block; }
.diagram-node { transition:opacity 120ms; }
.diagram-node:hover { opacity:0.7; }

/* Term Drawer */
.drawer-overlay { position:fixed; inset:0; z-index:50; background:oklch(0.08 0.02 148 / 0.65); }
.drawer { position:fixed; right:0; top:0; bottom:0; width:min(440px,92vw); background:var(--surface); border-left:1px solid var(--border); z-index:60; display:flex; flex-direction:column; animation:slide-in 150ms ease-out; }
@keyframes slide-in { from{transform:translateX(100%);} to{transform:translateX(0);} }
.dr-head  { padding:15px 18px; border-bottom:1px solid var(--border); display:flex; justify-content:space-between; align-items:flex-start; flex-shrink:0; }
.dr-eye   { font-size:10px; color:var(--fg-mute); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:4px; }
.dr-title { font-size:16px; font-weight:600; color:var(--fg-hi); }
.dr-body  { flex:1; padding:16px 18px; overflow-y:auto; font-size:13.5px; color:var(--fg-dim); line-height:1.65; }
.dr-body p+p { margin-top:10px; }
.dr-chat  { padding:12px 18px; border-top:1px solid var(--border); display:flex; flex-direction:column; gap:7px; flex-shrink:0; max-height:48%; }
.dr-chat .chat-log { max-height:180px; }

/* ===== PROGRESS VIEW ===== */
.progress-grid { display:grid; grid-template-columns:1fr 1fr; gap:18px; }
.missed-list { display:flex; flex-direction:column; gap:5px; max-height:380px; overflow-y:auto; }
.missed-item { padding:9px 12px; background:var(--surface); border:1px solid var(--border); border-left:2px solid var(--red); border-radius:0 var(--r) var(--r) 0; font-size:12.5px; color:var(--fg-dim); cursor:pointer; }
.missed-item:hover { border-color:var(--border-hi); color:var(--fg); }

/* ===== BUTTONS ===== */
.btn { background:var(--surface); border:1px solid var(--border); color:var(--fg); padding:7px 13px; border-radius:var(--r); font:inherit; font-size:12px; cursor:pointer; transition:all 80ms; display:inline-flex; align-items:center; gap:5px; text-transform:uppercase; letter-spacing:0.07em; }
.btn:hover { border-color:var(--border-hi); color:var(--fg-hi); }
.btn:active { opacity:0.85; }
.btn:disabled { opacity:0.35; cursor:not-allowed; pointer-events:none; }
.btn-primary { background:var(--green); border-color:var(--green); color:var(--bg); font-weight:700; }
.btn-primary:hover { background:oklch(0.82 0.24 148); border-color:oklch(0.82 0.24 148); color:var(--bg); }
.btn-ghost   { background:transparent; border-color:transparent; }
.btn-ghost:hover { background:var(--raised); border-color:var(--border); }
.btn-danger  { border-color:var(--red); color:var(--red); }
.btn-danger:hover { background:var(--red-bg); }
.btn-sm  { padding:4px 9px; font-size:11px; }
.btn-lg  { padding:10px 18px; font-size:13px; }

/* ===== TAGS / UTILS ===== */
.tag { display:inline-flex; align-items:center; padding:2px 7px; border-radius:var(--r); border:1px solid; font-size:10px; text-transform:uppercase; letter-spacing:0.08em; }
.tag-d1 { color:var(--d1); border-color:var(--d1); background:oklch(0.18 0.04 200); }
.tag-d2 { color:var(--d2); border-color:var(--d2); background:var(--green-bg); }
.tag-d3 { color:var(--d3); border-color:var(--d3); background:oklch(0.18 0.05 245); }
.tag-d4 { color:var(--d4); border-color:var(--d4); background:var(--amber-bg); }
.tag-d5 { color:var(--d5); border-color:var(--d5); background:var(--red-bg); }
.tag-d6 { color:var(--d6); border-color:var(--d6); background:var(--purple-bg); }
.tag-diff-1 { color:var(--green); border-color:var(--green); background:var(--green-bg); }
.tag-diff-2 { color:var(--amber); border-color:var(--amber); background:var(--amber-bg); }
.tag-diff-3 { color:var(--red);   border-color:var(--red);   background:var(--red-bg);   }
.tag-ccnp   { color:var(--purple); border-color:var(--purple); background:var(--purple-bg); }

.card { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:18px; }
.divider { height:1px; background:var(--border); margin:14px 0; }
.empty-msg { color:var(--fg-mute); font-size:12px; padding:16px; text-align:center; }

@keyframes blink { 0%,100%{opacity:1;} 50%{opacity:0;} }

/* ===== RESPONSIVE ===== */
@media(max-width:880px){
  .quiz-layout,.results-grid,.learn-layout{ grid-template-columns:1fr; }
  .stats-row{ grid-template-columns:repeat(2,1fr); }
  .session-grid{ grid-template-columns:1fr; }
  .progress-grid{ grid-template-columns:1fr; }
  .cert-toggle{ grid-template-columns:1fr; }
  .hint-panel{ position:static; max-height:none; }
  .learn-sidebar{ position:static; max-height:none; }
}

/* React root needs full viewport so chooser flex-column can fill it */
#root { height: 100%; }

/* ===== CERT SELECTION SCREEN ===== */
.cert-select-screen {
  /* Embedded inside the app frame (<main>), not a full-screen page. Let the
   * outer document scroll instead of locking the chooser to the viewport.
   * align-items:center centers the inner .cs-content block horizontally. */
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 24px 24px 16px;
  position: relative;        /* positioning context for .cs-user-menu top-right anchor */
  min-height: 60vh;          /* enough breathing room when there are few cards */
}

/* Floating user-menu corner — only rendered when logged in. Lets the user
 * access Profile / Switch cert / Admin / Logout from the chooser without
 * being trapped in cert-pick UI. Positioned absolute so it doesn't push
 * the centered chooser content around. z-index above the chooser content
 * so the dropdown menu (which extends below the trigger) isn't covered
 * by cards. */
.cs-user-menu {
  position: absolute;
  top: 18px;
  right: 22px;
  z-index: 50;
}
@media (max-width: 1024px) {
  /* Mobile + tablet: don't lock to viewport. The header (brand + title +
   * Career Planner card) takes too much of a short viewport, leaving the
   * horizontal cert strip with not enough vertical room — cards get clipped.
   * Let the page scroll naturally instead. Cards still scroll horizontally
   * inside their own container; only the *outer* page is unlocked. */
  .cert-select-screen {
    height: auto;
    max-height: none;
    min-height: 100vh;
    overflow: visible;
  }
  .cs-content {
    overflow: visible;
  }
}
/* Wider than the other screens to give the chooser grid room to spread. */
.cs-content {
  max-width: 1400px;
  width: 100%;
  text-align: center;
  display: flex;
  flex-direction: column;
  min-width: 0;              /* per project mobile-viewport gotcha rule */
}
.cs-brand { font-size: 14px; margin-bottom: 14px; letter-spacing: 0.04em; color: var(--fg-hi); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.cs-title { font-size: 26px; color: var(--fg-hi); margin: 0 0 8px; font-weight: 700; letter-spacing: 0.02em; flex-shrink: 0; }
.cs-sub { color: var(--fg-dim); margin: 0 auto 16px; font-size: 14.5px; max-width: 460px; line-height: 1.55; flex-shrink: 0; }
/* Chooser grid: cards have a fixed width (--cs-card-w). The grid lays out
   as many columns as fit the viewport at that width and wraps naturally.
   Number of columns is dynamic, card width is constant. Center the whole
   grid block so partial rows look balanced. */
.cs-options-wrap {
  display: grid;
  grid-template-columns: repeat(auto-fit, var(--cs-card-w, 300px));
  gap: 16px;
  justify-content: center;
  max-width: 100%;
  margin: 0 auto;
}
.cs-card { background: var(--surface); border: 2px solid var(--border); border-radius: var(--r-md); padding: 20px 22px; cursor: pointer; transition: all 120ms; font: inherit; text-align: left; color: inherit; display: flex; flex-direction: column; gap: 4px; position: relative; }
.cs-card:hover { border-color: var(--green); background: var(--green-bg); transform: translateY(-2px); }
/* Home landing action cards. Both cards use green (the primary brand accent)
 * so the Careers and Certifications cards are an identical, paired pair in
 * every theme. Override the bare .cs-card border so both are clearly clickable. */
.cs-card-career { border-color: var(--green); }
.cs-card-career:hover { border-color: var(--green); background: var(--green-bg); }
.cs-card-career .cs-card-label { color: var(--green); }
.cs-card-career .cs-card-sub { color: var(--green); }

.cs-card-cert { border-color: var(--green); }
.cs-card-cert:hover { border-color: var(--green); background: var(--green-bg); }
.cs-card-cert .cs-card-label { color: var(--green); }
.cs-card-cert .cs-card-sub { color: var(--green); }

/* Spotlight cards on the home page. Amber accent so they read as "featured"
 * without competing with the green primary action / cyan career accent. */
.spotlight-card { border-color: var(--amber); }
.spotlight-card:hover { border-color: var(--amber); background: var(--amber-bg); }
.spotlight-tag {
  position: absolute; top: 10px; right: 12px;
  font-size: 10px; font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--amber);
  background: var(--amber-bg);
  border: 1px solid var(--amber);
  padding: 2px 7px;
  border-radius: 2px;
}
/* On-path: green left border highlight + small badge top-right.
 * Indicates this cert is part of the user's currently-enrolled career path. */
.cs-card.on-path { border-left-width: 4px; border-left-color: var(--green); }

/* CertSelectScreen v2: left-align to match the career catalog layout */
.cert-select-screen .cs-content { text-align: left; }

/* CertSelectScreen v2: on-path green left-border for .cp-card (career-catalog
 * card class reused by the new cert chooser). Mirrors .cs-card.on-path above. */
.cp-card.on-path { border-left-width: 4px; border-left-color: var(--green); }
/* Active cert (the one you're currently studying) on the chooser */
.cp-card.is-active { border-color: var(--green); box-shadow: inset 0 0 0 1px var(--green); }
.cs-card-active-badge {
  display: inline-flex; align-items: center;
  margin-left: auto; align-self: flex-start; flex-shrink: 0;
  padding: 2px 8px; border-radius: var(--r);
  background: var(--green); color: var(--bg, #0a0e0b);
  font-size: 10px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  white-space: nowrap;
}
.cs-card-onpath-badge {
  position: absolute;
  top: 10px;
  right: 12px;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--green);
  background: rgba(0, 255, 102, 0.1);
  border: 1px solid var(--green);
  padding: 2px 7px;
  border-radius: 2px;
  font-weight: 600;
}
/* On-path badge: flow inline at the end of the cert card's header row
 * (the .cp-card layout) instead of absolute-overlapping the title. */
.cp-card .cs-card-onpath-badge {
  position: static;
  margin-left: auto;
  align-self: flex-start;
  flex-shrink: 0;
}
/* Label fits "A+ Core 1" on a SINGLE line at the 300px card width.
   word-break:normal stops the browser from breaking "Core" mid-word.
   padding-right reserves space for the absolutely positioned preview tag.
   min-height holds a stable 2-line footprint so single-line labels
   (Net+, Sec+, CCNA) leave the sub-label position aligned with any
   accidental two-line labels (shouldn't happen at 300px width). */
.cs-card-label {
  font-size: 24px;
  font-weight: 700;
  color: var(--fg-hi);
  letter-spacing: 0.04em;
  line-height: 1.15;
  word-break: normal;
  overflow-wrap: normal;
  hyphens: none;
  padding-right: 80px;
  min-height: calc(24px * 1.15 * 2);
}
.cs-card-sub { font-size: 11px; color: var(--green); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 12px; font-weight: 600; margin-top: 4px; }
.cs-card-desc { font-size: 14px; color: var(--fg-dim); line-height: 1.65; }

/* "preview" tag for under-construction certs. Absolutely positioned in the
   top-right corner — completely decoupled from the label, so two-line
   titles don't push it down or trigger flex-wrap. */
.cs-card-ro:hover { border-color: var(--amber); background: var(--amber-bg); }
.cs-card-ro .cs-card-sub { color: var(--amber); }
.cs-card-tag {
  position: absolute;
  top: 16px;
  right: 16px;
  font-family: var(--font);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--amber);
  border: 1px solid var(--amber);
  border-radius: 999px;
  padding: 2px 8px;
  background: transparent;
  font-weight: 600;
  white-space: nowrap;
  opacity: 0.85;
  pointer-events: none;
}
@media (max-width: 600px) {
  /* On narrow phones, force single-column with the card filling viewport. */
  .cs-options-wrap { grid-template-columns: 1fr; }
}

/* ===== Cert preview page (/certs/<certId>) =====
   Shown when a user clicks a cert they're NOT enrolled in. Single-column
   detail layout: hero, blurb, stat row, domain list, exam facts, actions. */
.cpv-back-link {
  align-self: flex-start;
  background: none; border: none; color: var(--fg-dim);
  font: inherit; font-size: 13px; cursor: pointer; padding: 4px 0;
  margin-bottom: 12px;
}
.cpv-back-link:hover { color: var(--green); }
.cpv-hero { display: flex; align-items: center; gap: 16px; margin-bottom: 14px; }
.cpv-icon { font-size: 40px; line-height: 1; flex-shrink: 0; }
.cpv-title { font-size: 26px; font-weight: 700; color: var(--fg-hi); margin: 0; letter-spacing: 0.02em; }
.cpv-sub { font-size: 11px; color: var(--green); text-transform: uppercase; letter-spacing: 0.1em; font-weight: 600; margin-top: 4px; }
.cpv-blurb { color: var(--fg-dim); font-size: 15px; line-height: 1.65; margin: 0 0 22px; max-width: 720px; }
.cpv-stats { display: flex; gap: 14px; flex-wrap: wrap; margin-bottom: 24px; }
.cpv-stat {
  flex: 1 1 140px; min-width: 120px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 16px 18px; display: flex; flex-direction: column; gap: 4px;
}
.cpv-stat-val { font-size: 28px; font-weight: 700; color: var(--green); line-height: 1; }
.cpv-stat-label { font-size: 11px; color: var(--fg-mute); text-transform: uppercase; letter-spacing: 0.06em; }
.cpv-section { margin-bottom: 24px; }
.cpv-h2 { font-size: 13px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--fg-mute); margin: 0 0 10px; font-weight: 600; }
.cpv-domains { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.cpv-domain {
  display: flex; align-items: center; gap: 12px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r);
  padding: 10px 14px;
}
.cpv-domain-name { color: var(--fg-hi); font-size: 14px; }
.cpv-domain-weight { margin-left: auto; color: var(--green); font-size: 13px; font-weight: 600; flex-shrink: 0; }
.cpv-examinfo { display: flex; flex-direction: column; gap: 8px; max-width: 540px; }
.cpv-examinfo-row { display: flex; gap: 12px; font-size: 13.5px; }
.cpv-examinfo-k { color: var(--fg-mute); min-width: 110px; flex-shrink: 0; }
.cpv-examinfo-v { color: var(--fg-dim); }
.cpv-actions { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 8px; }
.cpv-btn {
  font: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
  padding: 12px 24px; border-radius: var(--r-md); border: 2px solid var(--border);
  transition: all 120ms;
}
.cpv-btn-primary { background: var(--green); border-color: var(--green); color: var(--bg, #0a0e0b); }
.cpv-btn-primary:hover { filter: brightness(1.08); transform: translateY(-1px); }
.cpv-btn-ghost { background: transparent; color: var(--fg-dim); }
.cpv-btn-ghost:hover { border-color: var(--green); color: var(--green); }
.cpv-signin-note { margin-top: 16px; font-size: 13px; color: var(--fg-mute); }
.cpv-inline-link { background: none; border: none; padding: 0; font: inherit; color: var(--green); cursor: pointer; text-decoration: underline; }
.cpv-notfound { padding: 60px 20px; text-align: center; color: var(--fg-dim); display: flex; flex-direction: column; gap: 16px; align-items: center; }

/* Chooser footer actions row — sits below the cert grid, holds the
 * "+ Request a new certification" button. Not flex:1 so it takes natural
 * height while the grid above fills remaining space. */
.cs-footer-actions {
  flex-shrink: 0;
  padding: 10px 0 4px;
  display: flex;
  justify-content: center;
}

/* ═══ Cert-grid scroll container ═══
   Laptop+ (>1024px): vertical scroll filling the remaining viewport
     height (after header + Career Planner card). Uses flex:1 from the
     parent .cs-content flex column.
   Mobile/tablet (≤1024px): horizontal scroll. The grid becomes a single
     row (or two rows on tighter phones) of cards that the user swipes
     through. More natural on touch devices. */
.cs-grid-scroll {
  width: 100%;
  margin: 0 auto;
  flex: 1;           /* fill whatever vertical space is left in cs-content */
  min-height: 0;     /* allows flex:1 to actually shrink below content size */
  min-width: 0;      /* prevents intrinsic max-content child from leaking width up */
  max-width: 100%;
}
@media (min-width: 1025px) {
  /* Laptop: vertical scroll, fills remaining viewport */
  .cs-grid-scroll {
    overflow-y: auto;
    overflow-x: hidden;
    /* Subtle fade at top+bottom so cards entering/leaving don't pop */
    mask-image: linear-gradient(to bottom, transparent 0, black 12px, black calc(100% - 12px), transparent 100%);
    -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 12px, black calc(100% - 12px), transparent 100%);
    padding: 12px 4px;       /* breathing room above/below cards */
  }
  /* Custom scrollbar so it reads as terminal-y, not OS-default */
  .cs-grid-scroll::-webkit-scrollbar { width: 8px; }
  .cs-grid-scroll::-webkit-scrollbar-track { background: var(--input); border-radius: 4px; }
  .cs-grid-scroll::-webkit-scrollbar-thumb {
    background: var(--border-hi);
    border-radius: 4px;
  }
  .cs-grid-scroll::-webkit-scrollbar-thumb:hover { background: var(--green); }
}
@media (max-width: 1024px) {
  /* Mobile + tablet: horizontal swipe through cards */
  .cs-grid-scroll {
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scroll-snap-type: x mandatory;
    padding: 8px 4px 16px;
    /* Hide native scrollbar — a swipe gesture is the affordance */
    scrollbar-width: none;
  }
  .cs-grid-scroll::-webkit-scrollbar { display: none; }

  .cs-grid-scroll .cs-options-wrap {
    /* Flatten the grid into a single horizontal row */
    display: flex;
    flex-wrap: nowrap;
    gap: 12px;
    width: max-content;        /* shrink-wrap to actual card count */
    margin: 0;
    justify-content: flex-start;
  }
  .cs-grid-scroll .cs-card {
    flex: 0 0 var(--cs-card-w, 280px);
    scroll-snap-align: start;
    /* Match heights so the row stays neat */
    min-height: 260px;
  }
}

/* ═══ Under-development cert cards ═══
   Visually distinct from live cards: muted color palette, amber "Under
   Development" badge, no hover-lift (still hover-highlights so the
   tell-us button feels reachable). */
.cs-card-under-dev {
  background: var(--surface);
  border: 2px dashed var(--border-hi);
  cursor: default;
  opacity: 0.78;
  position: relative;
}
.cs-card-under-dev:hover {
  background: var(--surface);    /* override .cs-card:hover */
  border-color: var(--amber);
  transform: none;
  opacity: 0.92;
}
/* CertSelectScreen v2: career.css loads AFTER styles.css, so .cp-card:hover
 * (cyan border + translateY) would override .cs-card-under-dev:hover above.
 * Restore the under-dev muted treatment when both classes are present. */
.cp-card.cs-card-under-dev:hover { transform: none; border-color: var(--amber); background: var(--surface); }
.cs-card-under-dev .cs-card-label {
  color: var(--fg-dim);
}
.cs-card-under-dev .cs-card-sub {
  color: var(--amber);
  opacity: 0.85;
}
.cs-card-under-dev-badge {
  position: absolute;
  top: 12px;
  right: 12px;
  font-family: var(--font);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--amber);
  border: 1px solid var(--amber);
  border-radius: 999px;
  padding: 2px 8px;
  background: var(--amber-bg);
  font-weight: 600;
  white-space: nowrap;
  z-index: 1;
}
.cs-card-under-dev .cs-card-label {
  /* Reserve more padding-right so the badge has room */
  padding-right: 130px;
}

/* "Tell us this matters" button on each under-dev card. Sits at the bottom
 * of the card with a margin-top:auto so it sticks to the bottom regardless
 * of how short the blurb is. */
.cs-card-tellus-btn {
  margin-top: auto;
  align-self: flex-start;
  background: transparent;
  border: 1px solid var(--amber);
  color: var(--amber);
  font: inherit;
  font-size: 11.5px;
  padding: 6px 12px;
  border-radius: var(--r);
  cursor: pointer;
  transition: all 120ms;
  margin-top: 16px;     /* explicit gap above */
}
.cs-card-tellus-btn:hover:not(:disabled) {
  background: var(--amber-bg);
  border-color: var(--amber);
  color: var(--amber);
  opacity: 1;
}
.cs-card-tellus-btn:disabled {
  cursor: wait;
  opacity: 0.5;
}

/* ═══ Toast (centered above the grid) for tell-us feedback ═══ */
.cs-toast {
  margin: 12px auto;
  padding: 8px 16px;
  border-radius: var(--r);
  font-size: 13px;
  font-weight: 500;
  display: inline-block;
  text-align: center;
  border: 1px solid var(--border);
}
.cs-toast.ok      { color: var(--green); border-color: var(--green); background: var(--green-bg); }
.cs-toast.error   { color: var(--red);   border-color: var(--red);   background: var(--red-bg); }
.cs-toast.sending { color: var(--cyan);  border-color: var(--cyan);  background: var(--cyan-bg); }

.cert-logo {
  font-size: 10px;
  background: transparent;
  color: var(--green);
  border: 1.5px solid var(--green);
  padding: 3px 9px;
  border-radius: 3px;
  margin-left: 14px;
  font-weight: 700;
  letter-spacing: 0.15em;
  cursor: pointer;
  font-family: var(--font);
  transition: all 100ms;
  text-transform: uppercase;
}
.cert-logo:hover { background: var(--green); color: var(--bg); border-color: var(--green); }

/* ===== CERT TOGGLE (legacy — kept for the CertPickerModal which is no longer used) ===== */
.cert-toggle { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; margin-bottom:4px; }
.cert-opt { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:14px 16px; cursor:pointer; font:inherit; color:var(--fg-dim); text-align:center; transition:all 100ms; display:flex; flex-direction:column; gap:3px; }
.cert-opt:hover { border-color:var(--border-hi); color:var(--fg); }
.cert-opt.active { border-color:var(--green); background:var(--green-bg); color:var(--green); }
.cert-opt-label { font-size:18px; font-weight:700; letter-spacing:0.04em; }
.cert-opt-sub { font-size:11px; opacity:0.75; text-transform:uppercase; letter-spacing:0.06em; }
.cert-opt.active .cert-opt-sub { opacity:1; }

/* ===== TERM (terminal selection-style highlight) ===== */
.term { display:inline; cursor:pointer; background:oklch(0.80 0.10 200 / 0.20); color:oklch(0.88 0.08 200); border-radius:2px; padding:0 3px; border:none; font:inherit; transition:background 80ms; }
.term:hover { background:oklch(0.80 0.10 200 / 0.45); color:var(--fg-hi); }
.term.active { background:var(--cyan); color:var(--bg); }

/* ===== CLI SIMULATOR ===== */
.cli-sim { display:flex; flex-direction:column; gap:10px; }
.cli-task-card { background:var(--surface); border:1px solid var(--border); border-left:3px solid var(--green); border-radius:var(--r-md); padding:14px 16px; }
.cli-task-label { font-size:10px; color:var(--green); text-transform:uppercase; letter-spacing:0.1em; margin-bottom:5px; }
.cli-task-text { font-size:14.5px; color:var(--fg-hi); line-height:1.5; margin-bottom:10px; }
.cli-step-pips { display:flex; gap:4px; }
.cli-pip { width:8px; height:8px; border-radius:2px; background:var(--border); }
.cli-pip.done { background:var(--green); }
.cli-pip.active { background:var(--amber); box-shadow:0 0 5px oklch(0.82 0.14 80 / 0.6); }
.cli-prog { height:2px; background:var(--border); border-radius:99px; overflow:hidden; margin-top:10px; }
.cli-prog-fill { height:100%; background:var(--green); transition:width 300ms; border-radius:99px; }
.cli-terminal { background:var(--input); border:1px solid var(--border); border-radius:var(--r-md); padding:14px 16px; min-height:220px; max-height:420px; overflow-y:auto; cursor:text; font-size:13px; line-height:1.55; }
.cli-boot { color:var(--fg-mute); font-size:11px; margin-bottom:10px; padding-bottom:8px; border-bottom:1px solid var(--border); }
.cli-entry { margin-bottom:2px; }
.cli-cmd-line { display:flex; align-items:flex-start; }
.cli-prompt { color:var(--green); font-weight:600; white-space:nowrap; user-select:none; }
.cli-cmd-text { color:var(--amber); margin-left:2px; }
.cli-cmd-err { color:var(--red); }
.cli-pre { margin:1px 0 6px 0; padding:0; background:transparent; font:inherit; font-size:12px; white-space:pre; }
.cli-pre-err { color:var(--red); opacity:0.8; }
.cli-pre-help { color:var(--cyan); }
.cli-success-line { color:var(--green); margin-top:8px; padding-top:8px; border-top:1px dashed var(--border); }
.cli-input-line { display:flex; align-items:center; margin-top:4px; }
.cli-input-field { background:transparent; border:0; outline:none; color:var(--amber); font:inherit; font-size:13px; caret-color:transparent; margin-left:2px; }
.cli-cursor-block { display:inline-block; width:0.55em; height:1em; background:var(--green); vertical-align:text-bottom; animation:blink 1s step-end infinite; margin-left:1px; opacity:0.9; }

/* ===== YOUTUBE EMBED ===== */
.yt-section { border:1px solid var(--border); border-radius:var(--r-md); overflow:hidden; margin-bottom:6px; }
.yt-bar { display:flex; align-items:center; gap:8px; padding:7px 14px; background:var(--raised); border-bottom:1px solid var(--border); font-size:11px; color:var(--fg-dim); text-transform:uppercase; letter-spacing:0.08em; font-weight:600; }
.yt-bar a { margin-left:auto; color:var(--fg-mute); font-size:11px; text-decoration:none; }
.yt-bar a:hover { color:var(--fg); }
.yt-wrap { position:relative; padding-bottom:56.25%; height:0; overflow:hidden; background:var(--input); }
.yt-iframe { position:absolute; top:0; left:0; width:100%; height:100%; border:0; }
.yt-thumb-link { display:block; position:relative; text-decoration:none; background:var(--input); aspect-ratio:16/9; overflow:hidden; }
.yt-thumb-img { width:100%; height:100%; object-fit:cover; display:block; }
.yt-play-overlay { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:10px; background:oklch(0.10 0.02 148 / 0.55); transition:background 150ms; }
.yt-thumb-link:hover .yt-play-overlay { background:oklch(0.10 0.02 148 / 0.30); }
.yt-play-btn { width:62px; height:62px; background:var(--red); border-radius:50%; display:grid; place-items:center; font-size:22px; color:#fff; padding-left:4px; box-shadow:0 4px 18px oklch(0.10 0.02 148 / 0.4); }
.yt-play-label { color:#fff; font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:0.08em; }

/* ===== MODAL ===== */
.modal-overlay { position:fixed; inset:0; z-index:60; background:oklch(0.08 0.02 148 / 0.7); display:grid; place-items:center; padding:20px; animation:fade-in 140ms ease-out; }
@keyframes fade-in { from{opacity:0;} to{opacity:1;} }
.modal-card { background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:24px 26px; max-width:520px; width:100%; box-shadow:0 18px 50px oklch(0 0 0 / 0.4); }
.modal-title { font-size:14px; color:var(--green); text-transform:uppercase; letter-spacing:0.1em; font-weight:700; margin-bottom:6px; }
.modal-sub { font-size:13px; color:var(--fg-dim); margin-bottom:18px; line-height:1.5; }

/* ===== MOBILE PASS (≤600px) =====================================
 * The site is desktop-first. This block adapts the layout for phones
 * (375-414px wide). The existing 880px breakpoint above handles
 * tablet/laptop sizes; this block handles "definitely a phone."
 *
 * Strategy:
 *   - Tighten container padding (24px → 12px) so content has room
 *   - Top nav becomes horizontally scrollable (7 tabs don't fit otherwise)
 *   - Right-side badges (streak, accuracy) hide to save space; account
 *     menu and brand stay visible
 *   - Stat cards stack into a 2-column grid (4 columns is too narrow)
 *   - Domain rows shrink their gutter columns so the name doesn't get
 *     squeezed into a sliver
 *   - Headings shrink slightly (28px → 22px for h1)
 *   - Modal padding tightens
 *   - Tweaks panel button stays in the corner but doesn't dwarf content
 */
@media (max-width: 600px) {
  /* Container padding — give content more room */
  main { padding: 14px 12px 60px; }

  /* Topbar: keep brand + horizontally scrollable nav + auth button visible.
   * Hide the "streak" and "% acc · Nq" badges to keep header height sane. */
  .topbar { padding: 8px 12px; gap: 8px; }
  .brand {
    font-size: 14px;
    flex-shrink: 1;
    min-width: 0;
    max-width: 100%;
    overflow: hidden;            /* enable inner ellipsis */
    display: flex;
    align-items: center;
  }
  .brand-wrap { flex: 1 1 0; min-width: 0; max-width: 100%; }
  .brand-cd-text { font-size: 14px; flex-shrink: 0; }
  /* Hide @cyberstudy on mobile — it's decorative, costs ~12 characters.
   * Resulting prompt: "whertz0215:~/career cd .. ▌" instead of the full
   * "whertz0215@cyberstudy:~/career cd .. ▌". Saves ~100px on a phone. */
  .brand .b-sep,
  .brand .b-host { display: none; }
  .brand .b-path {
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
    flex: 1 1 auto;
  }
  .brand .b-user { flex-shrink: 0; }
  .brand .b-colon { flex-shrink: 0; }
  .brand-wrap .b-cursor { display: none; }  /* save horizontal pixels */
  .brand .b-dollar { display: none; }  /* save more pixels — prompt is implicit */
  .nav-tabs {
    margin-left: 6px; gap: 2px;
    overflow-x: auto; overflow-y: hidden;
    flex: 1 1 auto; min-width: 0;
    scrollbar-width: none;  /* Firefox: hide scrollbar */
  }
  .nav-tabs::-webkit-scrollbar { display: none; }  /* Chrome/Safari */
  .nav-tab {
    padding: 4px 8px; font-size: 11px;
    flex-shrink: 0; white-space: nowrap;
  }
  .nav-right { gap: 6px; flex-shrink: 0; }
  .nav-right .streak-badge,
  .nav-right > span { display: none; }  /* hide acc/streak text on phones */
  /* The AuthButton stays visible — it's the only thing in .nav-right not
   * wrapped in a span or .streak-badge. */

  /* Home dashboard */
  .home-h1 { font-size: 22px; }
  .home-sub { font-size: 12px; }
  .stats-row { grid-template-columns: repeat(2, 1fr) !important; gap: 8px; }
  .stat-card { padding: 12px 14px; }
  .stat-v { font-size: 24px; }
  .stat-k { font-size: 10px; }

  /* Quick-action grid — already 1-col below 880px, just tighten padding */
  .session-btn { padding: 14px 16px; }
  .sb-title { font-size: 14px; }
  .sb-desc { font-size: 12px; }

  /* Domain rows on Home — shrink the gutters that we added for desktop
   * centering. On phones, just let the name + tiny bar fit. */
  .domain-row {
    grid-template-columns: 24px 1fr 60px 36px !important;
    gap: 6px; padding: 8px 10px; font-size: 11px;
  }
  .domain-row .dom-num  { grid-column: 1 !important; }
  .domain-row .dom-name { grid-column: 2 !important; text-align: left !important; }
  .domain-row .dom-bar  { grid-column: 3 !important; }
  .domain-row .dom-pct  { grid-column: 4 !important; }

  /* Section labels */
  .sec-label { font-size: 10px; margin-top: 18px; }

  /* Modal */
  .modal-overlay { padding: 12px; }
  .modal-card { padding: 18px 18px; }

  /* Notes view */
  .notes-item { padding: 12px 14px; }
  .notes-item-hl { font-size: 13px; }
  .notes-item-txt { font-size: 13px; }

  /* Progress page — already 1-col below 880px */
  .progress-grid { gap: 10px; }

  /* Locked tab interstitial — already constrained, just tighten padding */
  .locked-view { margin: 30px auto; padding: 22px 18px; }
  .locked-title { font-size: 16px; }
  .locked-desc { font-size: 12px; }

  /* Tweaks panel — keep it accessible but smaller */
  .tweaks-trigger { width: 36px; height: 36px; font-size: 16px; }
}

/* Very narrow phones (≤380px, iPhone SE etc.) — extra trim */
@media (max-width: 380px) {
  main { padding: 12px 8px 60px; }
  .topbar { padding: 6px 8px; gap: 6px; }
  .brand { font-size: 15px; }
  .nav-tab { padding: 3px 7px; font-size: 10px; }
  .stat-v { font-size: 20px; }
}

/* ====================================================================
 * HAMBURGER MENU (mobile-only) — desktop keeps the existing tab strip
 * ====================================================================
 * The TopBar renders BOTH the .nav-tabs strip AND the .nav-burger-wrap.
 * On desktop we show nav-tabs and hide the hamburger; on mobile we flip.
 * This avoids re-rendering on resize and keeps state simple.
 */

/* Hamburger wrap is hidden on desktop */
.nav-burger-wrap { display: none; position: relative; }

/* The 3-line hamburger button itself */
.nav-burger {
  background: transparent; border: 1px solid var(--border);
  border-radius: var(--r); padding: 6px 8px;
  width: 32px; height: 30px; cursor: pointer;
  display: flex; flex-direction: column; justify-content: space-around;
  align-items: stretch;
}
.nav-burger:hover { border-color: var(--green); }
.nav-burger span {
  display: block; height: 2px; background: var(--fg-hi);
  border-radius: 1px; transition: transform 150ms, opacity 150ms;
}
.nav-burger.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-burger.open span:nth-child(2) { opacity: 0; }
.nav-burger.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* The dropdown drawer that appears below the hamburger */
.nav-drawer {
  position: absolute; top: calc(100% + 6px); right: 0;
  background: var(--surface); border: 1px solid var(--border-hi);
  border-radius: var(--r-md); padding: 6px;
  min-width: 180px; box-shadow: 0 8px 30px oklch(0 0 0 / 0.5);
  z-index: 50;
  display: flex; flex-direction: column; gap: 2px;
  animation: nav-drawer-in 120ms ease-out;
}
@keyframes nav-drawer-in {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}
.nav-drawer-item {
  background: transparent; border: 1px solid transparent;
  color: var(--fg-dim); padding: 10px 14px; border-radius: var(--r);
  font: inherit; font-size: 13px; text-align: left;
  text-transform: uppercase; letter-spacing: 0.08em;
  cursor: pointer; transition: all 80ms;
}
.nav-drawer-item:hover { color: var(--fg); background: var(--raised); }
.nav-drawer-item.active { color: var(--green); border-color: var(--green); background: var(--green-bg); }

/* ============================================================================
   Left side navigation. The top bar is now a slim sticky header (.topbar-slim)
   holding only the hamburger + brand/breadcrumb; ALL nav (pillars, study tabs,
   cert badge, stats, auth) lives in .sidenav, which slides in as an overlay
   (dimming the page via .sidenav-scrim) and docks permanently on ultrawide.
   ========================================================================== */
:root { --sidenav-w: 252px; }

.topbar-slim { gap: 14px; }
.topbar-hamburger {
  background: transparent; border: 1px solid var(--border); border-radius: var(--r);
  padding: 6px 8px; width: 34px; height: 30px; cursor: pointer; flex-shrink: 0;
  display: flex; flex-direction: column; justify-content: space-around; align-items: stretch;
}
.topbar-hamburger:hover { border-color: var(--green); }
.topbar-hamburger span { display: block; height: 2px; background: var(--fg-hi); border-radius: 1px; transition: transform 150ms, opacity 150ms; }
.topbar-hamburger.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.topbar-hamburger.open span:nth-child(2) { opacity: 0; }
.topbar-hamburger.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.sidenav-scrim {
  position: fixed; inset: 0; background: oklch(0 0 0 / 0.5);
  opacity: 0; pointer-events: none; transition: opacity 160ms ease; z-index: 45;
}
.sidenav-scrim.open { opacity: 1; pointer-events: auto; }

.sidenav {
  position: fixed; top: 0; left: 0; height: 100vh; width: var(--sidenav-w);
  background: var(--surface); border-right: 1px solid var(--border); z-index: 46;
  transform: translateX(-100%); transition: transform 180ms ease;
  display: flex; flex-direction: column;
}
.sidenav.open { transform: none; box-shadow: 6px 0 30px oklch(0 0 0 / 0.4); }
.sidenav-scroll { display: flex; flex-direction: column; gap: 3px; padding: 14px 12px; overflow-y: auto; height: 100%; }
.sidenav-item {
  background: transparent; border: 1px solid transparent; color: var(--fg-dim);
  padding: 11px 14px; border-radius: var(--r); font: inherit; font-size: 13px;
  text-align: left; text-transform: uppercase; letter-spacing: 0.08em;
  cursor: pointer; transition: all 80ms; white-space: nowrap;
}
.sidenav-item:hover { color: var(--fg); background: var(--raised); }
.sidenav-item.active { color: var(--green); border-color: var(--green); background: var(--green-bg); }
.sidenav-divider { height: 1px; background: var(--border); margin: 7px 6px; flex-shrink: 0; }
.sidenav-meta { margin-top: auto; display: flex; flex-direction: column; gap: 10px; padding: 12px 4px 4px; }
/* .cert-badge (defined later in this file) caps at max-width:180px; the
   double-class selector raises specificity so the sidebar full-width wins
   regardless of source order. */
.cert-badge.sidenav-cert { width: 100%; max-width: none; justify-content: space-between; box-sizing: border-box; }
.sidenav-stats { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: center; color: var(--fg-mute); font-size: 12px; padding: 0 4px; }
.sidenav-auth { display: flex; }
.sidenav-auth > * { width: 100%; }
/* Make the profile button fill the panel like .sidenav-cert above it — the
   base .user-menu-trigger caps at max-width:160px and sizes to its label,
   which left it visibly narrower than the full-width cert badge. */
.sidenav-auth .user-menu-trigger { width: 100%; max-width: none; justify-content: space-between; box-sizing: border-box; }

/* The profile/user menu lives at the BOTTOM of the sidebar, so its dropdown
   must open UPWARD (and left-aligned) instead of downward off the panel. */
.sidenav .user-menu { top: auto; bottom: calc(100% + 4px); left: 0; right: auto; }

/* Ultrawide: dock the sidebar permanently — no hamburger, no scrim. Content
   (slim header + main + footer) shifts right to clear the fixed sidebar. */
@media (min-width: 1600px) {
  .topbar-hamburger { display: none; }
  .sidenav-scrim { display: none; }
  .sidenav { transform: none; box-shadow: none; }
  .app { padding-left: var(--sidenav-w); }
}

/* Learn-mode mobile sidebar toggle + close button.
 * Desktop hides both; mobile shows the toggle above the content. */
.learn-toc-toggle {
  display: none;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--r-md); padding: 10px 14px;
  color: var(--fg-hi); font: inherit; font-size: 13px;
  cursor: pointer; width: 100%; text-align: left; margin-bottom: 12px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.learn-toc-toggle:hover { border-color: var(--green); }
.learn-sidebar-close { display: none; }
.learn-sidebar-backdrop { display: none; }

/* ===== Mobile breakpoint: swap nav-tabs ↔ hamburger, sidebar ↔ drawer ===== */
@media (max-width: 600px) {
  /* Hide desktop tab strip; reveal hamburger */
  .nav-tabs { display: none !important; }
  .nav-burger-wrap { display: block; margin-left: auto; }
  /* nav-right loses its auto-left margin since burger now takes that role */
  .nav-right { margin-left: 8px; }

  /* Learn mode: hamburger-style sidebar */
  .learn-toc-toggle { display: block; }

  /* The sidebar becomes a slide-in drawer from the left */
  .learn-sidebar {
    position: fixed !important;
    top: 0; left: 0; bottom: 0;
    width: 80vw; max-width: 320px;
    z-index: 70;
    background: var(--surface);
    border: 0; border-right: 1px solid var(--border-hi);
    border-radius: 0;
    transform: translateX(-100%);
    transition: transform 200ms ease-out;
    padding: 52px 12px 20px;  /* room for close button at top */
    overflow-y: auto;
    max-height: none !important;
  }
  .learn-sidebar.open { transform: translateX(0); }

  .learn-sidebar-close {
    display: block;
    position: absolute; top: 8px; right: 8px;
    background: transparent; border: 1px solid var(--border);
    border-radius: var(--r); width: 32px; height: 32px;
    color: var(--fg-hi); font-size: 20px; font-family: var(--font);
    cursor: pointer; line-height: 1;
  }
  .learn-sidebar-close:hover { border-color: var(--green); }

  .learn-sidebar-backdrop {
    display: block;
    position: fixed; inset: 0; z-index: 60;
    background: oklch(0 0 0 / 0.55);
    animation: fade-in 140ms ease-out;
  }
}

/* Width-not-viewport trigger for compact mode. When the topbar children
 * don't fit comfortably (long username + deep career path), force the
 * mobile layout regardless of viewport width. Added by JS measurement
 * in TopBar. */
.topbar.topbar-compact .nav-tabs { display: none !important; }
.topbar.topbar-compact .nav-burger-wrap { display: block; margin-left: auto; }
.topbar.topbar-compact .nav-right { margin-left: 8px; }
/* When compact-mode is triggered by overflow (not by viewport width), apply
 * the same brand-shrinking rules as mobile: hide @cyberstudy, allow path
 * to ellipsize. Keeps the prompt readable on mid-width laptops with long
 * career URLs. */
.topbar.topbar-compact .brand .b-sep,
.topbar.topbar-compact .brand .b-host { display: none; }
.topbar.topbar-compact .brand .b-path {
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
  flex: 1 1 auto;
}
.topbar.topbar-compact .brand {
  overflow: hidden;
  flex-shrink: 1;
  min-width: 0;
}
.topbar.topbar-compact .brand-wrap {
  flex: 1 1 0;
  min-width: 0;
}
/* ═══════════════════════════════════════════════════════════════════════
 * Account settings + delete flow + flash banners
 * Append to styles.css. Uses only existing :root tokens.
 * ═══════════════════════════════════════════════════════════════════════ */

/* ───── Flash banner (post-deletion, OAuth errors) ───── */
.flash-banner {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 22px; font-family: var(--font); font-size: 13px;
  border-bottom: 1px solid var(--border);
}
.flash-banner span { flex: 1; }
.flash-ok  { background: var(--green-bg); color: var(--green); border-bottom-color: var(--green); }
.flash-err { background: var(--red-bg);   color: var(--red);   border-bottom-color: var(--red); }
.flash-close {
  background: transparent; border: 0; color: inherit; cursor: pointer;
  font-size: 18px; line-height: 1; padding: 0 4px; opacity: 0.7;
}
.flash-close:hover { opacity: 1; }

/* ───── Account page ───── */
.account-page {
  display: flex; flex-direction: column; align-items: center;
  padding: 40px 20px 80px; gap: 24px;
}
.account-card,
.danger-zone {
  background: var(--surface); border: 1px solid var(--border-hi);
  border-radius: var(--r-md); padding: 24px 28px;
  width: 100%; max-width: 520px; font-family: var(--font);
}
.account-title {
  color: var(--fg-hi); font-family: var(--font); font-size: 20px;
  margin: 0 0 18px; letter-spacing: 0.02em;
}
.account-fields {
  display: grid; grid-template-columns: 140px 1fr; gap: 8px 16px;
  margin: 0;
}
.account-fields dt { color: var(--fg-dim); font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; align-self: center; }
.account-fields dd { margin: 0; color: var(--fg-hi); font-size: 13px; align-self: center; word-break: break-word; }

/* ───── Danger zone (delete account) ───── */
.danger-zone { border-color: var(--red); }
.danger-zone-done { border-color: var(--green); }
.danger-title {
  color: var(--red); font-family: var(--font); font-size: 16px;
  margin: 0 0 10px; letter-spacing: 0.02em;
}
.danger-zone-done .danger-title { color: var(--green); }
.danger-desc {
  color: var(--fg-dim); font-size: 13px; line-height: 1.5;
  margin: 0 0 16px;
}
.danger-form { display: flex; flex-direction: column; gap: 14px; }
.danger-form-actions {
  display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap;
}

/* Danger button variant. Pairs with the existing .btn from styles.css. */
.btn-danger {
  background: var(--red-bg); border-color: var(--red); color: var(--red);
}
.btn-danger:hover:not(:disabled) {
  background: var(--red); color: var(--bg);
}
.btn-danger:disabled {
  opacity: 0.45; cursor: not-allowed;
}

/* ───── Mobile pass ───── */
@media (max-width: 600px) {
  .account-page { padding: 20px 12px 60px; }
  .account-card, .danger-zone { padding: 18px 16px; }
  .account-fields { grid-template-columns: 1fr; gap: 4px 0; }
  .account-fields dt { margin-top: 8px; }
  .danger-form-actions { flex-direction: column-reverse; }
  .danger-form-actions .btn { width: 100%; }
  .flash-banner { padding: 9px 14px; font-size: 12px; }
}

/* ===== Learn-mode Finish Page ===== */
.finish-page { padding: 24px 28px; max-width: 920px; margin: 0 auto; }

.finish-banner {
  border: 1px solid var(--accent-cyan);
  border-radius: 4px;
  padding: 18px 22px;
  margin-bottom: 24px;
  background: rgba(0, 188, 212, 0.06);
}
.finish-banner-tag {
  font-size: 11px;
  color: var(--fg-mute);
  margin-bottom: 8px;
  letter-spacing: 0.05em;
}
.finish-banner-title {
  font-size: 22px;
  font-weight: 600;
  color: var(--accent-cyan);
  letter-spacing: 0.02em;
}

.finish-summary {
  font-size: 15px;
  line-height: 1.55;
  margin-bottom: 28px;
  color: var(--fg);
}
.finish-summary strong { color: var(--accent-cyan); font-weight: 600; }

.finish-section { margin-bottom: 28px; }
.finish-section-label {
  font-size: 11px;
  color: var(--fg-mute);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-bottom: 10px;
}

.finish-domains { display: flex; flex-direction: column; gap: 4px; }
.finish-domain-row {
  display: grid;
  grid-template-columns: 48px 1fr auto;
  align-items: center;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 3px;
  font-size: 14px;
}
.finish-domain-num { font-weight: 600; font-variant-numeric: tabular-nums; }
.finish-domain-name { color: var(--fg); }
.finish-domain-count { color: var(--fg-mute); font-size: 13px; font-variant-numeric: tabular-nums; }

.finish-learned { list-style: none; padding: 0; margin: 0; }
.finish-learned li {
  position: relative;
  padding: 6px 0 6px 22px;
  font-size: 14px;
  line-height: 1.5;
}
.finish-learned li::before {
  content: "✓";
  position: absolute;
  left: 0;
  top: 6px;
  color: var(--accent-green, #4caf50);
  font-weight: bold;
}

.finish-actions {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 10px;
}
.finish-btn {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 14px 16px;
  background: var(--bg-card, transparent);
  border: 1px solid var(--border);
  border-radius: 3px;
  color: var(--fg);
  text-decoration: none;
  cursor: pointer;
  font: inherit;
  text-align: left;
  transition: border-color 0.15s, background 0.15s;
}
.finish-btn:hover {
  border-color: var(--accent-cyan);
  background: rgba(0, 188, 212, 0.04);
}
.finish-btn-primary {
  border-color: var(--accent-cyan);
  background: rgba(0, 188, 212, 0.06);
}
.finish-btn-icon {
  font-size: 22px;
  width: 28px;
  text-align: center;
  flex-shrink: 0;
}
.finish-btn-text { flex: 1; min-width: 0; }
.finish-btn-title { font-size: 14px; font-weight: 600; margin-bottom: 2px; }
.finish-btn-desc { font-size: 12px; color: var(--fg-mute); line-height: 1.4; }

.finish-exam-meta {
  border: 1px solid var(--border);
  border-radius: 3px;
  padding: 14px 18px;
  background: var(--bg-card, transparent);
}
.finish-meta-row {
  display: grid;
  grid-template-columns: 160px 1fr;
  gap: 16px;
  padding: 4px 0;
  font-size: 14px;
  line-height: 1.55;
}
.finish-meta-key {
  color: var(--fg-mute);
  font-size: 13px;
}
.finish-meta-val { color: var(--fg); }

.finish-blurb {
  margin-top: 14px;
  font-size: 14px;
  line-height: 1.55;
  color: var(--fg-dim);
}
.finish-tip {
  margin-top: 12px;
  padding: 10px 14px;
  background: rgba(255, 193, 7, 0.06);
  border-left: 3px solid var(--accent-amber, #ffc107);
  font-size: 13px;
  line-height: 1.5;
  color: var(--fg-dim);
}
.finish-tip strong { color: var(--accent-amber, #ffc107); }

.finish-footer { margin-top: 16px; text-align: center; }

/* Sidebar entry styling for the finish page */
.ls-dom-finish { margin-top: 14px; padding-top: 12px; border-top: 1px dashed var(--border); }
.ls-topic-finish {
  font-style: italic;
  opacity: 0.85;
}
.ls-topic-finish.unlocked {
  opacity: 1;
  color: var(--accent-cyan) !important;
  font-style: normal;
  font-weight: 500;
}
.ls-topic-finish.locked { color: var(--fg-mute); }

@media (max-width: 600px) {
  .finish-page { padding: 16px 18px; }
  .finish-meta-row { grid-template-columns: 1fr; gap: 2px; }
  .finish-meta-key { font-size: 12px; }
  .finish-domain-row { grid-template-columns: 40px 1fr auto; padding: 8px 10px; font-size: 13px; }
}

/* ===== Report-a-question button (small inline button in practice + final exam review) ===== */
.fb-report-row {
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px dashed var(--border);
  display: flex;
  justify-content: flex-end;
}
.fe-review-report-row {
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px dashed var(--border);
  display: flex;
  justify-content: flex-end;
}
.fb-report-btn {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: 3px;
  padding: 5px 10px;
  font-size: 11px;
  color: var(--fg-mute);
  cursor: pointer;
  font-family: inherit;
  transition: color 0.15s, border-color 0.15s;
}
.fb-report-btn:hover {
  color: var(--accent-amber, #ffc107);
  border-color: var(--accent-amber, #ffc107);
}

/* ===== Report-question modal ===== */
.report-modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  padding: 16px;
}
.report-modal {
  background: var(--bg, #0d1418);
  border: 1px solid var(--accent-cyan);
  border-radius: 4px;
  width: 100%;
  max-width: 560px;
  max-height: 90vh;
  overflow: auto;
  font-family: inherit;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
}
.report-modal-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
}
.report-modal-title {
  font-size: 15px;
  font-weight: 600;
  color: var(--accent-cyan);
}
.report-modal-close {
  background: none;
  border: none;
  color: var(--fg-mute);
  cursor: pointer;
  font-size: 22px;
  line-height: 1;
  padding: 0 4px;
}
.report-modal-close:hover { color: var(--fg); }

.report-modal-body { padding: 16px 18px 18px; }

.report-modal-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  padding: 8px 12px;
  background: rgba(0, 188, 212, 0.04);
  border: 1px solid var(--border);
  border-radius: 3px;
  margin-bottom: 14px;
  font-size: 12px;
}
.report-modal-meta code {
  background: var(--bg-card, rgba(255, 255, 255, 0.04));
  padding: 1px 6px;
  border-radius: 2px;
  font-size: 11px;
  color: var(--fg);
}
.report-meta-key { color: var(--fg-mute); }

.report-modal-label {
  display: block;
  font-size: 11px;
  color: var(--fg-mute);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin: 12px 0 6px;
}
.report-modal-select,
.report-modal-textarea {
  width: 100%;
  background: var(--bg-card, rgba(255, 255, 255, 0.02));
  border: 1px solid var(--border);
  border-radius: 3px;
  color: var(--fg);
  font-family: inherit;
  font-size: 13px;
  padding: 8px 10px;
  box-sizing: border-box;
}
.report-modal-select:focus,
.report-modal-textarea:focus {
  outline: none;
  border-color: var(--accent-cyan);
}
.report-modal-textarea { resize: vertical; min-height: 100px; line-height: 1.45; }

.report-modal-status {
  margin: 12px 0 0;
  padding: 8px 12px;
  border-radius: 3px;
  font-size: 13px;
}
.report-modal-status.ok {
  background: rgba(76, 175, 80, 0.1);
  color: var(--accent-green, #4caf50);
  border: 1px solid rgba(76, 175, 80, 0.3);
}
.report-modal-status.error {
  background: rgba(244, 67, 54, 0.1);
  color: var(--accent-red, #f44336);
  border: 1px solid rgba(244, 67, 54, 0.3);
}

.report-modal-actions {
  display: flex;
  gap: 8px;
  justify-content: flex-end;
  margin-top: 16px;
}

@media (max-width: 600px) {
  .report-modal { max-width: 95vw; }
  .report-modal-head { padding: 12px 14px; }
  .report-modal-body { padding: 12px 14px 14px; }
  .report-modal-meta { gap: 8px; }
}

/* ===== Home page: sign-in banner for logged-out users ===== */
.home-signin-banner {
  display: block;
  width: 100%;
  background: var(--green-bg);
  border: 2px solid var(--green);
  border-radius: var(--r-md);
  padding: 18px 22px;
  margin: 18px 0 22px;
  cursor: pointer;
  font: inherit;
  text-align: left;
  color: inherit;
  transition: background 120ms, transform 120ms;
}
.home-signin-banner:hover { background: var(--surface); transform: translateY(-1px); }
.home-signin-banner-row {
  display: flex;
  align-items: center;
  gap: 18px;
  flex-wrap: wrap;
}
.home-signin-banner-prompt {
  font-size: 18px;
  color: var(--green);
  font-weight: 700;
  letter-spacing: 0.02em;
  flex-shrink: 0;
}
.home-signin-banner-prompt .ps1 { color: var(--green); }
.home-signin-banner-prompt .cmd { color: var(--fg-hi); }
.home-signin-banner-text {
  color: var(--fg-dim);
  font-size: 14px;
  flex: 1 1 auto;
  min-width: 0;
}
.home-signin-banner-cta {
  color: var(--green);
  font-weight: 600;
  font-size: 14px;
  white-space: nowrap;
  flex-shrink: 0;
}

/* "Start Learning" banner across the top of Quick Actions → Learn tab.
 * Mirrors the home sign-in banner's terminal-prompt look. */
.qa-start-banner {
  display: flex;
  align-items: center;
  gap: 18px;
  flex-wrap: wrap;
  width: 100%;
  background: var(--green-bg);
  border: 2px solid var(--green);
  border-radius: var(--r-md);
  padding: 16px 22px;
  margin-bottom: 8px;
  cursor: pointer;
  font: inherit;
  text-align: left;
  color: inherit;
  transition: background 120ms, transform 120ms;
}
.qa-start-banner:hover { background: var(--surface); transform: translateY(-1px); }
.qa-start-banner-prompt { font-size: 18px; font-weight: 700; letter-spacing: 0.02em; flex-shrink: 0; }
.qa-start-banner-prompt .ps1 { color: var(--green); }
.qa-start-banner-prompt .cmd { color: var(--fg-hi); }
.qa-start-banner-text { color: var(--fg-dim); font-size: 14px; flex: 1 1 auto; min-width: 0; }
.qa-start-banner-cta { color: var(--green); font-weight: 600; font-size: 14px; white-space: nowrap; flex-shrink: 0; }

/* Active-cert badge in the top bar (nav-right). Click to switch track.
 * Fulfils the chooser copy "switch anytime from the badge in the top bar". */
.cert-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  background: var(--green-bg);
  border: 1px solid var(--green);
  border-radius: var(--r-md);
  color: var(--green);
  font: inherit;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.02em;
  cursor: pointer;
  white-space: nowrap;
  max-width: 180px;
  flex-shrink: 0;
  transition: background 120ms;
}
.cert-badge:hover { background: var(--surface); }
.cert-badge-label { overflow: hidden; text-overflow: ellipsis; }
.cert-badge-caret { opacity: 0.7; font-size: 10px; }

/* Cert quick-switch dropdown. Reuses the .user-menu panel styling (and the
   `.sidenav .user-menu` upward-opening rule, since the badge sits above the
   profile button in the sidenav). The wrapper is full-width so the badge keeps
   filling the panel like .sidenav-cert; the panel matches that width and caps
   its height so the full cert list can scroll instead of overflowing the
   viewport. The current cert renders as a non-actionable ✓ row. */
.cert-menu-wrap { display: block; width: 100%; }
.cert-menu { width: 100%; min-width: 0; max-height: 60vh; overflow-y: auto; box-sizing: border-box; }
.cert-menu .user-menu-item.active { color: var(--cyan); font-weight: 600; cursor: default; }
.cert-menu .user-menu-item.active:hover { background: none; color: var(--cyan); }

/* "Coming soon" section label spanning the cert grid, separating live certs
 * from under-development ones. */
.cs-coming-soon-label {
  grid-column: 1 / -1;
  margin: 10px 0 2px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--fg-dim);
  border-top: 1px solid var(--border);
  padding-top: 14px;
}

/* ===== Theme picker (home page) ===== */
.theme-picker {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  margin: 8px 0 24px;
  align-items: center;
}
.theme-swatch {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  border: 2px solid var(--border);
  border-radius: var(--r-md);
  background: var(--surface);
  cursor: pointer;
  font: inherit;
  font-size: 13px;
  color: var(--fg-dim);
  transition: all 120ms;
}
.theme-swatch:hover { border-color: var(--border-hi); color: var(--fg-hi); }
.theme-swatch.active { border-color: var(--green); color: var(--fg-hi); background: var(--green-bg); }
.theme-swatch-dot {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  border: 1px solid var(--border-hi);
  flex-shrink: 0;
}
.theme-swatch-dot.mono {
  background: linear-gradient(135deg, #ffffff 0%, #ffffff 50%, #1a1a1a 50%, #1a1a1a 100%);
}
