/* =============================================================================
   ERB ACADEMY V2 — erb.css
   Single shared stylesheet. Loaded by every page.
   Concept: "Academic Editorial" (see ERB-Academy-V2-Design-System.md)

   Fonts are loaded via <link> in each page <head>, not @import,
   so they start downloading before this file is parsed.

   ORDER OF THIS FILE
     1  Tokens (colour, type, space, grid, radius, motion)
     2  Reset
     3  Type primitives
     4  Layout: shell, section, the ruled margin, grids
     5  Annotation (signature device)
     6  Buttons / links / forms / chips
     7  Header + navigation + footer
     8  Rows, cards, badges, product, testimonial, quotation, dividers, tables
     9  Focus + motion
    10  Mobile patterns
    11  Page blocks (homepage)
    12  Utilities
   ========================================================================== */

/* -----------------------------------------------------------------------------
   1 · COLOUR TOKENS
   Four hues only: paper, ink, cobalt, marking red. Gold is a fifth, rationed.
   -------------------------------------------------------------------------- */
:root{
  /* Grounds — warm off-white paper stock */
  --paper:        #FAF7F1;   /* primary ground */
  --paper-sunk:   #F2EEE5;   /* recessed panel, table stripe, code */
  --paper-edge:   #E3DDD0;   /* hairline rule on paper */
  --paper-rule:   #CFC7B6;   /* stronger rule, margin line */

  /* Ink — deep navy, used for text and for dark grounds */
  --ink:          #0E1B30;   /* body text · dark section ground */
  --ink-raised:   #16263F;   /* raised surface on a dark ground */
  --ink-rule:     #2A3A54;   /* hairline on dark */
  --ink-soft:     #4E5A6E;   /* secondary text on paper */
  --ink-faint:    #666C77;   /* captions, meta, disabled — 4.9:1 on paper, 4.6:1 on paper-sunk */

  /* Cobalt — the academic accent. Links, focus, free resources, actions. */
  --cobalt:       #1D3FD6;
  --cobalt-deep:  #142CA0;   /* hover / pressed */
  --cobalt-wash:  #E6EAFB;   /* tint fill */
  --cobalt-on-dark:#7086E5;  /* cobalt as text on a dark ground */

  /* Marking red — the examiner's pen. Annotation and correction ONLY. */
  --red:          #C4382C;
  --red-on-dark:  #D46F67;   /* the same ink, legible on a dark ground */
  --red-wash:     #F8E9E5;

  /* Gold — premium and editorial moments. AD ASTRA. Rationed. */
  --gold:         #B8891F;   /* RULES AND BORDERS ONLY — 2.96:1, fails as text */
  --gold-ink:     #8A6617;   /* gold as TEXT on paper — 4.9:1 on paper, 4.5:1 on paper-sunk */
  --gold-bright:  #D8A23B;   /* on ink grounds only */
  --gold-wash:    #F6EEDC;

  /* Text on dark grounds */
  --on-ink:       #F3EFE6;
  --on-ink-soft:  #A9B4C6;

  /* ---------------------------------------------------------------------------
     2 · TYPOGRAPHY
     ------------------------------------------------------------------------ */
  --font-display: "Newsreader", Georgia, "Times New Roman", serif;
  --font-body:    "Instrument Sans", system-ui, -apple-system, "Segoe UI", sans-serif;

  --w-light:300; --w-book:400; --w-med:500; --w-semi:600; --w-bold:700;

  /* 3 · RESPONSIVE TYPE SCALE — fluid, no breakpoint jumps */
  --t-2xs:  0.6875rem;                                    /* 11 · mark allocations */
  --t-xs:   0.75rem;                                      /* 12 · eyebrows, meta */
  --t-sm:   0.8125rem;                                    /* 13 · captions, legal */
  --t-md:   0.9375rem;                                    /* 15 · UI, table cells */
  --t-base: clamp(1.0625rem, 1.02rem + 0.22vw, 1.1875rem);/* 17→19 · body */
  --t-lead: clamp(1.1875rem, 1.10rem + 0.40vw, 1.375rem); /* 19→22 · standfirst */
  --t-h4:   clamp(1.125rem, 1.06rem + 0.32vw, 1.3125rem);
  --t-h3:   clamp(1.375rem, 1.22rem + 0.72vw, 1.75rem);
  --t-h2:   clamp(1.75rem, 1.42rem + 1.55vw, 2.625rem);
  --t-h1:   clamp(2.25rem, 1.66rem + 2.80vw, 3.75rem);
  --t-hero: clamp(2.75rem, 1.80rem + 4.40vw, 5.25rem);

  --lh-tight: 1.08;
  --lh-head:  1.16;
  --lh-snug:  1.35;
  --lh-body:  1.62;
  --lh-loose: 1.75;

  --tr-tight: -0.02em;
  --tr-none:   0em;
  --tr-wide:   0.06em;
  --tr-caps:   0.13em;   /* eyebrows and labels */

  --measure:      66ch;  /* body column */
  --measure-tight:52ch;  /* standfirst, pull quotes */

  /* 4 · SPACING SCALE — 4px base, editorial generosity at the top end */
  --s-1:4px;  --s-2:8px;   --s-3:12px;  --s-4:16px;  --s-5:24px;
  --s-6:32px; --s-7:48px;  --s-8:64px;  --s-9:96px;  --s-10:128px;
  --section-y: clamp(56px, 8vw, 128px);   /* vertical rhythm between sections */
  --gutter:    clamp(20px, 4.5vw, 40px);  /* page edge padding */

  /* 5 · GRID */
  --maxw:      1180px;   /* standard content shell */
  --maxw-wide: 1400px;   /* full-bleed editorial moments */
  --maxw-text: 720px;    /* long-form reading column */
  --margin-col: clamp(0px, 8vw, 132px);  /* THE MARGIN — signature device */
  --col-gap:   clamp(20px, 3vw, 40px);

  /* 6 · RADIUS — deliberately near-zero. Not everything is a pill. */
  --r-0: 0;      /* cards, panels, dividers, images — the default */
  --r-1: 2px;    /* buttons, inputs, chips — touch affordance only */
  --r-2: 4px;    /* maximum permitted anywhere in the system */
  --r-full: 999px; /* PERMITTED ONLY on the status dot and the avatar */

  /* 7 · ELEVATION — paper does not float. Rules and tint before shadow. */
  --shadow-none: none;
  --shadow-lift: 0 1px 0 var(--paper-rule), 0 12px 28px -22px rgba(14,27,48,.45);
  --shadow-dark: 0 18px 44px -26px rgba(0,0,0,.7);

  /* 8 · BORDERS */
  --hair: 1px solid var(--paper-edge);
  --rule: 1px solid var(--paper-rule);
  --hair-dark: 1px solid var(--ink-rule);
  --bar: 3px;   /* the margin rule weight */

  /* 9 · MOTION */
  --dur-micro: 140ms;
  --dur-base:  240ms;
  --dur-enter: 420ms;
  --ease: cubic-bezier(.2,.62,.24,1);
  --ease-out: cubic-bezier(0,.64,.28,1);
}

/* -----------------------------------------------------------------------------
   RESET
   -------------------------------------------------------------------------- */
*,*::before,*::after{ box-sizing:border-box; }
html{ -webkit-text-size-adjust:100%; scroll-behavior:smooth; }
body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:var(--font-body);
  font-size:var(--t-base);
  line-height:var(--lh-body);
  font-variant-numeric:tabular-nums;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
img,svg{ max-width:100%; display:block; }
button,input,select,textarea{ font:inherit; color:inherit; }

/* -----------------------------------------------------------------------------
   TYPE PRIMITIVES
   Newsreader carries every heading. Instrument Sans carries everything read
   at speed: UI, tables, prices, timetables.
   -------------------------------------------------------------------------- */
.erb-h1{ font-family:var(--font-display); font-size:var(--t-h1); font-weight:var(--w-book);
  line-height:var(--lh-tight); letter-spacing:var(--tr-tight); margin:0; }
.erb-h2{ font-family:var(--font-display); font-size:var(--t-h2); font-weight:var(--w-book);
  line-height:var(--lh-head); letter-spacing:var(--tr-tight); margin:0; }
.erb-h3{ font-family:var(--font-display); font-size:var(--t-h3); font-weight:var(--w-med);
  line-height:var(--lh-head); margin:0; }
.erb-h4{ font-family:var(--font-body); font-size:var(--t-h4); font-weight:var(--w-semi);
  line-height:var(--lh-snug); margin:0; }

.erb-lead{ font-size:var(--t-lead); line-height:var(--lh-snug); color:var(--ink-soft);
  max-width:var(--measure-tight); font-weight:var(--w-book); }
.erb-body{ max-width:var(--measure); }
.erb-caption{ font-size:var(--t-sm); line-height:var(--lh-snug); color:var(--ink-faint); }

/* Eyebrow — the section's classification mark, set like a paper's header line */
.erb-eyebrow{
  font-family:var(--font-body); font-size:var(--t-xs); font-weight:var(--w-semi);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--ink-faint);
  margin:0 0 var(--s-3);
}
.erb-eyebrow--cobalt{ color:var(--cobalt); }
.erb-eyebrow--gold{ color:var(--gold-ink); }

/* Drop the first-paragraph indent convention of print; use a standfirst instead */
.erb-standfirst{
  font-family:var(--font-display); font-size:var(--t-lead); font-weight:var(--w-light);
  line-height:var(--lh-snug); color:var(--ink-soft); max-width:var(--measure-tight);
}

/* -----------------------------------------------------------------------------
   5 · GRID + THE MARGIN (signature)
   -------------------------------------------------------------------------- */
.erb-shell{ width:100%; max-width:var(--maxw); margin-inline:auto; padding-inline:var(--gutter); }
.erb-shell--wide{ max-width:var(--maxw-wide); }
.erb-shell--text{ max-width:var(--maxw-text); }

.erb-section{ padding-block:var(--section-y); }
.erb-section--tight{ padding-block:calc(var(--section-y) * .55); }

/* Ruled margin: content sits to the right of a vertical rule, as on a script. */
.erb-ruled{
  display:grid;
  grid-template-columns:var(--margin-col) minmax(0,1fr);
  column-gap:var(--col-gap);
  align-items:start;
}
.erb-ruled__margin{
  position:relative;
  min-height:100%;
  padding-right:var(--s-4);
  border-right:var(--rule);
  text-align:right;
}
.erb-ruled__body{ min-width:0; }

/* 12-column editorial grid for card and row layouts */
.erb-grid{ display:grid; grid-template-columns:repeat(12,minmax(0,1fr)); gap:var(--col-gap); }
.erb-grid--2{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--col-gap); }
.erb-grid--3{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--col-gap); }

/* Dark ground */
.erb-ink{ background:var(--ink); color:var(--on-ink); }
.erb-ink .erb-lead,
.erb-ink .erb-standfirst{ color:var(--on-ink-soft); }
.erb-ink .erb-eyebrow{ color:var(--on-ink-soft); }
.erb-ink .erb-ruled__margin{ border-right-color:var(--ink-rule); }

/* -----------------------------------------------------------------------------
   14 · ACADEMIC ANNOTATION (signature)
   The examiner's hand: Newsreader italic in marking red, set in the margin.
   -------------------------------------------------------------------------- */
.erb-mark{                       /* [4] — a mark allocation */
  font-family:var(--font-body); font-size:var(--t-2xs); font-weight:var(--w-semi);
  letter-spacing:var(--tr-wide); color:var(--ink-faint);
  font-variant-numeric:tabular-nums;
}
.erb-annot{                      /* an examiner's margin note */
  font-family:var(--font-display); font-style:italic; font-weight:var(--w-book);
  font-size:var(--t-sm); line-height:1.4; color:var(--red);
  display:block;
}
.erb-annot--ink{ color:var(--gold-bright); }
.erb-tick{                       /* the marking tick */
  color:var(--red); font-size:var(--t-lead); line-height:1;
  display:inline-block; transform:rotate(-8deg);
}
/* Inline underline in marking red — "this is the thing to notice" */
.erb-underscore{
  background-image:linear-gradient(var(--red),var(--red));
  background-size:100% 2px; background-repeat:no-repeat; background-position:0 92%;
  padding-bottom:2px;
}
/* Section number, set as a question number would be */
.erb-qnum{
  font-family:var(--font-display); font-size:var(--t-h3); font-weight:var(--w-light);
  color:#958F83; line-height:1; font-variant-numeric:lining-nums;   /* 3.0:1 */
}
.erb-ink .erb-qnum{ color:#5A677B; }                                 /* 3.0:1 */

/* -----------------------------------------------------------------------------
   6 · BUTTONS
   Square-ish, weighted, no gradients, no glow. Three ranks only.
   -------------------------------------------------------------------------- */
.erb-btn{
  --_bg:var(--ink); --_fg:var(--paper); --_bd:var(--ink);
  display:inline-flex; align-items:center; justify-content:center; gap:var(--s-2);
  padding:14px 26px; min-height:48px;
  background:var(--_bg); color:var(--_fg); border:1px solid var(--_bd);
  border-radius:var(--r-1);
  font-family:var(--font-body); font-size:var(--t-md); font-weight:var(--w-semi);
  letter-spacing:0.01em; text-decoration:none; cursor:pointer;
  transition:background var(--dur-micro) var(--ease),
             color var(--dur-micro) var(--ease),
             border-color var(--dur-micro) var(--ease),
             transform var(--dur-micro) var(--ease);
}
.erb-btn:hover{ transform:translateY(-1px); }
.erb-btn:active{ transform:translateY(0); }

.erb-btn--primary{ --_bg:var(--cobalt); --_fg:#fff; --_bd:var(--cobalt); }
.erb-btn--primary:hover{ --_bg:var(--cobalt-deep); --_bd:var(--cobalt-deep); }

.erb-btn--ink{ --_bg:var(--ink); --_fg:var(--paper); --_bd:var(--ink); }
.erb-btn--ink:hover{ --_bg:var(--ink-raised); --_bd:var(--ink-raised); }

.erb-btn--outline{ --_bg:transparent; --_fg:var(--ink); --_bd:var(--paper-rule); }
.erb-btn--outline:hover{ --_bd:var(--ink); --_bg:var(--paper-sunk); }

.erb-btn--gold{ --_bg:var(--gold-bright); --_fg:var(--ink); --_bd:var(--gold-bright); }
.erb-btn--gold:hover{ --_bg:#E9B451; --_bd:#E9B451; }

.erb-btn--quiet{ --_bg:transparent; --_fg:var(--cobalt); --_bd:transparent;
  padding-inline:0; min-height:auto; }
.erb-btn--quiet:hover{ --_fg:var(--cobalt-deep); }

.erb-btn--block{ display:flex; width:100%; }
.erb-btn--sm{ padding:9px 16px; min-height:40px; font-size:var(--t-sm); }

.erb-ink .erb-btn--outline{ --_fg:var(--on-ink); --_bd:var(--ink-rule); }
.erb-ink .erb-btn--outline:hover{ --_bd:var(--on-ink); --_bg:var(--ink-raised); }

.erb-btn[disabled],.erb-btn[aria-disabled="true"]{
  opacity:.45; pointer-events:none;
}

/* -----------------------------------------------------------------------------
   7 · LINKS
   Inline links are underlined from rest. Underline offset does the styling work.
   -------------------------------------------------------------------------- */
.erb-link{
  color:var(--cobalt); text-decoration:underline;
  text-decoration-thickness:1px; text-underline-offset:3px;
  text-decoration-color:color-mix(in srgb, var(--cobalt) 40%, transparent);
  transition:text-decoration-color var(--dur-micro) var(--ease), color var(--dur-micro) var(--ease);
}
.erb-link:hover{ text-decoration-color:var(--cobalt); color:var(--cobalt-deep); }
.erb-ink .erb-link{ color:var(--gold-bright);
  text-decoration-color:color-mix(in srgb, var(--gold-bright) 45%, transparent); }
.erb-ink .erb-link:hover{ text-decoration-color:var(--gold-bright); color:var(--gold-bright); }

/* Standalone directional link — the editorial "read on" */
.erb-link-arrow{
  display:inline-flex; align-items:baseline; gap:var(--s-2);
  font-weight:var(--w-semi); font-size:var(--t-md); color:var(--cobalt);
  text-decoration:none; border-bottom:1px solid var(--paper-rule); padding-bottom:3px;
  transition:border-color var(--dur-micro) var(--ease), gap var(--dur-micro) var(--ease);
}
.erb-link-arrow:hover{ border-bottom-color:var(--cobalt); gap:var(--s-3); }

/* -----------------------------------------------------------------------------
   8 · FORM ELEMENTS
   Underline-first inputs — a form on a page, not a control panel.
   -------------------------------------------------------------------------- */
.erb-field{ display:block; margin-bottom:var(--s-5); }
.erb-label{
  display:block; font-size:var(--t-xs); font-weight:var(--w-semi);
  letter-spacing:var(--tr-caps); text-transform:uppercase;
  color:var(--ink-soft); margin-bottom:var(--s-2);
}
.erb-input,.erb-textarea,.erb-select{
  width:100%; padding:12px 0; min-height:48px;
  background:transparent; color:var(--ink);
  border:0; border-bottom:2px solid var(--paper-rule); border-radius:0;
  font-size:var(--t-base);
  transition:border-color var(--dur-micro) var(--ease);
}
.erb-input::placeholder,.erb-textarea::placeholder{ color:var(--ink-faint); }
.erb-input:hover,.erb-textarea:hover,.erb-select:hover{ border-bottom-color:var(--ink-soft); }
.erb-input:focus,.erb-textarea:focus,.erb-select:focus{
  outline:none; border-bottom-color:var(--cobalt);
}
.erb-textarea{ min-height:120px; resize:vertical; line-height:var(--lh-body); }
.erb-select{ appearance:none; padding-right:28px;
  background-image:linear-gradient(45deg,transparent 50%,var(--ink-soft) 50%),
                   linear-gradient(135deg,var(--ink-soft) 50%,transparent 50%);
  background-position:calc(100% - 14px) 55%, calc(100% - 8px) 55%;
  background-size:6px 6px,6px 6px; background-repeat:no-repeat; }

.erb-hint{ font-size:var(--t-sm); color:var(--ink-faint); margin-top:var(--s-2); }
.erb-error{ font-size:var(--t-sm); color:var(--red); margin-top:var(--s-2);
  font-family:var(--font-display); font-style:italic; }
.erb-input[aria-invalid="true"],.erb-textarea[aria-invalid="true"]{ border-bottom-color:var(--red); }

/* Checkbox / radio — square, ink-weighted */
.erb-check{ display:flex; gap:var(--s-3); align-items:flex-start;
  font-size:var(--t-md); line-height:var(--lh-snug); cursor:pointer; }
.erb-check input{ appearance:none; flex:none; width:20px; height:20px; margin-top:2px;
  border:2px solid var(--paper-rule); border-radius:var(--r-1); background:transparent;
  cursor:pointer; transition:all var(--dur-micro) var(--ease); }
.erb-check input:checked{ background:var(--cobalt); border-color:var(--cobalt); }
.erb-check input:checked::after{ content:"✓"; display:block; color:#fff;
  font-size:13px; line-height:16px; text-align:center; }

/* Filter chip — the finder's control, not a pill */
.erb-chip{
  display:inline-flex; align-items:center; min-height:40px; padding:8px 16px;
  background:transparent; color:var(--ink-soft);
  border:1px solid var(--paper-rule); border-radius:var(--r-1);
  font-size:var(--t-md); font-weight:var(--w-med); cursor:pointer;
  transition:all var(--dur-micro) var(--ease);
}
.erb-chip:hover{ border-color:var(--ink); color:var(--ink); }
.erb-chip[aria-pressed="true"]{ background:var(--ink); border-color:var(--ink); color:var(--paper); }

/* -----------------------------------------------------------------------------
   9 · NAVIGATION
   -------------------------------------------------------------------------- */
.erb-head{
  position:sticky; top:0; z-index:60;
  background:color-mix(in srgb, var(--paper) 88%, transparent);
  backdrop-filter:saturate(1.2) blur(10px);
  border-bottom:var(--hair);
}
.erb-nav{ display:flex; align-items:center; gap:var(--s-6);
  min-height:68px; }
.erb-brand{ display:flex; align-items:baseline; gap:var(--s-2);
  min-height:44px; align-items:center;
  text-decoration:none; color:var(--ink); margin-right:auto; }
.erb-brand__name{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); letter-spacing:var(--tr-tight); white-space:nowrap; }
.erb-brand__mark{ font-size:var(--t-2xs); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink-faint); }

.erb-nav__links{ display:flex; align-items:center; gap:var(--s-5); }
.erb-nav__link{
  position:relative; padding:10px 0; white-space:nowrap;
  font-size:var(--t-md); font-weight:var(--w-med); color:var(--ink-soft);
  text-decoration:none; transition:color var(--dur-micro) var(--ease);
}
.erb-nav__link:hover{ color:var(--ink); }
.erb-nav__link[aria-current="page"]{ color:var(--ink); font-weight:var(--w-semi); }
.erb-nav__link[aria-current="page"]::after{
  content:""; position:absolute; left:0; right:0; bottom:0;
  height:2px; background:var(--cobalt);
}
/* Start Here — the one visually distinct action in the bar */
.erb-nav__start{
  display:inline-flex; align-items:center; gap:var(--s-2);
  padding:11px 20px; min-height:44px;
  background:var(--cobalt); color:#fff; border-radius:var(--r-1);
  font-size:var(--t-md); font-weight:var(--w-semi); text-decoration:none;
  white-space:nowrap; flex:none;
  transition:background var(--dur-micro) var(--ease);
}
.erb-nav__start:hover{ background:var(--cobalt-deep); }

/* Breadcrumb — set as a running head */
.erb-crumb{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); }

/* -----------------------------------------------------------------------------
   10 · RESOURCE ROWS + CARDS
   Rows are the default. Cards are the exception, used only where items must be
   compared side by side.
   -------------------------------------------------------------------------- */
.erb-rows{ border-top:var(--rule); }
.erb-row{
  display:grid; grid-template-columns:1fr auto; gap:var(--s-4) var(--s-5);
  align-items:start; padding:var(--s-5) 0;
  border-bottom:var(--hair);
  transition:background var(--dur-micro) var(--ease);
}
.erb-row:hover{ background:var(--paper-sunk); }
.erb-row__meta{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); margin-bottom:var(--s-2); }
.erb-row__title{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); line-height:var(--lh-snug); margin:0 0 var(--s-2); }
.erb-row__desc{ font-size:var(--t-md); color:var(--ink-soft); max-width:56ch; margin:0; }
.erb-row__side{ display:flex; flex-direction:column; align-items:flex-end;
  gap:var(--s-3); text-align:right; }

.erb-price{ font-family:var(--font-body); font-size:var(--t-h4);
  font-weight:var(--w-bold); font-variant-numeric:tabular-nums; letter-spacing:-0.01em; }
.erb-price__unit{ font-size:var(--t-sm); font-weight:var(--w-med); color:var(--ink-faint); }
.erb-price--free{ color:var(--cobalt); }

/* Badges — flat, square, quiet */
.erb-badge{
  display:inline-block; padding:4px 9px;
  font-size:var(--t-2xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase;
  border-radius:var(--r-1); border:1px solid transparent;
}
.erb-badge--free{ background:var(--cobalt-wash); color:var(--cobalt-deep); border-color:#C9D3F7; }
.erb-badge--premium{ background:var(--gold-wash); color:var(--gold-ink); border-color:#E7D6AE; }
.erb-badge--best{ background:var(--gold-bright); color:var(--ink); }
.erb-badge--new{ background:var(--red-wash); color:var(--red); border-color:#EFCFC9; }

/* Card — used sparingly */
.erb-card{
  background:var(--paper); border:var(--rule); border-radius:var(--r-0);
  padding:var(--s-6); display:flex; flex-direction:column; gap:var(--s-4);
  transition:border-color var(--dur-base) var(--ease), transform var(--dur-base) var(--ease);
}
.erb-card:hover{ border-color:var(--ink); }
.erb-card--sunk{ background:var(--paper-sunk); }
.erb-card--free{ border-left:var(--bar) solid var(--cobalt); }
.erb-card--premium{ border-left:var(--bar) solid var(--gold); }
.erb-card__foot{ margin-top:auto; padding-top:var(--s-4); border-top:var(--hair); }
.erb-ink .erb-card{ background:var(--ink-raised); border-color:var(--ink-rule); }
.erb-ink .erb-card__foot{ border-top-color:var(--ink-rule); }

/* -----------------------------------------------------------------------------
   11 · PRODUCT PRESENTATION
   A product is presented as a specimen page, not a shop tile.
   -------------------------------------------------------------------------- */
.erb-product{
  display:grid; grid-template-columns:minmax(0,1fr) minmax(0,320px);
  gap:var(--s-7); align-items:start;
  padding-block:var(--s-7); border-top:var(--rule);
}
.erb-product__spec{
  display:grid; grid-template-columns:auto 1fr; gap:var(--s-2) var(--s-4);
  font-size:var(--t-md); border-top:var(--hair); padding-top:var(--s-4);
}
.erb-product__spec dt{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); }
.erb-product__spec dd{ margin:0; }
.erb-product__buy{
  border:var(--rule); padding:var(--s-5); display:flex; flex-direction:column; gap:var(--s-4);
  position:sticky; top:88px;
}
.erb-contents{ list-style:none; margin:0; padding:0; }
.erb-contents li{
  display:grid; grid-template-columns:auto 1fr; gap:var(--s-3);
  padding:var(--s-2) 0; border-bottom:var(--hair); font-size:var(--t-md);
}
.erb-contents li::before{ content:"—"; color:var(--paper-rule); }

/* -----------------------------------------------------------------------------
   12 · TESTIMONIAL
   Attributed, restrained, never a floating card with a five-star row.
   -------------------------------------------------------------------------- */
.erb-testimonial{
  display:grid; grid-template-columns:auto 1fr; gap:var(--s-4);
  padding:var(--s-5) 0; border-top:var(--hair);
  max-width:var(--measure);
}
.erb-testimonial__avatar{
  width:44px; height:44px; border-radius:var(--r-full);
  background:var(--paper-sunk); border:var(--hair);
  display:grid; place-items:center;
  font-family:var(--font-display); font-size:var(--t-md); color:var(--ink-soft);
}
.erb-testimonial__quote{
  font-size:var(--t-base); line-height:var(--lh-snug); margin:0 0 var(--s-3);
}
.erb-testimonial__who{
  font-size:var(--t-sm); color:var(--ink-faint);
  display:flex; flex-wrap:wrap; gap:var(--s-2); align-items:baseline;
}
.erb-testimonial__who strong{ color:var(--ink); font-weight:var(--w-semi); }

/* -----------------------------------------------------------------------------
   13 · EDITORIAL QUOTATION
   The pull quote is a break in the page, not an ornament inside it.
   -------------------------------------------------------------------------- */
.erb-pull{
  margin:var(--s-8) 0; padding-left:var(--s-5);
  border-left:var(--bar) solid var(--gold);
  font-family:var(--font-display); font-style:italic; font-weight:var(--w-light);
  font-size:var(--t-h3); line-height:1.32; letter-spacing:var(--tr-tight);
  max-width:var(--measure-tight);
}
.erb-pull cite{
  display:block; margin-top:var(--s-3);
  font-family:var(--font-body); font-style:normal; font-size:var(--t-xs);
  font-weight:var(--w-semi); letter-spacing:var(--tr-caps); text-transform:uppercase;
  color:var(--ink-faint);
}
.erb-ink .erb-pull{ border-left-color:var(--gold-bright); }


/* Creole line — a bilingual device, set as a footnote gloss */
.erb-creole{ border-left:2px solid var(--paper-rule); padding-left:var(--s-4); }
.erb-creole__kr{ font-family:var(--font-display); font-style:italic;
  font-size:var(--t-lead); display:block; }
.erb-creole__en{ font-size:var(--t-sm); color:var(--ink-faint); display:block;
  margin-top:var(--s-1); }
.erb-creole--on-ink{ border-left-color:var(--ink-rule); }
.erb-creole--on-ink .erb-creole__kr{ color:var(--on-ink); }
.erb-creole--on-ink .erb-creole__en{ color:var(--on-ink-soft); }

/* -----------------------------------------------------------------------------
   15 · SECTION DIVIDERS
   Rules, not shadows. Three weights, each meaning something different.
   -------------------------------------------------------------------------- */
.erb-div{ border:0; border-top:var(--hair); margin:var(--s-6) 0; }        /* within a section */
.erb-div--rule{ border-top:var(--rule); }                                  /* between subjects */
.erb-div--heavy{ border-top:2px solid var(--ink); margin:var(--s-8) 0; }   /* between sections */
.erb-div--mark{                       /* the end-of-section mark */
  border:0; margin:var(--s-8) 0; text-align:center;
  color:var(--paper-rule); font-family:var(--font-display); font-size:var(--t-h4);
}
.erb-div--mark::before{ content:"§"; }
.erb-ink .erb-div{ border-top-color:var(--ink-rule); }
.erb-ink .erb-div--heavy{ border-top-color:var(--on-ink-soft); }

/* -----------------------------------------------------------------------------
   TABLE — timetables and price lists are data, set as data
   -------------------------------------------------------------------------- */
.erb-table{ width:100%; border-collapse:collapse; font-size:var(--t-md); }
.erb-table caption{ text-align:left; font-size:var(--t-xs);
  letter-spacing:var(--tr-caps); text-transform:uppercase;
  color:var(--ink-faint); padding-bottom:var(--s-3); }
.erb-table th{ text-align:left; font-weight:var(--w-semi); font-size:var(--t-xs);
  letter-spacing:var(--tr-wide); text-transform:uppercase; color:var(--ink-soft);
  padding:var(--s-3) var(--s-4) var(--s-3) 0; border-bottom:2px solid var(--ink); }
.erb-table td{ padding:var(--s-3) var(--s-4) var(--s-3) 0;
  border-bottom:var(--hair); vertical-align:top; }
.erb-table tbody tr:hover{ background:var(--paper-sunk); }
.erb-table .erb-time{ font-variant-numeric:tabular-nums; font-weight:var(--w-semi);
  white-space:nowrap; }

/* -----------------------------------------------------------------------------
   17 · FOCUS + KEYBOARD STATES
   Never removed, never subtle.
   -------------------------------------------------------------------------- */
:where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{
  outline:2px solid var(--cobalt);
  outline-offset:3px;
  border-radius:var(--r-1);
}
.erb-ink :where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{
  outline-color:var(--gold-bright);
}
.erb-skip{
  position:absolute; left:var(--s-4); top:-100px; z-index:100;
  padding:12px 20px; background:var(--ink); color:var(--paper);
  text-decoration:none; border-radius:var(--r-1);
  transition:top var(--dur-micro) var(--ease);
}
.erb-skip:focus{ top:var(--s-4); }

/* -----------------------------------------------------------------------------
   18 · MOTION
   Motion clarifies arrival and state. It never decorates.
   -------------------------------------------------------------------------- */
.erb-reveal{
  opacity:0; transform:translateY(14px);
  transition:opacity var(--dur-enter) var(--ease-out),
             transform var(--dur-enter) var(--ease-out);
}
.erb-reveal.is-in{ opacity:1; transform:none; }
.erb-reveal--d1{ transition-delay:70ms; }
.erb-reveal--d2{ transition-delay:140ms; }
.erb-reveal--d3{ transition-delay:210ms; }

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important; animation-iteration-count:1 !important;
    transition-duration:.01ms !important; scroll-behavior:auto !important;
  }
  .erb-reveal{ opacity:1; transform:none; }
}

/* -----------------------------------------------------------------------------
   16 · MOBILE PATTERNS
   -------------------------------------------------------------------------- */
@media (max-width:900px){
  .erb-product{ grid-template-columns:1fr; gap:var(--s-6); }
  .erb-product__buy{ position:static; }
  .erb-grid--3{ grid-template-columns:1fr; }
}
@media (max-width:720px){
  :root{ --margin-col:0px; }
  /* The margin collapses: the rule moves above the content as a short mark */
  .erb-ruled{ grid-template-columns:1fr; row-gap:var(--s-3); }
  .erb-ruled__margin{
    display:flex; align-items:center; flex-wrap:wrap; gap:var(--s-2) var(--s-3);
    border-right:0; border-top:0;
    padding:0 0 var(--s-3); text-align:left; width:100%; min-height:0;
  }
  .erb-ruled__margin::before{
    content:""; display:block; flex:none; width:44px; height:var(--bar);
    background:var(--ink);
  }
  .erb-ink .erb-ruled__margin::before{ background:var(--on-ink-soft); }
  .erb-ruled__margin .erb-annot{ display:inline; }
  .erb-grid--2{ grid-template-columns:1fr; }
  .erb-nav__links{ display:none; }
  .erb-row{ grid-template-columns:1fr; }
  .erb-row__side{ align-items:flex-start; text-align:left;
    flex-direction:row; flex-wrap:wrap; align-items:center; }
  .erb-testimonial{ grid-template-columns:1fr; }
  .erb-btn{ width:100%; }         /* full-width actions in flow */
  .erb-nav__start{ width:auto; }  /* except the nav action */
  /* Superseded in Phase 7: the timetable is grouped by day and reflows to a
     single column, so nothing on the site needs a horizontal scroll region. */
}

/* Sticky action bar — ONE WhatsApp entry point sitewide, mobile only */
.erb-actionbar{
  position:fixed; left:0; right:0; bottom:0; z-index:70;
  display:none; gap:1px;
  background:var(--paper-rule); border-top:1px solid var(--paper-rule);
}
.erb-actionbar a{
  flex:1; display:flex; align-items:center; justify-content:center; gap:var(--s-2);
  min-height:56px; padding:10px;
  background:var(--paper); color:var(--ink); text-decoration:none;
  font-size:var(--t-sm); font-weight:var(--w-semi);
}
.erb-actionbar a.is-primary{ background:var(--cobalt); color:#fff; }
@media (max-width:720px){
  .erb-actionbar{ display:flex; }
  body{ padding-bottom:56px; }
}

/* -----------------------------------------------------------------------------
   UTILITIES — a deliberately short list
   -------------------------------------------------------------------------- */
/* Spacing utilities — the only sanctioned way to nudge vertical rhythm.
   Anti-pattern 31: never hand-tune a section's padding inline. */
.erb-mt-4{ margin-top:var(--s-4); }
.erb-mt-6{ margin-top:var(--s-6); }
.erb-my-6{ margin-block:var(--s-6); }
.erb-stack > * + *{ margin-top:var(--s-4); }
.erb-stack-lg > * + *{ margin-top:var(--s-6); }
.erb-flow > * + *{ margin-top:var(--s-5); }
.erb-center{ margin-inline:auto; text-align:center; }
.erb-vh{ position:absolute; width:1px; height:1px; overflow:hidden;
  clip:rect(0 0 0 0); white-space:nowrap; }

/* =============================================================================
   7b · MOBILE NAVIGATION (drawer)
   The toggle is a real <button>; the drawer is a real element in the DOM.
   No content depends on JavaScript to exist — only to be revealed.
   ========================================================================== */
.erb-nav__toggle{
  display:none; align-items:center; justify-content:center; gap:8px;
  min-height:44px; padding:8px 12px; margin-left:var(--s-3);
  background:transparent; border:1px solid var(--paper-rule); border-radius:var(--r-1);
  font-size:var(--t-md); font-weight:var(--w-semi); color:var(--ink); cursor:pointer;
}
.erb-nav__toggle:hover{ border-color:var(--ink); }
.erb-nav__bars{ position:relative; width:16px; height:10px; flex:none; }
.erb-nav__bars span{
  position:absolute; left:0; right:0; height:2px; background:currentColor;
  transition:transform var(--dur-base) var(--ease), opacity var(--dur-micro) var(--ease);
}
.erb-nav__bars span:nth-child(1){ top:0; }
.erb-nav__bars span:nth-child(2){ top:4px; }
.erb-nav__bars span:nth-child(3){ top:8px; }
.erb-nav__toggle[aria-expanded="true"] .erb-nav__bars span:nth-child(1){ transform:translateY(4px) rotate(45deg); }
.erb-nav__toggle[aria-expanded="true"] .erb-nav__bars span:nth-child(2){ opacity:0; }
.erb-nav__toggle[aria-expanded="true"] .erb-nav__bars span:nth-child(3){ transform:translateY(-4px) rotate(-45deg); }

.erb-drawer{
  display:none; border-top:var(--hair); background:var(--paper);
  max-height:calc(100dvh - 68px); overflow-y:auto;
}
.erb-drawer.is-open{ display:block; }
.erb-drawer__list{ display:flex; flex-direction:column; padding-block:var(--s-3); }
.erb-drawer__link{
  padding:14px 0; min-height:48px; display:flex; align-items:center;
  border-bottom:var(--hair);
  font-family:var(--font-display); font-size:var(--t-h4); font-weight:var(--w-med);
  color:var(--ink); text-decoration:none;
}
.erb-drawer__link[aria-current="page"]{ color:var(--cobalt); }
.erb-drawer__secondary{
  display:flex; flex-wrap:wrap; gap:var(--s-2) var(--s-4);
  padding:var(--s-4) 0 var(--s-5);
}
.erb-drawer__secondary a{
  font-size:var(--t-sm); color:var(--ink-faint); text-decoration:none;
  border-bottom:1px solid transparent;
}
.erb-drawer__secondary a:hover{ color:var(--ink); border-bottom-color:var(--paper-rule); }
.erb-drawer__cta{ padding-bottom:var(--s-5); }

/* =============================================================================
   7c · FOOTER
   ========================================================================== */
.erb-foot{ background:var(--ink); color:var(--on-ink-soft); padding-block:var(--s-8) var(--s-6); }
.erb-foot__grid{
  display:grid; grid-template-columns:1.5fr 1fr 1fr 1fr;
  gap:var(--s-7) var(--col-gap);
}
.erb-foot__brand{ font-family:var(--font-display); font-size:var(--t-h3);
  color:var(--on-ink); font-weight:var(--w-book); display:block; text-decoration:none; }
.erb-foot__blurb{ font-size:var(--t-md); max-width:38ch; margin:var(--s-3) 0 var(--s-5); }
.erb-foot h2{
  font-size:var(--t-xs); font-weight:var(--w-semi); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--on-ink); margin:0 0 var(--s-4);
}
.erb-foot__col{ display:flex; flex-direction:column; gap:var(--s-3); }
.erb-foot__col a{ font-size:var(--t-md); color:var(--on-ink-soft); text-decoration:none;
  transition:color var(--dur-micro) var(--ease); }
.erb-foot__col a:hover{ color:var(--on-ink); }
.erb-foot__bottom{
  margin-top:var(--s-8); padding-top:var(--s-5); border-top:var(--hair-dark);
  display:flex; flex-wrap:wrap; gap:var(--s-3) var(--s-5);
  font-size:var(--t-sm);
}
.erb-foot__bottom a{ color:var(--on-ink-soft); }
.erb-foot__legal{ width:100%; max-width:70ch; color:var(--on-ink-soft); font-size:var(--t-sm); }

/* =============================================================================
   11 · PAGE BLOCKS — HOMEPAGE
   ========================================================================== */

/* --- Hero ---------------------------------------------------------------- */
.erb-hero{ padding-block:clamp(48px,7vw,104px) clamp(48px,7vw,96px); }
.erb-hero__grid{
  display:grid; grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);
  gap:clamp(32px,5vw,72px); align-items:center;
}
.erb-hero__promise{ max-width:16ch; }
.erb-hero__sub{ margin-top:var(--s-5); }
.erb-hero__actions{ display:flex; flex-wrap:wrap; gap:var(--s-3); margin-top:var(--s-6); }
.erb-hero__note{ margin-top:var(--s-5); }
.erb-hero__figure{ margin:0; }
.erb-hero__figure img{ width:100%; height:auto; border:var(--rule); background:var(--paper); }
.erb-hero__figure figcaption{ margin-top:var(--s-3); }

/* --- Path list (What do you need right now?) ------------------------------ */
.erb-paths{ border-top:2px solid var(--ink); margin-top:var(--s-6); }
.erb-path{
  display:grid; grid-template-columns:minmax(0,1fr) auto;
  gap:var(--s-3) var(--s-5); align-items:center;
  padding:var(--s-5) 0; border-bottom:var(--hair);
  text-decoration:none; color:inherit;
  transition:background var(--dur-micro) var(--ease), padding-left var(--dur-base) var(--ease);
}
.erb-path:hover{ background:var(--paper-sunk); padding-left:var(--s-3); }
.erb-path__title{
  font-family:var(--font-display); font-size:var(--t-h3); font-weight:var(--w-book);
  line-height:var(--lh-head); margin:0;
}
.erb-path__desc{ font-size:var(--t-md); color:var(--ink-soft); margin:var(--s-2) 0 0; max-width:52ch; }
.erb-path__go{
  font-size:var(--t-md); font-weight:var(--w-semi); color:var(--cobalt);
  white-space:nowrap; display:inline-flex; align-items:center; gap:var(--s-2);
  transition:gap var(--dur-micro) var(--ease);
}
.erb-path:hover .erb-path__go{ gap:var(--s-3); }

/* --- Exam season band ----------------------------------------------------- */
.erb-season__facts{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--s-5) var(--col-gap); margin-top:var(--s-6); }
.erb-season__fact{ max-width:30ch; }
.erb-season__fact dt{
  font-size:var(--t-xs); letter-spacing:var(--tr-caps); text-transform:uppercase;
  color:var(--gold-bright); margin-bottom:var(--s-2);
}
.erb-season__fact dd{ margin:0; font-size:var(--t-md); color:var(--on-ink-soft); }

/* --- The four-step system ------------------------------------------------- */
.erb-steps{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:var(--col-gap);
  margin-top:var(--s-6); list-style:none; padding-left:0; }
.erb-step{ border-top:2px solid var(--ink); padding-top:var(--s-4); }
.erb-step__stage{
  font-size:var(--t-xs); font-weight:var(--w-bold); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--cobalt); margin:0 0 var(--s-2);
}
.erb-step__thing{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:0 0 var(--s-2); }
.erb-step__desc{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }
.erb-step:last-child{ border-top-color:var(--gold); }
.erb-step:last-child .erb-step__stage{ color:var(--gold-ink); }

/* --- Featured offers ------------------------------------------------------ */
.erb-featured{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.erb-offer{ display:flex; flex-direction:column; gap:var(--s-3);
  border:var(--rule); border-left-width:var(--bar); border-left-style:solid;
  border-left-color:var(--paper-rule); padding:var(--s-5); }
.erb-offer--free{ border-left-color:var(--cobalt); }
.erb-offer--premium{ border-left-color:var(--gold); }
.erb-offer--service{ border-left-color:var(--ink); }
.erb-offer__meta{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); margin:0; }
.erb-offer__title{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:0; }
.erb-offer__desc{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }
.erb-offer__foot{ margin-top:auto; padding-top:var(--s-4); border-top:var(--hair);
  display:flex; align-items:center; justify-content:space-between; gap:var(--s-3);
  flex-wrap:wrap; }

/* --- Proof / open practice ------------------------------------------------ */
.erb-proof{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s-5) var(--col-gap); margin-top:var(--s-6); }
.erb-proof__item{ border-top:var(--rule); padding-top:var(--s-4); }
.erb-proof__item h3{ font-family:var(--font-body); font-size:var(--t-h4);
  font-weight:var(--w-semi); margin:0 0 var(--s-2); }
.erb-proof__item p{ font-size:var(--t-md); color:var(--ink-soft); margin:0; max-width:46ch; }

/* --- Human story ---------------------------------------------------------- */
.erb-story__grid{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(32px,5vw,64px); align-items:start; }

/* --- Closing CTA ---------------------------------------------------------- */
.erb-close{ text-align:center; }
.erb-close__inner{ max-width:44ch; margin-inline:auto; }
.erb-close__inner .erb-lead{ margin-inline:auto; }
.erb-close__actions{ display:flex; flex-wrap:wrap; gap:var(--s-3);
  justify-content:center; margin-top:var(--s-6); }

/* --- WhatsApp glyph ------------------------------------------------------- */
.erb-wa{ width:18px; height:18px; flex:none; fill:currentColor; }

/* =============================================================================
   10b · MOBILE OVERRIDES for page blocks
   ========================================================================== */
@media (max-width:1024px){
  .erb-steps{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .erb-foot__grid{ grid-template-columns:1fr 1fr; }
}
@media (max-width:900px){
  .erb-season__facts{ grid-template-columns:1fr; }
  .erb-hero__grid{ grid-template-columns:1fr; }
  .erb-hero__promise{ max-width:20ch; }
  .erb-story__grid{ grid-template-columns:1fr; }
  .erb-featured{ grid-template-columns:1fr; }
}
@media (max-width:820px){
  .erb-nav__links{ display:none; }
  .erb-nav__toggle{ display:inline-flex; }
  /* Three items must fit one line at 375px: brand, Start here, Menu. */
  .erb-nav{ gap:var(--s-3); }
  .erb-nav__toggle{ margin-left:0; }
}
@media (max-width:520px){
  /* The locality mark is the first thing to go — the wordmark carries it. */
  .erb-brand__mark{ display:none; }
  .erb-nav__start{ padding-inline:14px; }
}
@media (max-width:430px){
  /* Icon-only menu button. Its accessible name comes from aria-label,
     so the control is still announced correctly. */
  .erb-nav__toggle [data-nav-label]{
    position:absolute; width:1px; height:1px; overflow:hidden;
    clip:rect(0 0 0 0); white-space:nowrap;
  }
  .erb-nav__toggle{ padding-inline:12px; }
  .erb-brand__name{ font-size:var(--t-base); }
}
@media (max-width:720px){
  .erb-steps{ grid-template-columns:1fr; }
  .erb-proof{ grid-template-columns:1fr; }
  .erb-foot__grid{ grid-template-columns:1fr; gap:var(--s-6); }
  .erb-path{ grid-template-columns:1fr; align-items:start; }
  .erb-path:hover{ padding-left:0; }
  .erb-hero__actions .erb-btn{ width:100%; }
  .erb-close__actions .erb-btn{ width:100%; }
}

/* =============================================================================
   12 · PAGE BLOCKS — STUDY MATERIALS
   ========================================================================== */

/* --- Step 1: the three-way choice ---------------------------------------- */
.erb-types{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.erb-type{
  display:flex; flex-direction:column; gap:var(--s-3); text-align:left;
  padding:var(--s-5); background:transparent; cursor:pointer;
  border:var(--rule); border-left:var(--bar) solid var(--paper-rule);
  border-radius:var(--r-0); color:inherit; font:inherit;
  transition:border-color var(--dur-micro) var(--ease),
             background var(--dur-micro) var(--ease);
}
.erb-type:hover{ background:var(--paper-sunk); }
.erb-type[aria-pressed="true"]{ border-color:var(--ink); background:var(--paper-sunk); }
.erb-type--free{ border-left-color:var(--cobalt); }
.erb-type--booklet{ border-left-color:var(--gold); }
.erb-type--examfile{ border-left-color:var(--ink); }
.erb-type__name{ font-family:var(--font-display); font-size:var(--t-h3);
  font-weight:var(--w-book); line-height:var(--lh-head); margin:0; }
.erb-type__eq{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--cobalt); margin:0; }
.erb-type--booklet .erb-type__eq{ color:var(--gold-ink); }
.erb-type--examfile .erb-type__eq{ color:var(--ink-soft); }
.erb-type__desc{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }
.erb-type__count{ font-size:var(--t-sm); color:var(--ink-faint); margin:auto 0 0;
  padding-top:var(--s-3); border-top:var(--hair); }

/* --- Step 2/3: filters ---------------------------------------------------- */
.erb-filters{ margin-top:var(--s-7); }
.erb-filter{ padding-block:var(--s-4); border-top:var(--hair); }
.erb-filter__label{
  font-size:var(--t-xs); font-weight:var(--w-semi); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink-soft); margin:0 0 var(--s-3);
}
.erb-filter__set{ display:flex; flex-wrap:wrap; gap:var(--s-2); }
.erb-chip[hidden]{ display:none; }

/* Steps that are not yet reachable are dimmed, not removed — the reader can
   see what the next decision will be. */
.erb-filter[data-state="waiting"]{ opacity:.45; }
.erb-filter[data-state="waiting"] .erb-chip{ pointer-events:none; }

.erb-results{ margin-top:var(--s-7); }
.erb-results__head{
  display:flex; flex-wrap:wrap; align-items:baseline; justify-content:space-between;
  gap:var(--s-3); padding-bottom:var(--s-4); border-bottom:2px solid var(--ink);
}
.erb-results__count{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }
.erb-results__reset{ font-size:var(--t-md); }

/* Before a choice is made, JS sets this and the 51 items stay out of the way.
   Without JS the attribute is never set, so the full catalogue is readable. */
.erb-results[data-empty="true"] .erb-res{ display:none; }
.erb-prompt{ padding:var(--s-7) 0; border-bottom:var(--hair); }
.erb-prompt p{ font-family:var(--font-display); font-size:var(--t-h4);
  color:var(--ink-faint); margin:0; }

/* --- The reusable resource component -------------------------------------- */
.erb-res{
  display:grid; grid-template-columns:minmax(0,1fr) minmax(210px,244px);
  gap:var(--s-4) var(--s-6); align-items:start;
  padding:var(--s-5) 0; border-bottom:var(--hair);
}
.erb-res[hidden]{ display:none; }
.erb-res__meta{
  font-size:var(--t-xs); letter-spacing:var(--tr-wide); text-transform:uppercase;
  color:var(--ink-faint); margin:0 0 var(--s-2);
}
.erb-res__title{
  font-family:var(--font-display); font-size:var(--t-h4); font-weight:var(--w-med);
  line-height:var(--lh-snug); margin:0 0 var(--s-2);
}
.erb-res__purpose{ font-size:var(--t-md); color:var(--ink-soft); margin:0 0 var(--s-4);
  max-width:56ch; }
.erb-res__inc-label{
  font-size:var(--t-2xs); font-weight:var(--w-bold); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink-faint); margin:0 0 var(--s-2);
}
.erb-res__inc{ list-style:none; margin:0; padding:0;
  display:flex; flex-wrap:wrap; gap:var(--s-2) var(--s-4); }
.erb-res__inc li{ font-size:var(--t-md); color:var(--ink); position:relative;
  padding-left:14px; }
.erb-res__inc li::before{ content:""; position:absolute; left:0; top:.62em;
  width:6px; height:1px; background:var(--paper-rule); }
.erb-res__side{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--s-3); }
.erb-res__price{ font-size:var(--t-h4); font-weight:var(--w-bold);
  font-variant-numeric:tabular-nums; margin:0; letter-spacing:-0.01em; }
.erb-res__price--free{ color:var(--cobalt); }
.erb-res__unit{ display:block; font-size:var(--t-sm); font-weight:var(--w-med);
  color:var(--ink-faint); letter-spacing:0; }
.erb-res__note{ font-size:var(--t-sm); color:var(--ink-faint); margin:0; }
.erb-res__side .erb-btn{ width:100%; }
/* A free resource reads as free: cobalt bar, never a gold premium frame. */
.erb-res--free{ border-left:var(--bar) solid var(--cobalt); padding-left:var(--s-4); }
.erb-res--booklet{ border-left:var(--bar) solid var(--gold); padding-left:var(--s-4); }
.erb-res--examfile{ border-left:var(--bar) solid var(--ink); padding-left:var(--s-4); }

/* --- Buying rules, stated once (flags F-22, F-23) ------------------------- */
.erb-rules{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s-5) var(--col-gap); margin-top:var(--s-6); }
.erb-rules__item{ border-top:var(--rule); padding-top:var(--s-4); }
.erb-rules__item h3{ font-family:var(--font-body); font-size:var(--t-h4);
  font-weight:var(--w-semi); margin:0 0 var(--s-2); }
.erb-rules__item p{ font-size:var(--t-md); color:var(--ink-soft); margin:0; max-width:46ch; }

/* =============================================================================
   13 · PAGE BLOCKS — PREDICTIONS
   ========================================================================== */

/* --- Disclaimer: present early, sized quietly ---------------------------- */
.erb-disclaimer{
  border:var(--rule); border-left:var(--bar) solid var(--red);
  padding:var(--s-4) var(--s-5); margin-top:var(--s-6); background:var(--paper-sunk);
}
.erb-disclaimer h2{
  font-family:var(--font-body); font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:#A32C22;
  margin:0 0 var(--s-2);
}
.erb-disclaimer p{ font-size:var(--t-sm); line-height:var(--lh-snug);
  color:var(--ink-soft); margin:0; max-width:80ch; }

/* --- The free lead panel: the most prominent thing in its section --------- */
.erb-freelead{
  border:2px solid var(--cobalt); border-radius:var(--r-0);
  padding:clamp(24px,3.5vw,40px); margin-top:var(--s-6);
  background:var(--cobalt-wash);
}
.erb-freelead__top{ display:flex; flex-wrap:wrap; align-items:center;
  gap:var(--s-3); margin-bottom:var(--s-4); }
.erb-freelead__title{ font-family:var(--font-display); font-size:var(--t-h2);
  font-weight:var(--w-book); line-height:var(--lh-head); margin:0 0 var(--s-3);
  letter-spacing:var(--tr-tight); }
.erb-freelead__desc{ font-size:var(--t-base); color:var(--ink); margin:0;
  max-width:64ch; }
.erb-freelead__spec{ font-size:var(--t-sm); color:var(--cobalt-deep);
  font-weight:var(--w-semi); letter-spacing:var(--tr-wide);
  text-transform:uppercase; margin:0; }
.erb-freelead__list{ list-style:none; margin:var(--s-5) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--s-2) var(--s-5); }
.erb-freelead__list li{ font-size:var(--t-md); position:relative; padding-left:18px; }
.erb-freelead__list li::before{ content:""; position:absolute; left:0; top:.6em;
  width:9px; height:1px; background:var(--cobalt); }
.erb-freelead__foot{ display:flex; flex-wrap:wrap; align-items:center;
  gap:var(--s-3) var(--s-5); margin-top:var(--s-6);
  padding-top:var(--s-5); border-top:1px solid #C9D3F7; }
.erb-freelead__note{ font-size:var(--t-sm); color:var(--ink-soft); margin:0; }

/* --- Two-panel explainer -------------------------------------------------- */
.erb-explain{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.erb-explain__panel{ border-top:2px solid var(--ink); padding-top:var(--s-4); }
.erb-explain__panel--file{ border-top-color:var(--cobalt); }
.erb-explain__panel--booklet{ border-top-color:var(--gold); }
.erb-explain__eq{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:0 0 var(--s-3); }
.erb-explain__panel p{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }

/* --- Process strip: LEARN → TARGET → PRACTISE → PERFORM ------------------- */
.erb-process{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--s-3);
  margin-top:var(--s-6); padding:var(--s-4) 0;
  border-top:var(--hair); border-bottom:var(--hair); list-style:none; }
.erb-process li{ display:flex; align-items:baseline; gap:var(--s-3); }
.erb-process__stage{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--ink); }
.erb-process__thing{ font-size:var(--t-sm); color:var(--ink-faint); }
.erb-process__arrow{ color:var(--paper-rule); }

/* --- Paid product cards --------------------------------------------------- */
.erb-paid{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); align-items:stretch; }
.erb-paid__card{ display:flex; flex-direction:column; gap:var(--s-3);
  border:var(--rule); padding:var(--s-5); }
.erb-paid__card--best{ border-color:var(--gold); border-top:var(--bar) solid var(--gold); }
.erb-paid__sub{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); margin:0; }
.erb-paid__title{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:0; }
.erb-paid__desc{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }
.erb-paid__inc{ list-style:none; margin:0; padding:0; }
.erb-paid__inc li{ font-size:var(--t-md); padding:var(--s-2) 0;
  border-bottom:var(--hair); }
.erb-paid__foot{ margin-top:auto; padding-top:var(--s-4); border-top:var(--hair);
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--s-3); flex-wrap:wrap; }

/* =============================================================================
   MOBILE — materials + predictions
   ========================================================================== */
@media (max-width:1024px){
  .erb-types{ grid-template-columns:1fr; }
  .erb-paid{ grid-template-columns:1fr; }
}
@media (max-width:900px){
  .erb-res{ grid-template-columns:1fr; }
  .erb-res__side{ flex-direction:row; flex-wrap:wrap; align-items:center; }
  .erb-res__side .erb-btn{ width:auto; }
  .erb-res__note{ flex-basis:100%; }
  .erb-explain{ grid-template-columns:1fr; }
  .erb-rules{ grid-template-columns:1fr; }
  .erb-freelead__list{ grid-template-columns:1fr; }
}
@media (max-width:720px){
  .erb-process{ flex-direction:column; align-items:flex-start; gap:var(--s-2); }
  .erb-process__arrow{ display:none; }
}

/* Anchored sections must not slide under the sticky header. */
:where([id]){ scroll-margin-top:88px; }
@media (max-width:820px){ :where([id]){ scroll-margin-top:76px; } }

/* --- Dark-ground variants, so a dark section needs no inline overrides ---- */
.erb-ink .erb-freelead{ background:var(--ink-raised); border-color:var(--gold-bright); }
.erb-ink .erb-freelead__title{ color:var(--on-ink); }
.erb-ink .erb-freelead__desc{ color:var(--on-ink-soft); }
.erb-ink .erb-freelead__spec{ color:var(--gold-bright); }
.erb-ink .erb-freelead__foot{ border-top-color:var(--ink-rule); }
.erb-ink .erb-freelead__note{ color:var(--on-ink-soft); }
.erb-ink .erb-freelead__list li::before{ background:var(--gold-bright); }

.erb-ink .erb-paid__card{ background:var(--ink-raised); border-color:var(--ink-rule); }
.erb-ink .erb-paid__inc li{ border-bottom-color:var(--ink-rule); }
.erb-ink .erb-paid__foot{ border-top-color:var(--ink-rule); }
.erb-ink .erb-paid__desc{ color:var(--on-ink-soft); }
.erb-ink .erb-paid__sub{ color:var(--on-ink-soft); }

.erb-ink .erb-disclaimer{ background:var(--ink-raised); border-color:var(--ink-rule);
  border-left-color:var(--gold-bright); }
.erb-ink .erb-disclaimer h2{ color:var(--gold-bright); }
.erb-ink .erb-disclaimer p{ color:var(--on-ink-soft); }

.erb-ink .erb-process{ border-color:var(--ink-rule); }
.erb-ink .erb-process__stage{ color:var(--on-ink); }
.erb-ink .erb-process__thing{ color:var(--on-ink-soft); }
.erb-ink .erb-process__arrow{ color:var(--ink-rule); }
.erb-ink .erb-explain__panel{ border-top-color:var(--on-ink-soft); }
.erb-ink .erb-explain__panel p{ color:var(--on-ink-soft); }
.erb-ink .erb-res__purpose{ color:var(--on-ink-soft); }

/* Two-up product layout, for a section with one detail panel and one buy panel */
.erb-paid--2up{ grid-template-columns:minmax(0,1.4fr) minmax(0,1fr); }
@media (max-width:1024px){ .erb-paid--2up{ grid-template-columns:1fr; } }

/* Section-internal heading rhythm */
.erb-mt-8{ margin-top:var(--s-8); }
.erb-measure-head{ max-width:20ch; }

/* =============================================================================
   14 · AD ASTRA
   The one page where gold leads rather than accents. Everything else stays on
   the ERB Academy tokens, so the book reads as an authored product inside the
   academy rather than a second brand. (Resolves flag F-8.)
   ========================================================================== */
.aa{
  /* CONTENT colours, not brand colours. These two exist only because the book's
     own status system uses four marks. Scoped here; never used elsewhere. */
  --aa-amber:#C98A1E;
  --aa-green:#2E7D5B;
}

/* --- Cover / hero --------------------------------------------------------- */
.aa-hero{ padding-block:clamp(48px,7vw,112px) clamp(48px,7vw,96px); }
.aa-hero__grid{
  display:grid; grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);
  gap:clamp(36px,6vw,88px); align-items:center;
}
.aa-hero__imprint{
  font-size:var(--t-xs); font-weight:var(--w-semi); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--gold-bright); margin:0 0 var(--s-5);
}
.aa-title{
  font-family:var(--font-display); font-weight:var(--w-light);
  font-size:clamp(3rem, 2rem + 5.4vw, 6rem); line-height:.95;
  letter-spacing:.06em; margin:0; color:var(--on-ink);
}
.aa-hero__rule{ width:120px; height:2px; background:var(--gold-bright);
  border:0; margin:var(--s-5) 0; }
.aa-hero__toline{
  font-family:var(--font-display); font-style:italic; font-weight:var(--w-light);
  font-size:var(--t-h3); color:var(--gold-bright); margin:0 0 var(--s-4);
}
.aa-hero__sub{ font-size:var(--t-lead); line-height:var(--lh-snug);
  color:var(--on-ink-soft); max-width:34ch; margin:0; }
.aa-hero__by{
  margin-top:var(--s-6); padding-top:var(--s-4); border-top:1px solid var(--ink-rule);
  font-size:var(--t-md); color:var(--on-ink-soft);
}
.aa-hero__by strong{ color:var(--on-ink); font-weight:var(--w-semi); }
.aa-hero__actions{ display:flex; flex-wrap:wrap; gap:var(--s-3); margin-top:var(--s-6); }
.aa-cover{ margin:0; }
.aa-cover img{ width:100%; height:auto; display:block;
  box-shadow:0 40px 80px -40px rgba(0,0,0,.85), 0 2px 0 rgba(216,162,59,.25); }

/* --- The hook: one line, nothing else ------------------------------------- */
.aa-hook{ text-align:center; padding-block:clamp(56px,8vw,120px); }
.aa-hook__rule{ width:100%; max-width:340px; height:1px; background:var(--gold-bright);
  border:0; margin-inline:auto; opacity:.6; }
.aa-hook__line{
  font-family:var(--font-display); font-weight:var(--w-light); font-style:italic;
  font-size:clamp(1.75rem, 1.2rem + 2.6vw, 3.25rem); line-height:1.18;
  letter-spacing:var(--tr-tight); max-width:20ch;
  margin:clamp(28px,4vw,52px) auto; color:var(--on-ink);
}

/* --- Spread figure -------------------------------------------------------- */
.aa-spread{ margin:0; }
.aa-spread img{ width:100%; height:auto; border:1px solid var(--ink-rule); }
.aa-spread figcaption{ margin-top:var(--s-3); font-size:var(--t-sm);
  color:var(--on-ink-soft); }

/* --- The AD ASTRA 6 ------------------------------------------------------- */
.aa-six{ list-style:none; margin:var(--s-6) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(6,minmax(0,1fr)); gap:var(--s-4); }
.aa-six li{ border-top:2px solid var(--gold-bright); padding-top:var(--s-3); }
.aa-six__no{ font-family:var(--font-display); font-size:var(--t-h4);
  color:var(--gold-bright); display:block; line-height:1; margin-bottom:var(--s-2); }
.aa-six__name{ font-family:var(--font-body); font-size:var(--t-md);
  font-weight:var(--w-semi); display:block; margin-bottom:var(--s-2); }
.aa-six__what{ font-size:var(--t-sm); color:var(--ink-soft); margin:0; }
.erb-ink .aa-six__what{ color:var(--on-ink-soft); }

/* --- Status system -------------------------------------------------------- */
.aa-status{ list-style:none; margin:var(--s-6) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:var(--s-4); }
.aa-status li{ padding-top:var(--s-3); border-top:var(--bar) solid currentColor; }
.aa-status__name{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; display:block;
  margin-bottom:var(--s-2); }
.aa-status__what{ font-size:var(--t-md); color:var(--ink); margin:0; }
.erb-ink .aa-status__what{ color:var(--on-ink); }
.aa-status--red{ color:var(--red); }
.aa-status--amber{ color:var(--aa-amber); }
.aa-status--green{ color:var(--aa-green); }
.aa-status--gold{ color:var(--gold-bright); }

/* --- Systems (the 17 features, grouped into five) ------------------------- */
.aa-system{
  display:grid; grid-template-columns:minmax(0,7.5rem) minmax(0,1fr) minmax(0,1fr);
  gap:var(--s-4) var(--col-gap); align-items:start;
  padding:var(--s-7) 0; border-top:var(--rule);
}
.aa-system__no{ font-family:var(--font-display); font-size:var(--t-h2);
  font-weight:var(--w-light); color:var(--gold-ink); line-height:1; margin:0; }
.aa-system__name{ font-family:var(--font-display); font-size:var(--t-h3);
  font-weight:var(--w-book); line-height:var(--lh-head); margin:0 0 var(--s-3); }
.aa-system__lede{ font-size:var(--t-md); color:var(--ink-soft); margin:0; max-width:44ch; }
.aa-system__parts{ list-style:none; margin:0; padding:0; }
.aa-system__parts li{ padding:var(--s-3) 0; border-bottom:var(--hair); font-size:var(--t-md); }
.aa-system__parts li:first-child{ padding-top:0; }
.aa-system__parts b{ font-weight:var(--w-semi); }
.aa-system__parts span{ display:block; color:var(--ink-soft); font-size:var(--t-sm);
  margin-top:2px; }

/* --- 60-day journey ------------------------------------------------------- */
.aa-journey{ margin-top:var(--s-6); }
.aa-journey__track{
  position:relative; height:var(--bar); background:var(--ink-rule);
  margin:var(--s-7) 0 var(--s-5);
  background-image:linear-gradient(90deg,var(--ink-rule),var(--gold-bright));
}
.aa-journey__marks{ display:flex; justify-content:space-between;
  list-style:none; margin:0; padding:0; }
.aa-journey__marks li{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--on-ink-soft); }
.aa-journey__marks li:last-child{ color:var(--gold-bright); font-weight:var(--w-bold); }
.aa-journey__cols{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.aa-journey__cols h3{ font-family:var(--font-body); font-size:var(--t-h4);
  font-weight:var(--w-semi); margin:0 0 var(--s-2); color:var(--on-ink); }
.aa-journey__cols p{ font-size:var(--t-md); color:var(--on-ink-soft); margin:0; }

/* --- Principles ----------------------------------------------------------- */
.aa-principles{ margin-top:var(--s-6); }
.aa-principle{
  display:grid; grid-template-columns:minmax(0,9rem) minmax(0,1fr);
  gap:var(--s-3) var(--col-gap); align-items:baseline;
  padding:var(--s-5) 0 var(--s-5) var(--s-5);
  border-left:var(--bar) solid var(--gold);
  border-bottom:var(--hair);
}
.aa-principle:nth-child(even){ background:var(--paper-sunk); }
.erb-ink .aa-principle:nth-child(even){ background:var(--ink-raised); }
.erb-ink .aa-principle{ border-left-color:var(--gold-bright); border-bottom-color:var(--ink-rule); }
.aa-principle__no{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--gold-ink); margin:0; }
.erb-ink .aa-principle__no{ color:var(--gold-bright); }
.aa-principle__text{
  font-family:var(--font-display); font-style:italic; font-weight:var(--w-light);
  font-size:var(--t-h3); line-height:1.28; margin:0; letter-spacing:var(--tr-tight);
}

/* --- What you receive: a colophon, not a feature list --------------------- */
.aa-colophon{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0 var(--col-gap); margin-top:var(--s-6); }
.aa-colophon div{ display:grid; grid-template-columns:minmax(0,10rem) minmax(0,1fr);
  gap:var(--s-4); padding:var(--s-3) 0; border-bottom:var(--hair); }
.aa-colophon dt{ font-size:var(--t-xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); }
.aa-colophon dd{ margin:0; font-size:var(--t-md); }

/* --- Offer ---------------------------------------------------------------- */
.aa-offer{ text-align:center; }
.aa-offer__price{
  font-family:var(--font-display); font-weight:var(--w-light);
  font-size:clamp(3.5rem, 2.4rem + 5vw, 6.5rem); line-height:1;
  color:var(--gold-bright); margin:var(--s-5) 0 0; letter-spacing:var(--tr-tight);
}
.aa-offer__unit{ display:block; font-family:var(--font-body); font-size:var(--t-sm);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--on-ink-soft);
  margin-top:var(--s-3); }
.aa-offer__bonus{
  max-width:52ch; margin:var(--s-7) auto 0; padding:var(--s-5);
  border:1px solid var(--gold-bright);
}
.aa-offer__bonus h3{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--gold-bright);
  margin:0 0 var(--s-3); }
.aa-offer__bonus p{ font-size:var(--t-md); color:var(--on-ink); margin:0; }
.aa-offer__when{ max-width:56ch; margin:var(--s-6) auto 0;
  font-size:var(--t-md); color:var(--on-ink-soft); }

/* --- Final CTA ------------------------------------------------------------ */
.aa-final{ text-align:center; }
.aa-final__head{
  font-family:var(--font-display); font-weight:var(--w-light);
  font-size:clamp(2.25rem, 1.6rem + 3vw, 4rem); line-height:1.08;
  letter-spacing:var(--tr-tight); margin:0; color:var(--on-ink);
}
.aa-final__sub{ max-width:44ch; margin:var(--s-5) auto 0;
  font-size:var(--t-lead); color:var(--on-ink-soft); }
.aa-final__site{ font-size:var(--t-xs); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--on-ink-soft); margin-top:var(--s-6); }
.aa-final__sign{ font-family:var(--font-display); font-style:italic;
  font-size:var(--t-h3); color:var(--gold-bright); margin-top:var(--s-5); }

/* --- Mobile --------------------------------------------------------------- */
@media (max-width:1024px){
  .aa-six{ grid-template-columns:repeat(3,minmax(0,1fr)); }
  .aa-system{ grid-template-columns:minmax(0,5rem) minmax(0,1fr); }
  .aa-system__parts{ grid-column:1 / -1; }
  .aa-journey__cols{ grid-template-columns:1fr; }
}
@media (max-width:900px){
  .aa-hero__grid{ grid-template-columns:1fr; }
  .aa-cover{ max-width:340px; }
  .aa-status{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .aa-colophon{ grid-template-columns:1fr; }
}
@media (max-width:720px){
  .aa-six{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .aa-system{ grid-template-columns:1fr; gap:var(--s-4); }
  .aa-system__no{ font-size:var(--t-h3); }
  .aa-principle{ grid-template-columns:1fr; gap:var(--s-2); padding-left:var(--s-4); }
  .aa-colophon div{ grid-template-columns:1fr; gap:var(--s-1); }
  .aa-hero__actions .erb-btn{ width:100%; }
  .aa-journey__marks li:nth-child(even){ display:none; }
}

/* Caption on a dark ground */
.erb-ink .erb-caption{ color:var(--on-ink-soft); }

/* =============================================================================
   15 · CLASSES — the single programme journey
   Eight questions, in order, on one page. A parent should never have to open a
   second page to understand what the thing is, when it runs and how to pay.
   ========================================================================== */

/* --- On this page: a contents list, as a manual has ---------------------- */
.cl-contents{ margin-top:var(--s-6); border-top:2px solid var(--ink); }
.cl-contents ol{ list-style:none; margin:0; padding:0;
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:0 var(--col-gap); }
.cl-contents li{ border-bottom:var(--hair); }
.cl-contents a{
  display:grid; grid-template-columns:2.25rem minmax(0,1fr); gap:var(--s-3);
  align-items:baseline; padding:var(--s-3) 0;
  text-decoration:none; color:var(--ink); font-size:var(--t-md);
  transition:color var(--dur-micro) var(--ease);
}
.cl-contents a:hover{ color:var(--cobalt); }
.cl-contents span{ font-family:var(--font-display); color:var(--ink-faint);
  font-variant-numeric:tabular-nums; }

/* --- Available programmes ------------------------------------------------ */
.cl-offer{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.cl-offer__item{ border-top:2px solid var(--ink); padding-top:var(--s-4); }
.cl-offer__level{ font-family:var(--font-display); font-size:var(--t-h3);
  font-weight:var(--w-book); margin:0 0 var(--s-2); }
.cl-offer__for{ font-size:var(--t-sm); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--cobalt); margin:0 0 var(--s-3); }
.cl-offer__subjects{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }

/* --- What's included ------------------------------------------------------ */
.cl-included{ list-style:none; margin:var(--s-6) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:0 var(--col-gap); }
.cl-included li{ padding:var(--s-3) 0; border-bottom:var(--hair);
  font-size:var(--t-md); position:relative; padding-left:20px; }
.cl-included li::before{ content:""; position:absolute; left:0; top:1.35em;
  width:10px; height:1px; background:var(--cobalt); }

/* --- The hour ------------------------------------------------------------- */
.cl-hour{ list-style:none; margin:var(--s-6) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:var(--s-4); }
.cl-hour li{ border-top:2px solid var(--paper-rule); padding-top:var(--s-3); }
.cl-hour__min{ font-family:var(--font-body); font-size:var(--t-xs);
  font-weight:var(--w-bold); letter-spacing:var(--tr-wide); color:var(--cobalt);
  font-variant-numeric:tabular-nums; display:block; margin-bottom:var(--s-2); }
.cl-hour__what{ font-size:var(--t-md); margin:0; }

/* --- Video coverage ------------------------------------------------------- */
.cl-cov{ margin-top:var(--s-5); }
.cl-cov__row{
  display:grid; grid-template-columns:minmax(0,13rem) minmax(0,9rem) minmax(0,1fr);
  gap:var(--s-2) var(--s-4); padding:var(--s-3) 0; border-bottom:var(--hair);
  align-items:baseline;
}
.cl-cov__subject{ font-weight:var(--w-semi); font-size:var(--t-md); }
.cl-cov__status{ font-size:var(--t-2xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; }
.cl-cov__status--complete{ color:var(--aa-green, #2E7D5B); }
.cl-cov__status--most{ color:var(--cobalt); }
.cl-cov__status--partial{ color:var(--gold); }
.cl-cov__status--live{ color:var(--ink-faint); }
.cl-cov__note{ font-size:var(--t-md); color:var(--ink-soft); }
.cl-cov__head{ border-bottom:2px solid var(--ink); padding-bottom:var(--s-3);
  font-size:var(--t-xs); letter-spacing:var(--tr-caps); text-transform:uppercase;
  color:var(--ink-soft); }

/* --- TIMETABLE
   Grouped by day, never a wide table. At 375px this reads top to bottom with
   no horizontal scrolling; on a wide screen the five days sit side by side.
   -------------------------------------------------------------------------- */
.cl-week{ display:grid; grid-template-columns:repeat(5,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.cl-day{ border-top:2px solid var(--ink); }
.cl-day__name{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:var(--s-3) 0 var(--s-1); }
.cl-day__level{ font-size:var(--t-2xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--ink-faint);
  margin:0 0 var(--s-3); }
.cl-day__list{ list-style:none; margin:0; padding:0; }
.cl-day__list li{ padding:var(--s-3) 0; border-top:var(--hair); }
.cl-slot__time{ display:block; font-size:var(--t-sm); font-weight:var(--w-semi);
  font-variant-numeric:tabular-nums; color:var(--cobalt); white-space:nowrap; }
.cl-slot__subject{ display:block; font-size:var(--t-md); margin-top:2px; }
.cl-slot__tag{ font-size:var(--t-2xs); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-faint); }

/* --- Pricing -------------------------------------------------------------- */
.cl-prices{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.cl-price{ border:var(--rule); border-top:var(--bar) solid var(--ink);
  padding:var(--s-5); display:flex; flex-direction:column; gap:var(--s-3); }
.cl-price__level{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:0; }
.cl-price__opt{ display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--s-3); padding:var(--s-3) 0; border-bottom:var(--hair); }
.cl-price__opt:last-of-type{ border-bottom:0; }
.cl-price__what{ font-size:var(--t-md); color:var(--ink-soft); }
.cl-price__fig{ font-size:var(--t-h4); font-weight:var(--w-bold);
  font-variant-numeric:tabular-nums; white-space:nowrap; }
.cl-price__unit{ display:block; font-size:var(--t-sm); font-weight:var(--w-med);
  color:var(--ink-faint); text-align:right; }
.cl-price__note{ font-size:var(--t-sm); color:var(--ink-faint); margin:auto 0 0;
  padding-top:var(--s-3); border-top:var(--hair); }

/* --- Numbered process (register, pay, access) ---------------------------- */
.cl-steps{ list-style:none; counter-reset:step; margin:var(--s-6) 0 0; padding:0; }
.cl-steps li{
  counter-increment:step;
  display:grid; grid-template-columns:3rem minmax(0,1fr); gap:var(--s-4);
  padding:var(--s-5) 0; border-top:var(--hair); align-items:start;
}
.cl-steps li::before{
  content:counter(step); font-family:var(--font-display); font-size:var(--t-h3);
  font-weight:var(--w-light); color:var(--gold-ink); line-height:1;
}
.cl-steps h3{ font-family:var(--font-body); font-size:var(--t-h4);
  font-weight:var(--w-semi); margin:0 0 var(--s-2); }
.cl-steps p{ font-size:var(--t-md); color:var(--ink-soft); margin:0; max-width:60ch; }
.erb-ink .cl-steps li{ border-top-color:var(--ink-rule); }
.erb-ink .cl-steps p{ color:var(--on-ink-soft); }
.erb-ink .cl-steps li::before{ color:var(--gold-bright); }

/* --- The access chain ----------------------------------------------------- */
.cl-chain{ list-style:none; display:flex; flex-wrap:wrap; align-items:center;
  gap:var(--s-2) var(--s-3); margin:var(--s-6) 0 0; padding:var(--s-4) 0;
  border-top:var(--hair); border-bottom:var(--hair); }
.cl-chain li{ font-size:var(--t-sm); letter-spacing:var(--tr-wide);
  text-transform:uppercase; color:var(--ink-soft); }
.cl-chain li[aria-hidden]{ color:var(--paper-rule); }
.cl-chain li:last-child{ color:var(--cobalt); font-weight:var(--w-bold); }
.erb-ink .cl-chain{ border-color:var(--ink-rule); }
.erb-ink .cl-chain li{ color:var(--on-ink-soft); }
.erb-ink .cl-chain li:last-child{ color:var(--gold-bright); }

/* --- Parent block --------------------------------------------------------- */
.cl-parent{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s-5) var(--col-gap); margin-top:var(--s-6); }
.cl-parent__item{ border-top:var(--bar) solid var(--gold-bright); padding-top:var(--s-4); }
.cl-parent__item h3{ font-family:var(--font-body); font-size:var(--t-h4);
  font-weight:var(--w-semi); margin:0 0 var(--s-2); color:var(--on-ink); }
.cl-parent__item p{ font-size:var(--t-md); color:var(--on-ink-soft); margin:0;
  max-width:46ch; }

/* --- Mobile --------------------------------------------------------------- */
@media (max-width:1024px){
  .cl-week{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .cl-hour{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .cl-prices{ grid-template-columns:1fr; }
  .cl-offer{ grid-template-columns:1fr; }
}
@media (max-width:900px){
  .cl-cov__row{ grid-template-columns:minmax(0,1fr) minmax(0,7rem); }
  .cl-cov__note{ grid-column:1 / -1; }
  .cl-cov__head span:last-child{ display:none; }
}
@media (max-width:720px){
  .cl-contents ol{ grid-template-columns:1fr; }
  .cl-included{ grid-template-columns:1fr; }
  .cl-week{ grid-template-columns:1fr; }
  .cl-hour{ grid-template-columns:1fr; }
  .cl-parent{ grid-template-columns:1fr; }
  .cl-steps li{ grid-template-columns:2.25rem minmax(0,1fr); gap:var(--s-3); }
}

/* =============================================================================
   16 · PHASE 8 QA — DARK-GROUND CORRECTIONS
   Several components were built for a light ground and then used inside an
   .erb-ink section, where their light-ground colours fall below WCAG AA.
   Each override below restores a passing ratio on both --ink and --ink-raised.
   ========================================================================== */
.erb-ink .cl-hour__min{ color:var(--gold-bright); }            /* was cobalt · 2.24:1 */
.erb-ink .cl-hour li{ border-top-color:var(--ink-rule); }
.erb-ink .cl-cov__head{ border-bottom-color:var(--on-ink-soft); color:var(--on-ink-soft); }
.erb-ink .cl-cov__row{ border-bottom-color:var(--ink-rule); }
.erb-ink .cl-cov__subject{ color:var(--on-ink); }
.erb-ink .cl-cov__note{ color:var(--on-ink-soft); }            /* was ink-soft · 2.47:1 */
.erb-ink .cl-cov__status--complete{ color:#5B997F; }           /* 5.2:1 */
.erb-ink .cl-cov__status--most{ color:var(--cobalt-on-dark); } /* 5.1:1 */
.erb-ink .cl-cov__status--partial{ color:var(--gold-bright); }
.erb-ink .cl-cov__status--live{ color:var(--on-ink-soft); }
.erb-ink .cl-included li{ border-bottom-color:var(--ink-rule); }
.erb-ink .cl-included li::before{ background:var(--gold-bright); }
.erb-ink .erb-caption{ color:var(--on-ink-soft); }

/* AD ASTRA status marks, on a dark ground */
.erb-ink .aa-status--red{ color:var(--red-on-dark); }          /* was 3.24:1 */
.erb-ink .aa-status--green{ color:#5B997F; }                   /* was 3.45:1 */

/* The margin annotation is marking ink; on a dark ground it needs the
   dark-ground variant rather than the paper one. */
.erb-ink .erb-annot{ color:var(--red-on-dark); }

/* A single-column variant of the inclusion list, for narrow content columns. */
.cl-included--single{ grid-template-columns:1fr; }

/* =============================================================================
   17 · SEASON BANNER
   A dated promotional band. It carries data-expires so it removes itself once
   the series it names is over — flag F-9 was a stale campaign bar that sat on
   the old site for a month past its date. Never ship one of these without a
   date attached.
   ========================================================================== */
.erb-banner{ background:var(--ink); color:var(--on-ink); border-block:1px solid var(--ink-rule); }
.erb-banner[hidden]{ display:none; }
.erb-banner__inner{
  display:grid; grid-template-columns:auto minmax(0,1fr) auto;
  gap:var(--s-3) var(--s-5); align-items:center; padding-block:var(--s-5);
}
.erb-banner__tag{
  font-size:var(--t-2xs); font-weight:var(--w-bold); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink); background:var(--gold-bright);
  padding:5px 10px; border-radius:var(--r-1); white-space:nowrap;
}
.erb-banner__text{ margin:0; font-size:var(--t-md); color:var(--on-ink-soft); }
.erb-banner__text strong{
  display:block; font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); color:var(--on-ink); margin-bottom:2px;
}
.erb-banner__subjects{ color:var(--gold-bright); }
@media (max-width:820px){
  .erb-banner__inner{ grid-template-columns:1fr; }
  .erb-banner__inner .erb-btn{ width:100%; }
}

/* =============================================================================
   18 · BUNDLE ADD-ON
   A second price offered inside a product card. The struck-through figure is
   the item's own true retail price — never a higher "was" invented to make the
   saving look larger.
   ========================================================================== */
.erb-addon{
  border:1px dashed var(--paper-rule); border-radius:var(--r-1);
  padding:var(--s-3) var(--s-4); margin-top:var(--s-2);
}
.erb-addon__label{
  font-size:var(--t-2xs); font-weight:var(--w-bold); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink-faint); margin:0 0 var(--s-2);
}
.erb-addon__price{ display:flex; align-items:baseline; gap:var(--s-3); margin:0; }
.erb-addon__was{
  font-size:var(--t-md); color:var(--ink-faint); text-decoration:line-through;
  text-decoration-thickness:1px; font-variant-numeric:tabular-nums;
}
.erb-addon__now{
  font-size:var(--t-h4); font-weight:var(--w-bold); color:var(--cobalt);
  font-variant-numeric:tabular-nums; letter-spacing:-0.01em;
}
.erb-addon__cond{ font-size:var(--t-sm); color:var(--ink-soft); margin:var(--s-2) 0 0; }

.erb-ink .erb-addon{ border-color:var(--ink-rule); }
.erb-ink .erb-addon__label{ color:var(--on-ink-soft); }
.erb-ink .erb-addon__was{ color:var(--on-ink-soft); }
.erb-ink .erb-addon__now{ color:var(--gold-bright); }
.erb-ink .erb-addon__cond{ color:var(--on-ink-soft); }

/* The free-preview link sits under the buy row, so the free route is always
   visible without competing with the primary action. */
.erb-paid__free{ margin:var(--s-4) 0 0; }

/* The directional link had no dark-ground variant; cobalt on ink fails AA. */
.erb-ink .erb-link-arrow{ color:var(--gold-bright); border-bottom-color:var(--ink-rule); }
.erb-ink .erb-link-arrow:hover{ border-bottom-color:var(--gold-bright); }

/* Cards in a row have different content lengths. Letting the inclusion list
   absorb the slack keeps the add-on box and the price row aligned across the
   row instead of floating at three different heights. */
.erb-paid__card .erb-paid__inc{ margin-bottom:auto; }

.erb-ml-3{ margin-left:var(--s-3); }

/* =============================================================================
   19 · MASTER BOOKLET vs EXAM FILE
   A two-column comparison with matched rows, so the difference is read across
   rather than inferred from two paragraphs.
   ========================================================================== */
.erb-compare{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.erb-compare__col{ border-top:var(--bar) solid var(--paper-rule); padding-top:var(--s-4); }
.erb-compare__col--booklet{ border-top-color:var(--gold-bright); }
.erb-compare__col--file{ border-top-color:var(--cobalt-on-dark); }
.erb-compare__eq{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; margin:0 0 var(--s-2);
  color:var(--ink-faint); }
.erb-compare__col--booklet .erb-compare__eq{ color:var(--gold-bright); }
.erb-compare__col--file .erb-compare__eq{ color:var(--cobalt-on-dark); }
.erb-compare__one{ font-family:var(--font-display); font-size:var(--t-h3);
  font-weight:var(--w-book); line-height:var(--lh-head); margin:0 0 var(--s-4); }
.erb-compare__rows{ margin:0; }
.erb-compare__rows > div{ display:grid; grid-template-columns:minmax(0,6.5rem) minmax(0,1fr);
  gap:var(--s-3); padding:var(--s-3) 0; border-top:var(--hair); }
.erb-compare__rows dt{ font-size:var(--t-2xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--ink-faint); }
.erb-compare__rows dd{ margin:0; font-size:var(--t-md); }
.erb-ink .erb-compare__col{ border-top-color:var(--ink-rule); }
.erb-ink .erb-compare__rows > div{ border-top-color:var(--ink-rule); }
.erb-ink .erb-compare__rows dt{ color:var(--on-ink-soft); }
.erb-ink .erb-compare__rows dd{ color:var(--on-ink); }

/* =============================================================================
   20 · COMING SOON
   Deliberately plain: no cards, no prices, no buttons. Nothing here is for sale.
   ========================================================================== */
.erb-soon{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--col-gap); margin-top:var(--s-6); }
.erb-soon__col{ border-top:var(--rule); padding-top:var(--s-4); }
.erb-soon__level{ font-size:var(--t-xs); font-weight:var(--w-bold);
  letter-spacing:var(--tr-caps); text-transform:uppercase; color:var(--gold-ink);
  margin:0 0 var(--s-3); }
.erb-soon__list{ list-style:none; margin:0; padding:0; }
.erb-soon__list li{ font-size:var(--t-md); padding:var(--s-2) 0;
  border-bottom:var(--hair); color:var(--ink-soft); }

/* =============================================================================
   21 · HOW TO NAVIGATE THE MATERIALS
   ========================================================================== */
.erb-route{ list-style:none; counter-reset:route; margin:var(--s-6) 0 0; padding:0; }
.erb-route > li{
  counter-increment:route;
  display:grid; grid-template-columns:2.75rem minmax(0,1fr);
  gap:var(--s-4); padding:var(--s-5) 0; border-top:var(--rule); align-items:start;
}
.erb-route > li::before{
  content:counter(route); font-family:var(--font-display); font-size:var(--t-h3);
  font-weight:var(--w-light); color:var(--gold-ink); line-height:1;
}
.erb-route h3{ font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-med); margin:0 0 var(--s-2); }
.erb-route p{ font-size:var(--t-md); color:var(--ink-soft); margin:0; max-width:62ch; }
.erb-route__ask{ font-family:var(--font-display); font-style:italic;
  color:var(--ink); display:block; margin-bottom:var(--s-2); }

@media (max-width:900px){
  .erb-compare{ grid-template-columns:1fr; }
  .erb-soon{ grid-template-columns:1fr; }
}
@media (max-width:720px){
  .erb-compare__rows > div{ grid-template-columns:1fr; gap:var(--s-1); }
  .erb-route > li{ grid-template-columns:2rem minmax(0,1fr); gap:var(--s-3); }
}

/* The add-on box, used to state that there is deliberately no add-on. */
.erb-addon--none{ border-style:solid; }
.erb-addon--none .erb-addon__cond{ margin-top:0; }

/* =============================================================================
   22 · ORDER BUILDER
   ========================================================================== */
.ob-layout{ display:grid; grid-template-columns:minmax(0,1fr) minmax(300px,360px);
  gap:var(--s-7); align-items:start; margin-top:var(--s-6); }
.ob-steps > * + *{ margin-top:var(--s-6); }
.ob-step{ border-top:var(--rule); padding-top:var(--s-4); }
.ob-step[data-state="waiting"]{ opacity:.45; }
.ob-step[data-state="waiting"] .erb-chip,
.ob-step[data-state="waiting"] .erb-btn{ pointer-events:none; }
.ob-step__label{ font-size:var(--t-xs); font-weight:var(--w-semi); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink-soft); margin:0 0 var(--s-3); }
.ob-step__label b{ color:var(--cobalt); font-family:var(--font-display); font-size:var(--t-h4);
  font-weight:var(--w-book); letter-spacing:0; text-transform:none; margin-right:var(--s-2); }

.ob-item{ display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--s-3) var(--s-5);
  align-items:center; padding:var(--s-4) 0 var(--s-4) var(--s-4);
  border-bottom:var(--hair); border-left:var(--bar) solid var(--paper-rule);
  transition:background var(--dur-micro) var(--ease); }
.ob-item--booklet{ border-left-color:var(--gold); }
.ob-item--examfile{ border-left-color:var(--cobalt); }
.ob-item--pack{ border-left-color:var(--ink); }
.ob-item.is-in{ background:var(--paper-sunk); }
.ob-item__type{ margin:0 0 var(--s-2); display:flex; gap:var(--s-2); align-items:center; flex-wrap:wrap; }
.ob-item__line{ font-size:var(--t-sm); color:var(--ink-faint); }
.ob-item__name{ font-family:var(--font-display); font-size:var(--t-h4); font-weight:var(--w-med); margin:0; }
.ob-item__note{ font-size:var(--t-sm); color:var(--ink-soft); margin:var(--s-2) 0 0; max-width:52ch; }
.ob-item__free{ display:inline-block; margin-top:var(--s-2); font-size:var(--t-sm);
  font-weight:var(--w-semi); color:var(--cobalt); text-decoration:none;
  border-bottom:1px solid var(--cobalt-wash); }
.ob-item__free:hover{ border-bottom-color:var(--cobalt); }
.ob-item__free--none{ color:var(--ink-faint); font-weight:var(--w-book); border:0; }
.ob-item__side{ display:flex; flex-direction:column; align-items:flex-end; gap:var(--s-2); }
.ob-item__price{ font-size:var(--t-h4); font-weight:var(--w-bold); font-variant-numeric:tabular-nums; }

.ob-basket{ position:sticky; top:88px; border:var(--rule); border-top:var(--bar) solid var(--ink);
  padding:var(--s-5); }
.ob-basket__title{ font-family:var(--font-display); font-size:var(--t-h4); font-weight:var(--w-med); margin:0; }
.ob-basket__ref{ font-size:var(--t-xs); letter-spacing:var(--tr-wide); text-transform:uppercase;
  color:var(--ink-faint); margin:var(--s-1) 0 var(--s-4); }
.ob-basket__ref b{ color:var(--ink); font-variant-numeric:tabular-nums; letter-spacing:.04em; }
.ob-basket__empty{ font-size:var(--t-md); color:var(--ink-faint); margin:0; padding:var(--s-4) 0; }
.ob-lines{ list-style:none; margin:0; padding:0; }
.ob-lines li{ display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:var(--s-3);
  align-items:baseline; padding:var(--s-2) 0; border-bottom:var(--hair); font-size:var(--t-md); }
.ob-lines li span:last-of-type{ font-variant-numeric:tabular-nums; }
.ob-lines--disc li{ color:var(--cobalt-deep); border-bottom:0; padding:var(--s-1) 0; font-size:var(--t-sm); }
.ob-remove{ background:none; border:0; color:var(--ink-faint); font-size:var(--t-h4); line-height:1;
  cursor:pointer; padding:0 0 0 var(--s-2); }
.ob-remove:hover{ color:var(--red); }
.ob-sub{ display:flex; justify-content:space-between; font-size:var(--t-sm); color:var(--ink-faint);
  padding-top:var(--s-3); }
.ob-total{ display:flex; justify-content:space-between; align-items:baseline;
  border-top:2px solid var(--ink); margin-top:var(--s-3); padding-top:var(--s-3); }
.ob-total b{ font-size:var(--t-h3); font-weight:var(--w-bold); font-variant-numeric:tabular-nums; }

/* Payment */
.ob-pay{ margin-top:var(--s-5); padding-top:var(--s-5); border-top:var(--hair); }
.ob-pay__methods{ display:flex; gap:var(--s-2); margin-bottom:var(--s-4); }
.ob-pay__methods .erb-chip{ flex:1; justify-content:center; }
.ob-pay__row{ display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--s-2);
  align-items:center; padding:var(--s-2) 0; }
.ob-pay__k{ display:block; font-size:var(--t-2xs); letter-spacing:var(--tr-caps);
  text-transform:uppercase; color:var(--ink-faint); }
.ob-pay__v{ font-size:var(--t-base); font-weight:var(--w-semi); font-variant-numeric:tabular-nums; }
.ob-pay__steps{ list-style:none; counter-reset:ps; margin:var(--s-4) 0 0; padding:0; }
.ob-pay__steps li{ counter-increment:ps; position:relative; padding:var(--s-2) 0 var(--s-2) 28px;
  font-size:var(--t-sm); color:var(--ink-soft); }
.ob-pay__steps li::before{ content:counter(ps); position:absolute; left:0; top:var(--s-2);
  width:20px; height:20px; border-radius:var(--r-full); background:var(--cobalt); color:#fff;
  font-size:11px; font-weight:var(--w-bold); display:grid; place-items:center; }
.ob-trust{ display:flex; align-items:center; gap:var(--s-3); margin-top:var(--s-5);
  padding-top:var(--s-4); border-top:var(--hair); font-size:var(--t-sm); color:var(--ink-soft); }
.ob-trust svg{ width:20px; height:20px; flex:none; }

/* Which-one helper */
.ob-helper{ border:var(--rule); border-left:var(--bar) solid var(--gold); padding:var(--s-5);
  margin-top:var(--s-6); background:var(--paper-sunk); }
.ob-helper__q{ margin:var(--s-4) 0 var(--s-2); font-family:var(--font-display);
  font-size:var(--t-h4); font-weight:var(--w-med); }
.ob-helper__out{ margin-top:var(--s-5); padding-top:var(--s-4); border-top:2px solid var(--ink); }
.ob-helper__out h2{ font-family:var(--font-display); font-size:var(--t-h3); font-weight:var(--w-book);
  margin:0 0 var(--s-2); }
.ob-helper__out p{ font-size:var(--t-md); color:var(--ink-soft); margin:0; }

/* Free-version strip, sitewide */
.erb-freestrip{ background:var(--cobalt-wash); border-block:1px solid #C9D3F7; }
.erb-freestrip__inner{ display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:var(--s-3) var(--s-5); padding-block:var(--s-4); }
.erb-freestrip__text{ margin:0; font-size:var(--t-md); color:var(--ink); }
.erb-freestrip__text strong{ font-weight:var(--w-semi); }
.erb-freestrip .erb-link-arrow{ white-space:nowrap; }

/* Founder portrait */
.erb-portrait{ margin:0; }
.erb-portrait img{ width:100%; height:auto; display:block; border:var(--rule); }
.erb-portrait figcaption{ margin-top:var(--s-3); font-size:var(--t-sm); color:var(--ink-faint); }
.erb-portrait--round{ max-width:220px; }
.erb-portrait--round img{ aspect-ratio:1; object-fit:cover; object-position:50% 22%;
  border-radius:var(--r-full); border:2px solid var(--gold-bright); }

@media (max-width:1024px){
  .ob-layout{ grid-template-columns:1fr; }
  .ob-basket{ position:static; }
}
@media (max-width:720px){
  .ob-item{ grid-template-columns:1fr; }
  .ob-item__side{ flex-direction:row; align-items:center; justify-content:space-between; }
  .ob-pay__methods{ flex-direction:column; }
}

/* =============================================================================
   23 · RUDDY'S ASSISTANT
   A launcher bottom-right (above the mobile action bar) and a panel. The face
   on the launcher is the founder's, so a student knows whose voice it is.
   ========================================================================== */
.ra{ position:fixed; right:16px; bottom:16px; z-index:80; font-family:var(--font-body); }
.ra__launch{
  display:flex; align-items:center; gap:10px; padding:8px 16px 8px 8px;
  background:var(--ink); color:var(--paper); border:1px solid var(--ink-rule);
  border-radius:var(--r-full); font-size:var(--t-md); font-weight:var(--w-semi);
  cursor:pointer; box-shadow:0 12px 30px -14px rgba(0,0,0,.6);
  transition:transform var(--dur-micro) var(--ease);
}
.ra__launch:hover{ transform:translateY(-1px); }
.ra__launch img{ width:36px; height:36px; border-radius:var(--r-full); object-fit:cover;
  object-position:50% 20%; border:2px solid var(--gold-bright); }
.ra.is-open .ra__launch{ display:none; }

.ra__panel[hidden]{ display:none; }
.ra__panel{
  width:min(400px, calc(100vw - 32px)); height:min(600px, calc(100dvh - 32px));
  display:flex; flex-direction:column; background:var(--paper);
  border:var(--rule); border-top:var(--bar) solid var(--gold-bright);
  box-shadow:0 30px 60px -30px rgba(0,0,0,.7);
}
.ra__head{ display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--s-3);
  align-items:center; padding:var(--s-3) var(--s-4); background:var(--ink); color:var(--on-ink); }
.ra__head img{ width:40px; height:40px; border-radius:var(--r-full); object-fit:cover; object-position:50% 20%;
  border:2px solid var(--gold-bright); }
.ra__head b{ display:block; font-family:var(--font-display); font-size:var(--t-h4); font-weight:var(--w-med); }
.ra__head span{ font-size:var(--t-sm); color:var(--on-ink-soft); }
.ra__close{ background:none; border:0; color:var(--on-ink); font-size:26px; line-height:1;
  cursor:pointer; padding:4px 8px; }
.ra__log{ flex:1; overflow-y:auto; padding:var(--s-4); display:flex; flex-direction:column; gap:var(--s-3); }
.ra__msg{ max-width:88%; padding:10px 14px; font-size:var(--t-md); line-height:1.45;
  border-radius:var(--r-2); }
.ra__msg--bot{ align-self:flex-start; background:var(--paper-sunk); border-left:3px solid var(--gold); }
.ra__msg--user{ align-self:flex-end; background:var(--cobalt); color:#fff; }
.ra__msg--wait{ color:var(--ink-faint); }
.ra__msg a{ color:var(--cobalt); word-break:break-all; }
.ra__msg .erb-btn{ margin-top:var(--s-2); }
.ra__chips{ display:flex; flex-wrap:wrap; gap:6px; padding:0 var(--s-4) var(--s-3); }
.ra__chip{ background:transparent; border:1px solid var(--paper-rule); border-radius:var(--r-1);
  padding:6px 10px; font-size:var(--t-sm); color:var(--ink-soft); cursor:pointer; }
.ra__chip:hover{ border-color:var(--ink); color:var(--ink); }
.ra__form{ display:grid; grid-template-columns:minmax(0,1fr) auto; gap:var(--s-2);
  padding:var(--s-3) var(--s-4); border-top:var(--hair); }
.ra__form input{ padding:10px 12px; border:1px solid var(--paper-rule); border-radius:var(--r-1);
  font-size:var(--t-md); background:#fff; }
.ra__form input:focus{ outline:2px solid var(--cobalt); outline-offset:2px; border-color:var(--cobalt); }
.ra__foot{ margin:0; padding:var(--s-2) var(--s-4) var(--s-3); font-size:var(--t-2xs);
  color:var(--ink-faint); }
.ra__foot a{ color:var(--cobalt); }

@media (max-width:720px){
  .ra{ right:12px; bottom:68px; }              /* sits above the action bar */
  .ra__launch span{ display:none; }            /* face only, to save space */
  .ra__launch{ padding:6px; }
  .ra__launch img{ width:44px; height:44px; }
  .ra__panel{ position:fixed; inset:0; width:100%; height:100%; border:0; }
}
.erb-maxw-420{ max-width:420px; } .erb-maxw-320{ max-width:320px; }
.erb-mb-3{ margin-bottom:var(--s-3); }

/* --- RuddyGPT additions --------------------------------------------------- */
.ra__tools{ display:flex; gap:2px; }
.ra__new{ background:none; border:0; color:var(--on-ink-soft); font-size:22px; line-height:1;
  cursor:pointer; padding:4px 8px; }
.ra__new:hover{ color:var(--on-ink); }
.ra__msg ul,.ra__msg ol{ margin:6px 0 0 18px; padding:0; }
.ra__msg li{ margin:2px 0; }
.ra__form{ grid-template-columns:auto minmax(0,1fr) auto; }
.ra__cam{ display:grid; place-items:center; width:40px; height:40px; border:1px solid var(--paper-rule);
  border-radius:var(--r-1); color:var(--ink-soft); cursor:pointer; }
.ra__cam:hover{ border-color:var(--ink); color:var(--ink); }
.ra__cam:focus-within{ outline:2px solid var(--cobalt); outline-offset:2px; }
.ra__cam svg{ width:20px; height:20px; }
.ra__preview{ display:flex; align-items:center; gap:var(--s-2); padding:var(--s-2) var(--s-4) 0; }
.ra__preview[hidden]{ display:none; }
.ra__preview img{ height:56px; width:auto; border:var(--rule); }
.ra__preview button{ background:none; border:0; font-size:20px; color:var(--ink-faint); cursor:pointer; }

/* Page mode: /ask/ renders the panel inline, full height, no launcher */
.ra--page{ position:static; }
.ra--page .ra__panel{ width:100%; height:min(78vh, 760px); box-shadow:none; border-top-width:var(--bar); }
@media (max-width:720px){ .ra--page .ra__panel{ position:static; height:78dvh; border:var(--rule); border-top:var(--bar) solid var(--gold-bright); } }
