/* ═══════════════════════════════════════════════════════════════════════════
 * reDojo design system — tokens.css (v1, spike-derived brand).
 *
 * THE GOLDEN SOURCE + what the app ships: embedded and served at /static/tokens.css,
 * linked from every page (no build step — the CSS custom property IS the token, ADR-0017).
 * SUPERSEDES the redojo-0052 brand layer (paper/blue/clay/system fonts). This is the look
 * ported from the spike-v1 prototypes (the visual source of truth): warm STONE greys, an
 * AMBER accent, Space Grotesk (display) over Manrope (body), rounded cards, the loop-D mark.
 *
 * kata-0026: templates + rule bodies reference ONLY var(--…) — every raw #hex lives here in
 * :root as a token DEFINITION. (Font woff2 are served from /static/fonts/; the url()s are
 * RELATIVE to this file so they resolve both served (/static/fonts/…) and standalone.)
 * ═══════════════════════════════════════════════════════════════════════════ */

@font-face { font-family:"Manrope"; font-style:normal; font-weight:400; font-display:swap; src:url("fonts/manrope-latin-400-normal.woff2") format("woff2"); }
@font-face { font-family:"Manrope"; font-style:normal; font-weight:500; font-display:swap; src:url("fonts/manrope-latin-500-normal.woff2") format("woff2"); }
@font-face { font-family:"Manrope"; font-style:normal; font-weight:600; font-display:swap; src:url("fonts/manrope-latin-600-normal.woff2") format("woff2"); }
@font-face { font-family:"Manrope"; font-style:normal; font-weight:700; font-display:swap; src:url("fonts/manrope-latin-700-normal.woff2") format("woff2"); }
@font-face { font-family:"Manrope"; font-style:normal; font-weight:800; font-display:swap; src:url("fonts/manrope-latin-800-normal.woff2") format("woff2"); }
@font-face { font-family:"Space Grotesk"; font-style:normal; font-weight:400; font-display:swap; src:url("fonts/space-grotesk-latin-400-normal.woff2") format("woff2"); }
@font-face { font-family:"Space Grotesk"; font-style:normal; font-weight:500; font-display:swap; src:url("fonts/space-grotesk-latin-500-normal.woff2") format("woff2"); }
@font-face { font-family:"Space Grotesk"; font-style:normal; font-weight:600; font-display:swap; src:url("fonts/space-grotesk-latin-600-normal.woff2") format("woff2"); }
@font-face { font-family:"Space Grotesk"; font-style:normal; font-weight:700; font-display:swap; src:url("fonts/space-grotesk-latin-700-normal.woff2") format("woff2"); }

:root {
  /* ── raw palette (token DEFINITIONS — the ONLY place #hex lives) ────────── */
  /* stone — warm neutral foundation */
  --stone-50:#fafaf9;  --stone-100:#f5f5f4; --stone-200:#e7e5e4; --stone-300:#d6d3d1;
  --stone-400:#a8a29e; --stone-500:#78716c; --stone-600:#57534e; --stone-700:#44403c;
  --stone-800:#292524; --stone-900:#1c1917;
  /* amber — the brand accent */
  --amber-400:#fbbf24; --amber-500:#f59e0b; --amber-600:#d97706; --amber-50:#fffbeb;
  /* emerald — secondary / positive */
  --emerald-500:#10b981; --emerald-600:#059669; --emerald-50:#ecfdf5; --emerald-950:#04291b;
  /* danger */
  --red-600:#dc2626; --red-50:#fef2f2;
  --white:#ffffff;

  /* per-subject palette (calm, distinct — applied as accent + tint + dot + chip).
   * a11y: colour is NEVER the sole signal; always paired with the subject NAME. */
  --s-indigo-accent:#818cf8;  --s-indigo-dot:#6366f1;  --s-indigo-tint:#eef2ff;  --s-indigo-ic:#4f46e5;
  --s-rose-accent:#fb7185;    --s-rose-dot:#f43f5e;    --s-rose-tint:#fff1f2;    --s-rose-ic:#e11d48;
  --s-emerald-accent:#34d399; --s-emerald-dot:#10b981; --s-emerald-tint:#ecfdf5; --s-emerald-ic:#059669;
  --s-sky-accent:#38bdf8;     --s-sky-dot:#0ea5e9;     --s-sky-tint:#f0f9ff;     --s-sky-ic:#0284c7;
  --s-amber-accent:#fbbf24;   --s-amber-dot:#f59e0b;   --s-amber-tint:#fffbeb;   --s-amber-ic:#d97706;
  --s-violet-accent:#a78bfa;  --s-violet-dot:#8b5cf6;  --s-violet-tint:#f5f3ff;  --s-violet-ic:#7c3aed;

  /* ── semantic aliases (what templates/components reference) ── */
  --color-bg:var(--stone-100); --color-surface:var(--white);
  --color-text:var(--stone-900); --color-text-muted:var(--stone-500); --color-text-faint:var(--stone-400);
  --color-border:var(--stone-200); --color-accent:var(--amber-400); --color-ink:var(--stone-900);

  /* ── type ── */
  --font-sans:"Manrope", ui-sans-serif, system-ui, sans-serif;
  --font-display:"Space Grotesk", ui-sans-serif, system-ui, sans-serif;

  /* ── shape & elevation ── */
  --radius-lg:.5rem; --radius-xl:.75rem; --radius-2xl:1rem; --radius-3xl:1.5rem; --radius-pill:9999px;
  --shadow-sm:0 1px 2px 0 rgb(28 25 23 / .06);
  --shadow-md:0 4px 6px -2px rgb(28 25 23 / .07), 0 2px 4px -2px rgb(28 25 23 / .06);
  --shadow-lg:0 12px 24px -8px rgb(28 25 23 / .16), 0 0 0 1px rgb(28 25 23 / .04);
}

/* ── base ─────────────────────────────────────────────────────────────────── */
* { box-sizing:border-box; }
body {
  margin:0; background:var(--color-bg); color:var(--color-text);
  font:400 1rem/1.5 var(--font-sans); -webkit-font-smoothing:antialiased;
}
h1,h2,h3 { font-family:var(--font-display); letter-spacing:-.02em; margin:0; }
a { color:inherit; }
button { font-family:var(--font-sans); }
.muted { color:var(--color-text-muted); }
:where(button,a,input,[tabindex]):focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }

/* ── app shell (redojo-0084) ──
 * ONE shared shell (components.AppShell) frames every authenticated page. Header AND content share
 * ONE canonical width (1100) — locked together so the header can't jump AND content never pokes
 * outside the chrome (the Designer's UX call: content-≤-header, one width for the whole app).
 * The .shell-header band is constant; .shell-content matches it; a reserved-but-empty .shell-footer
 * region lets a real footer later land in one place. Replaces the old per-page .wrap, whose differing
 * max-widths (home 1100 / catalog 1080 / schedule 1240) caused the header jump.
 * box-sizing:border-box is global (top of file), so max-width includes the 24px inline padding —
 * the constant band width matches the old .wrap. */
.app-shell { min-height:100svh; display:flex; flex-direction:column; }
.shell-inner { width:100%; margin-inline:auto; padding-inline:24px; }
.shell-header { max-width:1100px; padding-top:28px; }
.shell-content { max-width:1100px; padding-bottom:40px; flex:1; }
.shell-content-center { display:flex; flex-direction:column; } /* Home: vertically centre the sparse landing */
.shell-footer { max-width:1100px; }                            /* reserved region — empty in this slice */
.site-header { display:flex; align-items:center; justify-content:space-between; margin-bottom:28px; }
html { scrollbar-gutter:stable; } /* redojo-0084 AC9 — scrollbar appear/disappear never shifts centred content */

/* brand lockup — loop-D mark (amber) on a dark tile + the wordmark (+ tagline). */
.brand { display:inline-flex; align-items:center; gap:12px; text-decoration:none; }
.brand-mark { display:grid; place-items:center; width:40px; height:40px; flex:none;
  border-radius:var(--radius-xl); background:var(--stone-900); color:var(--amber-400); }
.brand-mark svg { width:18px; height:auto; display:block; fill:currentColor; }
.brand-mark svg path[fill="none"] { stroke:currentColor; }
.brand-name { display:block; font-family:var(--font-display); font-weight:700; font-size:19px; line-height:1.1; letter-spacing:-.02em; color:var(--color-text); }
.brand-tag { display:block; font-size:11px; color:var(--color-text-muted); margin-top:1px; }

/* top nav */
.nav { display:flex; align-items:center; gap:4px; }
.nav-link { padding:8px 12px; border-radius:var(--radius-lg); font-size:14px; font-weight:600;
  color:var(--color-text-muted); text-decoration:none; transition:background .15s,color .15s; }
.nav-link:hover { background:rgb(255 255 255 / .7); }
.nav-link-active { background:var(--white); color:var(--color-text); box-shadow:var(--shadow-sm); }
.nav-link-active:hover { background:var(--white); }
.avatar { display:grid; place-items:center; width:36px; height:36px; border-radius:var(--radius-pill);
  background:var(--emerald-600); color:var(--white); font-weight:700; font-size:14px; }

/* ── surfaces ── */
.card { background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-sm); padding:24px; }

/* ── buttons ── */
.btn { display:inline-flex; align-items:center; justify-content:center; gap:8px; border:0;
  font-family:var(--font-sans); cursor:pointer; text-decoration:none; transition:background .15s,opacity .15s; }
.btn-primary { border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:10px 16px; font-size:14px; font-weight:700; }
.btn-primary:hover { background:var(--stone-800); }
.btn-primary:disabled { opacity:.5; cursor:default; }
.btn-ghost { border-radius:var(--radius-xl); background:transparent; color:var(--stone-600); padding:8px 12px; font-size:14px; font-weight:600; }
.btn-ghost:hover { background:var(--stone-100); }
.btn-amber { border-radius:var(--radius-xl); background:var(--amber-400); color:var(--stone-900); padding:10px 16px; font-size:14px; font-weight:700; }
.btn-amber:hover { background:var(--amber-500); }
.btn-danger { border-radius:var(--radius-xl); background:transparent; color:var(--red-600); padding:8px 12px; font-size:14px; font-weight:600; }
.btn-danger:hover { background:var(--red-50); }
.btn-sm { padding:7px 12px; font-size:13px; }
.btn-block { width:100%; }

/* ── badge ── */
.badge { display:inline-block; border-radius:var(--radius-pill); padding:2px 9px; font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.04em; }
.badge-stone { background:var(--stone-100); color:var(--stone-600); }
.badge-amber { background:var(--amber-50); color:var(--amber-600); }
.badge-emerald { background:var(--emerald-50); color:var(--emerald-600); }

/* ── progress bar ── */
.bar { height:8px; background:var(--stone-200); border-radius:var(--radius-pill); overflow:hidden; }
.bar > i { display:block; height:100%; border-radius:var(--radius-pill); background:var(--color-ink); }

/* ── form fields ── */
.field { width:100%; border-radius:var(--radius-xl); padding:10px 14px; font-size:14px; font-family:var(--font-sans);
  color:var(--color-text); background:var(--white); border:0; outline:none; box-shadow:inset 0 0 0 1px var(--stone-300); transition:box-shadow .15s; }
.field:focus { box-shadow:inset 0 0 0 2px var(--stone-900); }
.field-label { display:block; margin-bottom:6px; font-size:12px; font-weight:800; text-transform:uppercase; letter-spacing:.04em; color:var(--color-text-faint); }

/* ── per-subject colour (consumes the :root palette via local vars) ── */
.s-indigo  { --accent:var(--s-indigo-accent);  --dot:var(--s-indigo-dot);  --tint:var(--s-indigo-tint);  --ic-text:var(--s-indigo-ic); }
.s-rose    { --accent:var(--s-rose-accent);    --dot:var(--s-rose-dot);    --tint:var(--s-rose-tint);    --ic-text:var(--s-rose-ic); }
.s-emerald { --accent:var(--s-emerald-accent); --dot:var(--s-emerald-dot); --tint:var(--s-emerald-tint); --ic-text:var(--s-emerald-ic); }
.s-sky     { --accent:var(--s-sky-accent);     --dot:var(--s-sky-dot);     --tint:var(--s-sky-tint);     --ic-text:var(--s-sky-ic); }
.s-amber   { --accent:var(--s-amber-accent);   --dot:var(--s-amber-dot);   --tint:var(--s-amber-tint);   --ic-text:var(--s-amber-ic); }
.s-violet  { --accent:var(--s-violet-accent);  --dot:var(--s-violet-dot);  --tint:var(--s-violet-tint);  --ic-text:var(--s-violet-ic); }
.dot { width:9px; height:9px; border-radius:var(--radius-pill); background:var(--dot); flex:none; }

/* lists & rows */
.list { list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px; }
.plan-row { display:flex; align-items:center; gap:14px; padding:14px 16px; border-radius:var(--radius-2xl); background:var(--tint); border-left:3px solid var(--accent); }
.plan-row .topic { font-weight:700; font-size:15px; }
.stat { font-family:var(--font-display); font-weight:700; font-size:26px; line-height:1.1; margin:4px 0 0; }
.subj-row { display:flex; align-items:center; gap:12px; padding:14px 0; }
.subj-row + .subj-row { border-top:1px solid var(--stone-100); }
.icon-chip { display:grid; place-items:center; width:40px; height:40px; flex:none; border-radius:var(--radius-xl); background:var(--tint); color:var(--ic-text); font-weight:800; font-family:var(--font-display); font-size:16px; }

/* ── full-screen centred shells (landing + auth) ── */
.screen { min-height:100svh; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:28px; padding:48px 24px; }
.brand-hero { display:flex; flex-direction:column; align-items:center; gap:14px; text-align:center; }
.brand-hero .brand-mark { width:64px; height:64px; border-radius:1.25rem; }
.brand-hero .brand-mark svg { width:30px; }
.brand-hero .wordmark { font-family:var(--font-display); font-weight:700; font-size:32px; letter-spacing:-.03em; line-height:1; margin:0; color:var(--color-text); }
.brand-hero .tagline { font-size:14px; color:var(--color-text-muted); margin:0; }
.lede-lg { font-size:18px; color:var(--color-text-muted); margin:0; max-width:26rem; text-align:center; }

/* auth card */
.auth-card { width:100%; max-width:25rem; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-lg); padding:32px; display:flex; flex-direction:column; gap:20px; text-align:center; }
.auth-card h1 { font-size:22px; }
.auth-card .lede { color:var(--color-text-muted); margin:0; }
.auth-card .foot { color:var(--color-text-faint); font-size:13px; margin:0; }
.notice { display:flex; gap:10px; align-items:flex-start; text-align:left; padding:14px 16px; border-radius:var(--radius-xl); background:var(--amber-50); color:var(--amber-600); font-size:13px; }
.notice strong { color:var(--color-text); font-weight:700; }

/* ── utilities used by the screens ── */
.row { display:flex; align-items:center; gap:12px; }
.between { justify-content:space-between; }
.grid { display:grid; gap:20px; }
.eyebrow { font:700 12px/1.3 var(--font-sans); letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:0; }
.lucide { width:1.1em; height:1.1em; stroke-width:1.75; display:inline-block; vertical-align:-.15em; flex-shrink:0; }

/* calm "breathing" for the under-construction landing mark */
@keyframes redojo-breathe { 0%,100%{transform:scale(1)} 50%{transform:scale(1.04)} }
.breathe { animation:redojo-breathe 6s ease-in-out infinite; transform-origin:center; }
@media (prefers-reduced-motion:reduce) { .breathe { animation:none; } }

/* ═══════════════════════════════════════════════════════════════════════════
 * SCHEDULE (redojo-0061) — component classes for the Weekly-rhythm screen.
 *
 * APPEND-ONLY. Paste this block at the END of internal/web/static/tokens.css.
 * It edits NO existing rule and adds NO new token — every value resolves to an
 * existing redojo-0058 token (stone · amber · the --s-indigo-* subject accent ·
 * existing radii/shadows/fonts). kata-0026 stays green (no raw #hex here).
 *
 * The Architect pins the final class names / promotes the reusable primitives:
 *   • .stepper/.step/.count and .stub* are GENERAL primitives (the −/+ control and
 *     the redojo-0042 "not built yet" mask) — likely promoted out of this section.
 *   • The day stepper borrows the indigo SUBJECT accent (--s-indigo-*) as its colour;
 *     swap for a dedicated semantic alias if preferred.
 * Excluded from the ship: the preview-only .reviewbar/.seg state switcher and the
 * .tip* styles (those back an out-of-scope onboarding-tip placeholder), so they are
 * NOT part of this block.
 * ═══════════════════════════════════════════════════════════════════════════ */

.ic { width:1.05em; height:1.05em; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; display:inline-block; vertical-align:-.18em; }

/* empty-state prompt (first visit — AC1) */
.prompt { display:flex; gap:14px; align-items:flex-start; background:var(--amber-50);
  border-radius:var(--radius-3xl); padding:18px 20px; box-shadow:inset 0 0 0 1px var(--amber-400); }
.prompt-ico { display:grid; place-items:center; width:36px; height:36px; flex:none; border-radius:var(--radius-xl); background:var(--amber-400); color:var(--stone-900); }
.prompt h2 { font-family:var(--font-display); font-weight:700; font-size:16px; margin:0 0 4px; color:var(--stone-900); }
.prompt p { font-size:13px; line-height:1.5; color:var(--amber-600); margin:0; }

/* summary bar: live totals (left) + account-wide session length (right) */
.summary { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:20px 32px; }
.totals { display:flex; flex-wrap:wrap; align-items:center; gap:28px; }
.total { display:flex; align-items:baseline; gap:9px; }
.total b { font-family:var(--font-display); font-weight:700; font-size:30px; line-height:1; color:var(--color-text); }
.total span { font-size:12px; line-height:1.2; color:var(--color-text-muted); }

.sesslen { display:flex; align-items:center; gap:14px; padding:12px 14px 12px 18px; border-radius:var(--radius-2xl); background:var(--stone-100); }
.sesslen-meta { display:flex; flex-direction:column; }
.sesslen-meta .k { font-size:11px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text-faint); }
.sesslen-meta .h { font-size:11px; color:var(--color-text-muted); margin-top:1px; }
.sesslen-stepper { display:flex; align-items:center; gap:10px; }
.sesslen-val { font-family:var(--font-display); font-weight:700; font-size:18px; line-height:1; width:62px; text-align:center; }
.sesslen-val small { font-size:12px; font-weight:600; color:var(--color-text-muted); }

/* the −/+ stepper (GENERAL primitive) */
.stepper { display:flex; align-items:center; justify-content:center; gap:10px; }
.step { display:grid; place-items:center; width:28px; height:28px; border-radius:var(--radius-lg); background:var(--white);
  box-shadow:inset 0 0 0 1px var(--stone-200); color:var(--stone-600); cursor:pointer; flex:none; }
.step:hover { background:var(--stone-50); }
.step:disabled { color:var(--stone-300); cursor:not-allowed; }
.count { font-family:var(--font-display); font-weight:700; font-size:24px; line-height:1; width:30px; color:var(--s-indigo-ic); }

/* week grid + day card — 2 ROWS (4+3), not a 7-across calendar, so each card is wide enough for
 * full Subject-package names (redojo-assign-subject-per-session, F7). */
.week { display:grid; gap:12px; grid-template-columns:repeat(4,minmax(0,1fr)); align-items:start; }
@media (max-width:900px){ .week { grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media (max-width:560px){ .week { grid-template-columns:1fr; } }

.day { display:flex; flex-direction:column; background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:14px; }
.day.off { background:var(--stone-100); box-shadow:none; }
.day h3 { font-family:var(--font-display); font-weight:700; font-size:14px; margin:0 0 10px; }
.day.off h3 { color:var(--color-text-faint); }

.sess { border-radius:var(--radius-xl); padding:12px 8px; text-align:center; background:var(--s-indigo-tint); }
.day.off .sess { background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-200); }
.day.off .count { color:var(--stone-300); }
.dots { display:flex; align-items:center; justify-content:center; gap:4px; margin-top:9px; min-height:7px; }
.dots i { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--s-indigo-dot); }
.sesslabel { font-size:12px; font-weight:700; color:var(--s-indigo-ic); margin-top:7px; }
.offlabel { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--color-text-faint); margin-top:9px; }

/* advisory start cue */
.cue { margin-top:10px; }
.cue-toggle { width:100%; display:inline-flex; align-items:center; justify-content:center; gap:6px; font-size:12px;
  font-weight:700; color:var(--stone-500); background:transparent; border:0; border-radius:var(--radius-lg); padding:6px; cursor:pointer; }
.cue-toggle:hover { color:var(--stone-800); }
.cue-toggle.add { color:var(--color-text-faint); font-weight:600; box-shadow:inset 0 0 0 1px var(--stone-200); border-style:dashed; }
.cue-toggle .muted2 { color:var(--stone-300); font-weight:600; }
.cue-edit { display:grid; gap:6px; margin-top:6px; }
.cue-edit .row2 { display:flex; gap:6px; }
.day.off .cue { visibility:hidden; }

.day .grow { flex:1; }
.dayhint { font-size:10px; color:var(--color-text-faint); text-align:center; margin-top:9px; }
.undergrid { font-size:12px; color:var(--color-text-muted); margin:14px 2px 0; }
.undergrid b { color:var(--color-text); }

/* stub mask (redojo-0042 "not built yet") — GENERAL primitive, honest + loud for dev */
.stub { position:relative; border-radius:var(--radius-3xl); overflow:hidden; }
.stub-tape { position:absolute; inset:0; z-index:1; pointer-events:none;
  background:repeating-linear-gradient(-45deg, var(--amber-50), var(--amber-50) 14px, var(--amber-400) 14px, var(--amber-400) 16px); opacity:.16; }
.stub-tag { position:absolute; top:14px; right:14px; z-index:2; display:inline-flex; align-items:center; gap:6px;
  background:var(--amber-400); color:var(--stone-900); font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.06em; padding:5px 10px; border-radius:var(--radius-pill); }
.stub-inner { position:relative; z-index:0; opacity:.6; filter:saturate(.55); pointer-events:none; user-select:none; }

/* ═══════════════════════════════════════════════════════════════════════════
 * HOLIDAYS (redojo-0062) — additions for the Holidays section of the Schedule screen.
 *
 * APPEND-ONLY. Paste at the END of internal/web/static/tokens.css, after the
 * /* SCHEDULE (redojo-0061) */ block. Edits NO existing rule. No new token — every value
 * resolves to an existing redojo-0058 token (stone · the existing --red-* danger pair ·
 * radii). kata-0026 stays green (no raw #hex).
 *
 * NOTE for the Architect: .form-error is the one genuinely NEW primitive — a token-bound
 * inline validation message (role="alert"). It's GENERAL (not holidays-specific); promote it
 * out of this section as the design system's standard form-error treatment. The rhythm
 * steppers still reject silently (bounded), so this is the first error message in the system.
 * ═══════════════════════════════════════════════════════════════════════════ */

.holidays h2 { font-family:var(--font-display); font-weight:700; font-size:18px; margin:0 0 4px; }
.hol-list { list-style:none; margin:0 0 16px; padding:0; display:flex; flex-direction:column; gap:8px; }
.hol-row { display:flex; align-items:center; gap:12px; padding:10px 12px; border-radius:var(--radius-xl); box-shadow:inset 0 0 0 1px var(--stone-200); }
.hol-name { font-weight:700; font-size:14px; }
.hol-range { margin-left:auto; display:inline-flex; align-items:center; background:var(--stone-100); color:var(--stone-600); font-size:12px; font-weight:600; padding:4px 10px; border-radius:var(--radius-pill); white-space:nowrap; }
.hol-remove { flex:none; display:grid; place-items:center; width:30px; height:30px; border-radius:var(--radius-lg); background:transparent; border:0; color:var(--stone-400); cursor:pointer; }
.hol-remove:hover { color:var(--red-600); background:var(--red-50); }
.hol-empty { list-style:none; font-size:13px; color:var(--color-text-muted); padding:2px 0; }
.hol-form { display:flex; gap:10px; flex-wrap:wrap; align-items:flex-end; }

/* validation message — NEW general primitive (token-bound; role="alert" in markup) */
.form-error { display:flex; gap:8px; align-items:center; margin:0 0 14px; padding:10px 14px; border-radius:var(--radius-xl);
  background:var(--red-50); color:var(--red-600); font-size:13px; font-weight:600; }

/* ═══════════════════════════════════════════════════════════════════════════
 * CATALOG (redojo-0066) — component classes for the /catalog browse screen.
 *
 * APPEND-ONLY. Paste at the END of internal/web/static/tokens.css (after the
 * HOLIDAYS section). Edits NO existing rule. No new token — every value resolves to an
 * existing redojo-0058 token (stone · amber · the --s-* subject palette · radii/shadows).
 * The subject accents reuse the .s-* palette; a11y: colour is paired with the subject NAME,
 * never the sole signal. kata-0026 stays green (no raw #hex).
 *
 * Note for the Architect: .icon-chip · .badge-stone · the app shell (.shell-*, redojo-0084) ·
 * .site-header are existing primitives reused as-is. The .s-* accent blocks below mirror the existing subject palette
 * but expose only accent/tint/ic (no dot) for this screen — fold into the canonical .s-* if
 * preferred.
 * ═══════════════════════════════════════════════════════════════════════════ */

.cat-context { display:flex; flex-wrap:wrap; align-items:center; gap:8px 14px; margin:14px 0 4px; font-size:13px; color:var(--color-text-muted); }
.cat-context .chip { display:inline-flex; align-items:center; gap:7px; background:var(--stone-100); border-radius:var(--radius-pill); padding:5px 12px; font-weight:600; color:var(--stone-600); }

.qual-nav { display:flex; flex-wrap:wrap; gap:8px; margin:18px 0 26px; }
.qual-nav a { text-decoration:none; font-size:13px; font-weight:700; color:var(--stone-600); background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border-radius:var(--radius-pill); padding:7px 14px; }
.qual-nav a:hover { box-shadow:inset 0 0 0 1px var(--stone-300); background:var(--stone-50); }

.qual { display:flex; align-items:baseline; gap:12px; margin:0 0 16px; padding-bottom:10px; border-bottom:1px solid var(--stone-200); }
.qual h2 { font-family:var(--font-display); font-weight:700; font-size:22px; }
.qual .qmeta { font-size:13px; color:var(--color-text-faint); font-weight:600; }
.qual-section { margin-bottom:40px; scroll-margin-top:16px; }

.subjects { display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:16px; align-items:start; }
.subject-card { display:flex; flex-direction:column; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-sm); padding:20px; border-left:4px solid var(--accent); }
.subject-card.wide { grid-column:1 / -1; }
.subject-head { display:flex; align-items:flex-start; gap:12px; margin-bottom:16px; }
.subject-head .icon-chip { flex:none; }
.subject-head h3 { font-family:var(--font-display); font-weight:700; font-size:18px; line-height:1.1; }
.subject-sub { font-size:12.5px; color:var(--color-text-muted); margin-top:3px; display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.subject-sub .sep { color:var(--stone-300); }
.subject-head .ed-count { margin-left:auto; flex:none; }

.editions { list-style:none; margin:0; padding:0; display:grid; gap:10px; align-items:start; }
.subject-card.wide .editions { grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); }
.edition { display:flex; align-items:center; gap:12px; padding:12px 14px; border-radius:var(--radius-xl); background:var(--tint); }
.ed-id { flex:1; min-width:0; }
.ed-name { font-weight:700; font-size:14px; color:var(--color-text); min-height:2.6em; line-height:1.3; }
.ed-syl { font-size:12px; color:var(--color-text-muted); margin-top:2px; }
.ed-syl .lab { color:var(--ic-text); font-weight:700; }

/* The Enrol control (.enrol / .enrolled / .enrol-form) is defined in the ENROLMENT section below
   (redojo-0067) — the redojo-0066 reserved disabled "Enrol · soon" placeholder was retired there. */

.cat-note { font-size:12px; color:var(--color-text-faint); margin:6px 2px 0; }

/* subject accents for this screen (mirror the design-system subject palette) */
.s-indigo  { --accent:var(--s-indigo-accent);  --tint:var(--s-indigo-tint);  --ic-text:var(--s-indigo-ic); }
.s-rose    { --accent:var(--s-rose-accent);    --tint:var(--s-rose-tint);    --ic-text:var(--s-rose-ic); }
.s-emerald { --accent:var(--s-emerald-accent); --tint:var(--s-emerald-tint); --ic-text:var(--s-emerald-ic); }
.s-sky     { --accent:var(--s-sky-accent);     --tint:var(--s-sky-tint);     --ic-text:var(--s-sky-ic); }
.s-amber   { --accent:var(--s-amber-accent);   --tint:var(--s-amber-tint);   --ic-text:var(--s-amber-ic); }
.s-violet  { --accent:var(--s-violet-accent);  --tint:var(--s-violet-tint);  --ic-text:var(--s-violet-ic); }

/* ═══════════════════════════════════════════════════════════════════════════
 * ENROLMENT (redojo-0067) — the two-state Enrol control on the /catalog edition rows.
 *
 * Retires the redojo-0066 reserved placeholder (the disabled ".enrol" + ".enrol .soon"
 * pill were removed from the CATALOG section above). No new token — stone for the active
 * action (the system's primary treatment), the existing emerald "positive" pair for the
 * settled state. kata-0026 stays green (no raw #hex).
 *
 * a11y (rule colour-never-sole-signal): the two states differ by TEXT + ICON, not colour
 * alone — "Enrol" (a real focusable button) vs a check glyph + the word "Enrolled".
 * ═══════════════════════════════════════════════════════════════════════════ */

/* the enrol form wraps the button but stays out of the row's flex layout */
.enrol-form { display:contents; }

/* enrollable — the active, focusable primary enrol action (a real submit button) */
.enrol { flex:none; display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700;
  color:var(--white); background:var(--stone-900); box-shadow:none; border:0; border-radius:var(--radius-lg);
  padding:7px 13px; cursor:pointer; font-family:var(--font-sans); transition:background .15s; }
.enrol:hover { background:var(--stone-700); }

/* enrolled — a settled, non-actionable confirmation (check + word; NOT a button) */
.enrolled { flex:none; display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700;
  color:var(--emerald-600); background:var(--emerald-50); border-radius:var(--radius-lg); padding:7px 11px; white-space:nowrap; }
.enrolled .ic { width:14px; height:14px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * EXAM DATA (redojo-0081) — exam-date + past-paper-period capture AT enrol, on the /catalog edition
 * rows. Transcoded from the Designer's package-examdata (HANDOFF-v2.1). Reuses existing primitives
 * (.field / .field-label, .btn.btn-primary/.btn-ghost + .btn-sm, .form-error); only the classes below
 * are new. No new token — stone for structure + the subject --ic-text accent for the summary icon.
 * (The Designer's .examdata-add / enrolled-but-empty affordance is omitted: the PO chose Option B —
 * legacy enrolments are cleaned up at deploy, so there is no enrolled-but-empty state.)
 * ═══════════════════════════════════════════════════════════════════════════ */

/* an enrolled/enrolling edition that carries the exam-data zone stacks vertically so the zone gets
   full width — works in BOTH the ~220px multi-edition grid cell AND the full-width single-edition row */
.edition.has-exam { flex-direction:column; align-items:stretch; gap:0; }
.edition.has-exam .edition-main { display:flex; align-items:center; gap:12px; }

.examdata { margin-top:11px; padding-top:11px; border-top:1px solid var(--stone-200); }

/* captured show-back (AC1/AC4): calendar icon + exam date · period, with an Edit disclosure */
.examdata-summary { display:flex; align-items:center; gap:7px; flex-wrap:wrap; min-height:34px; font-size:12.5px; font-weight:600; color:var(--color-text); }
.examdata-summary .ic { width:14px; height:14px; color:var(--ic-text); }
.examdata-summary .sep { color:var(--stone-300); }
.examdata-summary .period { color:var(--color-text-muted); font-weight:600; }
.examdata-editlink { margin-left:auto; display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700; color:var(--stone-600); background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border:0; border-radius:var(--radius-pill); padding:4px 11px; cursor:pointer; transition:box-shadow .15s, background .15s, color .15s; }
.examdata-editlink:hover { background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-300); color:var(--stone-800); }
.examdata-editlink .ic { width:12px; height:12px; color:inherit; }

/* the capture/edit form (date + weeks + save) — stacks so it fits the 220px cell */
.examdata-intro { font-size:12px; color:var(--color-text-muted); margin:0 0 2px; }
.examdata-form { display:flex; flex-direction:column; gap:10px; }
.examdata-form .fld { display:flex; flex-direction:column; gap:5px; }
.examdata-weeks-row { display:flex; align-items:center; gap:8px; }
.examdata-weeks-row .field { width:78px; text-align:center; }
.examdata-weeks-row .unit { font-size:13px; font-weight:600; color:var(--color-text-muted); }
.examdata-hint { font-size:11px; color:var(--color-text-faint); margin:1px 0 0; }
.examdata-actions { display:flex; gap:8px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * ACCOUNT (redojo-0065) — shell account menu · /account danger zone · delete confirm.
 *
 * APPEND-ONLY. Paste at the END of internal/web/static/tokens.css. Edits NO existing rule.
 * No new token — stone + the existing --red-600/--red-50 danger pair + emerald .avatar + radii/
 * shadows. kata-0026: var() only, no raw #hex. Reuses .avatar / .card / .btn / .btn-ghost /
 * .btn-block / .site-header as-is.
 *
 * Note for the Architect: .btn-danger-solid is the one genuinely NEW primitive — a SOLID destructive
 * button (the existing .btn-danger is a quiet red-text ghost). It's general (any irreversible
 * confirm) — promote it alongside .btn-danger. The .account-menu popover is a native <details>
 * disclosure (no-JS-robust — a destructive path must never depend on scripting).
 * ═══════════════════════════════════════════════════════════════════════════ */

/* account menu — native <details> in the header top-right (replaces the bare Sign-out button) */
.account-menu { position:relative; }
.account-menu > summary { list-style:none; cursor:pointer; display:inline-flex; align-items:center; gap:7px; border-radius:var(--radius-pill); padding:3px 8px 3px 3px; }
.account-menu > summary::-webkit-details-marker { display:none; }
.account-menu > summary:hover { background:var(--stone-100); }
.account-menu > summary:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.account-menu .chev { color:var(--color-text-muted); transition:transform .15s; }
.account-menu[open] .chev { transform:rotate(180deg); }
.account-pop { position:absolute; top:calc(100% + 8px); right:0; z-index:30; width:248px; background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-lg); padding:8px; display:flex; flex-direction:column; }
.account-pop-head { display:flex; align-items:center; gap:10px; padding:10px 10px 12px; border-bottom:1px solid var(--stone-100); margin-bottom:6px; }
.account-pop-head .k { font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--color-text-faint); }
.account-pop-head .email { font-size:13px; font-weight:600; color:var(--color-text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:150px; }
.account-pop-item { display:flex; align-items:center; gap:10px; width:100%; text-align:left; background:transparent; border:0; font:600 14px/1 var(--font-sans); color:var(--color-text); text-decoration:none; padding:10px; border-radius:var(--radius-lg); cursor:pointer; }
.account-pop-item:hover { background:var(--stone-100); }
.account-pop-item .ic { width:16px; height:16px; color:var(--color-text-muted); }
.account-pop-form { margin:0; }
/* Test-account-only preset section (redojo-test-account-preset-profiles) — a dev-tool label that reuses
   the menu head's faint-uppercase language; never rendered for a real student. */
.account-pop-sep { font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--color-text-faint); padding:10px 10px 4px; margin-top:4px; border-top:1px solid var(--stone-100); }

/* /account settings page */
.account-page { max-width:760px; }
.account-whoami { font-size:15px; color:var(--color-text-muted); margin:6px 0 0; }
.account-whoami strong { color:var(--color-text); font-weight:700; word-break:break-all; }

/* Danger zone — red-bordered card (the delete ENTRY point; does not itself delete) */
.danger-zone { margin-top:32px; background:var(--color-surface); border-radius:var(--radius-3xl); border:1.5px solid var(--red-600); padding:0; overflow:hidden; }
.danger-head { display:flex; align-items:center; gap:9px; padding:16px 24px; background:var(--red-50); color:var(--red-600); font-weight:800; font-size:13px; letter-spacing:.04em; text-transform:uppercase; }
.danger-head .ic { width:16px; height:16px; }
.danger-body { padding:22px 24px 24px; }
.danger-body h2 { font-family:var(--font-display); font-weight:700; font-size:19px; margin:0 0 8px; }
.danger-body p { font-size:14px; line-height:1.55; color:var(--color-text-muted); margin:0 0 18px; max-width:46rem; }
.danger-body p strong { color:var(--color-text); font-weight:700; }

/* solid-red destructive button — NEW variant (existing .btn-danger is a quiet ghost) */
.btn-danger-solid { display:inline-flex; align-items:center; justify-content:center; gap:8px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--red-600); color:var(--white); padding:11px 18px; font-size:14px; font-weight:700; font-family:var(--font-sans); text-decoration:none; }
.btn-danger-solid:hover { filter:brightness(.93); }
.btn-danger-solid:focus-visible { outline:2px solid var(--red-600); outline-offset:2px; }
.btn-danger-solid .ic { width:16px; height:16px; }

/* /account/delete confirm page */
.confirm-wrap { max-width:540px; margin-inline:auto; padding-top:12px; }
.confirm-card { background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-lg); padding:30px; }
.confirm-ico { display:grid; place-items:center; width:52px; height:52px; border-radius:var(--radius-pill); background:var(--red-50); color:var(--red-600); margin-bottom:16px; }
.confirm-ico .ic { width:26px; height:26px; }
.confirm-card h1 { font-family:var(--font-display); font-weight:700; font-size:24px; letter-spacing:-.02em; margin:0 0 12px; }
.confirm-card .lead { font-size:14px; color:var(--color-text-muted); margin:0 0 12px; }
.erase-list { list-style:none; margin:0 0 18px; padding:0; display:flex; flex-direction:column; gap:8px; }
.erase-list li { display:flex; align-items:center; gap:10px; font-size:14px; font-weight:600; color:var(--color-text); }
.erase-list .ic { width:15px; height:15px; color:var(--red-600); flex:none; }
.confirm-warning { display:flex; align-items:center; gap:9px; padding:12px 14px; border-radius:var(--radius-xl); background:var(--red-50); color:var(--red-600); font-size:14px; font-weight:800; margin:0 0 22px; }
.confirm-warning .ic { width:18px; height:18px; flex:none; }
.confirm-actions { display:flex; flex-direction:column; gap:10px; }
/* ═════════════════════════════════════════════════════════════════════════════
 * RUNNER (redojo-runner-dispatch-and-present-lesson) — Present lesson + Day complete.
 *
 * APPEND-ONLY. Paste at the END of internal/web/static/tokens.css. Edits NO existing rule.
 * No new token — subject accent (--ic-text/--tint via .s-*), stone/emerald/amber, existing
 * radii/shadows. kata-0026: var() only, no raw #hex. Reuses .card-family, .btn/.btn-ghost/
 * .btn-danger/.btn-sm, .icon-chip, the .s-* subject accents, and .stub* as-is.
 *
 * Note for the Architect: .btn-open (primary "go study") and .btn-done (completion) are the two
 * new action styles — fold into the general .btn-* set if preferred. .lesson-title reuses the
 * display type; the subject accent maps from the subject (reuse the catalog subject→accent map).
 * ═══════════════════════════════════════════════════════════════════════════ */

/* the focused study column — narrower than the 1100 shell so the single task reads calmly */
.runner { max-width:720px; margin-inline:auto; }

/* deferred session-pulse chrome (un-sliced) — a compact bar, shown as a .stub this slice */
.session-bar { display:flex; align-items:center; gap:16px; padding:14px 18px; border-radius:var(--radius-2xl); background:var(--color-surface); box-shadow:var(--shadow-sm); }
.session-bar .sb-of { font-size:13px; font-weight:700; color:var(--color-text); }
.session-bar .sb-clock { display:inline-flex; align-items:center; gap:7px; font-family:var(--font-display); font-weight:700; font-size:18px; color:var(--color-text); }
.session-bar .sb-clock .ic { color:var(--color-text-muted); }
.session-bar .sb-actions { margin-left:auto; display:flex; gap:8px; }

/* the lesson card */
.lesson-card { position:relative; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-md); padding:32px; border-left:5px solid var(--accent); }
.lesson-eyebrow { display:flex; align-items:center; gap:10px; margin-bottom:18px; }
.lesson-eyebrow .icon-chip { width:36px; height:36px; font-size:15px; }
.lesson-place { font-size:13px; font-weight:600; color:var(--color-text-muted); display:flex; flex-wrap:wrap; align-items:center; gap:6px; }
.lesson-place .subj { color:var(--ic-text); font-weight:800; }
.lesson-place .chev { color:var(--stone-300); }
.lesson-kicker { font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 8px; }
.lesson-title { font-family:var(--font-display); font-weight:700; font-size:32px; line-height:1.12; letter-spacing:-.02em; margin:0 0 14px; }
.lesson-lead { font-size:15px; line-height:1.55; color:var(--color-text-muted); margin:0 0 26px; max-width:42rem; }

.lesson-actions { display:flex; flex-wrap:wrap; gap:12px; align-items:center; }
/* Open lesson — the primary "go study" affordance (opens SME in a new tab) */
.btn-open { display:inline-flex; align-items:center; gap:9px; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:13px 22px; font-size:15px; font-weight:700; text-decoration:none; }
.btn-open:hover { background:var(--stone-800); }
.btn-open .ic { width:17px; height:17px; }
/* Mark done — the completion command */
.btn-done { display:inline-flex; align-items:center; gap:8px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--emerald-50); color:var(--emerald-600); padding:13px 20px; font-size:15px; font-weight:700; }
.btn-done:hover { background:var(--emerald-50); box-shadow:inset 0 0 0 1.5px var(--emerald-500); }
.btn-done .ic { width:17px; height:17px; }
.lesson-hint { font-size:12.5px; color:var(--color-text-faint); margin:16px 0 0; }

/* Day complete — minimal, on-system placeholder (NOT a stub) */
.daydone { max-width:520px; margin-inline:auto; text-align:center; padding:56px 24px; display:flex; flex-direction:column; align-items:center; gap:6px; }
.daydone-mark { display:grid; place-items:center; width:76px; height:76px; border-radius:var(--radius-pill); background:var(--emerald-50); color:var(--emerald-600); margin-bottom:14px; }
.daydone-mark .ic { width:34px; height:34px; stroke-width:2.4; }
.daydone h1 { font-family:var(--font-display); font-weight:700; font-size:30px; letter-spacing:-.02em; margin:0; }
.daydone p { font-size:16px; color:var(--color-text-muted); margin:6px 0 0; max-width:32rem; }
.daydone-foot { margin-top:26px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * redojo-runner-activity-completion-transition (B) — the unified activity-completion transition beat.
 * TRANSCODED from the Designer's verified preview.html (HANDOFF-v1). The beat = the committed .daydone
 * terminal + the .ex-summary recap rows (both REUSED verbatim) + these small additions: the celebration
 * eyebrow (.xn-eyebrow), the "Up next" preview block (.xn-next holding one reused .wk-card.is-planned) or the
 * no-next inline Day-complete note (.xn-alldone), and the folded-in aesthetic-review tweaks (c) heading scale
 * + (d) the rail progress bar. All var()-bound, no new token, no raw #hex. Tweak (b) [the "Just done" rail
 * marker + rail done-cards] is DEFERRED to redojo-runner-landing-done-cards (the marker needs done cards in
 * the rail — that follow-up's territory). ═══════════════════════════════════════════════════════════════ */

/* tweak (c) — the celebration heading a step under the 30px Day-complete h1, so the recap below isn't top-heavy */
.daydone.is-transition { max-width:560px; }
.daydone.is-transition h1 { font-size:27px; margin-top:2px; }

/* kind eyebrow above the celebration heading (📖 Lessons complete / 🎯 Practice complete) */
.xn-eyebrow { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:800;
  letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-muted); }
.xn-eyebrow .ic { width:14px; height:14px; }

/* the up-next preview — a titled section holding the SAME .wk-card.is-planned the rail ships */
.xn-next { width:100%; max-width:460px; margin:26px auto 0; text-align:left;
  padding-top:24px; border-top:1px solid var(--color-border); }
.xn-cap { font-size:11px; font-weight:800; letter-spacing:.06em; text-transform:uppercase;
  color:var(--color-text-faint); margin:0 0 11px; display:flex; align-items:center; gap:7px; }
.xn-cap .ic { width:13px; height:13px; }
.xn-next .wk-card { cursor:default; }                 /* here it's a read-only preview, not a drawer trigger */
.xn-next .wk-card:hover { transform:none; box-shadow:var(--shadow-sm); }
.xn-planned-chip { background:var(--stone-100); color:var(--color-text-muted); }  /* the preview card's visible "Planned" chip (rail planned cards show none) */

/* no next → an inline "that was your last activity" note (Continue → Day complete) */
.xn-alldone { width:100%; max-width:460px; margin:26px auto 0; padding-top:24px;
  border-top:1px solid var(--color-border); display:flex; align-items:center; gap:13px; text-align:left; }
.xn-alldone .re-ic { flex:none; width:40px; height:40px; border-radius:var(--radius-xl);
  background:var(--emerald-50); color:var(--emerald-600); display:grid; place-items:center; }
.xn-alldone .re-ic .ic { width:21px; height:21px; }
.xn-alldone-t { font-size:14px; font-weight:800; color:var(--color-text); }
.xn-alldone-s { font-size:12.5px; font-weight:600; color:var(--color-text-muted); margin-top:2px; }

/* 🎨 tweak (d) — the rail progress becomes a glanceable emerald BAR + a short "N of M done" caption rather
   than the "N done · M to go" text tally (which duplicated the cards' own Done/planned states). */
.rail-bar { display:flex; flex-direction:column; gap:7px; }
.rail-bar-track { height:6px; border-radius:var(--radius-pill); background:var(--stone-200); overflow:hidden; }
.rail-bar-fill { height:100%; border-radius:var(--radius-pill); background:var(--emerald-500); transition:width .3s ease; }
.rail-bar-cap { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--color-text-muted); }
.rail-bar-cap .ic { width:13px; height:13px; color:var(--emerald-600); }
.rail-bar-cap b { color:var(--emerald-600); font-weight:800; }

/* ═══════════════════════════════════════════════════════════════════════════
 * SESSION SUBJECT (redojo-assign-subject-per-session, F7) — per-slot Subject-package picker in the
 * Schedule day card. A slot assigns ONE enrolled SUBJECT PACKAGE (edition); the picker shows FULL
 * package names (colour = subject family; the full name distinguishes editions). Custom <details>
 * popover (native <select> was rejected — off-style + too narrow). "Any" = a Flexible session
 * (the default), muted italic. No new token — stone + the existing --s-* subject palette.
 * The .week 2-row reshape that makes room for it is folded into the week-grid rule above.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* the per-slot picker block */
.slots { margin-top:11px; padding-top:11px; border-top:1px solid var(--stone-100); display:flex; flex-direction:column; gap:7px; }
.slots-lab { font-size:10px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 1px; }
.slot-row { display:flex; align-items:center; gap:8px; }
.slot-num { flex:none; display:grid; place-items:center; width:20px; height:20px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); font-family:var(--font-display); font-weight:700; font-size:11px; }
.slot-dot { flex:none; width:9px; height:9px; border-radius:var(--radius-pill); background:var(--dot,transparent); box-shadow:inset 0 0 0 1.5px var(--dot,var(--stone-300)); }

/* custom subject-package picker — styled <details> popover (no-JS-robust; sibling of account menu) */
.slot-picker { position:relative; flex:1; min-width:0; }
.slot-picker > summary { list-style:none; cursor:pointer; display:flex; align-items:center; gap:7px; background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border-radius:var(--radius-lg); padding:6px 9px; }
.slot-picker > summary::-webkit-details-marker { display:none; }
.slot-picker > summary:hover { box-shadow:inset 0 0 0 1px var(--stone-300); }
.slot-picker > summary:focus-visible { outline:2px solid var(--color-ink); outline-offset:1px; }
.slot-picker[open] > summary { box-shadow:inset 0 0 0 1.5px var(--color-ink); }
.sp-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font:600 12px/1.3 var(--font-sans); color:var(--color-text); }
.sp-name.is-any { color:var(--color-text-muted); font-style:italic; }
.sp-chev { flex:none; width:13px; height:13px; color:var(--color-text-muted); transition:transform .15s; }
.slot-picker[open] .sp-chev { transform:rotate(180deg); }
.slot-menu { position:absolute; z-index:20; top:calc(100% + 4px); left:0; min-width:210px; max-width:280px; background:var(--color-surface); border-radius:var(--radius-lg); box-shadow:var(--shadow-lg); padding:5px; display:flex; flex-direction:column; gap:1px; }
.slot-menu form { margin:0; }
.slot-opt { display:flex; align-items:flex-start; gap:8px; width:100%; text-align:left; background:transparent; border:0; cursor:pointer; padding:7px 8px; border-radius:var(--radius-lg); font:600 12px/1.35 var(--font-sans); color:var(--color-text); }
.slot-opt > span:nth-child(2) { flex:1; min-width:0; }
.slot-opt .slot-dot { margin-top:3px; }
.slot-opt:hover { background:var(--stone-100); }
.slot-opt.is-any { color:var(--color-text-muted); font-style:italic; }
.slot-opt .sp-check { margin-left:auto; flex:none; width:14px; height:14px; color:var(--s-indigo-ic); margin-top:2px; }

.slots-hint { font-size:11px; color:var(--color-text-faint); line-height:1.4; margin:2px 0 0; }
.slots-hint a { color:var(--s-indigo-ic); font-weight:700; }

/* subject family → the full accent set. Palette-named classes (ADR-0033 §4): the handler maps a package
   to its family via the SAME subject presentation metadata the Catalog/Today screens use ("subj-"+accent), so a Subject
   is one colour app-wide. Editions of one subject share the family colour; the full name distinguishes.
   --dot drives the picker dot; --tint/--accent/--ic-text drive the redesign's Session-block tinted
   background + coloured left border + tally count (redojo-schedule-summary-card-polish). */
.subj-indigo  { --dot:var(--s-indigo-dot);  --tint:var(--s-indigo-tint);  --accent:var(--s-indigo-accent);  --ic-text:var(--s-indigo-ic); }
.subj-sky     { --dot:var(--s-sky-dot);     --tint:var(--s-sky-tint);     --accent:var(--s-sky-accent);     --ic-text:var(--s-sky-ic); }
.subj-violet  { --dot:var(--s-violet-dot);  --tint:var(--s-violet-tint);  --accent:var(--s-violet-accent);  --ic-text:var(--s-violet-ic); }
.subj-emerald { --dot:var(--s-emerald-dot); --tint:var(--s-emerald-tint); --accent:var(--s-emerald-accent); --ic-text:var(--s-emerald-ic); }
.subj-rose    { --dot:var(--s-rose-dot);    --tint:var(--s-rose-tint);    --accent:var(--s-rose-accent);    --ic-text:var(--s-rose-ic); }
.subj-amber   { --dot:var(--s-amber-dot);   --tint:var(--s-amber-tint);   --accent:var(--s-amber-accent);   --ic-text:var(--s-amber-ic); }

/* ═══════════════════════════════════════════════════════════════════════════
 * TODAY (redojo-0009) — the morning-landing screen. Transcoded from the Designer's verified
 * preview.html (v2.1 handoff). No new token — stone + emerald/amber + the s-indigo subject accent
 * + radii/shadows. kata-0026: var() only, no raw #hex. Reuses .card/.btn/.btn-primary/.icon-chip/
 * .stub/.badge and shares .lesson-place/.subj/.chev with the Runner.
 *
 * TRANSCODE NOTE (ingest): the Designer's plan-row class was renamed .plan-row → .today-plan-row to
 * avoid clobbering the existing generic .plan-row styleguide primitive (docs/ux/design-system/
 * styleguide.html) — same rendered look, no design-system drift. Architect may fold .btn-start into
 * a shared prominent-action button (mirrors the Runner's .btn-open) and .today-state into a shared
 * empty/terminal-state primitive (generalises .daydone) if preferred.
 * ─────────────────────────────────────────────────────────────────────────── */

.today { max-width:720px; margin-inline:auto; }
.today-head { display:flex; align-items:center; justify-content:space-between; gap:14px; margin-bottom:6px; }
.today-head h1 { font-size:30px; }
.today-sub { font-size:15px; color:var(--color-text-muted); margin:0 0 22px; }

/* on-track / behind status pill */
.status-pill { flex:none; display:inline-flex; align-items:center; gap:7px; border-radius:var(--radius-pill); padding:7px 13px; font-size:13px; font-weight:700; }
.status-pill .ic { width:15px; height:15px; }
.status-on { background:var(--emerald-50); color:var(--emerald-600); }
.status-behind { background:var(--amber-50); color:var(--amber-600); }

/* Next-up hero card — the Runner lesson-card idiom, tuned for a landing */
.nextup { position:relative; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-md); padding:26px 28px; border-left:5px solid var(--accent); margin-bottom:14px; }
.nextup-kicker { font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 12px; }
.nextup-eyebrow { display:flex; align-items:center; gap:10px; margin-bottom:12px; }
.nextup-eyebrow .icon-chip { width:34px; height:34px; font-size:14px; }
.nextup-title { font-family:var(--font-display); font-weight:700; font-size:26px; line-height:1.14; letter-spacing:-.02em; margin:0 0 20px; }
.btn-start { display:inline-flex; align-items:center; gap:9px; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:13px 24px; font-size:15px; font-weight:700; text-decoration:none; border:0; cursor:pointer; }
.btn-start:hover { background:var(--stone-800); }
.btn-start .ic { width:17px; height:17px; }

/* deferred "Sessions today ●●" — hinted as a .stub (needs F7 per-slot subject allocation) */
.sessions-stub { margin-bottom:14px; }
.sessions-strip { display:flex; align-items:center; gap:10px; padding:12px 16px; border-radius:var(--radius-2xl); background:var(--color-surface); box-shadow:var(--shadow-sm); font-size:13px; font-weight:600; color:var(--color-text-muted); }
.sessions-strip .dots { display:inline-flex; gap:5px; }
.sessions-strip .dots i { width:9px; height:9px; border-radius:var(--radius-pill); background:var(--s-indigo-dot); }

/* Today's plan — the ordered planned-lesson list (read-only context; the actionable list is redojo-0010) */
.plan-title { font-family:var(--font-display); font-weight:700; font-size:16px; margin:22px 0 12px; }
.plan-list { list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px; }
.today-plan-row { display:flex; align-items:center; gap:14px; padding:13px 16px; border-radius:var(--radius-xl); background:var(--color-surface); box-shadow:var(--shadow-sm); }
.today-plan-row .idx { flex:none; display:grid; place-items:center; width:26px; height:26px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); font-family:var(--font-display); font-weight:700; font-size:13px; }
.today-plan-row.is-next { box-shadow:inset 0 0 0 1.5px var(--accent); background:var(--tint); }
.today-plan-row.is-next .idx { background:var(--accent); color:var(--white); }
.today-plan-row .pl-body { flex:1; min-width:0; }
.today-plan-row .pl-title { font-weight:700; font-size:14px; color:var(--color-text); }
.today-plan-row .pl-place { font-size:12px; color:var(--color-text-muted); margin-top:1px; }
.today-plan-row .pl-next { flex:none; font-size:10px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--ic-text); }
.plan-done .pl-title { color:var(--color-text-muted); }
.today-plan-row .pl-check { flex:none; color:var(--emerald-600); }
.today-plan-row .pl-check .ic { width:16px; height:16px; }

/* centred state screens (not-enrolled · finish-setup · caught-up) — generalises .daydone */
.today-state { max-width:520px; margin-inline:auto; text-align:center; padding:52px 24px; display:flex; flex-direction:column; align-items:center; gap:6px; }
.today-state-ico { display:grid; place-items:center; width:72px; height:72px; border-radius:var(--radius-pill); margin-bottom:14px; }
.today-state-ico .ic { width:32px; height:32px; }
.ico-neutral { background:var(--stone-100); color:var(--stone-500); }
.ico-amber { background:var(--amber-50); color:var(--amber-600); }
.ico-emerald { background:var(--emerald-50); color:var(--emerald-600); }
.today-state h1 { font-family:var(--font-display); font-weight:700; font-size:26px; letter-spacing:-.02em; margin:0; }
.today-state p { font-size:15px; color:var(--color-text-muted); margin:6px 0 0; max-width:34rem; }
.today-state-foot { margin-top:22px; }

/* LANDING (redojo-runner-becomes-landing / A3) — the two no-plan setup states (not-enrolled ·
 * finish-setup) own the whole play area, centred, with NO rail (the PO-chosen full-bleed treatment;
 * Today exactly as it looked). Reuses .today-state verbatim; this is only the centring wrapper. The
 * rail earns its place the instant a plan exists (playing onward). Layout only — no colour. */
.landing-full { flex:1; display:flex; align-items:center; justify-content:center; min-height:clamp(360px, 60vh, 640px); }

/* ═══════════════════════════════════════════════════════════════════════════
 * IN-SESSION LESSON LIST (redojo-0010) — the order-locked lesson list + Mark done, on the Runner.
 * Reuses AS-IS: .lesson-card (current lesson) · .stub* (session-pulse) · .daydone (terminal) ·
 * .s-* subject accents · .icon-chip. The compact done/locked rows MIRROR the Today .today-plan-row
 * idiom (the Architect may consolidate .lesson-row with .today-plan-row into one row primitive).
 * No new token — stone + emerald + the subject --accent/--tint via .s-*. var() only, no raw #hex.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* the single ordered list — done rows → current card → locked rows. One <ol> = strict order,
   screen-reader-legible sequence; the current lesson is a full .lesson-card <li> (list-style none). */
.lesson-list { list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px; }
.lesson-list .lesson-current { margin:6px 0; }   /* the card breathes vs the compact rows */

/* compact done / locked row (mirrors .today-plan-row) */
.lesson-row { display:flex; align-items:center; gap:14px; padding:12px 16px; border-radius:var(--radius-xl); background:var(--color-surface); box-shadow:var(--shadow-sm); }
.lr-idx { flex:none; display:grid; place-items:center; width:26px; height:26px; border-radius:var(--radius-pill); }
.lr-idx .ic { width:15px; height:15px; }
.lr-body { flex:1; min-width:0; display:flex; flex-direction:column; }
.lr-title { font-weight:700; font-size:14px; color:var(--color-text); }
.lr-place { font-size:12px; color:var(--color-text-muted); margin-top:2px; }
.lr-tail { flex:none; font-size:10px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; }

/* DONE — accomplished: emerald tick, quiet title. Colour is NOT the sole signal (tick icon + "Done"). */
.lesson-row.is-done .lr-idx { background:var(--emerald-50); color:var(--emerald-600); }
.lesson-row.is-done .lr-title { color:var(--color-text-muted); font-weight:600; }
.lesson-row.is-done .lr-tail { color:var(--emerald-600); display:inline-flex; align-items:center; gap:5px; }
.lesson-row.is-done .lr-tail .ic { width:15px; height:15px; }

/* LOCKED — not yet: greyed, lock glyph, a "Locked" text label. Visibly + semantically inert
   (no link/button; aria-disabled in markup). */
.lesson-row.is-locked { background:transparent; box-shadow:inset 0 0 0 1px var(--stone-200); }
.lesson-row.is-locked .lr-idx { background:var(--stone-100); color:var(--stone-400); }
.lesson-row.is-locked .lr-title { color:var(--color-text-faint); font-weight:600; }
.lesson-row.is-locked .lr-place { color:var(--stone-300); }
.lesson-row.is-locked .lr-tail { color:var(--stone-400); display:inline-flex; align-items:center; gap:5px; }
.lesson-row.is-locked .lr-tail .ic { width:13px; height:13px; }

/* windowed done history (Gap B): older done lessons collapse into an expandable summary so the list
   never renders the whole history as N rows. <details> = no-JS-robust + keyboard-accessible. */
.done-earlier { border-radius:var(--radius-xl); }
.done-earlier > summary { list-style:none; cursor:pointer; display:flex; align-items:center; gap:11px; padding:11px 16px; border-radius:var(--radius-xl); font-size:13px; font-weight:700; color:var(--emerald-600); background:var(--emerald-50); }
.done-earlier > summary::-webkit-details-marker { display:none; }
.done-earlier > summary:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.done-earlier > summary .de-ico { display:grid; place-items:center; width:24px; height:24px; border-radius:var(--radius-pill); background:var(--white); color:var(--emerald-600); flex:none; }
.done-earlier > summary .de-ico .ic { width:14px; height:14px; }
.done-earlier > summary .de-chev { margin-left:auto; color:var(--emerald-600); transition:transform .15s; }
.done-earlier[open] > summary { border-bottom-left-radius:0; border-bottom-right-radius:0; }
.done-earlier[open] > summary .de-chev { transform:rotate(180deg); }
.done-earlier .de-rows { display:flex; flex-direction:column; gap:8px; padding-top:8px; }

/* a quiet caption explaining the lock (kids' app: say WHY the rows are greyed) */
.locked-cap { display:flex; align-items:center; gap:7px; font-size:12px; color:var(--color-text-faint); margin:2px 2px 0; }
.locked-cap .ic { width:13px; height:13px; }

/* visually-hidden — screen-reader-only text (the done rows carry an sr "Done" so the tick is not the
   sole signal). A general a11y primitive; introduced here, a candidate to promote design-system-wide. */
.sr { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); border:0; }

/* ═══════════════════════════════════════════════════════════════════════════
 * LIVE SESSION / STOPWATCH (redojo-live-session-and-stopwatch) — the gated test-account stopwatch
 * panel + the Current-card in-progress (post-Open) state, on the Runner. Transcoded from the
 * Designer's verified preview (v2.1). No new token — stone + emerald + the amber .stub family
 * (var() only, no raw #hex). Reuses .lesson-card / .stub* / .btn-* / .lesson-*.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* (A) test-account-only harness panel — reads as DEV (amber .stub family) but INTERACTIVE (not masked) */
.testpanel { position:relative; border-radius:var(--radius-3xl); overflow:hidden; margin-bottom:18px; box-shadow:inset 0 0 0 1.5px var(--amber-400); background:var(--amber-50); }
.testpanel-tape { position:absolute; inset:0; z-index:0; pointer-events:none; background:repeating-linear-gradient(-45deg, transparent, transparent 13px, var(--amber-400) 13px, var(--amber-400) 15px); opacity:.10; }
.testpanel-in { position:relative; z-index:1; padding:16px 18px; }
.testpanel-head { display:flex; align-items:center; gap:9px; margin-bottom:13px; }
.testpanel-tag { display:inline-flex; align-items:center; gap:6px; background:var(--amber-400); color:var(--stone-900); font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.06em; padding:4px 10px; border-radius:var(--radius-pill); }
.testpanel-tag .ic { width:12px; height:12px; }
.testpanel-note { font-size:11px; font-weight:600; color:var(--amber-600); }

/* the stopwatch rows (only the Activity row live now; Session/Atom rows land in later slices) */
.sw-rows { display:flex; flex-direction:column; gap:8px; }
.sw-row { display:flex; align-items:center; gap:12px; padding:11px 14px; border-radius:var(--radius-xl); background:var(--white); box-shadow:var(--shadow-sm); }
.sw-row.is-future { opacity:.5; }
.sw-icon { flex:none; display:grid; place-items:center; width:30px; height:30px; border-radius:var(--radius-lg); background:var(--stone-100); color:var(--stone-500); }
.sw-icon .ic { width:16px; height:16px; }
.sw-row.is-running .sw-icon { background:var(--emerald-50); color:var(--emerald-600); }
.sw-meta { flex:1; min-width:0; display:flex; flex-direction:column; }
.sw-label { font-size:11px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text-faint); }
.sw-sub { font-size:12px; color:var(--color-text-muted); margin-top:1px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sw-reading { flex:none; font-family:var(--font-display); font-weight:700; font-size:22px; letter-spacing:-.01em; color:var(--color-text); font-variant-numeric:tabular-nums; }
.sw-row.is-idle .sw-reading { color:var(--stone-300); }
.sw-state { flex:none; display:inline-flex; align-items:center; gap:5px; font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.05em; padding:3px 8px; border-radius:var(--radius-pill); }
.sw-state.running { background:var(--emerald-50); color:var(--emerald-600); }
.sw-state.idle { background:var(--stone-100); color:var(--stone-500); }
.sw-dot { width:6px; height:6px; border-radius:var(--radius-pill); background:currentColor; }

.testpanel-foot { display:flex; align-items:center; gap:10px; margin-top:13px; flex-wrap:wrap; }
.advance-form { display:flex; align-items:center; gap:9px; flex-wrap:wrap; margin:0; }
.adv-lab { font-size:11px; font-weight:800; text-transform:uppercase; letter-spacing:.05em; color:var(--color-text-faint); }
.adv-field { display:inline-flex; align-items:center; gap:5px; background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-300); border-radius:var(--radius-lg); padding:5px 9px; }
.adv-field input { width:42px; border:0; outline:none; background:transparent; font:700 14px/1 var(--font-sans); color:var(--color-text); text-align:right; font-variant-numeric:tabular-nums; -moz-appearance:textfield; }
.adv-field input::-webkit-outer-spin-button, .adv-field input::-webkit-inner-spin-button { -webkit-appearance:none; margin:0; }
.adv-field .adv-unit { font-size:12px; font-weight:700; color:var(--color-text-muted); }
.btn-advance { display:inline-flex; align-items:center; gap:7px; border:0; cursor:pointer; border-radius:var(--radius-lg); background:var(--stone-900); color:var(--white); padding:8px 14px; font-size:13px; font-weight:700; font-family:var(--font-sans); }
.btn-advance:hover { background:var(--stone-800); }
.btn-advance .ic { width:14px; height:14px; }
.adv-chips { display:inline-flex; gap:5px; }
.adv-chips form { margin:0; display:inline-flex; }
.adv-chip { border:0; cursor:pointer; background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-300); color:var(--stone-600); font:700 12px/1 var(--font-sans); padding:6px 10px; border-radius:var(--radius-pill); }
.adv-chip:hover { background:var(--stone-50); color:var(--stone-800); }
.testpanel-hint { font-size:11px; color:var(--amber-600); margin:9px 0 0; }

/* (B) Current card — in-progress state (Open ↗ started the Stopwatch). Calm, non-pressuring; NO
   seconds counter for real students (the reading is test-panel-only). */
.studying-badge { display:inline-flex; align-items:center; gap:8px; margin:0 0 16px; padding:9px 14px; border-radius:var(--radius-pill); background:var(--emerald-50); color:var(--emerald-600); font-size:13px; font-weight:700; }
.studying-badge .pulse { width:8px; height:8px; border-radius:var(--radius-pill); background:var(--emerald-500); }
.btn-reopen { display:inline-flex; align-items:center; gap:8px; border-radius:var(--radius-xl); background:transparent; color:var(--stone-700); box-shadow:inset 0 0 0 1.5px var(--stone-300); padding:12px 18px; font-size:15px; font-weight:700; text-decoration:none; }
.btn-reopen:hover { background:var(--stone-50); }
.btn-reopen .ic { width:16px; height:16px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * TOPICAL PRACTICE (redojo-0012) — the exercise card (DO→MARK) + its atom-level Stopwatch row, on
 * the Session Runner. The exercise card IS the .lesson-card (shared left-accent, radius, shadow,
 * eyebrow, kicker, title) as a sibling of Present-lesson; only the .ex-*/.mark-*/.btn-gotit/.btn-notyet
 * /.btn-idid additions below are new. No new token — stone + emerald + the subject --accent/--tint/
 * --ic-text via .s-*. kata-0026: var() only, no raw #hex. Reuses .lesson-card / .lesson-eyebrow /
 * .lesson-kicker / .lesson-title / .lesson-lead / .lesson-hint / .btn-open / .btn-reopen /
 * .studying-badge / .daydone / .lesson-row.is-done / .testpanel / .sw-row / .stub / .icon-chip. */

/* metadata chips — variant · tier · number · marks · set (the composed exercise facts) */
.ex-meta { display:flex; flex-wrap:wrap; gap:8px; margin:0 0 22px; }
.ex-chip { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; padding:5px 11px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); }
.ex-chip .ic { width:13px; height:13px; }
.ex-chip.is-set { background:var(--tint); color:var(--ic-text); }        /* the set label — subject-tinted */
.ex-chip.is-marks { color:var(--color-text); }
.ex-chip .k { color:var(--color-text-faint); font-weight:700; }

/* block-position line ("Exercise 1 of N") — quiet order context (later Atoms order-locked, not shown) */
.ex-pos { display:flex; align-items:center; gap:7px; font-size:12.5px; font-weight:700; color:var(--color-text-faint); margin:0 0 18px; }
.ex-pos .ic { width:14px; height:14px; }
.ex-pos b { color:var(--color-text-muted); }

/* MARK phase — "How did it go?" + the binary self-mark */
.mark-q { font-family:var(--font-display); font-weight:700; font-size:21px; letter-spacing:-.01em; margin:2px 0 16px; }
.mark-actions { display:flex; flex-wrap:wrap; gap:12px; align-items:center; }
/* Got it — filled emerald. Distinguished from Not yet by FILL + the check icon. */
.btn-gotit { display:inline-flex; align-items:center; gap:8px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--emerald-500); color:var(--white); padding:13px 22px; font-size:15px; font-weight:700; font-family:var(--font-sans); }
.btn-gotit:hover { background:var(--emerald-600); }
.btn-gotit .ic { width:17px; height:17px; }
/* Not yet — OUTLINED (not colour-only): white fill, stone border, a distinct rotate glyph. */
.btn-notyet { display:inline-flex; align-items:center; gap:8px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--white); color:var(--stone-700); box-shadow:inset 0 0 0 1.5px var(--stone-300); padding:13px 22px; font-size:15px; font-weight:700; font-family:var(--font-sans); }
.btn-notyet:hover { background:var(--stone-50); box-shadow:inset 0 0 0 1.5px var(--stone-400); }
.btn-notyet .ic { width:16px; height:16px; }
/* "I've done the exercise →" — the DO→MARK forward primary (reuses the .btn-open dark idiom as a button) */
.btn-idid { display:inline-flex; align-items:center; gap:9px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:13px 22px; font-size:15px; font-weight:700; font-family:var(--font-sans); }
.btn-idid:hover { background:var(--stone-800); }
.btn-idid .ic { width:17px; height:17px; }

/* advisory "check the mark scheme ↗" — quiet link under the mark buttons */
.peek-link { display:inline-flex; align-items:center; gap:7px; margin-top:14px; font-size:13px; font-weight:700; color:var(--stone-500); text-decoration:none; }
.peek-link:hover { color:var(--stone-800); }
.peek-link .ic { width:14px; height:14px; }
.mark-hint { font-size:12.5px; color:var(--color-text-faint); margin:16px 0 0; }

/* block-complete summary — the questions worked, reusing the .lesson-row.is-done idiom (a neutral tick
   = attempted, NOT an outcome tally — clean·gap is deferred). Sits inside the .daydone terminal panel. */
.ex-summary { width:100%; max-width:460px; margin:22px auto 0; display:flex; flex-direction:column; gap:8px; text-align:left; }
.ex-sum-cap { font-size:11px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 2px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * WEEK (screen) — redojo-p2-day-activity-composition ②′ (the read-only weekly Plan view, route /week).
 *
 * APPEND-ONLY (transcoded from the Designer's v2.1 handoff — tokens-week-additions.css). Edits NO existing
 * rule. No new token — stone + amber + the --s-* subject accent (--accent/--tint/--dot/--ic-text) + existing
 * radii/shadows/fonts. kata-0026: var() only, no raw #hex. Status is NEVER colour-only — always icon + word too
 * (WCAG-AA; the ghosted-planned label uses --color-text-muted, never --color-text-faint, to stay above the floor).
 *
 * Reuses as-is: .site-header / .brand / .nav / .account-menu + .account-pop* · .icon-chip · .badge-stone ·
 * .avatar · .btn/.btn-primary · the .s-* subject accents · .stub*. Only the .shell-wide exception + the .wk-*
 * classes below are new.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* /week WIDE exception (0084-sanctioned — the deliberate case AppShellConfig.Wide reserves): header AND content
   AND footer widen together (1100 → 1320) via the .shell-wide modifier on <body>, so their edges stay aligned
   and the header never jumps. Scoped to .shell-wide, so every other screen stays at 1100. */
.shell-wide .shell-header, .shell-wide .shell-content, .shell-wide .shell-footer { max-width:1320px; }

/* ── WEEK screen — redojo-week-ui-ux-review (Designer-led review + the unified card & drawer) ──
   Transcoded from the Designer's verified preview (reDojo_v1_36). ONE card grammar (activity-type chip
   .atchip .t-* over a subject-hue border · label · light summary), the SAME grammar the runner uses;
   past/now/future differ by STYLE, not format (no more past-lessons tally). ONE drawer for lesson ·
   topical · mixed, with a per-type body + the shared exerciseRow. tokens/var() only (kata-0026); status
   is never colour-alone. Supersedes the ②′ tally/now-line section. */

/* page intro */
  .wk-head { display:flex; align-items:flex-start; justify-content:space-between; gap:20px; flex-wrap:wrap; margin-bottom:4px; }
  .wk-head h1 { font-size:30px; }
  .wk-sub { font-size:14.5px; color:var(--color-text-muted); margin:7px 0 0; max-width:44rem; line-height:1.5; }

  /* week navigator — prev / window / next (+ This week). Read-only: each issues GET /week?week=… (SSR). */
  .wk-weeknav { display:inline-flex; align-items:center; gap:5px; margin-top:2px; }
  .wk-weeknav .navbtn { width:34px; height:34px; border-radius:var(--radius-lg); border:0; background:var(--color-surface); box-shadow:var(--shadow-sm); color:var(--color-text-muted); cursor:pointer; display:grid; place-items:center; }
  .wk-weeknav .navbtn:hover:not(:disabled) { background:var(--stone-100); color:var(--color-text); }
  .wk-weeknav .navbtn:disabled { opacity:.4; cursor:not-allowed; }
  .wk-weeknav .navbtn:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
  .wk-weeknav .navbtn .ic { width:16px; height:16px; }
  .wk-window { display:inline-flex; align-items:center; gap:8px; font-size:13px; font-weight:700; color:var(--color-text); background:var(--color-surface); box-shadow:var(--shadow-sm); border-radius:var(--radius-pill); padding:8px 15px; }
  .wk-window .ic { width:14px; height:14px; color:var(--color-text-faint); }
  .wk-thisweek { margin-left:3px; font-size:12.5px; font-weight:700; color:var(--color-text-muted); background:transparent; border:0; cursor:pointer; padding:8px 11px; border-radius:var(--radius-lg); }
  .wk-thisweek:hover { background:var(--stone-100); color:var(--color-text); }
  .wk-thisweek:disabled { opacity:.35; cursor:default; }
  .wk-thisweek:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }

  /* legend — how to read done / now / planned + the activity types */
  .wk-legend { display:flex; flex-wrap:wrap; gap:9px 20px; align-items:center; margin:20px 0 22px; padding:13px 17px; background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); }
  .wk-leg { display:inline-flex; align-items:center; gap:8px; font-size:12px; font-weight:700; color:var(--color-text-muted); }
  .wk-leg .sw { width:24px; height:17px; border-radius:6px; flex:none; display:grid; place-items:center; }
  .wk-leg .sw.done { background:var(--s-indigo-tint); box-shadow:inset 0 0 0 1.5px var(--s-indigo-accent); color:var(--s-indigo-ic); }
  .wk-leg .sw.now { background:var(--white); box-shadow:inset 0 0 0 1.5px var(--amber-400); }
  .wk-leg .sw.now .live { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--amber-500); }
  .wk-leg .sw.planned { background:var(--white); box-shadow:inset 0 0 0 1.5px var(--stone-300); border:1px dashed var(--stone-400); }
  .wk-leg .sw .ic { width:11px; height:11px; }
  .wk-leg .tdot { width:10px; height:10px; border-radius:3px; flex:none; }
  .wk-leg .sep { width:1px; height:20px; background:var(--stone-200); }
  .wk-leg-note { font-size:11.5px; font-weight:600; color:var(--color-text-faint); flex-basis:100%; }

  /* the week grid — 7 day columns, past → now → future */
  .wk-grid { display:grid; grid-template-columns:repeat(7, minmax(0, 1fr)); gap:9px; align-items:start; }
  .wk-col { display:flex; flex-direction:column; min-width:0; border-radius:var(--radius-2xl); padding:8px 7px 12px; min-height:300px; }
  .wk-col.is-today { background:var(--amber-50); box-shadow:inset 0 0 0 1.5px var(--amber-400); }
  .wk-col.is-rest { opacity:.7; }

  .wk-colhead { padding:5px 5px 11px; }
  .wk-dow { font-size:10px; font-weight:800; letter-spacing:.08em; text-transform:uppercase; color:var(--color-text-faint); }
  .wk-col.is-today .wk-dow { color:var(--amber-600); }
  .wk-date { font-family:var(--font-display); font-weight:700; font-size:17px; color:var(--color-text); margin-top:1px; }
  .wk-daymeta { font-size:11px; font-weight:600; color:var(--color-text-muted); margin-top:3px; display:inline-flex; align-items:center; gap:5px; }
  .wk-daymeta .live { width:6px; height:6px; border-radius:var(--radius-pill); background:var(--amber-500); }

  .wk-stack { display:flex; flex-direction:column; gap:7px; }

  /* ── THE UNIFIED ACTIVITY CARD (week = the narrow-column layout of the shared grammar) ──
     grammar (identical to the runner .act): subject-hue left border · activity-type chip .atchip .t-* ·
     label · light summary. done/now/planned differ by style. */
  .wk-card { position:relative; text-align:left; width:100%; border:0; cursor:pointer; background:var(--color-surface);
    border-radius:var(--radius-xl); box-shadow:var(--shadow-sm); border-left:4px solid var(--accent); min-height:122px;
    padding:9px 10px; display:flex; flex-direction:column; gap:6px; transition:box-shadow .14s, transform .14s; font-family:var(--font-sans); }
  .wk-card:hover { box-shadow:var(--shadow-md); transform:translateY(-1px); }
  .wk-card:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
  .wk-card-top { display:flex; align-items:center; flex-wrap:wrap; gap:5px; }
  .wk-card .atchip { font-size:10px; padding:3px 8px 3px 6px; gap:4px; }
  .wk-card .atchip .ic { width:12px; height:12px; }
  /* label takes the slack so the meta line sits at the card foot, cards align regardless of label length */
  .wk-card-label { flex:1 0 auto; font-size:12.5px; font-weight:700; color:var(--color-text); line-height:1.25; }
  .wk-card-meta { font-size:10.5px; font-weight:600; color:var(--color-text-muted); display:flex; flex-wrap:wrap; align-items:baseline; gap:1px 6px; }
  .wk-card-meta .subj { font-weight:800; color:var(--ic-text); }
  .wk-card-meta .cnt { color:var(--color-text-muted); }
  .wk-card.is-planned .wk-card-meta .cnt { color:var(--color-text-faint); }
  .wk-card-outcome { display:flex; flex-wrap:wrap; gap:4px; }
  .wk-card-outcome .oc { display:inline-flex; align-items:center; gap:3px; font-size:10px; font-weight:800; padding:2px 7px; border-radius:var(--radius-pill); }
  .wk-card-outcome .oc .ic { width:11px; height:11px; }
  .wk-card-outcome .oc.got { background:var(--emerald-50); color:var(--emerald-600); }
  .wk-card-outcome .oc.gap { background:var(--stone-100); color:var(--color-text-muted); }
  /* status badge — icon-only in the card (word kept in the drawer + aria-label). Distinct shape, never colour alone. */
  .wk-status { margin-left:auto; width:21px; height:21px; border-radius:var(--radius-pill); display:grid; place-items:center; background:var(--stone-100); color:var(--color-text-muted); flex:none; }
  .wk-status .ic { width:12px; height:12px; display:block; }
  .wk-status .ic.wk-tick { transform:translateX(-0.75px); }

  /* DONE (past) — filled subject tint, ✓ ; settled and quiet */
  .wk-card.is-done { background:var(--tint); box-shadow:none; }
  .wk-card.is-done .wk-status { background:var(--color-surface); color:var(--emerald-600); }
  .wk-card.is-done .wk-card-label { color:var(--color-text); }
  /* NOW (today, current) — amber ring + live dot ; the single live thing (no wall-clock) */
  .wk-card.is-now { box-shadow:inset 0 0 0 2px var(--amber-400), var(--shadow-sm); }
  .wk-card.is-now .wk-status { background:var(--white); box-shadow:inset 0 0 0 1.5px var(--amber-400); }
  .wk-live { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--amber-500); box-shadow:0 0 0 0 var(--amber-400); animation:wkpulse 1.9s ease-out infinite; flex:none; }
  @keyframes wkpulse { 0%{box-shadow:0 0 0 0 rgba(245,158,11,.5)} 100%{box-shadow:0 0 0 7px rgba(245,158,11,0)} }
  @media (prefers-reduced-motion:reduce){ .wk-live{ animation:none; } }
  /* PLANNED (future) — dashed outline + clock ; the plan, still an outline */
  .wk-card.is-planned { background:var(--color-surface); box-shadow:none; border-left-color:var(--accent);
    outline:1.5px dashed var(--stone-300); outline-offset:-1.5px; }
  .wk-card.is-planned .wk-card-label { color:var(--color-text); }
  .wk-card.is-planned .wk-card-meta { color:var(--color-text-faint); }

  /* rest / caught-up column notes */
  .wk-note { margin:auto 2px; padding:16px 8px; text-align:center; font-size:11.5px; font-weight:600; color:var(--color-text-faint); display:flex; flex-direction:column; align-items:center; gap:8px; line-height:1.4; }
  .wk-note .ic { width:20px; height:20px; color:var(--stone-300); }
  /* rest-day-today (redojo-week-today-marker-on-rest-day) — a Rest column that is today keeps the amber today
     affordance while still reading as a rest day. Reuses amber + stone (no new colour). Today wins the .72 rest
     dim so the marker holds AA; the moon note warms to amber; a "Today" pill (shape + word, not colour alone). */
  .wk-col.is-today.is-rest { opacity:1; }
  .wk-col.is-today.is-rest .wk-note { color:var(--amber-600); font-weight:700; }
  .wk-col.is-today.is-rest .wk-note .ic { color:var(--amber-500); }
  .wk-col.is-today.is-rest .wk-today-pill { display:inline-flex; }
  .wk-today-pill { display:none; align-items:center; gap:5px; font:800 9.5px/1 var(--font-sans); letter-spacing:.05em; text-transform:uppercase; color:var(--stone-900); background:var(--amber-400); border-radius:9999px; padding:3px 8px; margin-top:5px; }
  .wk-today-pill .dot { width:5px; height:5px; border-radius:50%; background:var(--stone-900); }
  /* caught-up card — the single "all caught up" message (today column), not repeated per empty day */
  .wk-caught { display:flex; flex-direction:column; gap:9px; padding:14px 12px; border-radius:var(--radius-xl); background:var(--color-surface); box-shadow:var(--shadow-sm); }
  .wk-caught .wk-caught-ic { width:30px; height:30px; border-radius:var(--radius-pill); background:var(--emerald-50); color:var(--emerald-600); display:grid; place-items:center; }
  .wk-caught .wk-caught-ic .ic { width:16px; height:16px; }
  .wk-caught-txt b { display:block; font-family:var(--font-display); font-weight:700; font-size:13px; color:var(--color-text); }
  .wk-caught-txt span { display:block; font-size:11px; color:var(--color-text-muted); margin-top:3px; line-height:1.35; }

  /* ── read-only drill-down drawer (atoms of the selected activity) — ONE component, all types ── */
  .wk-scrim { position:fixed; inset:0; z-index:40; background:rgb(28 25 23 / .38); opacity:0; pointer-events:none; transition:opacity .2s; }
  .wk-scrim.open { opacity:1; pointer-events:auto; }
  .wk-panel { position:fixed; top:0; right:0; z-index:41; height:100%; width:412px; max-width:92vw; background:var(--color-surface);
    box-shadow:var(--shadow-lg); transform:translateX(100%); transition:transform .24s cubic-bezier(.4,0,.2,1);
    display:flex; flex-direction:column; }
  .wk-panel.open { transform:translateX(0); }
  .wk-panel-head { padding:22px 22px 18px; border-bottom:1px solid var(--stone-100); border-left:5px solid var(--accent); }
  .wk-panel-top { display:flex; align-items:flex-start; justify-content:space-between; gap:12px; }
  .wk-panel-eyebrow { display:flex; align-items:center; gap:8px; margin-bottom:11px; flex-wrap:wrap; }
  .wk-panel-status { display:inline-flex; align-items:center; gap:4px; font-size:10px; font-weight:800; letter-spacing:.03em; text-transform:uppercase; padding:3px 9px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); }
  .wk-panel-status .ic { width:12px; height:12px; }
  .wk-panel-status.is-done { background:var(--emerald-50); color:var(--emerald-600); }
  .wk-panel-status.is-now { background:var(--amber-400); color:var(--stone-900); }
  .wk-panel-status .live { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--amber-500); }
  .wk-panel h2 { font-family:var(--font-display); font-weight:700; font-size:21px; line-height:1.15; margin:2px 0 0; letter-spacing:-.01em; }
  .wk-panel-meta { display:flex; flex-wrap:wrap; align-items:center; gap:7px; margin-top:11px; font-size:12px; color:var(--color-text-muted); }
  .wk-panel-meta .subj { display:inline-flex; align-items:center; gap:6px; font-weight:800; color:var(--ic-text); }
  .wk-panel-meta .subj .dot { width:8px; height:8px; border-radius:var(--radius-pill); background:var(--dot); flex:none; }
  .wk-close { flex:none; width:34px; height:34px; border-radius:var(--radius-lg); border:0; background:var(--stone-100); color:var(--color-text-muted); cursor:pointer; display:grid; place-items:center; }
  .wk-close:hover { background:var(--stone-200); color:var(--color-text); }
  .wk-close:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
  .wk-close .ic { width:17px; height:17px; }

  .wk-panel-body { padding:16px 22px 26px; overflow-y:auto; }
  /* summary strip (per-type headline numbers) */
  .wk-sumstrip { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:18px; }
  .wk-sumstat { flex:1; min-width:88px; background:var(--stone-50); border-radius:var(--radius-xl); padding:11px 13px; }
  .wk-sumstat b { display:block; font-family:var(--font-display); font-weight:700; font-size:19px; color:var(--color-text); line-height:1; }
  .wk-sumstat.got b { color:var(--emerald-600); }
  .wk-sumstat.gap b { color:var(--color-text); }
  .wk-sumstat span { display:block; font-size:10.5px; font-weight:700; letter-spacing:.02em; text-transform:uppercase; color:var(--color-text-faint); margin-top:6px; }

  .wk-atoms-cap { font-size:11px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 6px; }
  .wk-atom { display:flex; gap:12px; padding:15px 0; border-top:1px solid var(--stone-100); }
  .wk-atom:first-of-type { border-top:0; }
  .wk-atom.done .wk-atom-n { background:var(--emerald-50); color:var(--emerald-600); }
  .wk-atom-n { flex:none; width:25px; height:25px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); font-size:11px; font-weight:800; display:grid; place-items:center; }
  .wk-atom-n .ic { width:14px; height:14px; }
  .wk-atom-main { min-width:0; flex:1; }
  .wk-atom-title { font-size:13.5px; font-weight:700; color:var(--color-text); line-height:1.3; }
  .wk-atom-path { font-size:12px; color:var(--color-text-muted); margin-top:3px; display:inline-flex; align-items:center; gap:5px; flex-wrap:wrap; }
  .wk-atom-path .chev { color:var(--stone-300); }
  .wk-atom-path .src { font-weight:700; color:var(--ic-text); }
  .wk-atom-chips { display:flex; flex-wrap:wrap; gap:6px; margin-top:9px; }
  .wk-atchip2 { display:inline-flex; align-items:center; gap:4px; font-size:11px; font-weight:700; padding:3px 8px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); }
  .wk-atchip2.is-set { background:var(--tint); color:var(--ic-text); }
  .wk-atchip2 .k { color:var(--color-text-faint); font-weight:800; }
  /* per-atom durations — Est (always) + Took (past only) */
  .wk-atom-durs { display:flex; flex-wrap:wrap; gap:5px 16px; margin-top:11px; }
  .dur { display:inline-flex; align-items:center; gap:5px; font-size:11.5px; font-weight:700; }
  .dur .ic { width:13px; height:13px; }
  .dur .lbl { font-size:9.5px; font-weight:800; text-transform:uppercase; letter-spacing:.04em; color:var(--color-text-faint); }
  .dur.est { color:var(--color-text-muted); }
  .dur.took { color:var(--color-text); }
  /* outcome (topical/mixed) — Got it / Revisit / Planned; colour + WORD, never colour alone */
  .wk-atom-outcome { flex:none; align-self:flex-start; display:inline-flex; align-items:center; gap:4px; font-size:10.5px; font-weight:800; text-transform:uppercase; letter-spacing:.02em; }
  .wk-atom-outcome .ic { width:14px; height:14px; }
  .wk-atom-outcome.got { color:var(--emerald-600); }
  .wk-atom-outcome.gap { color:var(--color-text); }
  .wk-atom-outcome.planned { color:var(--color-text-faint); }
  /* per-atom content link → opens the exact SME page in a new tab (read-only for the plan) */
  .wk-atom-open { flex:none; align-self:center; display:inline-flex; align-items:center; gap:5px; font-size:11.5px; font-weight:700; color:var(--stone-500); text-decoration:none; padding:6px 11px; border-radius:var(--radius-lg); background:var(--color-surface); box-shadow:inset 0 0 0 1px var(--stone-200); white-space:nowrap; transition:background .14s, color .14s, box-shadow .14s; }
  .wk-atom-open:hover { color:var(--color-text); background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-300); }
  .wk-atom-open:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
  .wk-atom-open .ic { width:13px; height:13px; }
  .wk-atom-side { flex:none; display:flex; flex-direction:column; align-items:flex-end; gap:9px; }
  .wk-atom-side .wk-atom-outcome { align-self:flex-end; }
  .wk-panel-foot { margin-top:18px; padding-top:14px; border-top:1px solid var(--stone-100); font-size:11.5px; color:var(--color-text-faint); display:flex; align-items:center; gap:7px; line-height:1.4; }
  .wk-panel-foot .ic { width:14px; height:14px; flex:none; }

  /* empty-state (no enrolment / empty plan) — echoes today--finish-setup */
  .wk-empty { max-width:440px; margin:64px auto; text-align:center; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-md); padding:44px 36px; }
  .wk-empty .em-badge { width:60px; height:60px; border-radius:var(--radius-2xl); background:var(--s-indigo-tint); color:var(--s-indigo-ic); display:grid; place-items:center; margin:0 auto 18px; }
  .wk-empty .em-badge .ic { width:28px; height:28px; }
  .wk-empty h2 { font-family:var(--font-display); font-weight:700; font-size:22px; margin:0 0 8px; }
  .wk-empty p { font-size:14px; color:var(--color-text-muted); margin:0 auto 22px; max-width:30rem; line-height:1.5; }

/* ═══════════════════════════════════════════════════════════════════════════
 * redojo-exercise-card-fixes · Part B — "Topical practice done" summary legibility.
 * The ONLY design change: the .ex-summary rows on runnerExerciseComplete —
 *   (1) a "Not yet" row reads DISTINCT from "Got it" (NOT colour-alone: rotate glyph + "Not yet" label);
 *   (2) each row surfaces its Calc / Non-calc Variant; (3) footer = Continue (primary) + schedule (secondary).
 *
 * APPEND-ONLY. Paste at the END of internal/web/static/tokens.css (after the redojo-0012 TOPICAL
 * PRACTICE section). Reuses .lesson-row / .lr-* / .is-done AS-IS; adds .is-notyet + .lr-variant.
 * No new token — stone + emerald + amber. kata-0026: var() only, no raw #hex.
 *
 * ⚠ TWO one-line edits to EXISTING rules (marked below), not just additions:
 *   • `.daydone-foot` gains flex (was margin-only) to hold two centered actions — Day-complete's single
 *     button stays centered, so it's safe.
 *   • the "Got it" tail gains icon+label layout so it mirrors "Not yet" (both carry a word, not just a tick).
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ⚠ EDIT the existing `.daydone-foot` rule → flex row (holds Continue + View your schedule) */
.daydone-foot { display:flex; gap:12px; justify-content:center; align-items:center; flex-wrap:wrap; }
.daydone-foot .btn-primary .ic { width:16px; height:16px; }

/* ⚠ EDIT: the "Got it" summary tail becomes icon+label (was a bare tick) so it mirrors "Not yet" */
.ex-summary .lesson-row.is-done .lr-tail { display:inline-flex; align-items:center; gap:5px; }

/* NEW — "Not yet" row: soft amber, NOT colour-alone (a rotate glyph + the word "Not yet" carry it too) */
.lesson-row.is-notyet { background:var(--amber-50); box-shadow:inset 0 0 0 1px var(--amber-400); }
.lesson-row.is-notyet .lr-idx { background:var(--amber-400); color:var(--stone-900); }
.lesson-row.is-notyet .lr-idx .ic { width:15px; height:15px; }
.lesson-row.is-notyet .lr-title { color:var(--color-text); font-weight:700; }
.lesson-row.is-notyet .lr-tail { color:var(--amber-600); display:inline-flex; align-items:center; gap:5px; }
.lesson-row.is-notyet .lr-tail .ic { width:15px; height:15px; }

/* NEW — the Calc / Non-calc Variant chip on each row's place line (so two Variants ≠ a dupe) */
.ex-summary .lr-place { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.lr-variant { display:inline-flex; align-items:center; padding:1px 8px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--stone-600); font-size:11px; font-weight:700; }
.is-notyet .lr-variant { background:var(--white); }

/* ═════════════════════════════════════════════════════════════════
 * redojo-runner-day-rail (A1) — the read-only Day-overview rail on /runner.
 * A rail ALONGSIDE the unchanged Runner center, REUSING the Week (②′) card + drawer surface. So the
 * ONLY new CSS is the two-region LAYOUT container + the narrow/mobile FALLBACK + a few quiet rail-frame
 * classes. Everything the rail CONTAINS is already committed: the activity card (.wk-card*), the atom
 * drawer (.wk-panel* / .wk-atom* — weekPanelInner/weekDrawer), the disclosure island (weekDrillIsland,
 * reused verbatim), and the center (.runner / .lesson-* / .stub / .daydone — UNTOUCHED). NO new token,
 * NO raw #hex — var() only. Status stays icon + word + shape (never colour alone), AA.
 * ═════════════════════════════════════════════════════════════════ */

/* the two-region composition — LEFT rail + the unchanged center, INSIDE the standard 1100 shell
   (302 + 34 gap + ~764 center). .runner keeps its own max-width:720 + margin-inline:auto, so the card
   stays centred (the hero) in its column — the shell width does NOT change (no Wide, unlike Week). */
.runner-layout { display:grid; grid-template-columns:302px minmax(0,1fr); gap:34px; align-items:start;
  max-width:1100px; margin-inline:auto; }

/* the rail — a QUIET sticky overview column, not a competing panel: sits on the page bg, no heavy fill */
.day-rail { position:sticky; top:20px; display:flex; flex-direction:column; gap:12px; min-width:0; }
.rail-frame { border:0; padding:0; margin:0; }               /* a <details>: forced-open on desktop (below) */
.rail-head { display:flex; flex-direction:column; gap:9px; padding:2px 2px 4px; }
.rail-eyebrow { display:inline-flex; align-items:center; gap:7px; font-size:11px; font-weight:800;
  letter-spacing:.07em; text-transform:uppercase; color:var(--color-text-faint); list-style:none; }
.rail-eyebrow .ic { width:14px; height:14px; color:var(--color-text-faint); }
.rail-eyebrow::-webkit-details-marker { display:none; }

/* the progress line — "N done · M to go" (AC3: done work is COUNTED, never re-listed as a remaining card) */
.rail-progress { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:12px; font-weight:600; color:var(--color-text-muted); }
.rail-done { display:inline-flex; align-items:center; gap:5px; font-weight:800; color:var(--emerald-600); }
.rail-done .ic { width:14px; height:14px; }
.rail-sep { color:var(--color-text-faint); }
.rail-togo { font-weight:700; color:var(--color-text); }

/* the card stack — REUSED .wk-card verbatim, one per REMAINING activity (now first, then planned) */
.rail-cards { display:flex; flex-direction:column; gap:9px; }

/* PAST activities — dev placeholder (descoped in A1; built later as done cards above the now-line) */
.rail-stub { margin-bottom:11px; }
.rail-stub-body { font-size:12px; font-weight:600; color:var(--color-text-muted); line-height:1.45; }

/* the rail's caught-up / empty note (the center carries Day-complete — AC4) */
.rail-empty { display:flex; flex-direction:column; align-items:flex-start; gap:8px; padding:18px 15px;
  border-radius:var(--radius-2xl); background:var(--stone-100); }
.rail-empty .re-ic { width:34px; height:34px; border-radius:var(--radius-xl); background:var(--emerald-50); color:var(--emerald-600); display:grid; place-items:center; }
.rail-empty .re-ic .ic { width:19px; height:19px; }
.rail-empty .re-t { font-size:13.5px; font-weight:800; color:var(--color-text); }
.rail-empty .re-s { font-size:12px; font-weight:600; color:var(--color-text-muted); }

/* chevron on the narrow collapsible summary — hidden on desktop (the rail is always open there) */
.rail-chev { margin-left:auto; width:16px; height:16px; color:var(--color-text-faint); transition:transform .18s; display:none; }

/* DESKTOP — the <details> rail is forced open + its summary is a plain (non-clickable) header.
   The ship forces open via a small rail island (mirrors weekDrillIsland): rail.open = matchMedia('(min-width:901px)'). */
@media (min-width: 901px) {
  .rail-head { cursor:default; }
}

/* ── NARROW / MOBILE fallback ──────────────────────────────────────
   Below 900px the rail collapses to a CLOSED-by-default summary bar ABOVE the center, so the center's
   actionable card is never buried. Tapping the summary discloses the card stack (native <details>). */
@media (max-width: 900px) {
  .runner-layout { grid-template-columns:1fr; gap:14px; }
  .day-rail { position:static; }
  .rail-frame { background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:6px 4px; }
  .rail-head { padding:10px 12px; cursor:pointer; }
  .rail-eyebrow { flex-direction:row; }
  .rail-chev { display:block; }
  .rail-frame[open] .rail-chev { transform:rotate(180deg); }
  .rail-cards, .rail-empty { margin:2px 10px 10px; }
}

/* ═════════════════════════════════════════════════════════════════════════
 * redojo-package-inspection-view — Package inspector (GET /catalog/{key}) + the one
 * Catalog-browse addition (the "View contents" affordance). APPEND-ONLY; edits no existing rule.
 * kata-0026: var() only, no raw #hex. TRANSCODED from the Designer's verified HTML (HANDOFF-v2.1),
 * with two transcode corrections: (1) the subject-accent vars are --ic-text / --tint (the Designer's
 * package wrote the non-existent --s-ic / --s-tint); (2) .pnl-admin renders when present (the block is
 * HANDLER-gated by showAdmin, so student markup never carries it — the preview's body.admin gate is
 * dropped). The mock completion/attempt overlay (tree % chips, tier Done column, sub-detail slide-over,
 * estimate⇔actual) is DROPPED for read-only v1 (PO 2026-07-09); its CSS is omitted, a follow-up queued.
 * Reuses the app shell, .icon-chip, .chip, the --accent/--tint/--ic-text subject accents, radii/shadows,
 * and the fixed --s-sky-* / --s-rose-dot role palette. Detail panel = the Week wk-panel family: docked
 * desktop / drawer narrow. ═════════════════════════════════════════════════════════════════════════ */

/* ── the Catalog-browse addition: a quiet "View contents" affordance beside Enrol, via .edition-actions ── */
.edition-actions { display:flex; align-items:center; gap:8px; margin-left:auto; flex:none; }
.view-contents { display:inline-flex; align-items:center; gap:6px; text-decoration:none;
  font:700 11px/1 var(--font-sans); color:var(--stone-600);
  background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border-radius:var(--radius-pill); padding:7px 13px;
  transition:background .15s, color .15s, box-shadow .15s; white-space:nowrap; }
.view-contents:hover { background:var(--stone-50); color:var(--stone-800); box-shadow:inset 0 0 0 1px var(--stone-300); }
.view-contents:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.view-contents .ic { width:13px; height:13px; color:var(--color-text-faint); }
.view-contents:hover .ic { color:inherit; }
.edition-main .edition-actions { margin-left:auto; }
.subject-card.wide .edition:not(.has-exam) { flex-direction:column; align-items:stretch; gap:12px; }
.subject-card.wide .edition:not(.has-exam) .edition-actions { margin-left:0; }
.subject-card.wide .edition.has-exam .edition-main { flex-direction:column; align-items:stretch; gap:12px; }
.subject-card.wide .edition.has-exam .edition-main .edition-actions { margin-left:0; }

/* ── inspector page header ── */
.insp-crumb { display:flex; align-items:center; gap:7px; font-size:13px; color:var(--color-text-muted); margin-bottom:6px; }
.insp-crumb a { display:inline-flex; align-items:center; gap:4px; color:var(--color-text-muted); text-decoration:none; }
.insp-crumb a:hover { color:var(--color-text); }
.insp-crumb .ic { width:14px; height:14px; }
.insp-crumb .sep { color:var(--color-text-faint); }
.insp-title { display:flex; align-items:flex-start; gap:14px; margin-bottom:18px; }
.insp-title .icon-chip { width:44px; height:44px; font-size:18px; border-radius:var(--radius-xl); flex:none; }
.insp-title h1 { font-size:27px; }
.insp-title .sub { margin-top:9px; display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.meta-src { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--ic-text); background:var(--tint); border-radius:var(--radius-pill); padding:4px 11px; }
.meta-src .ic { width:13px; height:13px; }
.meta-chip { font-size:12px; font-weight:600; color:var(--color-text-muted); background:var(--stone-100); border-radius:var(--radius-pill); padding:4px 10px; }
.meta-chip.subtle { background:transparent; border:1px solid var(--stone-200); }

/* ── master–detail layout: tree + docked panel (persistent desktop) ── */
.insp { display:grid; grid-template-columns:minmax(0,1fr) 424px; gap:20px; align-items:start; }

/* the tree (master) — LIGHT rows, native <details>/<summary> (no-JS), one glance signal each */
.insp-tree { background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:8px; }
.insp-tree-head { display:flex; align-items:center; justify-content:space-between; padding:10px 12px 8px; }
.insp-tree-head .k { font-size:11px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); }
.insp-tree-head .hint { font-size:12px; color:var(--color-text-muted); }
details.tnode > summary { list-style:none; }
details.tnode > summary::-webkit-details-marker { display:none; }
.trow { display:grid; grid-template-columns:20px 22px minmax(0,1fr) auto; align-items:center; gap:8px;
  width:100%; text-align:left; border:0; background:transparent; cursor:pointer; border-radius:var(--radius-lg);
  padding:8px 10px; font:600 14px/1.3 var(--font-sans); color:var(--color-text); }
.trow:hover { background:var(--stone-100); }
.trow.is-selected { background:var(--tint); box-shadow:inset 3px 0 0 var(--ic-text); }
.trow:focus-visible { outline:2px solid var(--color-ink); outline-offset:-2px; }
.tcaret { display:grid; place-items:center; width:20px; height:20px; border-radius:var(--radius-lg); color:var(--color-text-faint); }
.tcaret .ic { width:15px; height:15px; transition:transform .15s; }
details.tnode[open] > summary .tcaret .ic { transform:rotate(90deg); }
.tcaret.leaf { visibility:hidden; }
.tglyph { display:grid; place-items:center; width:22px; height:22px; border-radius:6px; color:var(--color-text-muted); background:var(--stone-100); }
.tglyph.is-lesson { color:var(--s-sky-ic); background:var(--s-sky-tint); }   /* lesson = FIXED sky role colour (matches the Week lesson icon), NOT the subject accent */
.tglyph.is-exset { color:var(--amber-600); background:var(--amber-50); }
.tglyph .ic { width:14px; height:14px; }
.tname { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.tglance { display:inline-flex; align-items:center; gap:5px; font-size:12px; font-weight:600; color:var(--color-text-muted); white-space:nowrap; justify-self:end; }
.tglance.chip, .tglance.effort { background:var(--stone-100); border-radius:var(--radius-pill); padding:3px 9px; }
.tglance.effort { color:var(--stone-700); }
.tglance .ic { width:12px; height:12px; }
.tchildren { padding-left:22px; border-left:1px solid var(--stone-100); margin-left:19px; }

/* the detail panel (detail) — docked desktop / drawer narrow */
.insp-scrim { position:fixed; inset:0; background:rgb(28 25 23 / .38); opacity:0; pointer-events:none; transition:opacity .2s; z-index:39; }
.insp-panel { background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm);
  position:sticky; top:20px; max-height:calc(100vh - 40px); overflow:auto; }
.pnl-head { position:relative; position:sticky; top:0; background:var(--color-surface); border-bottom:1px solid var(--stone-100);
  padding:18px 20px 15px; border-radius:var(--radius-2xl) var(--radius-2xl) 0 0; }
.pnl-back { display:inline-flex; align-items:center; gap:5px; margin-bottom:12px; padding:6px 12px 6px 8px;
  font:inherit; font-size:12.5px; font-weight:600; color:var(--ic-text); background:var(--tint);
  border:1px solid transparent; border-radius:var(--radius-pill); cursor:pointer; transition:background .15s, color .15s; }
.pnl-back:hover { background:var(--color-surface); border-color:var(--stone-100); color:var(--color-text); }
.pnl-back .ic { width:14px; height:14px; }
.pnl-close { display:none; place-items:center; width:34px; height:34px; border-radius:var(--radius-lg); border:0;
  background:var(--stone-100); color:var(--color-text); cursor:pointer; position:absolute; top:16px; right:16px; }
.pnl-close .ic { width:18px; height:18px; }
.pnl-eyebrow { display:inline-flex; align-items:center; gap:7px; font-size:11px; font-weight:700; letter-spacing:.05em;
  text-transform:uppercase; color:var(--ic-text); margin-bottom:7px; }
.pnl-eyebrow.exset { color:var(--amber-600); }
.pnl-eyebrow.lesson { color:var(--s-sky-ic); }
.pnl-eyebrow.topic { color:var(--color-text-muted); }
.pnl-eyebrow .ic { width:14px; height:14px; }
.pnl-crumb { font-size:12px; color:var(--color-text-faint); margin-bottom:6px; display:flex; flex-wrap:wrap; gap:5px; align-items:center; }
.pnl-crumb .sep { opacity:.6; }
.pnl-head h2 { font-size:19px; line-height:1.25; }
.pnl-body { padding:18px 20px 22px; }

/* design-ahead: reserved per-node edit slot (study §8.2 — NOT built; room only) */
.pnl-editslot { float:right; margin:-2px 0 0 10px; }
.pnl-editslot .reserved { display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700;
  color:var(--color-text-faint); border:1px dashed var(--stone-300); border-radius:var(--radius-pill); padding:4px 9px; opacity:.6; }
.pnl-editslot .reserved .ic { width:12px; height:12px; }

.pnl-effort { display:inline-flex; align-items:center; gap:7px; background:var(--stone-100); color:var(--stone-800);
  border-radius:var(--radius-pill); padding:8px 14px; font-size:14px; font-weight:700; }
.pnl-effort .ic { width:15px; height:15px; color:var(--color-text-muted); }
.pnl-row { display:flex; flex-wrap:wrap; gap:10px; align-items:center; margin-bottom:16px; }
.pnl-sec-k { font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text-faint); margin:20px 0 9px; }
.pnl-landing-hint { font-size:13px; color:var(--color-text-muted); margin-top:2px; }
.pnl-landing-hint .ic { width:14px; height:14px; vertical-align:-2px; }

/* stat grid (topic rollup / package counts) */
.pnl-stats { display:grid; grid-template-columns:1fr 1fr; gap:10px; }
.pnl-stat { background:var(--stone-50); border:1px solid var(--stone-100); border-radius:var(--radius-xl); padding:13px 15px; }
.pnl-stat .n { font-family:var(--font-display); font-size:24px; font-weight:700; letter-spacing:-.02em; }
.pnl-stat .l { font-size:12px; color:var(--color-text-muted); margin-top:2px; }
.pnl-stat.wide { grid-column:1 / -1; }
.pnl-stat.accent { background:var(--tint); border-color:transparent; }
.pnl-stat.accent .n { color:var(--ic-text); }
.pnl-idlist { display:grid; grid-template-columns:auto 1fr; gap:6px 16px; font-size:13px; margin-top:4px; }
.pnl-idlist dt { color:var(--color-text-faint); font-weight:600; }
.pnl-idlist dd { margin:0; color:var(--color-text); font-weight:600; }
.pnl-idlist dd.cap { text-transform:capitalize; }
.pnl-idlist dd.mono { font-family:var(--font-mono,monospace); font-size:12px; }

/* exercise-set: per-variant tabs + tier table + per-exercise marks */
.pnl-vtabs { display:flex; gap:6px; margin:4px 0 14px; flex-wrap:wrap; }
.pnl-vtab { border:1px solid var(--stone-200); background:var(--white); border-radius:var(--radius-pill);
  padding:7px 14px; font:700 13px/1 var(--font-sans); color:var(--color-text-muted); cursor:pointer; }
.pnl-vtab.on { background:var(--stone-900); color:var(--white); border-color:var(--stone-900); }
.pnl-vhead { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:10px; }
.pnl-vhead .vlabel { font-size:14px; font-weight:700; }
.pnl-link { display:inline-flex; align-items:center; gap:7px; font-size:13px; font-weight:700; color:var(--ic-text); text-decoration:none;
  border:1px solid var(--tint); background:var(--tint); border-radius:var(--radius-pill); padding:7px 13px; }
.pnl-link:hover { filter:brightness(.97); }
.pnl-link.amber { color:var(--amber-600); background:var(--amber-50); border-color:var(--amber-50); }
.pnl-link .ic { width:14px; height:14px; }
.tier-table { width:100%; border-collapse:collapse; font-size:13px; margin-bottom:6px; }
.tier-table th { text-align:left; font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color:var(--color-text-faint); padding:6px 8px; border-bottom:1px solid var(--stone-200); }
.tier-table td { padding:8px; border-bottom:1px solid var(--stone-100); }
.tier-table td.num { font-variant-numeric:tabular-nums; color:var(--color-text); font-weight:600; }
.tier-name { display:inline-flex; align-items:center; gap:8px; font-weight:700; }
.tier-dot { width:8px; height:8px; border-radius:50%; }
.tier-dot.t0 { background:var(--emerald-500); } .tier-dot.t1 { background:var(--amber-500); }
.tier-dot.t2 { background:var(--s-rose-dot); } .tier-dot.t3 { background:var(--stone-800); }
.marks-list { font-size:12px; color:var(--color-text-muted); line-height:1.9; margin-top:6px; }
.marks-list .tier-name { font-size:12px; margin-right:6px; }
.marks-list .mk { display:inline-block; background:var(--stone-100); border-radius:6px; padding:2px 7px; margin:0 4px 4px 0; font-variant-numeric:tabular-nums; }

/* 🔒 admin overlay — HANDLER-gated derivation block (rendered only when showAdmin → always shown when present) */
.pnl-admin { display:block; margin-top:20px; border:1px solid var(--stone-800); border-radius:var(--radius-xl); overflow:hidden; }
.pnl-admin-head { display:flex; align-items:center; gap:9px; background:var(--stone-900); color:var(--white); padding:10px 14px; font:700 12px/1 var(--font-sans); letter-spacing:.03em; }
.pnl-admin-head .ic { width:14px; height:14px; color:var(--amber-400); }
.pnl-admin-head .tag { margin-left:auto; font-size:10px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--stone-900); background:var(--amber-400); border-radius:var(--radius-pill); padding:3px 8px; }
.pnl-admin-body { padding:14px; }
.signal-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-bottom:12px; }
.signal { background:var(--stone-50); border:1px solid var(--stone-100); border-radius:var(--radius-lg); padding:9px 11px; }
.signal .n { font-family:var(--font-display); font-size:18px; font-weight:700; }
.signal .l { font-size:11px; color:var(--color-text-muted); }
.derive { background:var(--stone-50); border-radius:var(--radius-lg); padding:12px 13px; font-size:12.5px; }
.derive .drow { display:flex; justify-content:space-between; gap:12px; padding:4px 0; font-variant-numeric:tabular-nums; }
.derive .drow .term { color:var(--color-text-muted); }
.derive .drow.total { border-top:1px solid var(--stone-200); margin-top:5px; padding-top:8px; font-weight:700; color:var(--color-text); }
.derive .drow.total .val { color:var(--ic-text); }
.derive .formula { font-size:11px; color:var(--color-text-faint); margin-bottom:8px; line-height:1.5; }

/* ── narrow (drawer) — @media(max-width:900px): the panel becomes a right slide-over + scrim ── */
@media (max-width:900px){
  .insp { grid-template-columns:minmax(0,1fr); }
  .insp-panel { position:fixed; top:0; right:0; height:100svh; width:min(460px,94vw); max-height:none;
    border-radius:0; transform:translateX(100%); transition:transform .26s cubic-bezier(.4,0,.2,1); z-index:40; box-shadow:var(--shadow-lg); }
  .insp-panel.open { transform:none; }
  .insp-panel .pnl-close { display:grid; }
  .insp-panel .pnl-back { display:none; }
  .insp-scrim.open { opacity:1; pointer-events:auto; }
}

/* ═══ Package inspector — exercise drill (redojo-package-inspector-exercise-view) ═══
   The clickable difficulty tiers (Est + Done columns) + the level-2 exercise-list sub-detail
   (a slide-over at all widths). Transcoded verbatim from the Designer's verified preview.html
   <style> block — tokens only (kata-0026); the rgb() scrim matches the existing .insp-scrim. */

/* clickable difficulty rows → open the exercise sub-detail */
.tier-table-click tbody tr.tier-row { cursor:pointer; }
.tier-table-click tbody tr.tier-row:hover td { background:var(--stone-50); }
.tier-table-click tbody tr.tier-row:focus-visible { outline:2px solid var(--color-ink); outline-offset:-2px; }
.tier-go { width:22px; text-align:right; color:var(--color-text-faint); }
.tier-go .ic { width:15px; height:15px; }
.tier-prog { display:inline-flex; align-items:center; gap:8px; }
.tp-bar { width:40px; height:6px; border-radius:99px; background:var(--stone-200); overflow:hidden; display:inline-flex; }
.tp-got { background:var(--emerald-500); height:100%; } .tp-not { background:var(--amber-500); height:100%; }
.tp-lbl { font-size:12px; font-variant-numeric:tabular-nums; color:var(--color-text-muted); font-weight:600; }
.tier-est { color:var(--color-text-muted); font-weight:600; white-space:nowrap; }
/* six columns in 424px — tighten the clickable tier table so it stays scannable */
.tier-table-click th, .tier-table-click td { padding:7px 6px; }
.tier-table-click .tier-prog { gap:6px; }
.tier-hint { display:flex; align-items:center; gap:7px; font-size:12px; color:var(--color-text-muted); margin-top:10px; }
.tier-hint .ic { width:14px; height:14px; }

/* ── sub-detail panel (exercise list) — slide-over on ALL widths ── */
.insp-subscrim { position:fixed; inset:0; background:rgb(28 25 23 / .40); opacity:0; pointer-events:none; transition:opacity .2s; z-index:41; }
.insp-subscrim.open { opacity:1; pointer-events:auto; }
.insp-sub { position:fixed; top:0; right:0; height:100svh; width:min(468px,96vw); background:var(--color-surface);
  box-shadow:var(--shadow-lg); transform:translateX(100%); transition:transform .28s cubic-bezier(.4,0,.2,1);
  z-index:42; overflow:auto; }
.insp-sub.open { transform:none; }
.sub-head h2 { display:flex; align-items:center; gap:9px; }
.sub-head h2 .tier-dot { width:11px; height:11px; }

.sub-prog { background:var(--stone-50); border:1px solid var(--stone-100); border-radius:var(--radius-xl); padding:14px 15px; margin-bottom:14px; }
.sub-prog-top { display:flex; align-items:baseline; gap:10px; margin-bottom:9px; }
.sp-pct { font-family:var(--font-display); font-size:26px; font-weight:700; letter-spacing:-.02em; }
.sp-pct.s-done { color:var(--emerald-600); } .sp-pct.s-progress { color:var(--amber-600); } .sp-pct.s-none { color:var(--color-text-muted); }
.sp-lbl { font-size:13px; color:var(--color-text-muted); }
.sp-bar { height:8px; border-radius:99px; background:var(--stone-200); overflow:hidden; display:flex; margin-bottom:10px; }
.sp-got { background:var(--emerald-500); } .sp-not { background:var(--amber-500); }
.sp-key { display:flex; flex-wrap:wrap; gap:12px; font-size:12px; color:var(--color-text-muted); }
.sp-key span { display:inline-flex; align-items:center; gap:5px; }
.kdot { width:8px; height:8px; border-radius:50%; }
.kdot.k-got { background:var(--emerald-500); } .kdot.k-not { background:var(--amber-500); } .kdot.k-none { background:var(--stone-300); }

/* dev-stub overlay: the future "mark as already done" affordance */
.exq-stubbar { position:relative; border:1px dashed var(--stone-300); border-radius:var(--radius-lg); overflow:hidden; margin-bottom:12px; }
.exq-stubbar .stub-hatch { position:absolute; inset:0; background:repeating-linear-gradient(45deg,var(--stone-50),var(--stone-50) 7px,var(--stone-100) 7px,var(--stone-100) 14px); }
.exq-stubbar .stub-txt { position:relative; display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:10px 12px; font-size:12px; color:var(--color-text-muted); }
.exq-stubbar .stub-txt .ic { width:14px; height:14px; flex:none; }
.exq-stubbar .stub-txt b { color:var(--color-text); }
.exq-stubbar .tag { margin-left:auto; font-size:10px; font-weight:800; letter-spacing:.05em; text-transform:uppercase;
  color:var(--stone-900); background:var(--amber-400); border-radius:var(--radius-pill); padding:2px 7px; }

.exq-list { display:flex; flex-direction:column; }
.exq { display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:6px 12px; padding:12px 4px; border-bottom:1px solid var(--stone-100); }
.exq-main { min-width:0; display:flex; flex-direction:column; gap:6px; }
.exq-top { display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; }
.exq-n { font-weight:800; font-size:13px; font-variant-numeric:tabular-nums; color:var(--color-text); }
.exq-marks { font-size:13px; font-weight:600; color:var(--color-text); }
.exq-parts { color:var(--color-text-muted); font-weight:600; font-variant-numeric:tabular-nums; }
.exq-est { display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--color-text-muted); font-weight:600; }
.exq-est .ic { width:12px; height:12px; }
.exq-bot { display:flex; align-items:center; gap:9px; flex-wrap:wrap; }
.exq-state { display:inline-flex; align-items:center; gap:5px; font-size:12.5px; font-weight:700; }
.exq-state .ic { width:14px; height:14px; }
.exq-state.got { color:var(--emerald-600); }
.exq-state.not { color:var(--amber-600); }
.exq-state.none { color:var(--color-text-muted); font-weight:600; }
.exq-taken { display:inline-flex; align-items:center; gap:4px; font-size:12px; color:var(--color-text-muted); font-variant-numeric:tabular-nums; }
.exq-taken .ic { width:12px; height:12px; }
/* micro-label distinguishing the two times: estimated ("Est") vs the student's last attempt ("Took") */
.exq-tlbl { font-size:10px; font-weight:800; letter-spacing:.04em; text-transform:uppercase; color:var(--color-text-faint); }
.exq-act { display:flex; align-items:center; gap:6px; flex:none; }
.exq-link { display:grid; place-items:center; width:34px; height:34px; border-radius:var(--radius-lg); }
.exq-link { color:var(--amber-600); background:var(--amber-50); border:1px solid var(--amber-50); text-decoration:none; cursor:pointer; }
.exq-link:hover { filter:brightness(.97); }
.exq-link:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.exq-link .ic { width:15px; height:15px; }
.exq.is-none .exq-n, .exq.is-none .exq-marks { color:var(--color-text-faint); }
/* the "Not started" status dot inside a drill row — scoped to the exq component (the tree's own
   .sdot/.tglance.stat completion chips are a separate, out-of-scope slice). */
.exq-state.none .sdot { width:8px; height:8px; border-radius:50%; background:var(--stone-300); flex:none; display:inline-block; }

/* ═══════════════════════════════════════════════════════════════════════════
 * RUNNER SESSION IA — the session · activity · atom model (redojo-runner-session-ia ④0).
 * Transcoded from the Designer's verified package (reDojo_v1_32 · runner-ia.css + runner-states).
 * The two-region shape: a left SESSION SPINE (session identity · time · Pause/End) + a right
 * ACTIVITY STREAM (current activity as an inline hero, atoms order-locked, the break drawn inside).
 * Consumed by every ④ runner view; ④a/b/c wire the behaviour into it. Preview-only rules
 * (.reviewbar/.seg/.anno/.state/.setup-switch) are NOT transcoded — they were review chrome.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* activity-type palette — the one new token block (icon = identity, colour reinforces) */
:root {
  --at-lessons-accent:#3b6fe0; --at-lessons-tint:#eef3ff; --at-lessons-ic:#2650c8;
  --at-topical-accent:#0d9488; --at-topical-tint:#e9fbf7; --at-topical-ic:#0b7d73;
  --at-interleaved-accent:#c026d3; --at-interleaved-tint:#fdecff; --at-interleaved-ic:#a21caf;
  --at-anki-accent:#e11d48; --at-anki-tint:#ffecf0; --at-anki-ic:#c01640;
  --at-pastpaper-accent:#475569; --at-pastpaper-tint:#eef1f5; --at-pastpaper-ic:#3a4658;
}

/* difficulty ramp — the catalog tier (ADR-0019: Easy / Medium / Hard / Very Hard) as a colour + WORD
   chip (never colour-alone, AA). A SHARED design-system primitive (redojo-week-ui-ux-review) — the Week
   drawer uses it now; the runner exercise card (ExerciseCardView.Tier) reuses it when it shows an exercise
   (a later slice, flagged). green → amber → orange → red; only the orange (#ea580c/#fff7ed) is a new hex. */
:root {
  --diff-easy-ic:var(--emerald-600);   --diff-easy-tint:var(--emerald-50);
  --diff-medium-ic:var(--amber-600);   --diff-medium-tint:var(--amber-50);
  --diff-hard-ic:#ea580c;              --diff-hard-tint:#fff7ed;
  --diff-veryhard-ic:var(--red-600);   --diff-veryhard-tint:var(--red-50);
}

/* activity-type chip (icon-led badge) */
.atchip { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:800; letter-spacing:.02em;
  padding:4px 10px 4px 8px; border-radius:var(--radius-pill); background:var(--attint); color:var(--atic); white-space:nowrap; flex:none; }
.atchip .ic { width:13px; height:13px; }
.t-lessons     { --atacc:var(--at-lessons-accent);     --attint:var(--at-lessons-tint);     --atic:var(--at-lessons-ic); }
.t-topical     { --atacc:var(--at-topical-accent);     --attint:var(--at-topical-tint);     --atic:var(--at-topical-ic); }
.t-interleaved { --atacc:var(--at-interleaved-accent); --attint:var(--at-interleaved-tint); --atic:var(--at-interleaved-ic); }
.t-anki        { --atacc:var(--at-anki-accent);        --attint:var(--at-anki-tint);        --atic:var(--at-anki-ic); }
.t-pastpaper   { --atacc:var(--at-pastpaper-accent);   --attint:var(--at-pastpaper-tint);   --atic:var(--at-pastpaper-ic); }

/* difficulty chip — colour + WORD (never colour-alone, AA). Shared: the Week drawer uses it now, the
   runner exercise card reuses it later (redojo-week-ui-ux-review). Tier word → .d-easy/.d-medium/.d-hard/.d-veryhard. */
.diff { display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:800; padding:3px 9px 3px 7px; border-radius:var(--radius-pill); background:var(--dtint); color:var(--dic); }
.diff .ddot { width:7px; height:7px; border-radius:var(--radius-pill); background:currentColor; flex:none; }
.diff.d-easy     { --dic:var(--diff-easy-ic);     --dtint:var(--diff-easy-tint); }
.diff.d-medium   { --dic:var(--diff-medium-ic);   --dtint:var(--diff-medium-tint); }
.diff.d-hard     { --dic:var(--diff-hard-ic);     --dtint:var(--diff-hard-tint); }
.diff.d-veryhard { --dic:var(--diff-veryhard-ic); --dtint:var(--diff-veryhard-tint); }

/* two-region composition: SESSION SPINE + ACTIVITY STREAM, in the 1100 shell */
.runner-ia { display:grid; grid-template-columns:196px minmax(0,1fr); gap:34px; align-items:start;
  max-width:1000px; margin-inline:auto; }
.runner-ia .stream-col { min-width:0; max-width:680px; }

/* ── the SESSION SPINE (owns session identity · time · Pause/End) ── */
.runner-ia .spine { position:sticky; top:16px; display:flex; flex-direction:column; }
.runner-ia .spine-head { display:flex; align-items:center; gap:8px; padding:0 2px 12px; }
.runner-ia .spine-head .cap { font-size:11px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:var(--color-text-faint); }
.runner-ia .spine-collapse { margin-left:auto; width:24px; height:24px; border-radius:var(--radius-lg); border:0; cursor:pointer;
  background:transparent; color:var(--color-text-faint); display:grid; place-items:center; padding:0; transition:background .15s, color .15s; }
.runner-ia .spine-collapse:hover { background:var(--stone-100); color:var(--color-text-muted); }
.runner-ia .spine-collapse:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.runner-ia .spine-collapse .ic { width:16px; height:16px; }

.runner-ia .sess-blk { border-radius:var(--radius-xl); padding:11px 12px; }
.runner-ia .sess-blk .sb-top { display:flex; align-items:center; gap:6px; }
.runner-ia .sess-blk .sb-n { font-family:var(--font-display); font-weight:700; font-size:13px; color:var(--color-text); }
.runner-ia .sess-blk .sb-subj { display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700; color:var(--ic-text, var(--s-sky-ic)); margin-top:3px; }
.runner-ia .sess-blk .sb-subj .d { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--dot, var(--s-sky-dot)); }
.runner-ia .sess-blk .sb-subj.muted { opacity:.75; }
.runner-ia .sess-blk .sb-time { font-family:var(--font-display); font-weight:700; font-size:12px; color:var(--color-text-muted); font-variant-numeric:tabular-nums; margin-top:6px; }

/* DONE session — subject tint, quiet */
.runner-ia .sess-blk.done { background:var(--tint, var(--s-sky-tint)); }
.runner-ia .sess-blk.done .sb-n { color:var(--ic-text, var(--s-sky-ic)); }
.runner-ia .sess-blk.done .sb-done { margin-left:auto; color:var(--emerald-600); display:inline-flex; align-items:center; }
.runner-ia .sess-blk.done .sb-done .ic { width:15px; height:15px; }

/* ACTIVE session — the in-session shell lives here (amber ring) */
.runner-ia .sess-blk.now { background:var(--white); box-shadow:inset 0 0 0 2px var(--amber-400), var(--shadow-sm); padding:13px 13px 12px; }
.runner-ia .sess-now-cap { font-size:10px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--amber-600); margin-bottom:5px; display:flex; align-items:center; gap:6px; }
.runner-ia .sess-now-cap .live { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--amber-500); box-shadow:0 0 0 0 var(--amber-400); animation:iapulse 1.9s ease-out infinite; }
@keyframes iapulse { 0%{box-shadow:0 0 0 0 rgba(245,158,11,.5)} 100%{box-shadow:0 0 0 8px rgba(245,158,11,0)} }
.runner-ia .sess-clock { display:flex; align-items:baseline; gap:6px; }
.runner-ia .sess-clock .t { font-family:var(--font-display); font-weight:700; font-size:26px; letter-spacing:-.01em; color:var(--color-text); font-variant-numeric:tabular-nums; line-height:1; }
.runner-ia .sess-clock .of { font-size:11px; font-weight:600; color:var(--color-text-muted); }
.runner-ia .sess-breakdue { font-size:11px; color:var(--color-text-muted); margin-top:7px; display:flex; align-items:center; gap:5px; }
.runner-ia .sess-breakdue .ic { width:12px; height:12px; color:var(--color-text-faint); }
.runner-ia .sess-actions { display:flex; gap:7px; margin-top:12px; }
.runner-ia .sess-actions .btn { flex:1; border-radius:var(--radius-lg); padding:8px 10px; font-size:12px; font-weight:700; display:inline-flex; align-items:center; justify-content:center; gap:5px; cursor:pointer; border:0; }
.runner-ia .btn-end { background:var(--stone-900); color:var(--white); }
.runner-ia .btn-end:hover { background:var(--stone-800); }
.runner-ia .btn-pause { background:var(--white); color:var(--stone-600); box-shadow:inset 0 0 0 1.5px var(--stone-300); flex:0 0 auto; padding:8px 11px; }
.runner-ia .btn-pause:hover { background:var(--stone-50); }
.runner-ia .sess-actions .btn .ic { width:14px; height:14px; }

/* PLANNED sessions — ghosted */
.runner-ia .sess-blk.ghost { background:transparent; box-shadow:inset 0 0 0 1px var(--stone-200); }
.runner-ia .sess-blk.ghost .sb-n { color:var(--color-text-faint); }
.runner-ia .sess-blk.ghost .sb-time { color:var(--stone-400); }

/* UP-NEXT session (landing) — subject-ready, no live clock */
.runner-ia .sess-blk.next { background:var(--tint, var(--s-sky-tint)); box-shadow:inset 0 0 0 1.5px var(--accent, var(--s-sky-accent)); }
.runner-ia .sess-blk.next .sb-n { color:var(--ic-text, var(--s-sky-ic)); }
.runner-ia .sess-blk.next .up { margin-left:auto; font-size:9px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--ic-text, var(--s-sky-ic)); background:var(--white); border-radius:var(--radius-pill); padding:2px 8px; }

/* PAUSED session shell (④c) — frozen clock, Resume replaces Pause/End */
.runner-ia .sess-blk.paused { background:var(--white); box-shadow:inset 0 0 0 2px var(--stone-300), var(--shadow-sm); }
.runner-ia .sess-blk.paused .sess-now-cap { color:var(--stone-500); }
.runner-ia .sess-blk.paused .sess-now-cap .live { background:var(--stone-400); animation:none; box-shadow:none; }
.runner-ia .sess-blk.paused .sess-clock .t { color:var(--stone-400); }
.runner-ia .btn-resume { display:inline-flex; align-items:center; justify-content:center; gap:6px; border:0; cursor:pointer; border-radius:var(--radius-lg); background:var(--emerald-500); color:var(--white); font-size:12px; font-weight:700; padding:8px 12px; width:100%; }
.runner-ia .btn-resume:hover { background:var(--emerald-600); }
.runner-ia .btn-resume .ic { width:14px; height:14px; }

/* break gap between sessions */
.runner-ia .sess-gap { display:flex; align-items:center; gap:7px; padding:5px 12px; margin:5px 0; color:var(--stone-400); font-size:10px; font-weight:700; }
.runner-ia .sess-gap .bar { flex:none; width:2px; height:16px; border-radius:2px; background:var(--stone-200); margin-left:4px; }
.runner-ia .sess-gap.ghost { opacity:.6; }
.runner-ia .sess-gap.now { color:var(--amber-600); font-weight:800; }
.runner-ia .sess-gap.now .bar { background:var(--amber-400); height:26px; }

/* collapsed / mobile: single session chip (hidden by default) */
.runner-ia .sess-chip { display:none; align-items:center; gap:11px; padding:12px 14px; border-radius:var(--radius-2xl);
  background:var(--white); box-shadow:inset 0 0 0 2px var(--amber-400), var(--shadow-sm); margin-bottom:16px; }
.runner-ia .sess-chip.plain { box-shadow:inset 0 0 0 1.5px var(--s-sky-accent), var(--shadow-sm); }
.runner-ia .sess-chip.done-chip { box-shadow:inset 0 0 0 1.5px var(--emerald-500), var(--shadow-sm); }
.runner-ia .sess-chip.done-chip .cdot { background:var(--emerald-500); }
.runner-ia .sess-chip.break-chip { box-shadow:inset 0 0 0 1.5px var(--amber-400), var(--shadow-sm); }
.runner-ia .sess-chip.break-chip .cdot { background:var(--amber-500); }
.runner-ia .sess-chip.paused-chip { box-shadow:inset 0 0 0 1.5px var(--stone-300), var(--shadow-sm); }
.runner-ia .sess-chip.paused-chip .cdot { background:var(--stone-400); }
.runner-ia .sess-chip .cdot { width:9px; height:9px; border-radius:var(--radius-pill); background:var(--s-sky-dot); flex:none; }
.runner-ia .sess-chip .ct { min-width:0; }
.runner-ia .sess-chip .ct b { font-family:var(--font-display); font-weight:700; font-size:14px; color:var(--color-text); }
.runner-ia .sess-chip .ct span { display:block; font-size:11.5px; color:var(--color-text-muted); }
.runner-ia .sess-chip .cclock { margin-left:auto; font-family:var(--font-display); font-weight:700; font-size:16px; color:var(--color-text); font-variant-numeric:tabular-nums; }
.runner-ia .sess-chip .cmenu { flex:none; display:flex; gap:6px; margin-left:auto; }
.runner-ia .sess-chip .cbtn { border:0; cursor:pointer; border-radius:var(--radius-lg); font-size:11px; font-weight:700; padding:7px 10px; display:inline-flex; align-items:center; gap:5px; }
.runner-ia .sess-chip .cbtn.end { background:var(--stone-900); color:var(--white); }
.runner-ia .sess-chip .cbtn.day { background:var(--stone-100); color:var(--stone-600); }
.runner-ia .sess-chip .cbtn.resume { background:var(--emerald-500); color:var(--white); }
.runner-ia .sess-chip .cbtn .ic { width:13px; height:13px; }

/* ── the ACTIVITY STREAM ── */
.runner-ia .stream { display:flex; flex-direction:column; gap:14px; }

/* earlier-today fold */
.runner-ia .earlier { border-radius:var(--radius-xl); }
.runner-ia .earlier > summary { list-style:none; cursor:pointer; display:flex; align-items:center; gap:10px; padding:11px 15px;
  border-radius:var(--radius-xl); font-size:13px; font-weight:800; color:var(--emerald-600); background:var(--emerald-50); }
.runner-ia .earlier > summary::-webkit-details-marker { display:none; }
.runner-ia .earlier > summary:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.runner-ia .earlier > summary .eico { display:grid; place-items:center; width:24px; height:24px; border-radius:var(--radius-pill); background:var(--white); color:var(--emerald-600); flex:none; }
.runner-ia .earlier > summary .eico .ic { width:14px; height:14px; }
.runner-ia .earlier > summary .echev { margin-left:auto; color:var(--emerald-600); transition:transform .15s; }
.runner-ia .earlier[open] > summary { border-bottom-left-radius:0; border-bottom-right-radius:0; }
.runner-ia .earlier[open] > summary .echev { transform:rotate(180deg); }
.runner-ia .earlier .ebody { display:flex; flex-direction:column; gap:8px; padding-top:10px; }

/* a compact activity card (done earlier / next ghosted / peekable) */
.runner-ia .act { text-align:left; width:100%; border:0; font-family:var(--font-sans); cursor:pointer; display:flex; align-items:center; gap:12px;
  border-radius:var(--radius-xl); background:var(--color-surface); box-shadow:var(--shadow-sm); border-left:4px solid var(--accent, var(--s-sky-accent));
  padding:12px 15px; transition:box-shadow .14s, transform .14s; }
.runner-ia .act:hover { box-shadow:var(--shadow-md); transform:translateY(-1px); }
.runner-ia .act:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.runner-ia .act .a-body { flex:1; min-width:0; }
.runner-ia .act .a-title { font-weight:700; font-size:14px; color:var(--color-text); margin-top:6px; }
.runner-ia .act .a-sub { font-size:12px; color:var(--color-text-muted); margin-top:2px; }
.runner-ia .act .a-tail { flex:none; font-size:11px; font-weight:800; text-transform:uppercase; letter-spacing:.03em; display:inline-flex; align-items:center; gap:5px; }
.runner-ia .act .a-tail .ic { width:15px; height:15px; }
.runner-ia .act.is-done .a-tail { color:var(--emerald-600); }
.runner-ia .act.is-next { border-left-color:var(--accent, var(--s-sky-accent)); background:var(--color-surface);
  background-image:repeating-linear-gradient(-45deg, transparent, transparent 7px, var(--stone-50) 7px, var(--stone-50) 9px); }
.runner-ia .act.is-next .a-title { color:var(--color-text); }
.runner-ia .act.is-next .a-tail { color:var(--color-text-faint); }
.runner-ia .act .peekhint { font-size:10px; font-weight:700; color:var(--stone-400); display:inline-flex; align-items:center; gap:4px; }

/* ── the CURRENT ACTIVITY (hero) ── */
.runner-ia .act-current { border-radius:var(--radius-3xl); background:var(--color-surface); box-shadow:var(--shadow-md);
  border-left:5px solid var(--accent, var(--s-sky-accent)); overflow:hidden; }
.runner-ia .ac-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; padding:16px 20px 14px; border-bottom:1px solid var(--stone-100); }
.runner-ia .ac-place { font-size:12.5px; font-weight:600; color:var(--color-text-muted); display:inline-flex; align-items:center; gap:6px; }
.runner-ia .ac-place .subj { color:var(--s-sky-ic); font-weight:800; }
.runner-ia .ac-place .chev { color:var(--stone-300); }
.runner-ia .ac-span { display:inline-flex; align-items:center; gap:5px; font-size:10.5px; font-weight:800; color:var(--s-sky-ic); background:var(--s-sky-tint); border-radius:var(--radius-pill); padding:3px 9px; }
.runner-ia .ac-span .ic { width:12px; height:12px; }
.runner-ia .ac-prog { margin-left:auto; font-size:11px; font-weight:800; letter-spacing:.03em; text-transform:uppercase; color:var(--color-text-faint); }

.runner-ia .atom-list { display:flex; flex-direction:column; padding:14px 20px 20px; gap:9px; }

/* compact atom row (done / locked) */
.runner-ia .atom { display:flex; align-items:center; gap:12px; padding:11px 14px; border-radius:var(--radius-xl); }
.runner-ia .atom .ax { flex:none; width:26px; height:26px; border-radius:var(--radius-pill); display:grid; place-items:center; }
.runner-ia .atom .ax .ic { width:15px; height:15px; }
.runner-ia .atom .a-main { flex:1; min-width:0; }
.runner-ia .atom .a-t { font-weight:700; font-size:13.5px; }
.runner-ia .atom .a-k { font-size:11.5px; color:var(--color-text-muted); margin-top:1px; display:inline-flex; align-items:center; gap:5px; }
.runner-ia .atom .a-k .ic { width:12px; height:12px; }
/* .a-src — the per-question sub-topic label in a Mixed (interleaved) block's atom rows
   (redojo-interleaved-today-runner-integration S3, reDojo_v1_39 UX). Each card names its own sub-topic;
   the subject-sky accent distinguishes it from the muted meta, dimmed on a locked row. */
.runner-ia .atom .a-src { color:var(--s-sky-ic); font-weight:800; }
.runner-ia .atom.locked .a-src { color:var(--stone-400); }
.runner-ia .atom .a-tag { flex:none; font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.03em; display:inline-flex; align-items:center; gap:4px; }
.runner-ia .atom .a-tag .ic { width:14px; height:14px; }
.runner-ia .atom.done { background:var(--color-surface); box-shadow:inset 0 0 0 1px var(--stone-200); }
.runner-ia .atom.done .ax { background:var(--emerald-50); color:var(--emerald-600); }
.runner-ia .atom.done .a-t { color:var(--color-text-muted); font-weight:600; }
.runner-ia .atom.done .a-tag { color:var(--emerald-600); }
.runner-ia .atom.locked { box-shadow:inset 0 0 0 1px var(--stone-200); background:transparent; }
.runner-ia .atom.locked .ax { background:var(--stone-100); color:var(--stone-400); }
.runner-ia .atom.locked .a-t { color:var(--color-text-faint); font-weight:600; }
.runner-ia .atom.locked .a-k { color:var(--stone-300); }
.runner-ia .atom.locked .a-tag { color:var(--stone-400); }

/* in-card BREAK marker — where the break ran through this activity */
.runner-ia .atom-break { display:flex; align-items:center; gap:10px; padding:3px 2px; color:var(--color-text-faint); }
.runner-ia .atom-break .hr { flex:1; height:0; border-top:1.5px dashed var(--stone-300); }
.runner-ia .atom-break .lab { display:inline-flex; align-items:center; gap:6px; font-size:10.5px; font-weight:800; letter-spacing:.04em; text-transform:uppercase; white-space:nowrap; }
.runner-ia .atom-break .lab .ic { width:13px; height:13px; }

/* CURRENT atom — the actionable hero card */
.runner-ia .atom-hero { border-radius:var(--radius-2xl); background:var(--white); box-shadow:inset 0 0 0 2px var(--amber-400); padding:18px 18px 16px; }
.runner-ia .atom-hero .kick { font-size:10.5px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:var(--s-sky-ic); margin-bottom:9px; display:flex; align-items:center; gap:7px; }
.runner-ia .atom-hero .kick .n { display:inline-grid; place-items:center; min-width:19px; height:19px; padding:0 5px; border-radius:var(--radius-pill); background:var(--amber-400); color:var(--stone-900); font-weight:800; }
.runner-ia .atom-hero .htitle { font-family:var(--font-display); font-weight:700; font-size:20px; line-height:1.25; letter-spacing:-.01em; color:var(--color-text); margin:0 0 12px; }
.runner-ia .ex-meta { display:flex; flex-wrap:wrap; gap:7px; margin-bottom:16px; }
.runner-ia .ex-chip { display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700; padding:4px 10px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); }
.runner-ia .ex-chip .ic { width:12px; height:12px; }
.runner-ia .ex-chip.set { background:var(--s-sky-tint); color:var(--s-sky-ic); }
.runner-ia .hero-actions { display:flex; flex-wrap:wrap; gap:10px; align-items:center; }
.runner-ia .btn-open { display:inline-flex; align-items:center; gap:8px; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:12px 20px; font-size:14px; font-weight:700; text-decoration:none; border:0; cursor:pointer; }
.runner-ia .btn-open:hover { background:var(--stone-800); }
.runner-ia .btn-open .ic { width:16px; height:16px; }
.runner-ia .btn-did { display:inline-flex; align-items:center; gap:7px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--emerald-50); color:var(--emerald-600); padding:12px 18px; font-size:14px; font-weight:700; }
.runner-ia .btn-did:hover { box-shadow:inset 0 0 0 1.5px var(--emerald-500); }
.runner-ia .btn-did .ic { width:16px; height:16px; }
.runner-ia .hero-note { font-size:12px; color:var(--color-text-faint); margin:14px 0 0; display:flex; align-items:center; gap:6px; }
.runner-ia .hero-note .ic { width:13px; height:13px; }
.runner-ia .peek-link { display:inline-flex; align-items:center; gap:6px; margin-top:13px; font-size:12.5px; font-weight:700; color:var(--stone-500); text-decoration:none; }
.runner-ia .peek-link:hover { color:var(--stone-800); }
.runner-ia .peek-link .ic { width:13px; height:13px; }

/* paused hero (calm hold in the stream, ④c) */
.runner-ia .paused-hero { text-align:center; border-radius:var(--radius-2xl); background:var(--stone-50); box-shadow:inset 0 0 0 1.5px var(--stone-200); padding:32px 22px; }
.runner-ia .paused-ico { display:grid; place-items:center; width:62px; height:62px; border-radius:var(--radius-pill); background:var(--white); box-shadow:var(--shadow-sm); color:var(--stone-500); margin:0 auto 16px; }
.runner-ia .paused-ico .ic { width:28px; height:28px; }
.runner-ia .ph-title { font-family:var(--font-display); font-weight:700; font-size:22px; letter-spacing:-.01em; margin:0 0 8px; }
.runner-ia .ph-sub { font-size:14px; color:var(--color-text-muted); margin:0 auto 22px; max-width:26rem; line-height:1.5; }
.runner-ia .btn-resume-lg { display:inline-flex; align-items:center; gap:9px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:13px 26px; font-size:15px; font-weight:700; }
.runner-ia .btn-resume-lg:hover { background:var(--stone-800); }
.runner-ia .btn-resume-lg .ic { width:17px; height:17px; }

/* ── LANDING · Start hero ── */
.runner-ia .start-hero { position:relative; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-md);
  border-left:5px solid var(--accent, var(--s-sky-accent)); padding:30px 30px 26px; }
.runner-ia .sh-eyebrow { font-size:11px; font-weight:800; letter-spacing:.08em; text-transform:uppercase; color:var(--s-sky-ic); margin:0 0 10px; }
.runner-ia .sh-title { font-family:var(--font-display); font-weight:700; font-size:28px; letter-spacing:-.02em; margin:0 0 10px; }
.runner-ia .sh-sub { font-size:15px; color:var(--color-text-muted); margin:0 0 22px; line-height:1.5; }
.runner-ia .btn-start-day { display:inline-flex; align-items:center; gap:9px; border:0; cursor:pointer; border-radius:var(--radius-xl);
  background:var(--stone-900); color:var(--white); padding:14px 26px; font-size:16px; font-weight:700; }
.runner-ia .btn-start-day:hover { background:var(--stone-800); }
.runner-ia .btn-start-day .ic { width:18px; height:18px; }
.runner-ia .sh-help { font-size:12.5px; color:var(--color-text-faint); margin:16px 0 0; display:flex; align-items:center; gap:7px; }
.runner-ia .sh-help .ic { width:14px; height:14px; flex:none; }
.runner-ia .plan-head { font-size:11px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:26px 2px 12px; }

/* ── DAY COMPLETE / END-OF-DAY TERMINAL (redojo-unify-end-of-day-terminal) ──
   The ONE end-of-day terminal. UN-SCOPED from .runner-ia so the same .daycomplete renders both inside the
   .runner-ia grid (finished-early / all-ended — spine + stream) AND standalone inside .eod-centre (the
   caught-up shape — centred, no spine). Selectors identical to the shipped rules minus the .runner-ia
   ancestor, so the finished-early/all-ended render is byte-identical; only the caught-up variant is new. */
.daycomplete { position:relative; text-align:center; padding:14px 10px 10px; display:flex; flex-direction:column; align-items:center; }
.dc-mark { display:grid; place-items:center; width:80px; height:80px; border-radius:var(--radius-pill); background:var(--emerald-50); color:var(--emerald-600); margin-bottom:18px; }
.dc-mark .ic { width:38px; height:38px; stroke-width:2.4; }
.daycomplete h1 { font-family:var(--font-display); font-weight:700; font-size:30px; letter-spacing:-.02em; margin:0 0 8px; }
.daycomplete > .dc-lede { font-size:16px; color:var(--color-text-muted); margin:0 0 26px; max-width:32rem; }
.dc-tally { display:flex; gap:12px; flex-wrap:wrap; justify-content:center; }
.dc-stat { background:var(--color-surface); box-shadow:var(--shadow-sm); border-radius:var(--radius-2xl); padding:16px 22px; min-width:118px; }
.dc-stat b { display:block; font-family:var(--font-display); font-weight:700; font-size:26px; color:var(--color-text); line-height:1; }
.dc-stat.key b { color:var(--s-sky-ic); }
.dc-stat span { display:block; font-size:12px; color:var(--color-text-muted); margin-top:6px; }
.dc-done-list { width:100%; max-width:440px; margin:26px auto 0; text-align:left; display:flex; flex-direction:column; gap:8px; }
.dc-done-cap { font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 2px; }
/* CHANGE 2 — the footer is a centred column: the next-session line above the View-your-week button. */
.dc-foot { margin-top:28px; display:flex; flex-direction:column; gap:16px; align-items:center; }
.dc-next { display:inline-flex; align-items:center; gap:8px; font-size:14px; color:var(--color-text-muted); margin:0; }
.dc-next .ic { width:15px; height:15px; color:var(--color-text-faint); flex:none; }
.dc-next b { color:var(--color-text); font-weight:700; }
.dc-foot-actions { display:flex; gap:12px; justify-content:center; flex-wrap:wrap; }
.dc-foot .btn { text-decoration:none; }
.dc-foot .btn .ic { width:16px; height:16px; }
/* the caught-up shape renders the terminal standalone (no .runner-ia grid) — centre it in the content column */
.eod-centre { max-width:640px; margin-inline:auto; }

/* ── BREAK view ── */
.runner-ia .break-panel { position:relative; background:var(--color-surface); border-radius:var(--radius-3xl); box-shadow:var(--shadow-md); border-left:5px solid var(--amber-400); padding:32px 30px 28px; text-align:center; }
.runner-ia .brk-eyebrow { font-size:11px; font-weight:800; letter-spacing:.08em; text-transform:uppercase; color:var(--amber-600); margin:0 0 14px; display:inline-flex; align-items:center; gap:7px; }
.runner-ia .brk-eyebrow .ic { width:14px; height:14px; }
.runner-ia .brk-title { font-family:var(--font-display); font-weight:700; font-size:26px; letter-spacing:-.02em; margin:0 0 18px; }
.runner-ia .brk-time { font-family:var(--font-display); font-weight:700; font-size:54px; letter-spacing:-.02em; color:var(--color-text); font-variant-numeric:tabular-nums; line-height:1; }
.runner-ia .brk-time small { display:block; font-size:13px; font-weight:600; color:var(--color-text-muted); letter-spacing:0; margin-top:9px; }
.runner-ia .brk-sub { font-size:14px; color:var(--color-text-muted); margin:18px auto 0; max-width:30rem; line-height:1.55; }
.runner-ia .brk-next { margin:26px auto 0; max-width:430px; text-align:left; }
.runner-ia .brk-next-cap { font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 10px; }
.runner-ia .brk-actions { display:flex; gap:14px; justify-content:center; align-items:center; flex-wrap:wrap; margin-top:28px; }
.runner-ia .btn-startnext { display:inline-flex; align-items:center; gap:9px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:13px 24px; font-size:15px; font-weight:700; }
.runner-ia .btn-startnext:hover { background:var(--stone-800); }
.runner-ia .btn-startnext .ic { width:17px; height:17px; }
.runner-ia .brk-skip { font-size:13px; font-weight:700; color:var(--stone-500); background:transparent; border:0; cursor:pointer; }
.runner-ia .brk-skip:hover { color:var(--stone-800); }

/* ── OVERTIME (redojo-runner-overtime-break-and-session) — the break-overrun + session-overtime treatments.
 * "Over" is signalled by LABEL + ICON + SURFACE, never colour alone (WCAG-AA); the warm amber family only —
 * no new token, no stress-red. Transcoded from the Designer's verified package (HANDOFF-overtime §1/§2). ── */
/* BREAK OVERRUN — extends .break-panel (elapsed > BreakLength): filled badge + clock + up-arrow, amber-50 fill. */
.runner-ia .break-panel.is-overrun { background:var(--amber-50); border-left-color:var(--amber-500); }
.runner-ia .brk-eyebrow.over { background:var(--amber-400); color:var(--stone-900); padding:5px 13px 5px 10px; border-radius:var(--radius-pill); margin-bottom:16px; }
.runner-ia .brk-time.is-over { color:var(--amber-600); }
.runner-ia .brk-time.is-over .over-num { display:inline-flex; align-items:center; justify-content:center; gap:8px; }
.runner-ia .brk-time.is-over .over-up { width:30px; height:30px; color:var(--amber-500); stroke-width:2.6; flex:none; }
.runner-ia .brk-time.is-over small { color:var(--amber-600); font-weight:700; }
.runner-ia .sess-gap.over { color:var(--amber-600); font-weight:800; }
.runner-ia .sess-gap.over .bar { background:var(--amber-500); height:26px; }
.runner-ia .sess-chip.overrun-chip { box-shadow:inset 0 0 0 1.5px var(--amber-500), var(--shadow-sm); background:var(--amber-50); }
.runner-ia .sess-chip.overrun-chip .cdot { background:var(--amber-500); }
/* SESSION OVERTIME — the quiet spine "now" treatment (amber clock) + the calm stream note (the primary signal). */
.runner-ia .sess-blk.now.is-overtime { box-shadow:inset 0 0 0 2px var(--amber-500), var(--shadow-sm); }
.runner-ia .sess-blk.now.is-overtime .sess-clock .t { color:var(--amber-600); }
.runner-ia .sess-blk.now.is-overtime .sess-clock .of { color:var(--amber-600); font-weight:700; }
.runner-ia .sess-breakdue.over { color:var(--amber-600); font-weight:700; }
.runner-ia .sess-breakdue.over .ic { color:var(--amber-500); }
.runner-ia .overtime-note { display:flex; align-items:flex-start; gap:12px; padding:15px 17px; border-radius:var(--radius-2xl); background:var(--amber-50); box-shadow:inset 0 0 0 1.5px var(--amber-400); }
.runner-ia .overtime-note .on-ic { flex:none; display:grid; place-items:center; width:36px; height:36px; border-radius:var(--radius-xl); background:var(--amber-400); color:var(--stone-900); }
.runner-ia .overtime-note .on-ic .ic { width:19px; height:19px; }
.runner-ia .overtime-note .on-b { font-size:14px; font-weight:800; color:var(--stone-900); }
.runner-ia .overtime-note .on-s { font-size:12.5px; font-weight:600; color:var(--amber-600); margin-top:2px; line-height:1.45; }
.runner-ia .sess-chip.overtime-chip { box-shadow:inset 0 0 0 1.5px var(--amber-500), var(--shadow-sm); }
.runner-ia .sess-chip.overtime-chip .cdot { background:var(--amber-500); }
.runner-ia .sess-chip.overtime-chip .cclock { color:var(--amber-600); }

/* ── TRANSITION beat (slice B) — the recap moment between activities ── */
.runner-ia .transition-beat { position:relative; border-radius:var(--radius-3xl); background:var(--color-surface); box-shadow:var(--shadow-md); border-left:5px solid var(--emerald-500); padding:26px 28px; }
.runner-ia .tb-eyebrow { display:inline-flex; align-items:center; gap:9px; font-size:11px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--emerald-600); margin-bottom:14px; }
.runner-ia .tb-eyebrow .tbmark { display:grid; place-items:center; width:26px; height:26px; border-radius:var(--radius-pill); background:var(--emerald-50); }
.runner-ia .tb-eyebrow .tbmark .ic { width:15px; height:15px; }
.runner-ia .tb-done-row { display:flex; align-items:center; gap:10px; margin-bottom:4px; }
.runner-ia .tb-title { font-family:var(--font-display); font-weight:700; font-size:22px; letter-spacing:-.01em; margin:8px 0 15px; }
.runner-ia .tb-recap { display:flex; gap:8px; flex-wrap:wrap; }
.runner-ia .tb-chip { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; padding:5px 11px; border-radius:var(--radius-pill); background:var(--stone-100); color:var(--color-text-muted); }
.runner-ia .tb-chip .ic { width:13px; height:13px; }
.runner-ia .tb-chip.got { background:var(--emerald-50); color:var(--emerald-600); }
.runner-ia .tb-chip.gap { background:var(--amber-50); color:var(--amber-600); }
.runner-ia .tb-next-cap { font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:22px 0 10px; padding-top:20px; border-top:1px solid var(--stone-100); }
.runner-ia .tb-actions { margin-top:20px; display:flex; gap:14px; align-items:center; flex-wrap:wrap; }
.runner-ia .btn-continue { display:inline-flex; align-items:center; gap:9px; border:0; cursor:pointer; border-radius:var(--radius-xl); background:var(--stone-900); color:var(--white); padding:13px 24px; font-size:15px; font-weight:700; }
.runner-ia .btn-continue:hover { background:var(--stone-800); }
.runner-ia .btn-continue .ic { width:17px; height:17px; }

/* ── §10 test-account harness panel — S1 whole-panel (redojo-test-harness-panel-ux-shell; transcoded from the
   reDojo Designer package reDojo_v1_51). DEV-ONLY, test-account-gated, never student-facing (rule~ux-leads-the-
   look). Extends the amber "dev tool" .test-panel language; every value resolves to an existing token (stone ·
   amber · emerald · radii/shadows/fonts) — no raw #hex (check-design-tokens). Three regions: the LIVE
   "you-are-here" readout (.tp-readout), the grouped engine controls (DISABLED this slice — .tp-ctl:disabled +
   .tp-soon; S2–S4 activate them), and the LIVE clock&timer controls (.tp-ctl.is-live). The internal-state
   inspector was cut by the PO this iteration, so the old .tp-inspect/.tp-facet/.tp-grid/.tp-jump rules are
   removed (no other consumer — the catalog_inspect .tp-bar/.tp-got/.tp-lbl tier bars are unrelated + untouched). */
.test-panel { margin-top:20px; border:2px dashed var(--amber-500); border-radius:var(--radius-2xl);
  background:var(--amber-50); padding:16px 18px 18px; font-size:12.5px; color:var(--color-text); }
.tp-head { margin:0 0 14px; font-size:10.5px; font-weight:800; letter-spacing:.08em; text-transform:uppercase;
  color:var(--amber-600); display:flex; align-items:center; gap:7px; }
.tp-head::before { content:""; width:8px; height:8px; border-radius:var(--radius-pill); background:var(--amber-500); }

/* ── YOU-ARE-HERE readout — the LIVE primary (scenario 17). A white "live" card lifted off the amber dev frame
   so real state reads apart from the disabled controls. ── */
.tp-readout { background:var(--white); border-radius:var(--radius-xl); box-shadow:var(--shadow-sm);
  padding:14px 16px 16px; margin-bottom:14px; }
.tp-readout-head { margin:0 0 12px; display:inline-flex; align-items:center; gap:7px; font-size:10.5px;
  font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:var(--color-text-muted); }
.tp-live-dot { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--emerald-500);
  box-shadow:0 0 0 3px var(--emerald-50); }
.tp-facts { display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:10px; }
.tp-fact { display:flex; flex-direction:column; gap:4px; background:var(--stone-50);
  border-radius:var(--radius-lg); padding:11px 13px; min-width:0; }
.tp-fact .k { display:inline-flex; align-items:center; gap:6px; font-size:10.5px; font-weight:800;
  letter-spacing:.03em; text-transform:uppercase; color:var(--color-text-muted); }
.tp-fact .k .ic { width:13px; height:13px; color:var(--color-text-faint); }
.tp-fact .v { font-family:var(--font-display); font-weight:700; font-size:18px; line-height:1.15;
  color:var(--color-text); letter-spacing:-.01em; font-variant-numeric:tabular-nums; overflow-wrap:anywhere; }
.tp-fact .v small { font-family:var(--font-sans); font-weight:600; font-size:12px; color:var(--color-text-muted); }
.tp-fact .v.is-none { color:var(--color-text-faint); font-style:italic; font-size:16px; }
.tp-fact .sub { font-size:12px; font-weight:600; color:var(--color-text-muted); overflow-wrap:anywhere; }

/* running / idle flag — colour is NEVER the sole signal (dot + word) */
.tp-run { align-self:flex-start; display:inline-flex; align-items:center; gap:6px; margin-top:1px;
  border-radius:var(--radius-pill); padding:2px 9px 2px 7px; font-size:11px; font-weight:800;
  letter-spacing:.02em; background:var(--emerald-50); color:var(--emerald-600); }
.tp-run i { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--emerald-500); }
.tp-run.idle { background:var(--stone-100); color:var(--stone-600); }
.tp-run.idle i { background:var(--stone-400); }

/* ── control groups ── */
.tp-section + .tp-section { margin-top:14px; }
.tp-section-head { display:flex; align-items:center; gap:10px; margin:0 0 10px;
  padding-top:13px; border-top:1px solid var(--amber-400); }
.tp-section-t { font-size:11px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text); }
.tp-section-note { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:700;
  color:var(--color-text-muted); }
.tp-section-note.is-live { color:var(--emerald-600); }
.tp-section-note.is-live i { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--emerald-500); }

.tp-controls { display:flex; flex-wrap:wrap; gap:8px; }

/* engine sub-groups — a labelled cluster of related controls */
.tp-subgroup { margin-top:13px; }
.tp-subgroup:first-of-type { margin-top:0; }
.tp-subgroup-lab { display:block; margin:0 0 7px; font-size:10px; font-weight:800; letter-spacing:.06em;
  text-transform:uppercase; color:var(--color-text-faint); }

/* advanced — collapsed by default (native details, no-JS-robust) */
.tp-advanced { margin-top:13px; padding-top:11px; border-top:1px dashed var(--amber-400); }
.tp-advanced > summary { list-style:none; cursor:pointer; display:inline-flex; align-items:center; gap:7px;
  font-size:10px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-muted); }
.tp-advanced > summary::-webkit-details-marker { display:none; }
.tp-advanced > summary:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; border-radius:var(--radius-lg); }
.tp-advanced > summary .chev { width:12px; height:12px; color:var(--color-text-faint); transition:transform .15s; }
.tp-advanced[open] > summary .chev { transform:rotate(180deg); }
.tp-advanced .tp-controls { margin-top:10px; }

/* a control button — base + the ENABLED "live" variant (keeps the amber identity: amber border, amber-fill
   hover) but uses dark ink for a legible dev label (AA). */
.tp-ctl { display:inline-flex; align-items:center; gap:7px; cursor:pointer; font-family:var(--font-sans);
  border:1px solid var(--amber-500); border-radius:var(--radius-lg); background:var(--white);
  color:var(--stone-800); padding:7px 12px; font-size:12px; font-weight:700; transition:background .15s,color .15s; }
.tp-ctl .ic { width:14px; height:14px; }
.tp-ctl.is-live:hover { background:var(--amber-400); color:var(--stone-900); border-color:var(--amber-500); }
.tp-ctl:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }

/* DISABLED engine control — the not-yet-implemented treatment: greyed + dashed + a loud "soon" tag +
   not-allowed. Signalled by TEXT (the tag + the group's "activates in S2–S4" note), never colour alone. */
.tp-ctl:disabled, .tp-ctl[aria-disabled="true"] { cursor:not-allowed; background:var(--stone-50);
  border:1px dashed var(--stone-300); color:var(--stone-400); }
.tp-ctl:disabled .ic { color:var(--stone-300); }
.tp-soon { display:inline-flex; align-items:center; border-radius:var(--radius-pill); padding:1px 7px;
  background:var(--amber-400); color:var(--stone-900); font-size:9px; font-weight:800; letter-spacing:.05em;
  text-transform:uppercase; }

/* go-to-date — a labelled disabled date field + Go */
.tp-inline-rows { display:flex; flex-wrap:wrap; gap:10px 18px; margin-top:12px; align-items:center; }
.tp-inline { display:flex; align-items:center; gap:9px; }
.tp-inline-lab { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:800;
  letter-spacing:.03em; text-transform:uppercase; color:var(--color-text-muted); }
.tp-inline-lab .ic { width:13px; height:13px; color:var(--color-text-faint); }
.tp-date-input { width:auto; padding:6px 10px; font-size:12px; box-shadow:inset 0 0 0 1px var(--stone-300); }
.tp-date-input:disabled { background:var(--stone-50); color:var(--stone-400); cursor:not-allowed; }

/* outcome-ratio chooser — a small segmented 0–5 (default 4). Disabled this slice. */
.tp-ratio-lab small { font-weight:600; letter-spacing:0; text-transform:none; color:var(--color-text-faint); margin-left:4px; }
.tp-seg { display:inline-flex; border-radius:var(--radius-lg); overflow:hidden; box-shadow:inset 0 0 0 1px var(--stone-300); }
.tp-seg button { width:30px; height:28px; border:0; border-right:1px solid var(--stone-200); background:var(--white);
  color:var(--stone-500); font-family:var(--font-display); font-weight:700; font-size:13px; cursor:not-allowed;
  font-variant-numeric:tabular-nums; }
.tp-seg button:last-child { border-right:0; }
.tp-seg button[aria-pressed="true"] { background:var(--amber-400); color:var(--stone-900); }

/* ── the read-only drill-down drawer is now the SHARED /week drawer (.wk-panel / .wk-scrim, global) — the
   runner's dead .dwr* block was deleted with redojo-runner-drawer-build (Option A): the runner's own .act
   cards are unchanged, but their drill-down opens the shared weekDrawer. ── */

/* ── collapsed spine / narrow (responsive) ── */
.runner-ia.collapsed { grid-template-columns:1fr; }
.runner-ia.collapsed .spine { display:none; }
.runner-ia.collapsed .sess-chip { display:flex; }
.runner-ia.collapsed .stream-col { max-width:680px; margin-inline:auto; }
@media (max-width:820px) {
  .runner-ia { grid-template-columns:1fr; }
  .runner-ia .spine { display:none; }
  .runner-ia .sess-chip { display:flex; }
  .runner-ia .ac-head { padding:14px 16px 12px; }
  .runner-ia .atom-list { padding:12px 14px 16px; }
  .runner-ia .atom-hero .htitle { font-size:18px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * BREAK LENGTH (redojo-schedule-break-length-config) — the ONE new element on the
 * Schedule summary card: a "Break length" stepper, the Break-side counterpart of the
 * existing "Session length" stepper. ④b's break countdown reads the stored value.
 * No new token; the stepper reuses .sesslen/.sesslen-*/.step verbatim. The only
 * addition is .lengths — a flex group so Session length + Break length sit as a pair
 * on the summary card (the .summary rule already lays out [.totals] ⇄ [.lengths]).
 * kata-0026 stays green (no raw #hex). */
.lengths { display:flex; flex-wrap:wrap; gap:10px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * SCHEDULE REDESIGN (redojo-schedule-summary-card-polish) — the Weekly-rhythm screen
 * re-presented as a Mon–Sun "week strip" of subject-coloured Session blocks, with a
 * demoted inline length chip + a per-subject tally + a cold-start empty state. Transcoded
 * from the Claude Design hi-fi (direction 1a + 2b); popovers are native <details> (no JS),
 * so each trigger's menu is an absolutely-positioned .pop revealed on open. Every value is a
 * design-system token — no raw #hex (kata-0026). Supersedes the .summary/.sesslen/.lengths
 * summary-card layout above for this screen (those rules stay for now; unused here). */

/* summary strip — totals ⇄ demoted length chip */
.rhythm-bar { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:14px 24px; margin-bottom:18px; }
.totrow { display:flex; align-items:baseline; gap:24px; flex-wrap:wrap; }
.totrow .t { display:flex; align-items:baseline; gap:8px; }
.totrow .t b { font-family:var(--font-display); font-weight:700; font-size:28px; line-height:1; color:var(--color-text); }
.totrow .t span { font-size:12px; color:var(--color-text-muted); }
.lenchip { display:inline-flex; align-items:center; gap:8px; flex-wrap:wrap; background:var(--stone-100); border-radius:var(--radius-pill); padding:6px 12px; font-size:12.5px; color:var(--color-text-muted); }
.lenchip .lc { display:inline-flex; align-items:baseline; gap:6px; }
.lenchip b { color:var(--color-text); font-weight:700; }
.lenchip b small { font-size:11px; font-weight:600; color:var(--color-text-muted); }
.lenchip .sepdot { color:var(--stone-300); }
.mini { display:inline-flex; gap:3px; }
.mini .mini-btn { width:24px; height:24px; border-radius:var(--radius-lg); border:0; background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); color:var(--stone-600); cursor:pointer; display:grid; place-items:center; }
.mini .mini-btn:hover:not(:disabled) { background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-300); }
.mini .mini-btn:disabled { opacity:.4; cursor:not-allowed; }
.mini .mini-btn .ic { width:13px; height:13px; }

/* per-subject weekly tally */
.subjtally { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-bottom:18px; padding-bottom:16px; border-bottom:1px solid var(--stone-100); }
.stlab { font-size:11px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text-faint); margin-right:4px; }
.stchip { display:inline-flex; align-items:center; gap:7px; background:var(--tint); border-radius:var(--radius-pill); padding:5px 12px; font-size:12px; font-weight:700; color:var(--color-text); }
.stchip .dot { width:8px; height:8px; border-radius:var(--radius-pill); background:var(--dot); flex:none; }
.stchip b { color:var(--ic-text); font-family:var(--font-display); }
.stchip.any { background:var(--stone-100); color:var(--color-text-muted); }
.stchip.any .dot { background:var(--stone-300); }
.stchip.any b { color:var(--color-text-muted); }

/* the week strip */
.stripscroll { margin:0 -4px; padding:0 4px 4px; }
.wstrip { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:10px; align-items:start; }
@media (max-width:720px){
	.stripscroll { overflow-x:auto; }
	.wstrip { grid-template-columns:none; grid-auto-flow:column; grid-auto-columns:minmax(148px,1fr); min-width:min-content; }
}
.wcol { position:relative; display:flex; flex-direction:column; gap:8px; }
.wcol-h { display:flex; align-items:center; justify-content:space-between; gap:6px; min-height:26px; }
.wcol-h .wd { font-family:var(--font-display); font-weight:700; font-size:14px; }
.wcol-h .c { font-size:11px; color:var(--color-text-faint); font-weight:700; margin-left:auto; }
.wcol.rest .wcol-h .wd { color:var(--color-text-faint); }

/* hide the native <details> disclosure triangle on every strip popover trigger */
.copy > summary, .blk-wrap > summary, .add-wrap > summary, .wcol .cue > summary { list-style:none; cursor:pointer; }
.copy > summary::-webkit-details-marker, .blk-wrap > summary::-webkit-details-marker,
.add-wrap > summary::-webkit-details-marker, .wcol .cue > summary::-webkit-details-marker { display:none; }

/* copy-a-day */
.copy { position:relative; }
.copybtn { display:inline-flex; align-items:center; gap:5px; font:700 11px/1 var(--font-sans); color:var(--stone-500); background:transparent; border-radius:var(--radius-pill); padding:5px 8px; }
.copybtn:hover { background:var(--stone-100); color:var(--stone-700); }
.copybtn .ic { width:13px; height:13px; }

/* a Session block (the summary that opens its subject picker) */
.blk-wrap { position:relative; }
.blk { text-align:left; width:100%; border-radius:var(--radius-lg); background:var(--tint); border-left:3px solid var(--accent); padding:9px 10px; font-family:var(--font-sans); display:flex; align-items:flex-start; gap:8px; transition:box-shadow .12s; }
.blk:hover { box-shadow:inset 0 0 0 1px var(--accent); }
.blk .bd { flex:1; min-width:0; }
.blk .s { font-size:12px; font-weight:700; color:var(--color-text); line-height:1.25; }
/* redojo-schedule-short-subject-names — the paper marker (package Variant) under the short subject
   name; disambiguates multi-paper subjects (Pure 1 / Mechanics). Absent when the subject has no
   variant (single-paper). The Designer's delivered .blk .k rule (hi-fi), transcoded here. */
.blk .k { font-size:10px; color:var(--ic-text); font-weight:700; margin-top:2px; }
.blk .gr { color:var(--color-text-faint); flex:none; opacity:0; transition:opacity .12s; }
.blk .gr .ic { width:13px; height:13px; }
.blk:hover .gr { opacity:1; }
.blk.any { background:var(--stone-100); border-left-color:var(--stone-300); }
.blk.any .s { color:var(--color-text-muted); font-style:italic; }

/* add a session */
.add-wrap { position:relative; }
.wadd { border:1.5px dashed var(--stone-300); border-radius:var(--radius-lg); background:transparent; color:var(--color-text-faint); font:700 11.5px/1 var(--font-sans); padding:9px; display:flex; align-items:center; justify-content:center; gap:5px; transition:.12s; }
.wadd:hover { border-color:var(--stone-400); color:var(--stone-600); background:var(--stone-50); }
.wadd .ic { width:13px; height:13px; }

/* rest day */
.wrest { border-radius:var(--radius-lg); background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-200); color:var(--color-text-faint); font-size:11.5px; font-weight:700; padding:16px 8px; text-align:center; display:flex; flex-direction:column; align-items:center; gap:6px; }
.wrest .ic { width:16px; height:16px; }

/* advisory start cue (in the strip) — the container is the popover's positioning context, so the
   cue editor .pop anchors under its button (not the whole .wcol column). */
.wcol .cue { position:relative; }
.wcol .cue-btn { width:100%; display:inline-flex; align-items:center; justify-content:center; gap:5px; font:600 11px/1 var(--font-sans); color:var(--color-text-faint); background:transparent; border-radius:var(--radius-lg); padding:6px; }
.wcol .cue-btn.set { color:var(--stone-500); font-weight:700; }
.wcol .cue-btn:hover { color:var(--stone-700); background:var(--stone-50); }
.wcol .cue-btn .ic { width:13px; height:13px; }

/* popovers (shared) — revealed when the parent <details> is open */
.pop { position:absolute; z-index:40; top:calc(100% + 4px); left:0; background:var(--color-surface); border-radius:var(--radius-2xl); box-shadow:var(--shadow-lg); padding:6px; }
.pop.menu { width:240px; }
.pop-h { font-size:10.5px; font-weight:800; text-transform:uppercase; letter-spacing:.05em; color:var(--color-text-faint); padding:8px 10px 6px; }
.pop .opt { display:flex; align-items:center; gap:10px; width:100%; text-align:left; background:transparent; border:0; cursor:pointer; padding:9px 10px; border-radius:var(--radius-lg); font:600 13px/1.2 var(--font-sans); color:var(--color-text); }
.pop .opt:hover { background:var(--stone-100); }
.pop .opt .dot { width:10px; height:10px; border-radius:var(--radius-pill); background:var(--dot); flex:none; box-shadow:inset 0 0 0 1.5px var(--dot); }
.pop .opt .r { margin-left:auto; color:var(--color-text-faint); font-size:12px; font-weight:600; }
.pop .opt.is-any .dot { background:transparent; box-shadow:inset 0 0 0 1.5px var(--stone-300); }
.pop .opt.rm { color:var(--red-600); }
.pop .opt.rm:hover { background:var(--red-50); }
.pop .opt .ck { margin-left:auto; color:var(--ic-text); display:inline-flex; }
.pop .opt .ck .ic { width:15px; height:15px; }
.pop-div { height:1px; background:var(--stone-100); margin:5px 8px; }

/* choose-days checkbox set inside the copy menu */
.choose { padding:6px 8px 8px; }
.choose .dtog { display:flex; flex-wrap:wrap; gap:6px; margin:6px 0 10px; }
.choose .daychk { display:inline-flex; align-items:center; gap:5px; font:700 11px/1 var(--font-sans); color:var(--stone-600); background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border-radius:var(--radius-lg); padding:7px 9px; cursor:pointer; }
.choose .daychk input { accent-color:var(--stone-900); }
.applybtn { width:100%; background:var(--stone-900); color:var(--white); border:0; border-radius:var(--radius-xl); padding:10px; font:700 13px/1 var(--font-sans); cursor:pointer; }
.applybtn:hover { background:var(--stone-800); }

/* cold-start empty state (replaces the retired onboarding-tip stub) */
.coldstart { display:flex; gap:16px; align-items:flex-start; background:var(--amber-50); border-radius:var(--radius-3xl); padding:20px 22px; box-shadow:inset 0 0 0 1px var(--amber-400); }
.coldstart .cs-ico { display:grid; place-items:center; width:40px; height:40px; flex:none; border-radius:var(--radius-xl); background:var(--amber-400); color:var(--stone-900); }
.coldstart h2 { font-family:var(--font-display); font-weight:700; font-size:17px; margin:0 0 4px; color:var(--stone-900); }
.coldstart p { font-size:13px; line-height:1.55; color:var(--amber-600); margin:0; max-width:52rem; }
.coldstart p b { color:var(--stone-900); }

/* ═══════════════════════════════════════════════════════════════════════════
 * RUNNER MOTION (redojo-runner-animation-ux-exploration · adr-runner-motion.md · docs/design/runner-motion-ux.md)
 * Advisory polish OVER the frozen ④0 IA — a half-second beat at a state-change boundary the student just
 * triggered. It DECORATES a state the server already rendered; it never IS the state change and never gates
 * meaning (adr-session-timer-warnings §4/§5 discipline). Only opacity + transform(translateY ≤13px, scale) move —
 * layout, colour, and type never do. Bound to a .anim-* marker class the templ sets on the state root, so the
 * beat fires once on arrival. This slice ships the 3 arrival-beat moments (activity-complete · break · day-
 * complete); the 2 action-triggered beats (mark-landing · spine-advancing) are deferred (ADR §Decision-5).
 * A11y (Lens A): the prefers-reduced-motion guard below lands on the resting frame. VRT (Lens B): the vrt.go
 * cssReset already kills animation before every shot, so the goldens capture the resting frame unchanged.
 * ═══════════════════════════════════════════════════════════════════════════ */
:root {
  --dur-quick:140ms;  /* a tick landing */
  --dur-base:220ms;   /* a card arriving, a row committing */
  --dur-settle:340ms; /* the day-complete beat — the one longer moment */
  --ease-decel:cubic-bezier(0,0,.2,1);   /* entrances — fast in, gentle to rest */
  --ease-settle:cubic-bezier(.2,.7,.3,1); /* the mark — decelerate, NO overshoot/bounce */
}
@keyframes m-row-in    { from{opacity:0;transform:translateY(7px)}  to{opacity:1;transform:none} }
@keyframes m-tick-pop  { 0%{opacity:0;transform:scale(.45)} 55%{opacity:1} 100%{transform:scale(1)} }
@keyframes m-card-rise { from{opacity:0;transform:translateY(13px)} to{opacity:1;transform:none} }
@keyframes m-panel-in  { from{opacity:0;transform:translateY(9px)}  to{opacity:1;transform:none} }
@keyframes m-mark-draw { 0%{opacity:0;transform:scale(.62)} 60%{opacity:1} 100%{transform:scale(1)} }
@keyframes m-tile-up   { from{opacity:0;transform:translateY(11px)} to{opacity:1;transform:none} }

/* moment #2 — activity complete: the recap card rises; its eyebrow tick pops; the recap chips stagger in */
.anim-card { animation:m-card-rise var(--dur-base) var(--ease-decel) both; }
.anim-card .tbmark .ic { animation:m-tick-pop var(--dur-base) var(--ease-settle) 120ms both; }
.anim-card .tb-chip { animation:m-row-in var(--dur-quick) var(--ease-decel) both; }
.anim-card .tb-chip:nth-child(1) { animation-delay:150ms; }
.anim-card .tb-chip:nth-child(2) { animation-delay:205ms; }
.anim-card .tb-chip:nth-child(3) { animation-delay:260ms; }

/* moment #3 — session → break: the calm break panel settles (the OVER-RUN break never gets .anim-panel) */
.anim-panel { animation:m-panel-in var(--dur-settle) var(--ease-decel) both; }

/* moment #5 — day complete: the mark draws in; the title + the three stat tiles rise, staggered */
.anim-dc .dc-mark { animation:m-mark-draw var(--dur-settle) var(--ease-settle) both; }
.anim-dc h1 { animation:m-row-in var(--dur-base) var(--ease-decel) 120ms both; }
.anim-dc .dc-stat { animation:m-tile-up var(--dur-base) var(--ease-decel) both; }
.anim-dc .dc-stat:nth-child(1) { animation-delay:200ms; }
.anim-dc .dc-stat:nth-child(2) { animation-delay:270ms; }
.anim-dc .dc-stat:nth-child(3) { animation-delay:340ms; }

/* Lens A + Lens B converge on ONE static end-state: reduced-motion disables the beats (meaning is fully carried
 * by icon + text + colour in the resting frame). The VRT harness's cssReset does the same before every shot, so
 * the goldens are unchanged — motion cannot drift the pixel-diff. */
@media (prefers-reduced-motion: reduce) {
  .anim-card, .anim-card *, .anim-panel, .anim-dc, .anim-dc * { animation:none !important; }
}

/* ═══ Package inspector — MARK A LESSON DONE (prior-study seeding) ═══════════════════════════════════
 * redojo-package-inspection-mark-as-done-capture. Transcoded VERBATIM from the Designer's verified
 * prototype (mark-done-preview.html) — tokens only, no raw colour. Extends the read-only inspector; all
 * enrolment-gated at render (v.Enrolled). */

/* enrolment badge in the header sub-row (render-only; v.Enrolled) */
.enrol-badge { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--emerald-600);
  background:var(--emerald-50); border-radius:var(--radius-pill); padding:4px 11px; }
.enrol-badge .ic { width:13px; height:13px; }
.enrol-badge.not { color:var(--color-text-muted); background:var(--stone-100); }

/* the tree lesson row's mark-done control column — effort chip + a quiet mark control (not-done) or a
 * settled Done marker (done); enrolment-gated (a non-enrolled viewer sees neither, as today). */
.tright { display:inline-flex; align-items:center; gap:8px; justify-self:end; }
.tmark { width:26px; height:26px; flex:none; display:grid; place-items:center; border-radius:var(--radius-pill);
  background:transparent; box-shadow:inset 0 0 0 1px var(--stone-300); color:var(--stone-400); border:0; cursor:pointer;
  transition:color .13s, background .13s, box-shadow .13s; }
.tmark:hover { color:var(--emerald-600); background:var(--emerald-50); box-shadow:inset 0 0 0 1.5px var(--emerald-500); }
.tmark:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.tmark .ic { width:14px; height:14px; }
.tmark .ic-hover { display:none; }
.tmark:hover .ic-idle { display:none; }
.tmark:hover .ic-hover { display:block; }
/* done — a settled, non-actionable marker (check glyph + word "Done"; NOT a button; colour never sole signal) */
.tdone { display:inline-flex; align-items:center; gap:6px; font:700 12px/1 var(--font-sans); color:var(--emerald-600);
  background:var(--emerald-50); border-radius:var(--radius-pill); padding:4px 10px; white-space:nowrap; }
.tdone .ic { width:13px; height:13px; }

/* the lesson detail panel's seeding zone (mark-done · confirm · done) — rendered ONLY when v.Enrolled. */
.pnl-seed { margin-top:18px; padding-top:16px; border-top:1px solid var(--stone-100); }
.seed-cap { font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 10px; }
/* state 1 — actionable */
.seed-action { display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap; }
.seed-copy { font-size:12.5px; line-height:1.5; color:var(--color-text-muted); max-width:19rem; }
.seed-copy b { color:var(--color-text); font-weight:700; }
.btn-markdone { display:inline-flex; align-items:center; gap:8px; border:0; cursor:pointer; border-radius:var(--radius-xl);
  background:var(--emerald-50); color:var(--emerald-600); padding:11px 17px; font:700 14px/1 var(--font-sans); white-space:nowrap; }
.btn-markdone:hover { box-shadow:inset 0 0 0 1.5px var(--emerald-500); }
.btn-markdone:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.btn-markdone .ic { width:16px; height:16px; }
.btn-markdone.solid { background:var(--emerald-600); color:var(--white); }
.btn-markdone.solid:hover { filter:brightness(.94); box-shadow:none; }
/* state 4 — the "are you sure?" confirm (amber; a forward one-way write, not a delete) */
.seed-confirm { background:var(--amber-50); border-radius:var(--radius-xl); padding:15px 16px; box-shadow:inset 0 0 0 1px var(--amber-400); }
.sc-head { display:flex; align-items:center; gap:9px; font:800 13.5px/1.25 var(--font-sans); color:var(--color-text); }
.sc-head .ic { width:18px; height:18px; color:var(--amber-600); flex:none; }
.sc-body { font-size:12.5px; line-height:1.5; color:var(--color-text-muted); margin:9px 0 14px; }
.sc-body b { color:var(--color-text); font-weight:700; }
.sc-actions { display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
.btn-seed-cancel { border:0; background:transparent; color:var(--stone-600); font:600 13px/1 var(--font-sans);
  padding:11px 15px; border-radius:var(--radius-xl); cursor:pointer; }
.btn-seed-cancel:hover { background:var(--white); }
.btn-seed-cancel:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
/* state 2 — done (settled, one-way; NO un-mark control) */
.seed-done .sd-badge { display:inline-flex; align-items:center; gap:8px; font:800 13px/1 var(--font-sans); color:var(--emerald-600);
  background:var(--emerald-50); border-radius:var(--radius-pill); padding:10px 16px; }
.seed-done .sd-badge .ic { width:16px; height:16px; }
.seed-done .sd-note { font-size:12px; line-height:1.5; color:var(--color-text-muted); margin:11px 0 0; }
.seed-done .sd-note a { color:var(--s-ic); font-weight:700; text-decoration:none; }
.seed-done .sd-note a:hover { text-decoration:underline; }

/* the tree-row confirm popover (the same confirm on the tree surface) — content cloned in by islands.js. */
.markpop-scrim { position:fixed; inset:0; z-index:70; display:none; }
.markpop-scrim.open { display:block; }
.markpop { position:fixed; z-index:71; width:min(320px,92vw); background:var(--color-surface);
  border-radius:var(--radius-xl); box-shadow:var(--shadow-lg); padding:15px 16px; display:none; }
.markpop.open { display:block; }
.markpop .sc-head .ic { color:var(--amber-600); }

/* ═══════════════════════════════════════════════════════════════════════════
 * PLAN section (redojo-ia-plan-shell-tabs S3) — the tabbed "Plan" container's chrome: the sticky
 * per-subject "Plan fit" verdict bar + the section tab strip, pinned together in .plan-chrome.
 * TRANSCODED from the Designer's verified package (UX v1_44); sits inside AppShell's content slot
 * (the header/footer/width are redojo-0084's, untouched). The verdict bar is honest by design: S3
 * ships the neutral "not checked yet" placeholder + the enrol hint; the S6 fed ✓/✗ verdict + roll-up
 * is drawn design-ahead behind the redojo-0042 .stub not-yet mask (S6 fills data, no restyle).
 * ═══════════════════════════════════════════════════════════════════════════ */
.plan { display:flex; flex-direction:column; }

/* the sticky chrome block — verdict band + tab strip pin together below the (scrolling) AppShell header. */
.plan-chrome { position:sticky; top:0; z-index:5; border-radius:var(--radius-xl) var(--radius-xl) 0 0;
  overflow:hidden; box-shadow:var(--shadow-md); margin-bottom:22px; }

/* per-subject "Plan fit" verdict band — the dark bar that persists across the Plan tabs. */
.plan-verdict { position:relative; display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  background:var(--stone-900); color:var(--white); padding:14px 20px; }
.pv-title { font-family:var(--font-display); font-weight:700; font-size:15px; letter-spacing:-.01em;
  display:inline-flex; align-items:center; gap:8px; }
.pv-title::before { content:""; width:8px; height:8px; border-radius:var(--radius-pill); background:var(--amber-400); }
.pv-hint { font-size:13.5px; color:var(--stone-300); }
.pv-pill { display:inline-flex; align-items:center; gap:8px; background:rgb(255 255 255 / .07);
  box-shadow:inset 0 0 0 1px rgb(255 255 255 / .14); border-radius:var(--radius-pill); padding:6px 13px 6px 11px; }
.pv-dot { width:9px; height:9px; border-radius:var(--radius-pill); flex:none; background:var(--dot,var(--stone-400));
  box-shadow:0 0 0 2px rgb(255 255 255 / .18); }
.pv-name { font-weight:700; font-size:13px; color:var(--white); }
.pv-state { font-size:12px; color:var(--stone-400); }
.pv-note { margin-left:auto; font-size:12px; color:var(--stone-400); }
/* S6 fed (design-ahead, masked): real ✓/✗ chip per subject + the overall roll-up. */
.pv-pill-fed { gap:9px; padding:5px 6px 5px 11px; }
.pv-chip { display:inline-flex; align-items:center; gap:5px; font-weight:800; font-size:12px;
  border-radius:var(--radius-pill); padding:3px 10px; }
.pv-chip.pv-fits { background:var(--emerald-500); color:var(--emerald-950); }
.pv-chip.pv-short { background:var(--red-600); color:var(--white); }
.pv-chip.pv-none { background:var(--stone-100); color:var(--stone-500); } /* S10 — the neutral not-checked verdict */
.pv-rollup { margin-left:auto; display:inline-flex; align-items:center; gap:7px; font-size:12.5px;
  font-weight:700; background:rgb(255 255 255 / .1); border-radius:var(--radius-pill); padding:6px 13px; }
.pv-mask { position:absolute; inset:0; z-index:1; pointer-events:none;
  background:repeating-linear-gradient(-45deg, rgb(251 191 36 / 0), rgb(251 191 36 / 0) 13px,
    rgb(251 191 36 / .16) 13px, rgb(251 191 36 / .16) 15px); }
.pv-notyet { position:absolute; top:9px; right:12px; z-index:2; display:inline-flex; align-items:center; gap:6px;
  background:var(--amber-400); color:var(--stone-900); font-size:10px; font-weight:800; text-transform:uppercase;
  letter-spacing:.06em; padding:4px 9px; border-radius:var(--radius-pill); }

/* the Plan section tab strip — a second nav landmark; the active tab carries the amber underline. */
.plan-tabs { display:flex; gap:2px; flex-wrap:wrap; background:var(--white); padding:0 12px;
  border-bottom:1px solid var(--stone-200); }
.plan-tab { padding:14px 12px; font-size:14px; font-weight:600; color:var(--stone-500); text-decoration:none;
  border-bottom:2.5px solid transparent; margin-bottom:-1px; }
.plan-tab:hover { color:var(--stone-800); border-bottom-color:var(--stone-300); }
.plan-tab:focus-visible { outline:2px solid var(--stone-900); outline-offset:-2px; border-radius:4px; }
.plan-tab-active { font-weight:700; color:var(--stone-900); border-bottom-color:var(--amber-400); }
.plan-tab-active:hover { border-bottom-color:var(--amber-400); }

/* ── Contents selector (redojo-ia-plan-shell-tabs S3, UX v1_45) — the subject/paper switcher that
 *    replaces the inspector's "‹ Catalog" crumb on the Contents tab. Transcoded from the Designer
 *    package; token-bound. The active pill uses aria-current="page" as the state hook. ── */
.contents-selector { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:16px; }
.cs-label { font-size:11px; font-weight:800; text-transform:uppercase; letter-spacing:.05em; color:var(--stone-400); margin-right:2px; }
.cs-sep { width:1px; height:20px; background:var(--stone-300); margin:0 4px; }
.cs-subject { display:inline-flex; align-items:center; gap:7px; text-decoration:none; font-size:12.5px;
  border-radius:var(--radius-pill); padding:5px 13px; font-weight:600; background:var(--stone-50); color:var(--stone-600); }
.cs-subject .cs-dot { width:8px; height:8px; border-radius:50%; flex:none; background:var(--dot,var(--stone-400)); }
.cs-subject[aria-current="page"] { font-weight:700; background:var(--tint); color:var(--ic-text); }
.cs-subject:hover { filter:brightness(.98); }
.cs-paper { text-decoration:none; font-size:12.5px; border-radius:var(--radius-pill); padding:5px 13px;
  font-weight:600; background:var(--stone-50); color:var(--stone-600); }
.cs-paper[aria-current="page"] { font-weight:700; background:var(--stone-900); color:var(--white); }
.cs-paper:hover { filter:brightness(.98); }
.cs-badge { margin-left:auto; font-size:10.5px; font-weight:700; color:var(--stone-400); background:var(--white);
  box-shadow:inset 0 0 0 1px var(--stone-200); padding:4px 10px; border-radius:var(--radius-pill); }

/* ═══════════════════════════════════════════════════════════════════════════
 * CATCH-UP (redojo-ia-catch-up-lessons-batch, S12) — the Plan ▸ Catch up tab body: batch lesson
 * seeding over the SHARED tree in CHECKBOX mode. Only the per-leaf overlay swaps; the .trow grid /
 * glyph / caret are the shared tree's (DO-NOT-TOUCH). Transcoded from the Designer package
 * (reDojo_v1_48), token-bound (no raw hex). Row-highlight-when-checked uses :has() so the shared row
 * markup stays untouched. Select-all / clear / live-tally are JS enhancements (Build); the checkbox +
 * Apply-submit form is the no-JS base.
 * ═══════════════════════════════════════════════════════════════════════════ */
.cu-intro { margin-bottom:16px; }
.cu-intro-h { font-family:var(--font-display); font-weight:700; font-size:19px; letter-spacing:-.01em; }
.cu-intro-p { font-size:13px; color:var(--stone-500); margin-top:3px; }

/* subject switcher (per-package; PO: per paper) */
.cu-switcher { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:16px; }
.cu-switcher-k { font-size:11px; font-weight:800; text-transform:uppercase; letter-spacing:.05em; color:var(--stone-400); margin-right:2px; }
.cu-subject { display:inline-flex; align-items:center; gap:7px; text-decoration:none; font-size:12.5px;
  border-radius:var(--radius-pill); padding:5px 13px; font-weight:600; background:var(--stone-50); color:var(--stone-500); }
.cu-subject .cu-subject-dot { width:8px; height:8px; border-radius:50%; flex:none; background:var(--dot,var(--stone-400)); }
.cu-subject.is-current { font-weight:700; background:var(--tint); color:var(--ic-text); box-shadow:inset 0 0 0 1.5px var(--ic-text); }
.cu-subject:hover { filter:brightness(.98); }
.cu-switcher-note { margin-left:auto; font-size:10.5px; font-weight:700; color:var(--amber-600); background:var(--amber-50); padding:4px 10px; border-radius:var(--radius-pill); }

/* the tree card (mirrors .insp-tree) */
.cu-tree-wrap { background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:8px; }
.cu-tree-head { display:flex; align-items:center; justify-content:space-between; padding:10px 12px 8px; }
.cu-tree-head .k { font-size:11px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--stone-400); }
.cu-tree-head .hint { font-size:12px; color:var(--stone-500); }

/* the checkbox overlay — a real focusable input, styled as the design's box (no-JS batch member) */
.cu-check { justify-self:end; display:inline-grid; place-items:center; position:relative; cursor:pointer; }
.cu-check-in { position:absolute; inset:0; width:100%; height:100%; margin:0; opacity:0; cursor:pointer; }
.cu-box { display:grid; place-items:center; width:18px; height:18px; border-radius:5px; background:var(--white);
  box-shadow:inset 0 0 0 1.5px var(--stone-300); }
.cu-box .ic { width:13px; height:13px; stroke-width:3; color:var(--white); opacity:0; }
.cu-check-in:checked + .cu-box { background:var(--emerald-500); box-shadow:none; }
.cu-check-in:checked + .cu-box .ic { opacity:1; }
.cu-check-in:focus-visible + .cu-box { outline:2px solid var(--stone-900); outline-offset:2px; }
.cu-tree-wrap .trow:has(.cu-check-in:checked) { background:var(--emerald-50); }
.cu-tree-wrap .trow:has(.cu-check-in:checked):hover { background:var(--emerald-50); }

/* done badge (already caught up — no checkbox) + the muted done/exset row name */
.cu-done { justify-self:end; display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700;
  color:var(--emerald-600); background:var(--emerald-50); border-radius:var(--radius-pill); padding:3px 10px 3px 8px; white-space:nowrap; }
.cu-done .ic { width:13px; height:13px; }
.cu-tree-wrap .trow:has(.cu-done) .tname { color:var(--stone-500); }


/* select-all (topic overlay) — tri-state over the topic's not-yet-done lessons */
.cu-alldone { justify-self:end; display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700; color:var(--emerald-600); white-space:nowrap; }
.cu-alldone .ic { width:13px; height:13px; }
.cu-selall { justify-self:end; display:inline-flex; align-items:center; gap:7px; border:0; background:transparent;
  cursor:pointer; font:700 11px/1 var(--font-sans); color:var(--s-indigo-ic); border-radius:var(--radius-pill); padding:4px; }
.cu-selall:hover { filter:brightness(1.1); }
.cu-selall:focus-visible { outline:2px solid var(--stone-900); outline-offset:2px; }
.cu-selbox { display:grid; place-items:center; width:16px; height:16px; border-radius:4px; flex:none; box-shadow:inset 0 0 0 1.5px var(--stone-300); }
.cu-selbox.is-all, .cu-selbox.is-some { background:var(--s-indigo-ic); box-shadow:none; }
.cu-selbox .ic { width:11px; height:11px; stroke-width:3; color:var(--white); }
.cu-selbox-dash { width:8px; height:2px; background:var(--white); border-radius:2px; }

/* the sticky apply bar */
.cu-apply { position:sticky; bottom:0; margin-top:16px; background:var(--stone-900); color:var(--white);
  border-radius:var(--radius-lg); padding:13px 16px 13px 20px; display:flex; align-items:center; gap:14px; flex-wrap:wrap; box-shadow:var(--shadow-lg); }
.cu-tally { font-size:13.5px; font-weight:700; }
.cu-tally-note { font-size:12px; color:var(--stone-400); }
.cu-applied { display:inline-flex; align-items:center; gap:8px; font-size:13.5px; font-weight:700; color:var(--emerald-500); }
.cu-applied .ic { width:16px; height:16px; }
.cu-apply-actions { margin-left:auto; display:flex; align-items:center; gap:8px; }
.cu-clear { border:0; background:transparent; cursor:pointer; font:600 12.5px/1 var(--font-sans); color:var(--stone-400); padding:9px 12px; border-radius:var(--radius-lg); }
.cu-clear:hover { color:var(--white); }
.cu-apply-btn { display:inline-flex; align-items:center; gap:7px; border:0; font:700 13px/1 var(--font-sans);
  border-radius:var(--radius-lg); padding:10px 18px; background:var(--amber-400); color:var(--stone-900); cursor:pointer; }
.cu-apply-btn .ic { width:15px; height:15px; }
.cu-apply-btn:hover { background:var(--amber-500); }
/* Disabled LOOK — driven by the JS `.is-disabled` class AND (no-JS) the CSS :has() state, so the button
 * renders grey when the form has no checked lesson and amber when it does; identical to the design's two
 * states. The button is never truly `disabled` server-side, so a no-JS student can always submit. */
.cu-apply-btn.is-disabled,
.cu-form:not(:has(.cu-check-in:checked, .cux-opt-in[value="got-it"]:checked, .cux-opt-in[value="not-yet"]:checked)) .cu-apply-btn { background:transparent; box-shadow:inset 0 0 0 1.5px var(--stone-600); color:var(--stone-300); cursor:not-allowed; }
.cu-apply-btn.is-disabled:hover,
.cu-form:not(:has(.cu-check-in:checked, .cux-opt-in[value="got-it"]:checked, .cux-opt-in[value="not-yet"]:checked)) .cu-apply-btn:hover { background:transparent; }

/* empty state (no enrolments) */
.cu-empty { display:flex; gap:14px; align-items:flex-start; background:var(--amber-50); border-radius:var(--radius-2xl);
  padding:20px 22px; box-shadow:inset 0 0 0 1px var(--amber-400); }
.cu-empty-ic { display:grid; place-items:center; width:38px; height:38px; flex:none; border-radius:var(--radius-lg); background:var(--amber-400); color:var(--stone-900); }
.cu-empty-ic .ic { width:19px; height:19px; }
.cu-empty-h { font-family:var(--font-display); font-weight:700; font-size:16px; color:var(--stone-900); }
.cu-empty-p { font-size:13.5px; line-height:1.55; color:var(--amber-600); margin:4px 0 0; max-width:44rem; }
.cu-empty-cta { display:inline-flex; align-items:center; gap:7px; margin-top:13px; font-size:13px; font-weight:700;
  color:var(--white); background:var(--stone-900); border-radius:var(--radius-lg); padding:9px 15px; text-decoration:none; }
.cu-empty-cta .ic { width:14px; height:14px; }
.cu-empty-cta:hover { background:var(--stone-700); color:var(--white); }

/* ═════════════════════════════════════════════════════════════════
 * CATCH-UP · EXERCISES (redojo-manual-mark-exercise-done, realizes S13)
 * APPEND to internal/web/static/tokens.css, after the S12 Catch-up block
 * (the `.cu-*` rules ending at `.cu-empty-cta:hover`).
 *
 * Tokens only (kata-0026) — no raw #hex/rgb(). Reuses the shipped
 * primitives rather than re-founding them:
 *   .cu-tree-wrap / .cu-tree-head  → the card + head idiom (.cux-sec mirrors it)
 *   .cu-done                       → the already-marked badge (reused verbatim on sets)
 *   .diff + .d-easy…d-veryhard     → the SHARED difficulty chip (colour + WORD)
 *   .tglyph.is-exset               → the amber practice glyph from the shared tree
 *   .cu-apply / .cu-tally          → the sticky Apply bar (extended, see the ⚠ EDIT below)
 *   .btn-gotit / .btn-notyet       → the RUNNER's Got it / Not yet vocabulary — same two
 *                                    outcomes, so the same words + the same check / rotate
 *                                    glyphs; shrunk from a 15px action button to a row-scale
 *                                    selection pill (a control, not a page action).
 *
 * Colour is never the sole signal: every outcome carries a GLYPH + the WORD.
 * ═════════════════════════════════════════════════════════════════ */

/* ── the Practice-sets card (sibling of .cu-tree-wrap, inside the SAME .cu-form) ── */
.cux-sec { margin-top:16px; background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:8px; }
.cux-sec-head { display:flex; align-items:flex-start; gap:16px; flex-wrap:wrap; padding:12px 12px 10px; }
.cux-sec-head > div:first-child { flex:1 1 20rem; min-width:0; }
.cux-sec-h { font-family:var(--font-display); font-weight:700; font-size:15px; letter-spacing:-.01em; }
.cux-sec-p { font-size:12.5px; color:var(--stone-500); margin-top:3px; max-width:38rem; }
.cux-sec-note { margin-left:auto; display:flex; align-items:flex-start; gap:7px; max-width:20rem;
  font-size:11.5px; line-height:1.45; font-weight:600; color:var(--amber-600); background:var(--amber-50);
  border-radius:var(--radius-lg); padding:8px 11px; }
.cux-sec-note .ic { width:14px; height:14px; flex:none; margin-top:1px; }

/* ── one exercise-set = a native <details> (no-JS disclosure, like the tree's topics) ── */
.cux-sets { display:flex; flex-direction:column; gap:6px; }
.cux-set { border-radius:var(--radius-xl); box-shadow:inset 0 0 0 1px var(--stone-200); overflow:hidden; }
.cux-set-sum { display:flex; align-items:center; gap:10px; padding:11px 13px; cursor:pointer; list-style:none;
  font-size:13.5px; background:var(--white); }
.cux-set-sum::-webkit-details-marker { display:none; }
.cux-set-sum:hover { background:var(--stone-50); }
.cux-set-sum:focus-visible { outline:2px solid var(--stone-900); outline-offset:-2px; }
.cux-caret { display:inline-flex; color:var(--stone-400); transition:transform .15s; }
.cux-caret .ic { width:15px; height:15px; }
.cux-set[open] > .cux-set-sum .cux-caret { transform:rotate(90deg); }
.cux-set-name { font-weight:700; color:var(--color-text); white-space:nowrap; flex:0 0 auto; }
.cux-set-name .sep { color:var(--stone-300); font-weight:600; }
.cux-set-meta { font-size:12px; color:var(--stone-500); white-space:nowrap; flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; }
.cux-set-left { margin-left:auto; font-size:11px; font-weight:800; letter-spacing:.02em; color:var(--s-indigo-ic);
  background:var(--stone-50); border-radius:var(--radius-pill); padding:3px 10px; white-space:nowrap; }
.cux-set-sum .cu-done { margin-left:auto; }
.cux-set-body { border-top:1px solid var(--stone-100); background:var(--stone-50); padding:4px 8px 8px; }

/* ── a difficulty tier group inside a set ── */
.cux-tier { margin-top:8px; }
.cux-tier-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; padding:6px 6px 8px; }
.cux-tier-n { font-size:11.5px; font-weight:600; color:var(--stone-500); }
.cux-tier-all { margin-left:auto; display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700; color:var(--emerald-600); }
.cux-tier-all .ic { width:13px; height:13px; }

/* the low-click population model: a tier-level "All N got it" that PRE-FILLS every control in
   the tier (each one still individually correctable before Apply — it never commits anything).
   A progressive enhancement: without JS the per-exercise controls below are the honest base. */
.cux-bulk { margin-left:auto; display:flex; align-items:center; gap:6px; }
.cux-bulk-btn { display:inline-flex; align-items:center; gap:6px; border:0; cursor:pointer;
  font:700 11.5px/1 var(--font-sans); color:var(--stone-700); background:var(--white);
  box-shadow:inset 0 0 0 1.5px var(--stone-300); border-radius:var(--radius-pill); padding:6px 12px; }
.cux-bulk-btn:hover { background:var(--stone-100); box-shadow:inset 0 0 0 1.5px var(--stone-400); }
.cux-bulk-btn:focus-visible { outline:2px solid var(--stone-900); outline-offset:2px; }
.cux-bulk-btn .ic { width:13px; height:13px; }
.cux-bulk-btn.is-quiet { background:transparent; box-shadow:none; color:var(--stone-500); padding:6px 8px; }
.cux-bulk-btn.is-quiet:hover { color:var(--stone-800); background:transparent; }

/* ── one exercise row ── */
.cux-rows { display:flex; flex-direction:column; gap:4px; }
.cux-row { display:flex; align-items:center; gap:12px; background:var(--white); border-radius:var(--radius-lg);
  padding:7px 10px 7px 13px; min-height:44px; box-sizing:border-box; }
.cux-q { font-family:var(--font-display); font-weight:700; font-size:13px; width:32px; flex:none; font-variant-numeric:tabular-nums; }
.cux-marks { font-size:12.5px; font-weight:600; color:var(--color-text); }
.cux-est { display:inline-flex; align-items:center; gap:5px; font-size:12px; color:var(--stone-500); }
.cux-est .ic { width:13px; height:13px; }
.cux-row .cux-oc, .cux-row .cux-marked { margin-left:auto; }

/* selection feedback on the whole row — tinted by outcome, but the pill's glyph + word carry it */
.cux-row:has(.cux-opt-in[value="got-it"]:checked) { background:var(--emerald-50); }
.cux-row:has(.cux-opt-in[value="not-yet"]:checked) { background:var(--amber-50); }
.cux-row.is-marked { background:var(--stone-100); }
.cux-row.is-marked .cux-q, .cux-row.is-marked .cux-marks { color:var(--stone-500); }

/* ── the three-state outcome control: Got it · Not yet · clear (unset) ──
   Real <input type="radio">s in the Apply <form> (no-JS native, keyboard + focus-visible).
   Unset is a real third radio (value=""), so a mis-tap is correctable WITHOUT JS. */
.cux-oc { display:inline-flex; align-items:center; gap:6px; }
.cux-opt { position:relative; display:inline-flex; cursor:pointer; }
.cux-opt-in { position:absolute; inset:0; width:100%; height:100%; margin:0; opacity:0; cursor:pointer; }
.cux-opt-b { display:inline-flex; align-items:center; gap:6px; white-space:nowrap;
  font:700 12px/1 var(--font-sans); color:var(--stone-600); background:var(--white);
  box-shadow:inset 0 0 0 1.5px var(--stone-300); border-radius:var(--radius-pill); padding:9px 14px; }
.cux-opt-b .ic { width:14px; height:14px; stroke-width:2.4; }
.cux-opt:hover .cux-opt-b { background:var(--stone-50); box-shadow:inset 0 0 0 1.5px var(--stone-400); }
.cux-opt-in:focus-visible + .cux-opt-b { outline:2px solid var(--stone-900); outline-offset:2px; }
/* Got it — emerald fill + check glyph (the runner's .btn-gotit idiom, row-scale) */
.cux-opt.is-got .cux-opt-in:checked + .cux-opt-b { background:var(--emerald-500); color:var(--white); box-shadow:none; }
/* Not yet — amber fill + rotate glyph. Distinguished from Got it by GLYPH + WORD, not colour. */
.cux-opt.is-not .cux-opt-in:checked + .cux-opt-b { background:var(--amber-400); color:var(--stone-900); box-shadow:none; }
/* clear (unset) — a quiet ✕; the checked (= unmarked) state is deliberately the flattest thing in the row */
.cux-opt.is-clear .cux-opt-b { padding:9px; color:var(--stone-400); box-shadow:inset 0 0 0 1.5px var(--stone-200); }
.cux-opt.is-clear .cux-opt-in:checked + .cux-opt-b { color:var(--stone-300); box-shadow:inset 0 0 0 1.5px var(--stone-100); background:var(--white); }
.cux-opt.is-clear:hover .cux-opt-b { color:var(--stone-700); }

/* ── already marked: the recorded outcome as a badge, NO control and NO un-mark (one-way) ──
   Mirrors S12's .cu-done treatment; a Not yet also states its consequence (the redo). */
.cux-marked { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:700;
  border-radius:var(--radius-pill); padding:5px 12px 5px 10px; white-space:nowrap; }
.cux-marked .ic { width:13px; height:13px; }
.cux-marked.is-got { color:var(--emerald-600); background:var(--emerald-50); }
.cux-marked.is-not { color:var(--amber-600); background:var(--amber-50); box-shadow:inset 0 0 0 1px var(--amber-400); }

/* nothing left to mark in a set / no exercise-set under a sub-topic */
.cux-nothing { display:flex; align-items:center; gap:9px; margin:8px 2px; padding:12px 14px; border-radius:var(--radius-lg);
  background:var(--emerald-50); color:var(--emerald-600); font-size:12.5px; font-weight:600; }
.cux-nothing .ic { width:15px; height:15px; flex:none; }
.cux-noset { display:flex; align-items:center; gap:8px; margin:2px 0 6px 46px; font-size:12px; color:var(--stone-500); }
.cux-noset .ic { width:14px; height:14px; flex:none; }

/* the tree's exercise-set row: the masked "🔒 Exercises · S13" pill (.cu-exset-stub) is REMOVED —
   the row now states how much is left to mark and points down to the Practice-sets card. */
.cux-count { justify-self:end; display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:800;
  color:var(--s-indigo-ic); background:var(--stone-50); border-radius:var(--radius-pill); padding:3px 10px; white-space:nowrap; }
.cux-count-a { color:var(--stone-400); }
.trow[data-kind="exset"]:hover .cux-count { background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-300); }
/* the landing flash after a jump from the tree row (enhancement only) */
.cux-set.is-jumped { box-shadow:inset 0 0 0 2px var(--s-indigo-ic); }

/* ── Apply bar: the mixed tally (lessons AND exercises, split by outcome) ── */
.cux-split { display:inline-flex; align-items:center; gap:10px; font-size:12px; font-weight:700; }
.cux-split[hidden] { display:none; } /* the split is always rendered as the island's toggle hook (the counts are client-side, so the server can never gate it); this restores the `hidden` attribute the explicit display above would otherwise defeat — same trap + fix as .rd-defaultnote[hidden] */
.cux-split-got { display:inline-flex; align-items:center; gap:5px; color:var(--emerald-500); }
.cux-split-not { display:inline-flex; align-items:center; gap:5px; color:var(--amber-400); }
.cux-split .ic { width:13px; height:13px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * EXAM SESSION PICKER (redojo-ia-exam-session-picker, S1) — extends the redojo-0081 EXAM DATA block.
 * No new token (reuses .field / .field-label / .form-error / the .examdata-* primitives). Transcoded
 * from the Designer's verified package (package-exam-session-picker, tokens-session-additions.css).
 *
 * CONTROL: a native <select class="field"> (not a custom popover) — the session→date default resolves
 * server-side (a <select> can't fill a date input without JS), it sits consistently with the panel's
 * existing native date/number .field inputs, and it gives keyboard + focus + contrast for free (kids'
 * app). The schedule's custom <details> popover is deliberately NOT reused — that solved a tight inline
 * grid slot, not this full-width SSR form.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* the required Exam-session <select> renders as a .field sibling — keep the native disclosure arrow
   (most robust, no raster asset), reserve room for it, and make the whole control feel clickable */
.examdata-form select.field { appearance:auto; cursor:pointer; padding-right:30px; line-height:1.3; }
/* the placeholder ("Choose your exam session…") reads muted until a real session is picked
   (required + empty value ⇒ :invalid), matching the "not set yet" language elsewhere */
.examdata-form select.field:invalid { color:var(--color-text-muted); }
.examdata-form select.field option { color:var(--color-text); }

/* the "· optional" tag on the now-optional Exam-date label (un-uppercased, muted) */
.examdata-optional { text-transform:none; letter-spacing:0; font-weight:600; color:var(--color-text-muted); }

/* the show-back session — the primary term, ahead of the concrete date + period */
.examdata-summary .exam-session { color:var(--color-text); font-weight:700; }

/* ═══════════════════════════════════════════════════════════════════════════
 * PLAN SIMULATION (redojo-ia-plan-simulation, S6) — the per-subject fit-check on
 * the Weekly-schedule tab + the schedule-grid condense (absorbs cancelled S4).
 * Transcoded from the Designer package reDojo_v1_47. All values resolve to
 * existing tokens + the 3 --act-* activity colours below (kata-0026: #hex in :root).
 * ═══════════════════════════════════════════════════════════════════════════ */

/* barcode activity-type colours — the lane carries the SUBJECT hue (dot + name),
 * the block hue carries the ACTIVITY type (disambiguated by the legend; colour is
 * never the sole signal). Lesson is the only NEW colour; Topical/Mixed reuse tokens. */
:root{
  --act-lesson:#2563eb;                /* blue — the only NEW colour */
  --act-topical:var(--emerald-600);    /* green #059669 — reuses an existing token */
  /* §B1 (redojo-sim-polish) — Mixed re-coloured OFF alarm-red to a non-alarm violet: a run of red
   * Mixed days read as "the plan doesn't fit" and fought the actual Fit verdict. Violet = "both kinds
   * of work in one day" — a distinct third category, calm, non-alarm. Repoints the EXISTING token
   * (name unchanged → .sw/.sim-blk move in lockstep); reuses --s-violet-ic, NO new #hex (kata-0026). */
  --act-mixed:var(--s-violet-ic);      /* violet #7c3aed — was var(--red-600) */
}

/* condense pass (absorbs S4) — density-only overrides on the existing schedule card */
.sched-head{margin-bottom:16px;}
.sched-head h1{font-size:26px;}
.sched-head p{font-size:14px;color:var(--color-text-muted);margin:5px 0 0;max-width:52rem;}
.sched-card{padding:16px 18px;margin-bottom:0;}
.sched-card .rhythm-bar{margin-bottom:12px;}
.sched-card .totrow{gap:20px;}
.sched-card .totrow .t b{font-size:22px;}
.sched-card .subjtally{margin-bottom:12px;padding-bottom:12px;}
.sched-card .wstrip{gap:8px;}
.sched-card .wcol{gap:6px;}
.sched-card .blk{padding:7px 9px;}
.sched-card .blk .s,.sched-card .blk .k{display:block;}
.sched-card .wcol.rest .wrest{margin-top:41px;} /* align Rest day box with where session blocks start */

/* the simulation section */
.sim{margin-top:22px;padding-top:20px;border-top:1px solid var(--stone-200);}
.sim-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:16px;}
.sim-head h2{font-family:var(--font-display);font-weight:700;font-size:20px;letter-spacing:-.01em;}
.sim-sub{font-size:13px;color:var(--color-text-muted);}

.sim-hours{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:14px;}
.sim-hours-lab{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-faint);}
.sim-hchip{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:700;background:var(--stone-100);border-radius:var(--radius-pill);padding:5px 12px;}
.sim-hchip .dot{width:8px;height:8px;border-radius:var(--radius-pill);background:var(--dot);flex:none;}
.sim-htotal{font-size:12.5px;font-weight:800;background:var(--stone-900);color:var(--white);border-radius:var(--radius-pill);padding:5px 13px;}

.sim-legend{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:12px;}
.sim-legend .lg{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--color-text-muted);}
.sim-legend .lg-danger{color:var(--color-text-muted);}
.sim-legend .sw{width:13px;height:13px;border-radius:3px;flex:none;}
.sw.act-lesson{background:var(--act-lesson);}
.sw.act-topical{background:var(--act-topical);}
.sw.act-mixed{background:var(--act-mixed);}
.sw.sw-runway{background:var(--stone-100);box-shadow:inset 0 0 0 1.5px var(--stone-400);}
.sw.sw-over{background:var(--stone-100);box-shadow:inset 0 0 0 1.5px var(--stone-400);}

.sim-board{background:var(--stone-50);border-radius:var(--radius-2xl);padding:16px 18px;}
.sim-scale,.sim-lane{display:grid;grid-template-columns:116px 1fr;gap:12px;align-items:center;}
.sim-months{display:flex;justify-content:space-between;font-size:10px;font-weight:600;color:var(--color-text-faint);}
.sim-lane{margin-top:20px;position:relative;}
.sim-lane:has(details[open]){z-index:20;}
.sim-lane-label{display:flex;align-items:center;gap:9px;}
.sim-lane-label .dot{width:11px;height:11px;border-radius:var(--radius-pill);background:var(--dot);flex:none;}
.sl-name{font-weight:700;font-size:13.5px;}
.sl-verdict{font-size:11px;font-weight:800;margin-top:2px;display:inline-flex;align-items:center;gap:4px;}
.sl-verdict.ok{color:var(--emerald-600);}
.sl-verdict.bad{color:var(--red-600);}

.sim-track{position:relative;height:64px;background:var(--white);border-radius:var(--radius-lg);box-shadow:inset 0 0 0 1px var(--stone-200);padding:5px 4px;}
.sim-band{position:absolute;top:0;bottom:0;z-index:0;border-radius:0 var(--radius-lg) var(--radius-lg) 0;}
.sim-band.runway{background:var(--stone-100);border-left:1px dashed var(--stone-400);}
.sim-band.over{background:var(--stone-100);border-left:1px dashed var(--stone-400);}
.sim-days{position:relative;z-index:1;display:flex;align-items:stretch;gap:0;height:100%;}
.sim-day{flex:1;display:flex;flex-direction:column-reverse;gap:0;min-width:0;}
.sim-blk{height:16px;}
.sim-blk.act-lesson{background:var(--act-lesson);}
.sim-blk.act-topical{background:var(--act-topical);}
.sim-blk.act-mixed{background:var(--act-mixed);}
.sim-blk.sim-over{background:var(--stone-400);}
/* §B2 (redojo-sim-polish) — Recompute affordance: the weekly rhythm is an INPUT to the sim, but a rhythm
 * edit swaps only #schedule-body, so the sim + verdict render outside it and go silently stale. PO-chosen
 * (Frame) affordance: explicit stale-then-refresh — a calm amber banner + a Recompute control; the stale
 * board dims + goes non-interactive until recomputed. No new #hex (kata-0026). */
.sim-stale{display:flex;align-items:center;gap:14px;background:var(--amber-50);border-radius:var(--radius-2xl);padding:14px 16px;box-shadow:inset 0 0 0 1px var(--amber-400);margin-bottom:16px;}
.sim-stale-ico{display:grid;place-items:center;width:38px;height:38px;flex:none;border-radius:var(--radius-xl);background:var(--amber-400);color:var(--stone-900);}
.sim-stale-ico .ic{width:20px;height:20px;}
.sim-stale-txt{flex:1;min-width:0;}
.sim-stale-txt h3{font-family:var(--font-display);font-weight:700;font-size:15px;margin:0 0 2px;color:var(--stone-900);}
.sim-stale-txt p{font-size:13px;line-height:1.45;color:var(--amber-600);margin:0;}
.sim-stale .btn-primary{flex:none;}
.sim-stale .btn-primary .ic{width:16px;height:16px;}
/* stale data reads as clearly "old numbers": dim + desaturate + non-interactive until recomputed */
.sim-hours.is-stale,.sim-board.is-stale,.sim-fix.is-stale{opacity:.4;filter:saturate(.55);pointer-events:none;transition:opacity .2s;}
.sim-exam{position:absolute;z-index:2;top:-4px;bottom:-4px;width:2px;background:var(--stone-900);}
.sim-pillw{position:absolute;z-index:3;top:-14px;}
.sim-pillw>summary{list-style:none;cursor:pointer;}
.sim-pillw>summary::-webkit-details-marker{display:none;}
.sim-pill{transform:translateX(-50%);display:inline-flex;align-items:center;gap:5px;white-space:nowrap;background:var(--stone-900);color:var(--white);font-size:10px;font-weight:800;padding:3px 9px;border-radius:var(--radius-pill);}
.sim-pillw>summary:focus-visible{outline:2px solid var(--stone-900);outline-offset:2px;border-radius:var(--radius-pill);}
.sim-pill .ic{width:11px;height:11px;}
.sim-picker{position:absolute;top:calc(100% + 8px);left:50%;transform:translateX(-50%);width:226px;background:var(--white);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);padding:10px;}
.sp-h{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-faint);margin:0 2px 7px;}
.sp-opt{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;text-align:left;border:0;cursor:pointer;background:transparent;font:700 13px/1 var(--font-sans);color:var(--color-text);padding:9px 10px;border-radius:var(--radius-lg);}
.sp-opt:hover{background:var(--stone-100);}
.sp-opt.on{background:var(--stone-900);color:var(--white);}
.sp-tag{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-faint);}
.sp-opt.on .sp-tag{color:var(--stone-300);}
.sp-foot{margin-top:6px;padding-top:9px;border-top:1px solid var(--stone-100);display:flex;flex-direction:column;gap:7px;}
.sp-note{font-size:11px;color:var(--color-text-muted);line-height:1.4;}
.sp-note.sim{color:var(--amber-600);font-weight:700;}
.sp-note.ok{color:var(--emerald-600);font-weight:700;display:inline-flex;align-items:center;gap:5px;}
.sp-actions{display:flex;gap:7px;}
.sp-reset{border:0;cursor:pointer;background:var(--stone-100);color:var(--stone-600);font:700 11px/1 var(--font-sans);padding:7px 10px;border-radius:var(--radius-lg);}
.sp-reset:hover{background:var(--stone-200);}
.sp-commit{border:0;cursor:pointer;background:var(--stone-900);color:var(--white);font:700 11px/1 var(--font-sans);padding:7px 10px;border-radius:var(--radius-lg);flex:1;}
.sp-commit:hover{background:var(--stone-800);}

.sim-caption{display:grid;grid-template-columns:184px 1fr;gap:16px;margin-top:14px;}
.sim-caption .c1{font-size:10.5px;color:var(--color-text-faint);line-height:1.5;}
.sim-caption .c2{font-size:11px;color:var(--color-text-muted);display:flex;align-items:center;gap:7px;}
.sim-caption .tick{width:2px;height:13px;background:var(--stone-900);flex:none;}

.sim-fix{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:16px;background:var(--red-50);border-radius:var(--radius-xl);padding:12px 16px;box-shadow:inset 0 0 0 1px var(--red-600);}
.fix-t{font-size:13px;font-weight:800;color:var(--red-600);}
.fix-lead{font-size:12.5px;color:var(--color-text-muted);}
.fix-lever{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;background:var(--white);border-radius:var(--radius-pill);padding:6px 12px;box-shadow:inset 0 0 0 1px var(--stone-200);border:0;cursor:pointer;text-decoration:none;color:var(--color-text);}
.fix-lever:hover{box-shadow:inset 0 0 0 1px var(--stone-300);background:var(--stone-50);}
.fix-lever .ic{width:13px;height:13px;color:var(--color-text-muted);}

.sim-empty{display:flex;gap:14px;align-items:flex-start;background:var(--amber-50);border-radius:var(--radius-3xl);padding:18px 20px;box-shadow:inset 0 0 0 1px var(--amber-400);}
.sim-empty .ei{display:grid;place-items:center;width:36px;height:36px;flex:none;border-radius:var(--radius-xl);background:var(--amber-400);color:var(--stone-900);}
.sim-empty h3{font-family:var(--font-display);font-weight:700;font-size:16px;margin:0 0 4px;color:var(--stone-900);}
.sim-empty p{font-size:13px;line-height:1.5;color:var(--amber-600);margin:0;}
.sim-empty a{color:var(--amber-600);font-weight:800;text-decoration:underline;}
.sim-none{font-size:13px;color:var(--color-text-muted);margin:2px 0 0;}

/* ═════════════════════════════════════════════════════════════════════════
 * PROGRESS section (redojo-ia-progress-shell-overview-mastery S7) — the tabbed "Progress" container
 * (Overview · Mastery · Activity · Readiness) inside AppShell's content slot (header/footer/width are
 * redojo-0084's, untouched). TRANSCODED from the Designer's verified package (UX reDojo_v1_46). Overview
 * + Mastery ship live; Activity + Readiness are honest placeholders. The section tab strip mirrors the
 * Plan tab-strip language (amber underline on the active tab), kept distinct from the header pills.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ── mastery-tier token set (mt-*) — the canonical ADR-0025 RPG ladder. Values are the LOCKED hexes;
 *    -ink is the readable text colour on the light -tint chip (the raw swatch fails AA as text). Kept
 *    deliberately distinct from the existing Difficulty `.tier-*` classes (a different concept). ── */
:root {
  --mt-common:#a8a29e;    --mt-common-ink:#78716c;    --mt-common-tint:#f5f5f4;
  --mt-uncommon:#10b981;  --mt-uncommon-ink:#059669;  --mt-uncommon-tint:#ecfdf5;
  --mt-rare:#3b82f6;      --mt-rare-ink:#2563eb;      --mt-rare-tint:#eff6ff;
  --mt-epic:#8b5cf6;      --mt-epic-ink:#7c3aed;      --mt-epic-tint:#f5f3ff;
  --mt-legendary:#f97316; --mt-legendary-ink:#ea580c; --mt-legendary-tint:#fff7ed;
}

.progress { display:flex; flex-direction:column; }

/* the Progress section tab strip — a second nav landmark; the active tab carries the amber underline. */
.progress-tabs { display:flex; gap:2px; flex-wrap:wrap; background:var(--white); padding:0 12px;
  border:1px solid var(--stone-200); border-radius:var(--radius-xl) var(--radius-xl) 0 0;
  box-shadow:var(--shadow-sm); margin-bottom:22px; }
.progress-tab { padding:14px 14px; font-size:14px; font-weight:600; color:var(--stone-500);
  text-decoration:none; border-bottom:2.5px solid transparent; margin-bottom:-1px; }
.progress-tab:hover { color:var(--stone-800); border-bottom-color:var(--stone-300); }
.progress-tab:focus-visible { outline:2px solid var(--stone-900); outline-offset:-2px; border-radius:4px; }
.progress-tab-active { font-weight:700; color:var(--stone-900); border-bottom-color:var(--amber-400); }
.progress-tab-active:hover { border-bottom-color:var(--amber-400); }

/* ── the shared mastery atom — MasteryChip (components/mastery_chip.templ). One component renders the
 *    tier everywhere (Overview cards · Mastery rows · Today later). The tier modifier (.mt-common …
 *    .mt-legendary) sets the local swatch/ink/tint; the pill fill = progress within the tier band
 *    (decorative — the word always carries the tier); the popover reveals the gap to the next tier. ── */
.mchip { position:relative; display:inline-flex; align-items:center; justify-content:center; gap:6px;
  font-family:var(--font-sans); font-weight:800; font-size:11.5px; color:var(--_ink); background:var(--_tint);
  box-shadow:inset 0 0 0 1.5px var(--_swatch); border-radius:var(--radius-pill); padding:4px 12px;
  outline:none; overflow:visible; }
.mchip-word { min-width:112px; }
.mchip-letter { min-width:0; }
.mchip-fillwrap { position:absolute; inset:0; overflow:hidden; border-radius:var(--radius-pill); }
.mchip-fill { position:absolute; left:0; top:0; bottom:0; width:0; background:var(--_swatch); opacity:.22; }
.mchip-body { position:relative; display:inline-flex; align-items:center; gap:6px; }
.mchip-dot { width:6px; height:6px; border-radius:50%; flex:none; background:var(--_swatch); }
.mchip-pop { position:absolute; bottom:calc(100% + 8px); left:50%; transform:translateX(-50%) translateY(4px);
  white-space:nowrap; background:var(--stone-900); color:var(--white); font-size:11px; font-weight:700;
  border-radius:8px; padding:5px 9px; box-shadow:var(--shadow-md); z-index:5; opacity:0;
  transition:opacity .14s ease, transform .14s ease; pointer-events:none; }
.mchip:hover .mchip-pop, .mchip:focus-visible .mchip-pop { opacity:1; transform:translateX(-50%) translateY(0); }
.mchip-pop::after { content:""; position:absolute; top:100%; left:50%; transform:translateX(-50%);
  border:5px solid transparent; border-top-color:var(--stone-900); }
.mt-common    { --_swatch:var(--mt-common);    --_ink:var(--mt-common-ink);    --_tint:var(--mt-common-tint); }
.mt-uncommon  { --_swatch:var(--mt-uncommon);  --_ink:var(--mt-uncommon-ink);  --_tint:var(--mt-uncommon-tint); }
.mt-rare      { --_swatch:var(--mt-rare);      --_ink:var(--mt-rare-ink);      --_tint:var(--mt-rare-tint); }
.mt-epic      { --_swatch:var(--mt-epic);      --_ink:var(--mt-epic-ink);      --_tint:var(--mt-epic-tint); }
.mt-legendary { --_swatch:var(--mt-legendary); --_ink:var(--mt-legendary-ink); --_tint:var(--mt-legendary-tint); }

/* ── The level-up moment — the mastery strip inside the runner transition beat + the day-recap cards
 *    (redojo-mastery-epic-review UX ingest, WHEN:now; transcoded from the verified Designer package). The chip is
 *    the SHARED .mchip above; only the strip chrome (the floating delta, the rank-up badge/tag, the Mixed list) is
 *    new. Motion is advisory polish frozen to the resting frame by the VRT reset + prefers-reduced-motion. ── */
.tb-mastery { margin-top:18px; padding-top:16px; border-top:1px solid var(--stone-100); }
.tb-mastery-lab { display:flex; align-items:center; gap:6px; font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase; color:var(--color-text-faint); margin:0 0 11px; }
.tb-mastery-lab .ic { width:13px; height:13px; }
.tb-mrow { display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
/* the strip is the SAME .mchip, wrapped so the floating +N/−N can overlay it */
.lvl-stage { position:relative; display:inline-flex; }
/* the floating +N/−N is entrance-only: hidden at rest (opacity 0), revealed + faded by the deltaFloat
   animation (which itself ends at opacity 0), so the settled/VRT-frozen frame shows the chip + badge, not a
   stranded delta overlapping the row. */
.lvl-delta { position:absolute; left:50%; bottom:calc(100% + 6px); font-family:var(--font-display); font-weight:800; font-size:15px; white-space:nowrap; color:var(--emerald-600); opacity:0; }
.lvl-delta.show { animation:deltaFloat 1.7s ease forwards; }
.lvl-gap { font-size:12px; color:var(--color-text-muted); }
.lvl-gap b { color:var(--_ink,var(--stone-700)); }
@keyframes deltaFloat { 0%{opacity:0;transform:translate(-50%,8px) scale(.85);} 18%{opacity:1;transform:translate(-50%,-2px) scale(1);} 75%{opacity:1;transform:translate(-50%,-15px) scale(1);} 100%{opacity:0;transform:translate(-50%,-26px) scale(1);} }
@keyframes deltaFloatDown { 0%{opacity:0;transform:translate(-50%,-8px) scale(.85);} 18%{opacity:1;transform:translate(-50%,2px) scale(1);} 75%{opacity:1;transform:translate(-50%,15px) scale(1);} 100%{opacity:0;transform:translate(-50%,26px) scale(1);} }
.lvl-delta.down { color:var(--amber-600); bottom:auto; top:calc(100% + 6px); }
.lvl-delta.down.show { animation:deltaFloatDown 1.7s ease forwards; }
/* the ranked-up acknowledgement (Topical strip) — tier-hued via the mt-* class on .rankup */
.rankup { display:inline-flex; align-items:center; gap:9px; margin-top:13px; padding:10px 16px; border-radius:var(--radius-2xl); background:var(--_tint); color:var(--_ink); box-shadow:inset 0 0 0 1.5px var(--_swatch); }
.rankup .ru-star { display:grid; place-items:center; width:24px; height:24px; border-radius:var(--radius-pill); background:var(--_swatch); color:var(--white); flex:none; }
.rankup .ru-star .ic { width:14px; height:14px; stroke-width:0; fill:currentColor; }
.rankup .ru-t { display:block; font-family:var(--font-display); font-weight:700; font-size:14.5px; line-height:1.15; }
.rankup .ru-s { display:block; font-size:11.5px; font-weight:600; opacity:.8; margin-top:1px; }
.rankup.show { animation:popIn .42s var(--ease-settle) both; }
@keyframes popIn { 0%{opacity:0;transform:scale(.7) translateY(6px);} 60%{opacity:1;transform:scale(1.04) translateY(0);} 100%{opacity:1;transform:scale(1);} }
/* top-of-ladder = the loudest, still calm: a soft halo + larger badge */
.rankup.is-top { padding:13px 20px; background:linear-gradient(180deg,var(--mt-legendary-tint),var(--white)); box-shadow:inset 0 0 0 1.5px var(--mt-legendary), 0 8px 22px -10px rgba(249,115,22,.5); }
.rankup.is-top .ru-star { width:30px; height:30px; }
.rankup.is-top .ru-star .ic { width:17px; height:17px; }
.rankup.is-top .ru-t { font-size:16px; }
.rankup.is-top .ru-glow { position:absolute; inset:-2px; border-radius:inherit; pointer-events:none; box-shadow:0 0 0 0 rgba(249,115,22,.35); animation:haloPulse 2.4s ease-out infinite; }
@keyframes haloPulse { 0%{box-shadow:0 0 0 0 rgba(249,115,22,.32);} 70%{box-shadow:0 0 0 12px rgba(249,115,22,0);} 100%{box-shadow:0 0 0 0 rgba(249,115,22,0);} }
/* re-confirm = the quiet, honest variant (no star, an emerald check) */
.rankup.is-reconfirm .ru-star .ic { stroke:var(--white); stroke-width:2.4; fill:none; }
/* level-down = gentle, never punishing: warm amber, an eased-down arrow, encouraging copy (never red) */
.rankup.is-down { background:var(--amber-50); color:var(--amber-600); box-shadow:inset 0 0 0 1.5px var(--amber-400); }
.rankup.is-down .ru-star { background:var(--amber-500); }
.rankup.is-down .ru-star .ic { stroke:var(--white); stroke-width:2.4; fill:none; }
.newflag { display:inline-flex; align-items:center; gap:4px; margin-left:2px; font-size:9.5px; font-weight:800; letter-spacing:.04em; text-transform:uppercase; color:var(--amber-600); background:var(--amber-50); border-radius:var(--radius-pill); padding:2px 8px; box-shadow:inset 0 0 0 1px var(--amber-400); }
/* Mixed activity / day-recap — several sub-topics move at once, so the strip becomes a compact list */
.tb-mx-head { display:flex; align-items:center; gap:8px; margin:2px 0 12px; }
.tb-mx-head .mxh-ic { display:grid; place-items:center; width:24px; height:24px; border-radius:var(--radius-pill); background:var(--at-interleaved-tint); color:var(--at-interleaved-ic); flex:none; }
.tb-mx-head .mxh-ic .ic { width:13px; height:13px; }
.tb-mx-sum { font-family:var(--font-display); font-weight:700; font-size:14px; color:var(--color-text); }
.tb-mx-sum b { color:var(--at-interleaved-ic); }
.mx-list { display:flex; flex-direction:column; }
.mx-row { display:grid; grid-template-columns:minmax(120px,1fr) auto minmax(120px,150px); align-items:center; gap:10px 14px; padding:9px 2px; border-top:1px solid var(--stone-100); }
.mx-row:first-child { border-top:0; }
.mx-sub { font-size:13.5px; font-weight:700; color:var(--color-text); display:flex; align-items:center; gap:8px; min-width:0; }
.mx-sub .mx-dot { width:7px; height:7px; border-radius:50%; background:var(--s-sky-dot); flex:none; }
.mx-right { display:flex; justify-content:flex-end; }
.mx-tag { display:inline-flex; align-items:center; gap:5px; font-family:var(--font-sans); font-weight:800; font-size:10.5px; letter-spacing:.03em; text-transform:uppercase; color:var(--_ink); background:var(--_tint); box-shadow:inset 0 0 0 1.5px var(--_swatch); border-radius:var(--radius-pill); padding:3px 10px; white-space:nowrap; }
.mx-tag .ic { width:12px; height:12px; stroke-width:0; fill:currentColor; }
.mx-tag.show { animation:popIn .4s var(--ease-settle) both; }
.mx-gap { font-size:11.5px; color:var(--color-text-muted); white-space:nowrap; text-align:right; }
.mx-list .mx-row:nth-child(2) .lvl-delta.show { animation-delay:170ms; }
.mx-list .mx-row:nth-child(3) .lvl-delta.show { animation-delay:340ms; }
@media (prefers-reduced-motion:reduce) {
  .mx-tag.show { animation:none; }
  .lvl-delta.show { animation:none; opacity:1; transform:translate(-50%,-15px); }
  .lvl-delta.down.show { animation:none; opacity:1; transform:translate(-50%,15px); }
  .rankup.show { animation:none; }
  .rankup.is-top .ru-glow { animation:none; }
}

/* ── Overview tab — the dashboard: one card per enrolled subject (completion bars + mastery chip +
 *    time invested) + the honest exam-fit placeholder; and the honest empty state. ── */
.ov-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.ov-card { background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm);
  padding:18px 20px; border-left:4px solid var(--accent,var(--stone-300)); }
.ov-card-head { display:flex; align-items:center; gap:10px; margin-bottom:16px; }
.ov-card-dot { width:11px; height:11px; border-radius:50%; flex:none; background:var(--dot,var(--stone-400)); }
.ov-card-name { font-family:var(--font-display); font-weight:700; font-size:18px; }
/* S10 — the Overview card-head exam-fit verdict slot: the "Exam fit" label + the shared .pv-chip. */
.ov-fit { margin-left:auto; display:inline-flex; align-items:center; gap:8px; }
.ov-fit-k { font-size:11px; font-weight:700; color:var(--stone-400); }
.ov-bars { display:grid; grid-template-columns:1fr 1fr; gap:14px 22px; }
.ov-bar-head { display:flex; justify-content:space-between; font-size:12px; color:var(--stone-500); margin-bottom:5px; }
.ov-bar-head b { font-weight:700; color:var(--stone-700); }
.ov-bar { height:8px; background:var(--stone-200); border-radius:var(--radius-pill); overflow:hidden; }
.ov-bar-fill { display:block; height:100%; width:var(--_pct,0%); background:var(--dot,var(--stone-400)); border-radius:var(--radius-pill); }
.ov-mastery { display:flex; align-items:center; gap:10px; margin-top:16px; padding-top:14px; border-top:1px solid var(--stone-100); }
.ov-mastery-label { font-size:12px; font-weight:600; color:var(--stone-500); }
.ov-hours { margin-left:auto; font-size:12px; color:var(--stone-500); }
.ov-hours b { color:var(--stone-800); }

/* honest empty state (no enrolments / no history) — shared shape with the placeholders. */
.progress-empty { background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm);
  padding:52px 32px; text-align:center; display:flex; flex-direction:column; align-items:center; gap:6px;
  max-width:560px; margin:0 auto; }
.progress-empty-ic { display:grid; place-items:center; width:64px; height:64px; border-radius:var(--radius-pill);
  background:var(--stone-100); color:var(--stone-400); margin-bottom:12px; }
.progress-empty-ic .ic { width:28px; height:28px; }
.progress-empty-cta .ic { width:16px; height:16px; }
.progress-empty-title { font-family:var(--font-display); font-weight:700; font-size:22px; letter-spacing:-.02em; }
.progress-empty-text { font-size:14px; color:var(--stone-500); margin:4px 0 0; max-width:34rem; line-height:1.55; }
.progress-empty-cta { margin-top:20px; display:inline-flex; align-items:center; gap:8px; background:var(--amber-400);
  color:var(--stone-900); font-weight:700; font-size:14px; text-decoration:none; border-radius:var(--radius-xl); padding:11px 18px; }

/* ── Mastery tab — legend + subject switcher + collapsible Topic groups of Sub-topic rows. ── */
.mtb { background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:22px 24px; }
.mtb-legend-row { display:flex; align-items:center; gap:14px 18px; flex-wrap:wrap; margin-bottom:6px; }
.mtb-kicker { font-size:11px; font-weight:800; text-transform:uppercase; letter-spacing:.05em; color:var(--stone-400); }
.mtb-legend { display:flex; gap:16px; flex-wrap:wrap; }
.mtb-legend-item { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--stone-600); }
.mtb-swatch { width:12px; height:12px; border-radius:4px; flex:none; background:var(--_swatch); }
.mtb-abbr { font-size:10.5px; font-weight:800; color:var(--_ink); background:var(--_tint); border-radius:5px; padding:1px 5px; }
.mtb-note { font-size:12px; color:var(--stone-400); margin:8px 0 18px; }
.mtb-switcher { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:20px; }
.mtb-subject { display:inline-flex; align-items:center; gap:8px; font-size:13px; font-weight:600; color:var(--stone-500);
  background:var(--stone-50); border-radius:var(--radius-pill); padding:7px 15px; text-decoration:none; }
.mtb-subject .mtb-subject-dot { width:8px; height:8px; border-radius:50%; background:var(--dot,var(--stone-400)); }
.mtb-subject[aria-current="page"] { font-weight:700; color:var(--ic-text); background:var(--tint); box-shadow:inset 0 0 0 1.5px var(--dot); }
.mtb-byline { display:flex; align-items:baseline; gap:8px; margin-bottom:10px; flex-wrap:wrap; }
.mtb-byline-hint { font-size:11.5px; color:var(--stone-400); }
.mtb-topics { display:flex; flex-direction:column; gap:10px; }
.mt-newnote { display:flex; gap:11px; align-items:flex-start; background:var(--amber-50); border-radius:12px;
  padding:12px 14px; margin-bottom:18px; box-shadow:inset 0 0 0 1px var(--amber-400); }
.mt-newnote .ic { width:17px; color:var(--amber-600); margin-top:1px; flex:none; }
.mt-newnote-text { font-size:12.5px; line-height:1.5; color:var(--amber-600); }
.mt-newnote-text b { color:var(--stone-900); }

.mt-topic { border:1px solid var(--stone-200); border-radius:12px; overflow:hidden; }
.mt-summary { cursor:pointer; display:flex; align-items:center; gap:12px; padding:12px 14px; background:var(--stone-50); list-style:none; }
.mt-summary::-webkit-details-marker { display:none; }
.mt-summary:hover { background:var(--stone-100); }
.mt-topic > summary:focus-visible { outline:2px solid var(--stone-900); outline-offset:-2px; }
.mt-chev { width:15px; color:var(--stone-400); flex:none; transition:transform .15s ease; }
.mt-topic[open] > .mt-summary .mt-chev { transform:rotate(90deg); }
.mt-topic-name { flex:1; min-width:0; font-family:var(--font-display); font-weight:700; font-size:14px; color:var(--stone-900); }
.mt-count { font-size:12px; color:var(--stone-400); white-space:nowrap; }
.mt-dist { display:flex; gap:5px; flex-wrap:wrap; justify-content:flex-end; }
.mt-dist-chip { display:inline-flex; align-items:center; gap:4px; font-size:11px; font-weight:800; color:var(--_ink);
  background:var(--_tint); border-radius:var(--radius-pill); padding:2px 9px; }
.mt-dist-chip .mt-dist-n { opacity:.8; }
.mt-subs { padding:8px; display:grid; grid-template-columns:1fr 1fr; gap:1px 20px; align-items:start; }
.mt-subrow { display:flex; align-items:center; gap:12px; padding:7px 10px; border-radius:8px; }
.mt-subrow:hover { background:var(--stone-50); }
.mt-subname { flex:1; min-width:0; font-size:13px; font-weight:600; color:var(--stone-700); }

/* ── Activity + Readiness — honest "coming soon" placeholders (Journal at m2 · Readiness at S10). ── */
.ph-panel { background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm);
  padding:52px 32px; text-align:center; display:flex; flex-direction:column; align-items:center; gap:6px;
  max-width:560px; margin:0 auto; }
.ph-icon { display:grid; place-items:center; width:56px; height:56px; border-radius:var(--radius-pill);
  background:var(--stone-100); color:var(--stone-400); margin-bottom:10px; }
.ph-icon .ic { width:24px; }
.ph-heading { font-family:var(--font-display); font-weight:700; font-size:19px; letter-spacing:-.02em; }
.ph-text { font-size:13px; color:var(--stone-500); margin:2px 0 0; max-width:24rem; line-height:1.55; }
.ph-badge { margin-top:16px; display:inline-flex; align-items:center; gap:6px; font-size:10.5px; font-weight:800;
  text-transform:uppercase; letter-spacing:.05em; color:var(--stone-500); background:var(--stone-100);
  border-radius:var(--radius-pill); padding:5px 12px; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════════
 * ONBOARDING WALK (redojo-ia-onboarding-flow · S11) — the guided-linear first-run shell that COMPOSES
 * the existing Plan step bodies. Only the SHELL is new here (reduced header · progress rail · footer
 * nav · entry/land beats); the composed bodies (catalog · schedule · catch-up · simulation) reuse
 * their own already-shipped classes AS-IS. Token-only (var()); reuses .brand/.brand-hero/.ic/.icon-chip
 * /.subject-card/.enrol/.badge + the --act-* sim colours (all defined above). kata-0026: no raw #hex.
 * ═══════════════════════════════════════════════════════════════════════════════════════════════ */

/* the walk container */
.walk { background:var(--stone-100); border-radius:20px; box-shadow:var(--shadow-lg); overflow:hidden; max-width:1180px; margin:0 auto; }

/* reduced header: brand lockup kept; primary nav replaced by a quiet, honest exit (never a trap) */
.walk-hd { display:flex; align-items:center; justify-content:space-between; gap:16px; padding:20px 26px; background:var(--white); border-bottom:1px solid var(--stone-200); }
.walk-exit { display:inline-flex; align-items:center; gap:6px; border:0; cursor:pointer; background:transparent; font:600 13px/1 var(--font-sans); color:var(--stone-500); border-radius:var(--radius-lg); padding:8px 10px; text-decoration:none; }
.walk-exit:hover { color:var(--stone-800); background:var(--stone-100); }
.walk-exit .ic { width:15px; height:15px; }

/* progress rail — replaces the free-jump Plan tab strip + verdict bar in guided-linear mode */
.rail { background:var(--white); padding:16px 26px 20px; border-bottom:1px solid var(--stone-200); }
.rail-head { display:flex; align-items:baseline; justify-content:space-between; gap:12px; margin-bottom:14px; }
.rail-count { font:800 11px/1 var(--font-sans); letter-spacing:.06em; text-transform:uppercase; color:var(--stone-500); }
.rail-count b { color:var(--stone-900); }
.rail-title { font-family:var(--font-display); font-weight:700; font-size:15px; color:var(--stone-900); }
.rail-steps { display:grid; grid-auto-flow:column; grid-auto-columns:1fr; gap:10px; }
.rs { display:flex; flex-direction:column; gap:8px; min-width:0; }
.rs-bar { height:5px; border-radius:9999px; background:var(--stone-200); overflow:hidden; }
.rs-bar i { display:block; height:100%; width:0; background:var(--stone-300); transition:width .3s; }
.rs.done .rs-bar i { width:100%; background:var(--emerald-500); }
.rs.current .rs-bar i { width:100%; background:var(--amber-400); }
.rs-lab { display:flex; align-items:center; gap:6px; font:700 12.5px/1.2 var(--font-sans); color:var(--stone-400); min-width:0; }
.rs.done .rs-lab, .rs.current .rs-lab { color:var(--stone-900); }
.rs-num { display:grid; place-items:center; width:18px; height:18px; flex:none; border-radius:9999px; font-size:10px; font-weight:800; background:var(--stone-200); color:var(--stone-500); }
.rs-num .ic { width:11px; stroke-width:3; }
.rs.current .rs-num { background:var(--amber-400); color:var(--stone-900); }
.rs.done .rs-num { background:var(--emerald-500); color:var(--white); }
.rs-name { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rs-opt { font-size:9.5px; font-weight:800; letter-spacing:.04em; text-transform:uppercase; color:var(--stone-400); flex:none; }

/* body slot + per-step intro */
.walk-body { padding:26px; }
.walk-body-inner { max-width:1080px; margin:0 auto; }
.step-intro { margin-bottom:18px; }
.step-intro h1 { font-size:26px; }
.step-intro p { font-size:14px; color:var(--color-text-muted); margin:6px 0 0; max-width:52rem; }

/* footer nav */
.walk-foot { position:sticky; bottom:0; display:flex; align-items:center; gap:12px; flex-wrap:wrap; padding:16px 26px; background:var(--white); border-top:1px solid var(--stone-200); box-shadow:0 -6px 20px -12px rgb(28 25 23 / .18); }
.wf-back { display:inline-flex; align-items:center; gap:7px; border:0; cursor:pointer; background:transparent; font:700 14px/1 var(--font-sans); color:var(--stone-600); border-radius:var(--radius-xl); padding:10px 14px; text-decoration:none; }
.wf-back:hover { background:var(--stone-100); }
.wf-back .ic { width:16px; height:16px; }
.wf-gate { display:inline-flex; align-items:center; gap:7px; font-size:12.5px; color:var(--stone-500); }
.wf-gate .ic { width:14px; height:14px; color:var(--amber-600); }
.wf-spring { margin-left:auto; }
.wf-right { display:inline-flex; align-items:center; gap:8px; }
.wf-skip { border:0; cursor:pointer; background:transparent; font:700 13.5px/1 var(--font-sans); color:var(--stone-500); border-radius:var(--radius-xl); padding:10px 12px; text-decoration:none; }
.wf-skip:hover { background:var(--stone-100); color:var(--stone-800); }
.wf-cont { display:inline-flex; align-items:center; gap:8px; border:0; border-radius:var(--radius-xl); font:800 14px/1 var(--font-sans); padding:12px 20px; cursor:pointer; background:var(--stone-900); color:var(--white); text-decoration:none; }
.wf-cont:hover { background:var(--stone-800); }
.wf-cont .ic { width:16px; height:16px; }
.wf-cont[aria-disabled="true"] { background:var(--stone-200); color:var(--stone-400); cursor:not-allowed; box-shadow:none; }
.wf-cont.amber { background:var(--amber-400); color:var(--stone-900); }
.wf-cont.amber:hover { background:var(--amber-500); }

/* entry (/welcome) + land — full-bleed centred beats */
.beat { min-height:560px; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; gap:0; padding:56px 28px; }
.beat .brand-hero .brand-mark { width:72px; height:72px; border-radius:20px; }
.beat .brand-hero .brand-mark svg { width:34px; }
.beat h1 { font-family:var(--font-display); font-weight:700; font-size:34px; letter-spacing:-.02em; margin:26px 0 0; }
.beat .lead { font-size:16px; line-height:1.6; color:var(--color-text-muted); margin:12px 0 0; max-width:34rem; }
.privacy { display:flex; gap:13px; align-items:flex-start; text-align:left; background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border-radius:var(--radius-2xl); padding:16px 18px; margin:26px 0 0; max-width:32rem; }
.privacy .pi { display:grid; place-items:center; width:34px; height:34px; flex:none; border-radius:var(--radius-xl); background:var(--stone-100); color:var(--stone-500); }
.privacy .pi .ic { width:17px; height:17px; }
.privacy p { font-size:12.5px; line-height:1.55; color:var(--color-text-muted); margin:0; }
.privacy b { color:var(--color-text); }
.beat-cta { display:flex; flex-direction:column; align-items:center; gap:12px; margin-top:30px; }
.beat-skip { border:0; background:transparent; cursor:pointer; font:600 13px/1 var(--font-sans); color:var(--stone-500); text-decoration:underline; text-underline-offset:3px; }
.beat-skip:hover { color:var(--stone-800); }
.land-check { display:grid; place-items:center; width:76px; height:76px; border-radius:9999px; background:var(--emerald-50); color:var(--emerald-600); box-shadow:inset 0 0 0 2px var(--emerald-500); }
.land-check .ic { width:38px; height:38px; stroke-width:2.5; }
.land-recap { display:flex; gap:10px; flex-wrap:wrap; justify-content:center; margin-top:24px; }
.recap-chip { display:inline-flex; align-items:center; gap:8px; background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border-radius:9999px; padding:8px 14px; font-size:13px; font-weight:700; color:var(--stone-700); }
.recap-chip .ic { width:15px; height:15px; color:var(--emerald-600); }
/* Onboarding bypass — the TEST-ACCOUNT-ONLY dev affordance on the entry beat (redojo-onboarding-flow-
   simplify-and-bypass). Deliberately reads as a DEV tool, never student chrome: a DASHED edge (nothing
   else in the app is dashed) + an uppercase "DEV" text tag (colour is never the sole signal) + MUTED
   stone buttons (never the amber student CTA). Tokens-only — no new colours. Sits below .beat-cta,
   separated by margin + the dashed panel edge. */
.ob-bypass { width:100%; max-width:32rem; margin:34px 0 0; padding:16px 18px; text-align:left;
  background:var(--stone-50); border:1px dashed var(--stone-300); border-radius:var(--radius-2xl); }
.ob-bypass-tag { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:800;
  letter-spacing:.04em; text-transform:uppercase; color:var(--color-text-faint); }
.ob-bypass-tag .ic { width:14px; height:14px; }
.ob-bypass-hint { font-size:12.5px; line-height:1.5; color:var(--color-text-muted); margin:8px 0 12px; }
.ob-bypass-btns { display:flex; flex-direction:column; gap:8px; }
.ob-bypass-form { display:block; }
.ob-bypass-btn { display:inline-flex; align-items:center; gap:9px; width:100%; cursor:pointer;
  background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-300); border:0; border-radius:var(--radius-xl);
  padding:10px 14px; font:600 13px/1 var(--font-sans); color:var(--stone-700); text-align:left; }
.ob-bypass-btn:hover { background:var(--stone-100); color:var(--stone-900); }
.ob-bypass-btn .ic { width:16px; height:16px; color:var(--stone-500); flex:none; }
/* ── Progress ▸ Drill (redojo-ia-progress-drill-readiness, S10) ─────────────────────────────────────
   The completion-lens overlay + docked panel over the shared S3 tree. Transcoded from reDojo_v1_49
   (handoff-drill). No new colours — every value reuses an existing token (emerald=done/got-it,
   amber-400=not-yet, stone-300=not-started). See internal/web/progress_drill.{templ,go}. */
/* the drill uses a slightly narrower docked panel than the inspector to give the tree + overlay room */
.progress .insp { grid-template-columns:minmax(0,1fr) 340px; }
/* column headers above the tree — aligned to the two overlay columns (no per-row labels) */
.dr-colhead { display:flex; justify-content:flex-end; padding:2px 10px 9px; }
.dr-colhead span { font-size:9px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--stone-400); text-align:right; }
.dr-colhead span:nth-child(1) { width:42px; }
.dr-colhead span:nth-child(2) { width:104px; }
.dr-tree-head-hint { font-size:12px; color:var(--stone-400); }
/* two-column completion overlay for branch rows (topic / sub-topic): lessons done + exercise outcomes */
.dr-ov2 { justify-self:end; display:grid; grid-template-columns:42px 104px; align-items:center; white-space:nowrap; }
.dr-stat { display:flex; justify-content:flex-end; align-items:center; line-height:1; }
.dr-stat-v { font-size:12.5px; font-weight:600; color:var(--stone-500); }
.dr-stat-v b { font-weight:800; color:var(--stone-900); }
.dr-oc { display:inline-flex; align-items:center; justify-content:flex-end; gap:6px; }
.dr-oc .oc { display:inline-flex; align-items:center; gap:3px; font-weight:800; font-size:11.5px; }
.dr-oc .oc .d { width:7px; height:7px; border-radius:2px; flex:none; }
.dr-oc .got { color:var(--emerald-600); } .dr-oc .got .d { background:var(--emerald-500); }
.dr-oc .notyet { color:var(--amber-600); } .dr-oc .notyet .d { background:var(--amber-400); }
.dr-oc .tot { color:var(--stone-400); font-weight:600; }
/* leaf status — a lesson sits in the LESSONS column (✓ + time / ○), an exercise-set in the EXERCISES column */
.dr-ldone { display:inline-flex; align-items:center; gap:4px; font-size:12px; font-weight:800; color:var(--emerald-600); }
.dr-ldone .ic { width:13px; height:13px; }
.dr-ltodo { display:inline-flex; align-items:center; color:var(--stone-300); }
.dr-ltodo .ic { width:15px; height:15px; }
.trow:has(.dr-ltodo) .tname { color:var(--stone-500); }
/* the docked panel payload — tier chip · done bars · outcome split + legend · metrics */
.dr-chiprow { display:flex; align-items:center; gap:10px; margin-bottom:16px; }
.dr-chiprow .lbl { font-size:12px; font-weight:600; color:var(--stone-500); }
.dr-counts { display:grid; grid-template-columns:1fr 1fr; gap:12px 20px; margin-bottom:20px; }
.dr-sec-k { font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--stone-400); margin:0 0 10px; }
.dr-seg { display:flex; height:12px; border-radius:var(--radius-pill); overflow:hidden; background:var(--stone-100); }
.dr-seg span { display:block; height:100%; }
.dr-seg .got { background:var(--emerald-500); }
.dr-seg .notyet { background:var(--amber-400); }
.dr-seg .none { background:var(--stone-300); }
.dr-legend { display:flex; flex-wrap:wrap; gap:14px; margin-top:11px; }
.dr-legend-item { display:inline-flex; align-items:center; gap:6px; font-size:12px; color:var(--stone-600); }
.dr-legend-item b { font-weight:700; color:var(--stone-900); }
.dr-legend-dot { width:9px; height:9px; border-radius:3px; flex:none; }
.dr-metric { display:flex; align-items:center; gap:8px; margin-top:18px; padding-top:15px; border-top:1px solid var(--stone-100); font-size:13px; color:var(--stone-600); }
.dr-metric + .dr-metric { margin-top:10px; padding-top:0; border-top:0; }
.dr-metric b { color:var(--stone-900); font-weight:700; }
.dr-metric .ic { width:15px; height:15px; color:var(--stone-400); }

/* ── Progress ▸ Readiness (redojo-ia-progress-drill-readiness, S10) ─────────────────────────────────
   Per-subject verdict card (mirrors the S6 Fit verdict via the shared .pv-chip) + the two informational
   lists (weak areas · recently-missed). No new colours; transcoded from reDojo_v1_50 (handoff-readiness).
   See internal/web/progress_readiness.{templ,go}. */
.rd-grid { display:grid; grid-template-columns:1fr 1fr; gap:16px; align-items:start; }
.rd-card { background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); padding:20px 22px; border-left:4px solid var(--accent,var(--stone-300)); }
.rd-head { display:flex; align-items:center; gap:10px; margin-bottom:4px; }
.rd-dot { width:11px; height:11px; border-radius:50%; flex:none; background:var(--dot,var(--stone-400)); }
.rd-name { font-family:var(--font-display); font-weight:700; font-size:17px; }
.rd-head .pv-chip { margin-left:auto; }
.rd-runway { font-size:13px; color:var(--stone-500); margin:8px 0 18px; line-height:1.55; }
.rd-runway b { color:var(--stone-800); font-weight:700; }
.rd-sub-k { font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--stone-400); margin:0 0 8px; }
.rd-weak { display:flex; flex-direction:column; margin-bottom:18px; }
.rd-weak-row { display:flex; align-items:center; gap:10px; padding:7px 0; }
.rd-weak-row + .rd-weak-row { border-top:1px solid var(--stone-100); }
.rd-weak-name { flex:1; min-width:0; font-size:13px; font-weight:600; color:var(--stone-700); }
.rd-missed { display:flex; flex-direction:column; }
.rd-missed-row { display:flex; align-items:center; gap:12px; padding:9px 0; }
.rd-missed-row + .rd-missed-row { border-top:1px solid var(--stone-100); }
.rd-missed-main { flex:1; min-width:0; }
.rd-missed-name { font-size:13px; font-weight:600; color:var(--stone-800); }
.rd-missed-crumb { font-size:11.5px; color:var(--stone-400); margin-top:1px; }
.rd-missed-tag { display:inline-flex; align-items:center; gap:5px; font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.04em; color:var(--amber-600); background:var(--amber-50); border-radius:var(--radius-pill); padding:3px 9px; box-shadow:inset 0 0 0 1px var(--amber-400); white-space:nowrap; }
.rd-missed-when { font-size:11.5px; color:var(--stone-400); white-space:nowrap; }
.rd-foot { margin-top:18px; padding-top:15px; border-top:1px solid var(--stone-100); display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; }
.rd-foot-note { font-size:12px; color:var(--stone-400); flex:1; min-width:180px; }
.rd-adjust { display:inline-flex; align-items:center; gap:7px; font-size:13px; font-weight:700; color:var(--ic-text,var(--stone-700)); background:var(--tint,var(--stone-100)); border-radius:var(--radius-pill); padding:8px 15px 8px 16px; text-decoration:none; }
.rd-adjust:hover { filter:brightness(.97); }
.rd-adjust .ic { width:15px; height:15px; }

/* ═══════════════════════════════════════════════════════════════════════════
 * ENROLLMENTS SCREEN REFRESH (redojo-enrol-exam-date-visible-before-confirm) —
 * TRANSCODED from the Designer's verified package (docs/slices/redojo-enrol-exam-date-
 * visible-before-confirm/ux/package.html). Refreshes /catalog: enrol/edit moves into a
 * capture MODAL (was an inline panel), the single qualification-grouped list becomes an
 * ENROLLED-vs-flattened-BROWSE split, and the session's default Exam date is shown before
 * Confirm. Extends the shipped design system — tokens only, no raw colour (kata-0026).
 * Reuses .field/.field-label, .btn/.btn-primary/.btn-ghost/.btn-sm, .form-error, .icon-chip,
 * the .s-<accent> palette, .enrol. New primitives (converged Direction A) below.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* ── zone (a titled section: Enrolled subjects · Browse all subjects) ── */
.rd-zone { margin-top:24px; }
.rd-zonecap { display:flex; align-items:center; gap:9px; margin:0 0 12px; }
.rd-zonecap .t { font-family:var(--font-display); font-weight:700; font-size:15px; }
.rd-zonecap .c { font-size:12px; color:var(--stone-400); font-weight:600; }
.rd-zonecap .ln { flex:1; height:1px; background:var(--stone-200); }
/* ── Enrolled area · study shelf (compact cards) ── */
.rd-shelf { display:grid; grid-template-columns:repeat(auto-fill,minmax(238px,1fr)); gap:14px; }
.rd-shelf-card { display:flex; flex-direction:column; gap:11px; background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); border-left:4px solid var(--accent); padding:15px 16px; }
.rd-shelf-top { display:flex; align-items:center; gap:10px; }
.rd-shelf-top .icon-chip { width:34px; height:34px; font-size:14px; }
.rd-shelf-name { font-family:var(--font-display); font-weight:700; font-size:15px; line-height:1.15; }
.rd-shelf-sub { font-size:11.5px; color:var(--stone-500); margin-top:1px; }
.rd-shelf-exam { display:flex; align-items:center; gap:7px; flex-wrap:wrap; font-size:12px; font-weight:600; padding:9px 11px; border-radius:var(--radius-xl); background:var(--tint); }
.rd-shelf-exam .ic { width:14px; height:14px; color:var(--ic-text); }
.rd-shelf-exam .sep { color:var(--stone-300); }
.rd-shelf-exam .per { color:var(--stone-500); }
.rd-shelf-foot { display:flex; align-items:center; gap:8px; }
.rd-edit { display:inline-flex; align-items:center; gap:6px; font-size:12px; font-weight:700; color:var(--stone-600); background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); border:0; border-radius:var(--radius-pill); padding:7px 13px; cursor:pointer; font-family:var(--font-sans); }
.rd-edit:hover { background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-300); color:var(--stone-800); }
.rd-edit .ic { width:13px; height:13px; }
/* ── View contents — the inspector entry (redojo-package-inspection-view AC1). Round-2 UX placed it
 * intentionally (the round-1 package had omitted it): an ICON-ONLY inspector button beside Enrol on the
 * Browse paper row (.rd-paper-vc, keeps the compact row uncluttered), and a quiet "Contents" TEXT link
 * beside Edit in the Enrolled card foot (.rd-vc). Both carry data-testid="view-contents" + href. ── */
.rd-vc { display:inline-flex; align-items:center; gap:6px; text-decoration:none; font-size:12px; font-weight:700; color:var(--stone-500); }
.rd-vc:hover { color:var(--stone-800); }
.rd-vc .ic { width:13px; height:13px; }
.rd-paper-act { margin-left:auto; display:flex; align-items:center; gap:7px; flex:none; }
.rd-paper-vc { display:grid; place-items:center; width:30px; height:30px; flex:none; border-radius:var(--radius-lg); color:var(--stone-500); background:var(--white); box-shadow:inset 0 0 0 1px var(--stone-200); text-decoration:none; }
.rd-paper-vc:hover { color:var(--stone-800); box-shadow:inset 0 0 0 1px var(--stone-300); background:var(--stone-50); }
.rd-paper-vc .ic { width:14px; height:14px; }
/* ── empty Enrolled (first visit invite) ── */
.rd-empty { display:flex; gap:15px; align-items:center; background:var(--amber-50); border-radius:var(--radius-3xl); box-shadow:inset 0 0 0 1px var(--amber-400); padding:20px 22px; }
.rd-empty .ico { display:grid; place-items:center; width:44px; height:44px; flex:none; border-radius:var(--radius-xl); background:var(--amber-400); color:var(--stone-900); }
.rd-empty h3 { font-family:var(--font-display); font-weight:700; font-size:16px; margin:0 0 3px; color:var(--stone-900); }
.rd-empty p { font-size:13px; line-height:1.5; color:var(--amber-600); margin:0; }
.rd-empty .down { margin-left:auto; color:var(--amber-600); flex:none; }
/* ── Browse area · flattened subject grid ── */
.rd-browse { display:grid; grid-template-columns:repeat(auto-fill,minmax(258px,1fr)); gap:14px; }
.rd-bcard { display:flex; flex-direction:column; background:var(--white); border-radius:var(--radius-2xl); box-shadow:var(--shadow-sm); border-left:4px solid var(--accent); padding:16px; }
.rd-bcard-head { display:flex; align-items:flex-start; gap:11px; margin-bottom:12px; }
.rd-bcard-head .icon-chip { width:36px; height:36px; font-size:15px; }
.rd-bcard-name { font-family:var(--font-display); font-weight:700; font-size:15px; line-height:1.1; }
.rd-bcard-sub { font-size:11.5px; color:var(--stone-500); margin-top:2px; display:flex; flex-wrap:wrap; gap:5px; align-items:center; }
.rd-bcard-sub .sep { color:var(--stone-300); }
.rd-qual-tag { font:700 10px/1 var(--font-sans); letter-spacing:.03em; text-transform:uppercase; color:var(--stone-500); background:var(--stone-100); padding:4px 8px; border-radius:6px; margin-left:auto; }
.rd-papers { display:flex; flex-direction:column; gap:7px; }
.rd-paper { display:flex; align-items:center; gap:10px; padding:9px 11px; border-radius:var(--radius-lg); background:var(--tint); }
.rd-paper-name { font-size:13px; font-weight:600; min-width:0; }
/* ── capture modal (the popup — server-round-trip base, JS-enhanced at Build) ── */
.rd-backdrop { position:fixed; inset:0; z-index:50; background:rgb(28 25 23 / .5); display:grid; place-items:center; padding:28px; }
.rd-modal { position:relative; width:100%; max-width:452px; background:var(--white); border-radius:var(--radius-3xl); box-shadow:var(--shadow-lg); padding:24px 26px 26px; }
.rd-modal-head { display:flex; align-items:flex-start; gap:12px; margin-bottom:16px; }
.rd-modal-head .icon-chip { width:40px; height:40px; font-size:16px; flex:none; }
.rd-modal-title { font-family:var(--font-display); font-weight:700; font-size:18px; line-height:1.15; }
.rd-modal-sub { font-size:12.5px; color:var(--stone-500); margin-top:2px; }
.rd-modal-x { position:absolute; top:16px; right:16px; display:grid; place-items:center; width:30px; height:30px; border-radius:var(--radius-pill); background:var(--stone-100); border:0; color:var(--stone-500); cursor:pointer; text-decoration:none; }
.rd-modal-x:hover { background:var(--stone-200); color:var(--stone-800); }
.rd-modal-x .ic { width:15px; height:15px; }
.rd-modal-intro { font-size:12.5px; line-height:1.5; color:var(--stone-500); margin:0 0 16px; }
.rd-modal-form { display:flex; flex-direction:column; gap:15px; }
.rd-fld { display:flex; flex-direction:column; gap:6px; }
.rd-defaultnote { display:flex; align-items:center; gap:7px; font-size:11.5px; color:var(--emerald-600); font-weight:600; margin-top:1px; }
.rd-defaultnote[hidden] { display:none; } /* the note is always rendered as the island's toggle hook; this restores the `hidden` attribute the explicit display above would otherwise defeat (no-JS base + island reveal, adr-enrol-modal-progressive-enhancement §1) */
.rd-defaultnote .ic { width:13px; height:13px; }
.rd-weeks-row { display:flex; align-items:center; gap:9px; }
.rd-weeks-row .field { width:78px; text-align:center; }
.rd-weeks-row .unit { font-size:13px; font-weight:600; color:var(--stone-500); }
.rd-hint { font-size:11px; color:var(--stone-400); margin:2px 0 0; }
.rd-modal-actions { display:flex; gap:9px; margin-top:4px; }
.rd-modal-actions .btn { white-space:nowrap; }

/* ═══════════════════════════════════════════════════════════════════════════
 * WEEK — Practice chain + Spacing-drift warning
 * (redojo-week-topical-chain-and-spacing-warning) — Designer package, HANDOFF-v1.
 *
 * APPEND-ONLY. Paste at the END of internal/web/static/tokens.css. Edits NO existing rule.
 * NO new token — every value resolves to an existing token (stone · amber · emerald · the
 * --s-* subject accent via --tint/--ic-text · existing radii/shadows/fonts). kata-0026 stays
 * green (no raw #hex).
 *
 * a11y: the drift warning is ICON + WORD, never colour alone. The amber advisory surfaces put
 * the TEXT in --stone-900 on --amber-50 (not --amber-600 on --amber-50, which is ~3.1:1 and
 * fails AA for body text); amber carries the alert only as background + inset ring + glyph.
 *
 * Note for the Architect:
 *   • ⚠ SHARED SURFACE — these rules extend the .wk-card + .wk-panel drawer, which the RUNNER DAY-RAIL
 *     (redojo-runner-day-rail) reuses verbatim, so the drift badge + practice chain appear on /runner
 *     too, by construction (the PO wants exactly that). They only SHOW there if the rail's activity
 *     view-model is populated from the same derivation as the Week's — see HANDOFF §7.
 *   • .wk-chain-out .oc duplicates the .wk-card-outcome .oc chip (same values) because the
 *     committed rule is scoped to .wk-card-outcome. Consider promoting .oc to a general
 *     outcome-chip primitive and dropping this copy.
 *   • .wk-back is a general "back one level inside a drawer" control — promote alongside
 *     .wk-close if a second drawer ever nests.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ── ① the card's spacing-drift marker (today/upcoming topical cards only) ──
   A quiet badge in the card's top row, the SAME 21px geometry as the committed .wk-status pill and read
   the same way: the glyph marks it, the WORD lives in the .sr text + title + the drawer note + the chain
   flag (never colour alone — the shipped card grammar's own convention). Advisory, not actionable: the
   plan is still correct, just weaker — so it takes no card height and never competes with the label. */
.wk-drift { margin-left:auto; flex:none; width:21px; height:21px; border-radius:var(--radius-pill);
  display:grid; place-items:center; background:var(--amber-50);
  box-shadow:inset 0 0 0 1.5px var(--amber-400); color:var(--amber-600); }
.wk-drift .ic { width:12px; height:12px; display:block; }

/* ── ① the drawer's drift explainer (the "why", once, where there is room for words) ── */
.wk-driftnote { display:flex; gap:11px; align-items:flex-start; margin:0 0 16px; padding:13px 15px;
  border-radius:var(--radius-xl); background:var(--amber-50); box-shadow:inset 0 0 0 1px var(--amber-400); }
.wk-driftnote .dn-ic { flex:none; width:30px; height:30px; border-radius:var(--radius-lg);
  background:var(--amber-400); color:var(--stone-900); display:grid; place-items:center; }
.wk-driftnote .dn-ic .ic { width:16px; height:16px; }
.wk-driftnote b { display:block; font-size:12.5px; font-weight:800; color:var(--stone-900); }
.wk-driftnote span { display:block; font-size:12px; line-height:1.45; color:var(--stone-700); margin-top:3px; }
/* the one lever the student actually has — a quiet link to the weekly rhythm, never a demand */
.wk-driftnote-act { display:inline-flex; align-items:center; gap:6px; margin-top:9px; text-decoration:none;
  font-size:11.5px; font-weight:800; color:var(--stone-900); background:var(--white);
  box-shadow:inset 0 0 0 1px var(--amber-400); border-radius:var(--radius-lg); padding:6px 11px; }
.wk-driftnote-act:hover { background:var(--amber-400); }
.wk-driftnote-act:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.wk-driftnote-act .ic { width:13px; height:13px; }

/* ═══ REDO AFFORDANCE (redojo-week-drawer-redo-affordance — Designer package `package-week-redo`) ═══
   Reuses the shipped grammar: the Session Runner's redo pill (the redo glyph + the word "Redo") fitted to
   the Week drawer's exercise row. Only the CONTRAST changes — see the AA note below. NOTE these three rules
   also reach the RUNNER: its drill-down renders the same weekPanelInner (iaActDetail), so .wk-redo +
   .wk-redo-key are shared; .wk-card-redo is Week-only.

   SINCE redojo-runner-redo-badge-aa-and-topical the Runner's IN-SESSION list renders .wk-redo too (row and
   hero), so the .badge.badge-amber pill described in the past tense below no longer exists anywhere in the
   Runner — .wk-redo is now the single redo grammar across Week card, Week drawer, Runner drawer, Runner
   in-session row and Runner hero. */

/* ── the Redo mark on an exercise-atom row (topical AND mixed, all three phases) ──
   Sits FIRST in the row's existing .wk-atom-chips line, so one treatment serves both row shapes (a
   topical row has no title line; a mixed row does). Provenance lives on the LEFT with the question's
   descriptors; the outcome (Got it / Revisit) stays on the RIGHT in .wk-atom-side — placement is what
   keeps "where this came from" and "how it went" apart on a done redo row that carries both.

   AA note (written when the Runner still carried .badge-amber): that pill WAS --amber-600 on --amber-50
   (~3.1:1) — below the 4.5:1 floor for this 10px word. So the Week mark kept the pill's shape/hue but put
   the WORD in --stone-900 (~15:1) and let amber carry the ring + glyph, exactly as the shipped
   .wk-driftnote already does. redojo-runner-redo-badge-aa-and-topical then retired the sub-AA pill from
   the Runner, which is what this note anticipated. */
.wk-redo { flex:none; display:inline-flex; align-items:center; gap:5px;
  padding:3px 9px 3px 7px; border-radius:var(--radius-pill);
  background:var(--amber-50); box-shadow:inset 0 0 0 1px var(--amber-400);
  color:var(--stone-900); font-size:10px; font-weight:800;
  letter-spacing:.04em; text-transform:uppercase; }
.wk-redo .ic { width:12px; height:12px; flex:none; color:var(--amber-600); }

/* ── `.wk-redo.at-hero` — the SAME mark at hero scale ──
   (redojo-runner-redo-badge-aa-and-topical, Designer package `package-runner-redo`)

   The Runner's in-session list adopts the mark above wholesale. The one addition is a size step for the
   HERO, where the mark leads a line of `.runner-ia .ex-chip` pills (11px, line 1697) rather than the row's
   smaller meta text — at the base 10px it reads as a footnote to the chips it leads rather than their peer.

   Every value is a +1px step on `.wk-redo`'s own metrics (10→11px word, 12→13px glyph, 5→6px gap, and the
   same glyph-side-tighter asymmetry 3px 9px 3px 7px → 4px 11px 4px 9px). Colour, ring, glyph, word and
   casing are IDENTICAL — one grammar at two scales, the way `.ex-chip` is itself a scale of `.wk-atchip2`.

   NB the Designer's own comment describes this as "matching `.ex-chip`'s metrics"; it doesn't exactly
   (`.runner-ia .ex-chip` is gap:5px / 12px glyph / padding 4px 10px). The RULE is what was transcoded
   verbatim and it is internally coherent as a step on `.wk-redo`; only the prose was loose. Raised back
   to the Designer as feedback — do not "correct" these values to `.ex-chip`'s without them. */
.wk-redo.at-hero { padding:4px 11px 4px 9px; gap:6px; font-size:11px; }
.wk-redo.at-hero .ic { width:13px; height:13px; }

/* ── the drawer's one-line key — rendered ONLY when the set contains ≥1 redo ──
   Teaches the word once, in the one place there is room for words (the drift-note precedent), and is
   what stops "Redo" and "Revisit" reading as the same fact. Absent when there are no redos, so a
   redo-free drawer is byte-for-byte as today. */
.wk-redo-key { display:flex; align-items:flex-start; gap:9px;
  margin:0 0 4px; padding:0 0 13px;
  font-size:11.5px; line-height:1.45; color:var(--color-text-muted); }
.wk-redo-key > span:last-child { flex:1; min-width:0; }
.wk-redo-key b { color:var(--color-text); font-weight:800; }

/* ── the card-level signal (AC6 = YES) ──
   Same 21px pill geometry as the shipped .wk-status / .wk-drift badges, so it costs the card no height.
   Glyph + the COUNT; the word travels in the .sr text, the title and the card's aria-label — the shipped
   card convention (never colour alone).

   v1.2 (Designer ADDENDUM-v1.2-card-badge-glyph-only) — GLYPH-ONLY, superseding v1.1's metric tightening.
   The badge is now geometrically IDENTICAL to .wk-drift above (21px pill · --amber-50 fill · --amber-400
   ring · 12px glyph in --amber-600), differing only by which glyph it carries. The count is NOT painted; it
   travels in the title, the .sr text and weekCardAria ("Includes 2 redos") — exactly the convention its two
   row-siblings .wk-status and .wk-drift already use.

   WHY, so nobody re-adds the numeral: v1 and v1.1 rendered TEXT, and that text is what overflowed. The badge
   was the only one of the three markers in .wk-card-top painting a word, so it alone broke the row. Dropping
   it is not tightening — it makes the badge conform to the grammar it borrowed its geometry from. The count
   was also never what AC6 asked for: the brief asked whether the card should signal that it CONTAINS redos.
   v1.1's metrics fixed three of four cards but left the ordinary 3-marker case ("Topical" + a two-digit
   badge + status — a done activity with two redos, i.e. a student who marked Not yet twice) still wrapping,
   which is not rare enough to ship a taller, misaligned card. Verified at the goldens' real 154px card width,
   not in a narrower preview: all four redo cards now measure a single 21px .wk-card-top.

   ACCEPTED LIMIT — do NOT tighten further: the FOUR-marker card (type chip + redo + drift + status beside a
   long type chip) can still wrap. That is the genuinely rare case; flex-wrap exists for it and nowrap would
   overflow instead. The Designer accepts it. If a visible count on the tile is ever genuinely wanted, that is
   a card-density conversation belonging with docs/redojo-inbox/redo-count-on-runner-activity-cards.md — not
   a CSS tweak here. */
.wk-card-redo { flex:none; width:21px; height:21px; border-radius:var(--radius-pill);
  display:grid; place-items:center; background:var(--amber-50);
  box-shadow:inset 0 0 0 1.5px var(--amber-400); color:var(--amber-600); }
.wk-card-redo .ic { width:12px; height:12px; display:block; }

/* ── ② the practice-chain entry point — a quiet full-width row in the topical drawer ── */
.wk-chainlink { width:100%; display:flex; align-items:center; gap:11px; text-align:left; cursor:pointer;
  border:0; margin:0 0 18px; padding:11px 13px; border-radius:var(--radius-xl); background:var(--color-surface);
  box-shadow:inset 0 0 0 1px var(--stone-200); font-family:var(--font-sans); transition:background .14s, box-shadow .14s; }
.wk-chainlink:hover { background:var(--stone-50); box-shadow:inset 0 0 0 1px var(--stone-300); }
.wk-chainlink:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.wk-chainlink .cl-ic { flex:none; width:30px; height:30px; border-radius:var(--radius-lg);
  background:var(--tint); color:var(--ic-text); display:grid; place-items:center; }
.wk-chainlink .cl-ic .ic { width:16px; height:16px; }
.wk-chainlink b { display:block; font-size:13px; font-weight:800; color:var(--color-text); }
.wk-chainlink .sub { display:block; font-size:11.5px; font-weight:600; color:var(--color-text-muted); margin-top:2px; }
.wk-chainlink .chev { margin-left:auto; flex:none; width:15px; height:15px; color:var(--color-text-faint); }

/* ── ② the chain panel: a back control in the drawer eyebrow ── */
.wk-back { display:inline-flex; align-items:center; gap:4px; border:0; cursor:pointer;
  background:var(--stone-100); color:var(--color-text-muted); border-radius:var(--radius-pill);
  padding:4px 10px 4px 7px; font:800 10px/1 var(--font-sans); letter-spacing:.04em; text-transform:uppercase; }
.wk-back:hover { background:var(--stone-200); color:var(--color-text); }
.wk-back:focus-visible { outline:2px solid var(--color-ink); outline-offset:2px; }
.wk-back .ic { width:12px; height:12px; }

/* ── ② the chain itself — steps in date order, joined by their spacing interval ── */
.wk-chain-intro { font-size:12.5px; line-height:1.5; color:var(--color-text-muted); margin:0 0 12px; }
.wk-chain { display:flex; flex-direction:column; }
.wk-chain-step { display:flex; gap:12px; align-items:flex-start; padding:11px; border-radius:var(--radius-xl); }
.wk-chain-step.is-here { background:var(--stone-50); }
.wk-chain-node { flex:none; width:25px; height:25px; border-radius:var(--radius-pill); display:grid; place-items:center;
  background:var(--stone-100); color:var(--color-text-muted); font-size:11px; font-weight:800; }
.wk-chain-node .ic { width:14px; height:14px; }
.wk-chain-node .live { width:7px; height:7px; border-radius:var(--radius-pill); background:var(--amber-500); }
.wk-chain-step.is-done .wk-chain-node { background:var(--emerald-50); color:var(--emerald-600); }
.wk-chain-step.is-now .wk-chain-node { background:var(--white); box-shadow:inset 0 0 0 1.5px var(--amber-400); }
.wk-chain-step.is-upcoming .wk-chain-node { color:var(--color-text-faint); }
.wk-chain-main { min-width:0; flex:1; }
.wk-chain-when { display:flex; flex-wrap:wrap; align-items:center; gap:8px; }
.wk-chain-date { font-size:13.5px; font-weight:800; color:var(--color-text); }
.wk-chain-sub { font-size:11.5px; font-weight:600; color:var(--color-text-muted); margin-top:4px; }
.wk-chain-out { display:flex; flex-wrap:wrap; gap:4px; margin-top:8px; }
.wk-chain-out .oc { display:inline-flex; align-items:center; gap:3px; font-size:10px; font-weight:800;
  padding:2px 7px; border-radius:var(--radius-pill); }
.wk-chain-out .oc .ic { width:11px; height:11px; }
.wk-chain-out .oc.got { background:var(--emerald-50); color:var(--emerald-600); }
.wk-chain-out .oc.gap { background:var(--stone-100); color:var(--color-text-muted); }
.wk-chain-here { display:inline-flex; align-items:center; font-size:9.5px; font-weight:800; letter-spacing:.04em;
  text-transform:uppercase; color:var(--color-text-muted); background:var(--stone-200);
  border-radius:var(--radius-pill); padding:3px 8px; }
/* the step's own drift mark — the chain and the card agree (AC-S6) */
.wk-chain-flag { display:inline-flex; align-items:center; gap:4px; font-size:9.5px; font-weight:800;
  letter-spacing:.03em; text-transform:uppercase; color:var(--stone-900); background:var(--amber-50);
  box-shadow:inset 0 0 0 1px var(--amber-400); border-radius:var(--radius-pill); padding:3px 8px; }
.wk-chain-flag .ic { width:11px; height:11px; color:var(--amber-600); }

/* the interval between two consecutive steps — the spaced-repetition gap made visible */
.wk-chain-gap { position:relative; display:flex; align-items:center; gap:6px; min-height:34px;
  padding:2px 0 2px 40px; font-size:11px; font-weight:700; color:var(--color-text-faint); }
.wk-chain-gap::before { content:""; position:absolute; left:22px; top:0; bottom:0; width:2px;
  border-radius:var(--radius-pill); background:var(--stone-200); }
.wk-chain-gap .ic { width:13px; height:13px; color:var(--amber-600); }
.wk-chain-gap.is-drift { color:var(--stone-900); font-weight:800; }
.wk-chain-gap.is-drift::before { background:var(--amber-400); }

/* chain of one (a just-unlocked sub-topic) — a note, never an empty panel */
.wk-chain-note { display:flex; gap:9px; align-items:flex-start; margin-top:6px; padding:11px 13px;
  border-radius:var(--radius-xl); background:var(--stone-50); font-size:12px; line-height:1.45; color:var(--color-text-muted); }
.wk-chain-note .ic { width:14px; height:14px; flex:none; margin-top:2px; color:var(--color-text-faint); }
