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

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

:root {
  --green: #1B3F2A;
  --green-deep: #132d1e;
  --green-deeper: #0f2417;
  --gold: #B8962E;
  --gold-soft: #C9A94A;
  --gold-dim: rgba(184, 150, 46, 0.5);
  --gold-line: rgba(184, 150, 46, 0.32);
  --cream: #F2EDE0;
  --cream-80: rgba(242, 237, 224, 0.80);
  --cream-65: rgba(242, 237, 224, 0.65);
  --cream-45: rgba(242, 237, 224, 0.45);
  --cream-30: rgba(242, 237, 224, 0.30);
  --hair: rgba(242, 237, 224, 0.14);

  /* The mockups' own names for the same palette, promoted here from the page
     sheets that each carried a copy. Six sheets declared `--gold`, `--cream`,
     `--gold-soft` and `--gold-line`; four declared the `--g0`..`--g3` greens
     and the `--c28`..`--c80` creams. Every copy agreed on the value — only the
     formatting differed (`.32` against `0.32`, minified against spaced) — so
     this is a move rather than a decision, and the figure workbenches' nine
     `:root` blocks collapsing into scripts/figures/figures.css is the same
     move made once already.

     Where a mockup name and an estate name are the same colour, the mockup
     name is written as an alias: the relationship is then declared rather than
     merely true, and editing `--green` moves both. Three of them are NOT the
     same and are written out — the mockups' `--c62` and `--c28` are .62 and
     .28 against the estate's `--cream-65` and `--cream-30`, and `--g0` has no
     estate equivalent at all. Aliasing those would be a colour change wearing
     a tidy-up's clothes. */
  --g0: #0A1810;
  --g1: var(--green);
  --g2: var(--green-deep);
  --g3: var(--green-deeper);
  --c80: var(--cream-80);
  --c62: rgba(242, 237, 224, .62);
  --c45: var(--cream-45);
  --c28: rgba(242, 237, 224, .28);
  --gold-faint: rgba(184, 150, 46, .15);
  --body: "EB Garamond", Georgia, serif;
  --word: "Cormorant Garamond", Georgia, serif;

  /* ===== THE TYPE SCALE =====
     Every rung is a base size multiplied by `--fs-scale`, so the whole ladder
     moves by editing one number and any single rung still moves on its own.
     The estate had no type token at all before this: 694 px literals across
     ten sheets, of which 447 sat in the 11-18px band alone.

     `--fs-scale: 1.2` is not a guess. reader.css had already been bumped by
     exactly 1.2 — 106 fractional px values in an unmistakable family (11 to
     13.2, 14 to 16.8, 17 to 20.4, 24 to 28.8) — and no other sheet followed
     it. So the reader has been the right size for some time and the other nine
     sheets have been a fifth too small, which is what reading the site at 125%
     browser zoom was really showing.

     Browser zoom is NOT the same lever, and reaching for CSS `zoom` to
     reproduce it would not work: page zoom shrinks the CSS viewport, so every
     media query re-evaluates and the breakpoints move with the type. CSS
     `zoom` leaves the viewport alone, so the layout would keep its widescreen
     breakpoints while the content inside it grew.

     The four `-alt` rungs are the mockups' half-steps. They are kept so this
     pass changes size and nothing else; whether a 12.5px kicker and a 12px
     minor heading are two sizes or one is a design decision for the College,
     and collapsing them here would be answering it by accident.

     Two things this ladder deliberately does not cover. Display type stays in
     its own `clamp()`s — those are already fluid and were not what read small.
     And the nav bar is untouched, on purpose: it is the one component that
     looked right at 125%, so every size under `.alv-nav` stays a literal px
     and must not be "finished off" by a later pass. */
  --fs-scale: 1.2;

  --fs-micro: calc(11px * var(--fs-scale));
  --fs-label: calc(12px * var(--fs-scale));
  --fs-label-alt: calc(12.5px * var(--fs-scale));
  --fs-meta: calc(13px * var(--fs-scale));
  --fs-meta-alt: calc(13.5px * var(--fs-scale));
  --fs-note: calc(14px * var(--fs-scale));
  --fs-note-alt: calc(14.5px * var(--fs-scale));
  --fs-ui: calc(15px * var(--fs-scale));
  --fs-body-sm: calc(16px * var(--fs-scale));
  --fs-body-alt: calc(16.5px * var(--fs-scale));
  --fs-body: calc(17px * var(--fs-scale));
  --fs-body-lg: calc(18px * var(--fs-scale));
  --fs-prose: calc(19px * var(--fs-scale));
  /* The editorial pull quote. Fluid like the headings rather than fixed like
     the prose, because it is display type -- and multiplied by `--fs-scale`
     like everything else, which eight of its nine declarations were not. */
  --fs-quote: calc(clamp(15px, 1.8vw, 16px) * var(--fs-scale));
  /* The closing panel's heading. It was three sizes across four codas -- 70px
     on the Fellows and the Residencies, 58px on the College, 38px on the front
     page, which is the ordinary section heading and far too quiet to close a
     page with. Settled on the largest, which is the one the design drew. */
  --fs-coda: calc(clamp(38px, 4.6vw, 58px) * var(--fs-scale));

  /* ===== THE EYEBROW =====
     The rungs above are sizes. These three are a ROLE, and the difference is
     the whole point of them.

     The estate writes one thing — small, uppercase, letter-spaced, almost
     always Cormorant — 154 times, under 134 different class names, at 27
     different sizes. `.kick` on the front page and `.rl-h` on the Fellows page
     are the same label 1.5px apart; `.kick` itself is declared in four sheets
     at two sizes. Nobody chose any of that: it is what happens when each
     mockup arrives as a whole standalone document and is folded in beside the
     last one.

     Bucketing by size, which is what the rungs above do, cannot fix it —
     `.kick` at 12 and `.rl-h` at 11 come out as two tokens because they were
     two numbers. So these are assigned by what the label IS:

       -sm   badges, table headings, the smallest furniture
       -     kickers, eyebrows, card labels — the bulk of them
       -lg   section labels, buttons, calls to action

     Three and not one because the spread is not all drift: a 9px badge and a
     15px section label are doing genuinely different work, and collapsing them
     together would be answering a design question by accident. Three and not
     twenty-seven because the rest of it IS drift.

     `.alv-nav` is outside this, as it is outside the scale. So is reader.css,
     which was already bumped by 1.2 and holds a mix of scaled and unscaled
     values that have to be told apart by eye rather than by a rule. */
  --fs-eyebrow-sm: calc(10px * var(--fs-scale));
  --fs-eyebrow: calc(12px * var(--fs-scale));
  --fs-eyebrow-lg: calc(13.5px * var(--fs-scale));

  /* ===== THE SECTION HEADING =====
     One h2 for the estate. The three pages had three: the front page a bare
     <h2> at clamp(18,2.35vw,32), the Fellows `.pg-t` at clamp(31,3.5vw,46),
     the College `.gih` at clamp(23,2.5vw,34) -- 46px, 34px and 32px side by
     side at a desktop measure, none of them chosen against the others.

     The front page's shape won because it is the plainest, and it goes
     through --fs-scale like everything else: its clamp was a raw literal and
     so had sat out the 1.2 bump, leaving the heading a fifth behind the body
     it stands over. Scaled, the heading-to-body ratio is 1.88 again, which is
     what it was before any of this. */
  --fs-h2: calc(clamp(18px, 0.72vw + 22.2px, 32px) * var(--fs-scale));

  /* ===== THE HERO HEADING =====
     One h1 for the estate. `.alv-ed .hero h1` had it as a literal clamp, and
     the Library wrote two more of its own — clamp(52,8vw,104) on the index and
     clamp(40,6vw,76) on a hub — so three pages of one site opened at three
     sizes, none chosen against the others. The editorial value wins because it
     is the one the rest of the estate is already set to.

     It does NOT go through `--fs-scale`, and that is deliberate rather than an
     oversight: display type was excluded from the 1.2 bump because it was
     already fluid and was never what read small. Scaling it here would put the
     Library's hero a fifth above every other hero on the site, which is the
     drift this token exists to end. */
  --fs-display: clamp(34px, 4vw, 58px);

  /* ===== LEADING =====
     Line-height in this estate is unitless, which means it is a multiple of
     the font-size and not a measurement of its own. So raising the type by
     1.2 raised every gap between two lines by 1.2 as well — the prose did not
     merely get bigger, it got further apart, which is what reads as loose.

     `--lh-scale` pulls it back. It is a second lever rather than a set of new
     numbers for the same reason `--fs-scale` is: the sheets disagree about
     prose leading on purpose (1.62 in a hero, 1.8 in the College's body copy,
     1.95 in a pull quote) and flattening all of them to one value would trade
     a spacing problem for a duller page. Each rule keeps its own ratio and
     the whole set moves together.

     .88 is not the reciprocal of 1.2. Undoing the growth exactly would put
     the leading back where it was at the old size, and the old size is not
     what these ratios were set for — larger type wants proportionally less
     leading, not the same. This is the smaller correction that lands between
     the two. */
  --lh-scale: .88;

  /* ===== THE GAP UNDER A HEAD =====
     A kicker, a heading, a gold rule -- and then the prose. `.head.tight`
     hands that last gap to the prose beneath it, and until now three
     different things were holding it: a clamp on `.alv-home .body`, a flat
     14px on a Fellow's card, and on the four figure blocks of the Fellows a
     `<br>`, which is not a measurement at all -- an empty line box, so the
     gap was whatever the wrapper's line-height happened to be and no
     stylesheet mentioned it.

     A token rather than a literal in the one rule below, because the front
     page's Bands panel wants the same gap under a head that is NOT followed
     by a `.body` -- so there are two places that have to agree, and this is
     how they agree rather than by being typed out twice. */
  --head-gap: clamp(22px, 2.6vw, 22px);

  /* ===== THE GROUND CONTRACT =====
     A section knows whether it is dark or light. Everything standing on it —
     heading, prose, kicker, caption — takes its ink from that, and there is
     no other question to ask.

     The estate had six vocabularies for this one idea (`.sec.green`,
     `.sec.green`, `.rsec.dark`, and
     `.kdark`, which turns out not to be a ground at all — see below), and 46
     declarations spread across five sheets restating what each element should
     be on each of them. Two thirds of those rules did nothing but set a
     colour. So the ground declares the ink once, and the components read it.

     What this buys: a seventh vocabulary arriving with the next mockup costs
     one line in the selector list below, not ten new rules; and a light
     ground's kicker gold can only be written in one place, so it cannot drift
     to `#8a6a1a` in one sheet and `#8a6d1e` in six others, which is what had
     already happened.

     `.kdark` is deliberately absent. It reads like a ground and is not one —
     it is a modifier on `.pg-head` meaning "this head's kicker takes the dark
     variant", and it is used on LIGHT panels. Treating it as a dark ground
     puts a dark brown kicker on every dark section.

     The values are written out rather than as `var(--cream)` / `var(--c80)`,
     which would read better and be wrong: `--cream` is #F2EDE0 at the root
     and #ece4d1 -- the ivory paper -- inside `.alv-home`, and `--c80` is .80
     at the root against .82 there. A contract built on a token whose meaning
     changes by scope hands back a different colour depending on which page
     reads it, which is the drift it exists to end. It has to be literal to be
     a contract. */
  --ground-ink: #F2EDE0;
  --ground-ink-soft: rgba(242, 237, 224, .80);
  --ground-kick: #C9A94A;
  --ground-mute: rgba(242, 237, 224, .55);
  --ground-hair: rgba(242, 237, 224, .14);
}

/* ===== THE SECTION'S SURFACE =====
   A section's look is composed, not baked. `.sec.green` used to mean five
   different things depending on which sheet you were reading -- one had grain
   and no gradient, another a gradient and no grain, two carried a noise plate
   and two did not, and the greens themselves were #1B3F2A on three pages and
   #0f2417 on two. Two class names, ten recipes.

   So each part of the surface is named and set separately, and the base
   assembles them. `background-image` is a single property and cannot be
   written by four rules at once, so each modifier sets a VARIABLE and this
   rule composes the layers in a fixed order: noise over grain over light.

   The grain takes its ink from the ground rather than naming a colour, so
   `.grain` works on either without knowing which it is standing on -- the same
   arrangement as `--ground-ink` above.

       <section class="sec cream grain tight-top lit-foot">

   reads as: paper ground, dot texture, closed-up top edge, light at the foot. */
.alv-ed .sec,
.alv-home .sec,
.alv-lib .sec {
  /* The rhythm was in alvara-editorial.css, which the Library does not load.
     Same value, said where all three scopes can hear it. */
  position: relative;
  padding: clamp(58px, 7vw, 104px) 0;
  background-color: var(--sec-ground, transparent);
  background-image: var(--sec-noise, none), var(--sec-grain, none), var(--sec-light, none);
  background-size: var(--sec-noise-size, auto), var(--sec-grain-size, auto), 100% 100%;
  background-repeat: repeat, repeat, no-repeat;
  background-blend-mode: var(--sec-blend, normal);
}

.alv-ed .sec.grain,
.alv-home .sec.grain,
.alv-lib .sec.grain {
  --sec-grain: radial-gradient(var(--sec-grain-ink) 1px, transparent 1px);
  --sec-grain-size: 3px 3px;
}

.alv-ed .sec.noise,
.alv-home .sec.noise,
.alv-lib .sec.noise {
  --sec-noise: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20width%3D%27200%27%20height%3D%27200%27%3E%3Cfilter%20id%3D%27n%27%3E%3CfeTurbulence%20type%3D%27fractalNoise%27%20baseFrequency%3D%270.9%27%20numOctaves%3D%272%27%20stitchTiles%3D%27stitch%27/%3E%3CfeColorMatrix%20type%3D%27saturate%27%20values%3D%270%27/%3E%3C/filter%3E%3Crect%20width%3D%27100%25%27%20height%3D%27100%25%27%20filter%3D%27url%28%23n%29%27%20opacity%3D%270.5%27/%3E%3C/svg%3E");
  --sec-noise-size: 200px 200px;
  --sec-blend: soft-light, normal, normal;
}

.alv-ed .sec.lit-head,
.alv-home .sec.lit-head,
.alv-lib .sec.lit-head {
  --sec-light: radial-gradient(120% 120% at 50% 0%, #1a3a26, #0f2417 70%)
}

.alv-ed .sec.lit-foot,
.alv-home .sec.lit-foot,
.alv-lib .sec.lit-foot {
  --sec-light: radial-gradient(120% 120% at 50% 100%, #17331f, #0f2417 70%)
}

/* Rhythm. Named for the shape of the space, never for the page that wanted it:
   a second section wanting a closer band reuses `.tight` rather than inventing
   a name of its own, which is how `.plate-sec`, `.pathsec` and `.recunder`
   came to exist. */
.alv-ed .sec.tight,
.alv-home .sec.tight,
.alv-lib .sec.tight {
  padding: clamp(30px, 4vw, 58px) 0
}

.alv-ed .sec.tight-top,
.alv-home .sec.tight-top,
.alv-lib .sec.tight-top {
  padding-top: clamp(14px, 1.8vw, 26px)
}

.alv-ed .sec.deep-foot,
.alv-home .sec.deep-foot,
.alv-lib .sec.deep-foot {
  padding-bottom: clamp(40px, 5vw, 72px)
}

/* Every dark ground, whatever the page calls it. */
.alv-home .sec.green,
.alv-ed .sec.green,
.alv-ed .rsec.dark,
.alv-lib .sec.green {
  --ground-ink: #F2EDE0;
  --ground-ink-soft: rgba(242, 237, 224, .80);
  --ground-kick: #C9A94A;
  --ground-mute: rgba(242, 237, 224, .55);
  --ground-hair: rgba(242, 237, 224, .14);
  --sec-ground: #1B3F2A;
  --sec-grain-ink: rgba(242, 237, 224, .05);
}

/* Every light ground. The heading ink is #20301a and the prose #39402d;
   both were settled against the alternatives actually in use (#25321d for
   either), and the softer prose is what keeps a long measure from reading
   as heavy as its own heading. */
.alv-home .sec.cream,
.alv-ed .sec.cream,
.alv-ed .rsec.cream,
.alv-lib .sec.cream,
/* The Library's word for a cream section is `.paper`, and it is not a `.sec`
   -- the intro and the three Branch catalogues each set their own rhythm. It
   is the same ground, so it takes the same contract; what it does not take is
   `.sec`'s padding, which is why it is listed here rather than renamed. */
.alv-lib .paper,
/* The document pages -- the policies and the Registrar's Office. A long text
   on the dark green was the wrong ground for it: these are read at length
   rather than glanced at, so they take the light one, and take it by joining
   this list rather than by naming the same seven colours again a hundred
   lines further down.

   Scoped on the <main> that HOLDS `.page-content` rather than on a body class,
   because three page templates render it -- generic, contact and about -- and
   they all want the same treatment. The Library's prose is `.alv-lib
   .lib-body`, which this never reaches.

   On <main> rather than on `.page-content` because the sticky footer is
   pushed down by `margin-top: auto`, so the space above it belongs to the
   BODY unless something grows into it. `.page-content` is only ever as tall
   as its own content, which left a short document sitting on a band of paper
   with dark green beneath it down to the footer. */
main:has(> .page-content) {
  --ground-ink: #20301a;
  --ground-ink-soft: #39402d;
  --ground-kick: #8a6d1e;
  --ground-mute: #6f6a52;
  --ground-hair: rgba(60, 52, 24, .28);
  --sec-ground: #ece4d1;
  --sec-grain-ink: rgba(60, 52, 24, .032);
}

/* ===== THE BODY OF A TEXT BLOCK =====
   One size for the prose under a head, wherever it stands. `.alv-ed .body p`
   was declared in THREE page sheets at two different sizes, so which one a
   paragraph got depended on which page it was on: 21.6px on the Fellows and
   the Residencies, 19.2px on Membership. Beside those, `.lbody` set its own
   clamp (19.9px), `.magbody` another (19.8px), the front page a third
   (20.7px), and a Fellow's bio a fourth (19.2px). Six values for one thing.

   Settled at `--fs-body`, which is a rung of the scale rather than a sixth
   literal, and sits in the middle of what was there -- nothing moves by more
   than 1.2px. Editing this one line moves every text block on the estate.

   Unscoped, so `.alv-ed` and `.alv-home` both take it. Everything that
   competed with it has been removed rather than out-weighted: the page sheets
   load after this one, so an override would have won on source order and the
   whole exercise would have quietly done nothing. */
/* The Library joins this rule rather than restating it. It had three leadings
   of its own — 1.75 in the hub sections, 1.75 in the index lede and 1.9 in an
   article — against the 1.45 every other text block on the estate is set to,
   and the article hard-coded `'EB Garamond', Georgia, serif` where the rest
   reads `--body`. Being IN the rule is what stops that happening again. */
.body p,
.magbody>p,
.lbody,
.founder2 .bd,
.alv-lib .lede p,
.alv-lib .hub-sections p,
.page-library-article .lib-body p {
  font-size: var(--fs-body);
  line-height: calc(1.45 * var(--lh-scale));
  font-family: var(--body);
  color: var(--ground-ink-soft);
  margin: 0 0 1.05em;
}

.body p:last-child,
.magbody>p:last-child,
.lbody:last-child {
  margin-bottom: 0
}

/* A prose block set to the measure of whatever holds it, instead of to a
   reading measure of its own. For a standfirst run across the head of a
   section over a component that takes the full width -- a grid of cards, a
   figure, a ladder -- where a 74ch column above a full-width block reads as
   two things set separately rather than as one section. College's
   `.introwide` is the same rule; this is it named for what it does and put
   where every page can reach it.

   THE THREE SELECTORS ARE ONE DECISION, AND SOURCE ORDER IS WHY. The cap it
   lifts is `.alv-ed .body`, two classes, and it lives in
   alvara-editorial.css -- which base.html loads AFTER this file. So an
   equal-specificity rule here loses whatever it is called, and a bare
   `.p-wide` alone would appear to do nothing on exactly the pages that have a
   measure worth lifting. Written beside `.body` under the scope it is three
   classes to that rule's two and wins on specificity rather than on order.
   The bare selector is for anywhere outside `.alv-ed`; the third takes the
   class on a section wrapping the prose, which is the shape College wrote. */
.p-wide,
.alv-ed .body.p-wide,
.alv-ed .p-wide .body {
  max-width: none
}

/* ===== THE OPENING CAPITAL =====
   One drop cap for the estate, so the fifth page to want one reaches for this
   rather than writing a fifth private copy -- home.css, college.css and
   library.css each carry their own, at 2.5em, 3.1em and their own paddings.
   Those are left where they are: they are tuned to ledes already set, and
   this class is what anything new takes.

   `--word` and `--gold` rather than the literals they spell out: both are
   declared in this file's `:root` and nothing under base.html redeclares
   either at a different value.

   `.lede-main` is `flow-root` because the capital is a float three lines deep
   and a one-line lede cannot contain it -- the letter hangs out of its own
   paragraph and indents the NEXT one, a stair down the left margin that reads
   as mis-set leading rather than as an uncontained float. `clear` on the
   paragraph beneath would fix it too, and would clear a figure floated beside
   it as well. It was `.p7-dropcap` in residency.css that found this, on the
   Residencies' §VII; that class is gone and this one carries the fix for it.

   This sheet loads before every page sheet and the selector carries one
   class, so a page already dressing its own `.lede::first-letter` wins on
   both counts. Apply `lede-main` INSTEAD of that page's class, not beside it. */
.lede-main {
  display: flow-root;
}

.lede-main::first-letter {
  font-family: var(--word);
  float: left;
  font-size: 2em;
  line-height: .37;
  padding: 10px 2px 0 0;
  color: var(--gold);
  font-weight: 600
}

.lede-sml::first-letter {
  font-size: 1.8em;
  padding-top: 8px;
}

/* ===== CLOSER GRAMMAR =====
   The parts every closing panel shares, kept apart from any one panel's
   arrangement -- which is the split Alicia's design files already make
   (`.cl-*` for the grammar, `#closer` for the layout). Holding them here is
   what let the Colophon be deleted without taking the Ledger's labels with
   it, once they had been moved out of it. */
.cl-acts {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(16px, 2vw, 26px);
}

/* the College's imprint, and the line beneath the inscription */
.cl-mark {
  font-family: var(--word);
  font-weight: 600;
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--ground-mute);
  margin: 0;
}

/* a detail row: what a Membership is called, and what it opens */
/* Also used as a link -- each level goes to its own place on Membership --
   so it carries the underline and hover a bare label would not need. */
.d-label {
  display: block;
  text-decoration: none;
  transition: color .25s;
  font-family: var(--word);
  font-weight: 600;
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--ground-kick);
}

a.d-label:hover,
a.d-label:focus-visible {
  color: var(--ground-ink)
}

.led-detail-head a {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color .25s, border-color .25s;
}

.led-detail-head a:hover,
.led-detail-head a:focus-visible {
  color: var(--ground-kick);
  border-bottom-color: var(--gold-line);
}

.d-text {
  font-family: var(--body);
  font-size: var(--fs-note);
  line-height: calc(1.6 * var(--lh-scale));
  color: var(--ground-ink-soft);
  margin: 5px 0 0;
}

/* ===== THE BUTTON =====
   Four sheets declare `.btn` and no two agree: the padding is 15/32 in the
   editorial sheet, 15/34 on its own `.fill`, 14/30 on Membership and 15/34 on
   the front page; three of the four round the corner by 2px and one does not;
   the ink inside a filled button is #12251a, #0f2417 and `--g3` depending on
   which page you are reading. Nobody chose any of that.

   This is the recipe the estate actually renders on its closing panels, said
   once and unscoped so a shared component works in a scope that has no button
   of its own -- which is what the Library was, its closer taking `.alv-lib
   .btn` and coming out 2px narrower than every other page's. The four scoped
   copies still out-weigh it wherever they are declared, so promoting this
   moves nothing that was already right; it fills the gap and gives the next
   sheet somewhere to stop writing a fifth copy.

   `a.btn, button.btn` rather than `.btn`, and the element is what makes the
   rule work at all: every scope opens with `.alv-ed * { margin:0; padding:0 }`
   or its own copy, which is one class and matches everything -- a tie with a
   single-class component, broken by source order, and the page sheets load
   second. So a bare `.btn` here got its padding zeroed and the button came out
   as bare gold text on the line. The same reset had already been silently
   eating `.cl-link`'s padding on every editorial page. */
a.btn,
button.btn {
  display: inline-flex;
  align-items: center;
  gap: 11px;
  font-family: var(--word);
  font-weight: 600;
  font-size: var(--fs-eyebrow);
  letter-spacing: .2em;
  text-transform: uppercase;
  text-decoration: none;
  padding: 15px 34px;
  border: 1px solid var(--gold);
  border-radius: 2px;
  color: var(--cream);
  cursor: pointer;
  transition: background .3s, color .3s, border-color .3s;
}

.btn.fill {
  background: var(--gold);
  border-color: var(--gold);
  color: var(--g3);
}

.btn:hover,
.btn:focus-visible {
  background: var(--gold);
  color: var(--g3);
}

.btn.fill:hover,
.btn.fill:focus-visible {
  background: var(--gold-soft);
  border-color: var(--gold-soft);
}

.btn .ar {
  transition: transform .3s
}

.btn:hover .ar {
  transform: translateX(4px)
}

/* ===== THE LINK-ACTION =====
   The button's quieter twin: a line of gold small-caps over a hairline, with
   an arrow that steps on hover. It closes a text column where `.btn` would be
   too loud -- four on the front page, one on the College's Fellows block.

   It was `.alv-home .cta`, written when the front page was the only page that
   had one. The College's Fellows block then took the same markup and rendered
   as a bare underlined anchor, because the rules naming it were in home.css
   and the College does not load home.css. Nor could the editorial sheet have
   held it: the front page loads neither, so main.css is the only sheet both
   ends read.

   TWO CLASSES, and the scope list is what supplies the second. `.cta` alone
   loses three ways over, all of them documented above and below -- to the
   scopes' own `* { margin:0; padding:0 }` on a tie broken by load order (see
   THE BUTTON), to their bare `a { color: inherit }` the same way (see
   `.cl-link`), and outright to `.page-the-college main a`, which paints every
   anchor in that page's main gold and carries an element more. `a.cta` fixes
   only the first. So the rule names its grounds, exactly as the ground
   contract itself does; a scope that grows a `.cta` adds a line here.

   GROUND. Home said the colour three times -- `--gold-soft` bare, `#8a6d1e`
   under `.sec.cream` and `.plateband`, `--ground-kick` again under
   `.plateband.green`. Those are `--ground-kick`'s own two values and all four
   of the front page's live on a declared ground, so the three collapse into
   one token and nothing moves. It is also what let the College's version be
   written without naming its ground at all. */
.alv-home .cta,
.alv-ed .cta {
  display: inline-flex;
  align-items: center;
  gap: 11px;
  font-family: var(--word);
  font-weight: 600;
  font-size: var(--fs-eyebrow-lg);
  letter-spacing: .2em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--ground-kick);
  margin-top: clamp(26px, 3vw, 40px);
  border-bottom: 1px solid var(--gold-line);
  padding-bottom: 6px;
  transition: color .25s, border-color .25s;
}

.alv-home .cta:hover,
.alv-ed .cta:hover,
.alv-home .cta:focus-visible,
.alv-ed .cta:focus-visible {
  color: var(--gold);
  border-color: var(--gold);
}

.alv-home .cta .ar,
.alv-ed .cta .ar {
  transition: transform .25s;
}

.alv-home .cta:hover .ar,
.alv-ed .cta:hover .ar,
.alv-home .cta:focus-visible .ar,
.alv-ed .cta:focus-visible .ar {
  transform: translateX(4px);
}

/* ===== THE LEDGER =====
   The page's closing panel, built to
   docs/college/Closer_02_The_Ledger_v2_1.html. A titled head with the
   College's imprint opposite; the invitation and its calls to action against
   a ruled list of what each Membership opens; and the governing principle
   inscribed across the foot.

   It is a `.sec` and it names no colour -- ground, ink, kicker and hairlines
   all come from the contract, so telling it `cream` instead of `green` flips
   the panel whole. The design's own `--rule` and `--rule-gold` are the
   estate's `--ground-hair` and `--gold-line`; its ground was
   `linear-gradient(180deg,#122c1d,#0f2417)`, which `green` plus `lit-foot`
   already says.

   The head carries no eyebrow by design, so `.head` holds a heading alone --
   `.kick:empty` means one can be added later without a rule changing. It is
   `noline` because the head row draws its own. */
.ledger {
  position: relative;
  overflow: hidden;
}

.ledger>.seal-bg {
  position: absolute;
  right: -16%;
  top: 58%;
  transform: translateY(-50%);
  width: min(52vw, 460px);
  opacity: .065;
  filter: grayscale(1) brightness(1.6);
  z-index: 0;
  pointer-events: none;
  user-select: none;
}

.ledger .wrap {
  position: relative;
  z-index: 1;
}

.ledger .led-head {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: clamp(20px, 3vw, 36px);
  align-items: end;
  padding-bottom: 26px;
  border-bottom: 1px solid var(--gold-line);
}

/* The quiet second action beside the filled button. It is NOT `.cta` above,
   though the setting is the same one: this rests on the prose ink and steps
   up to the ground's gold on hover, where a `.cta` is gold from the start and
   carries an arrow. One is a way on, the other a way aside. `.cta` reached
   the editorial scope in the same move that centralised it; the Library still
   has none, so the closer goes on carrying its own either way.

   Written `.cl-acts .cl-link` rather than `.cl-link`, and the second class is
   load-bearing: every scope declares a bare `a { color: inherit }`, which is
   one class and one element against this rule's one class, so a plain
   `.cl-link` LOST its own colour on every page of the estate. The College
   looked right only by accident -- `.page-the-college main a` paints links
   gold and out-weighed both -- so the same link was gold there, inherited
   cream on the Library and Membership, and never once the ink the component
   asks for. Two classes beat both. */
.cl-acts .cl-link {
  font-family: var(--word);
  font-weight: 600;
  font-size: var(--fs-eyebrow-lg);
  letter-spacing: .2em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--ground-ink-soft);
  padding-bottom: 5px;
  border-bottom: 1px solid var(--gold-line);
  transition: color .3s, border-color .3s;
}

.cl-acts .cl-link:hover,
.cl-acts .cl-link:focus-visible {
  color: var(--ground-kick);
  border-bottom-color: var(--ground-kick);
}

.ledger .led-body {
  display: grid;
  grid-template-columns: 1.15fr .85fr;
  gap: clamp(38px, 6vw, 84px);
  padding-top: 34px;
  align-items: center;
}

/* `.one-column` is gone with it. It existed for a caller that passed no
   detail rows, the partial writes them now, and a variant nothing renders is
   a variant that quietly describes a bug -- which is exactly what it was
   doing on the Library and Membership. */

.ledger .cl-acts {
  margin-top: 34px;
  row-gap: 16px;
}

.ledger .led-detail-head {
  font-family: var(--word);
  font-weight: 600;
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--ground-mute);
  margin: 0 0 14px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--gold-line);
}

.ledger .led-detail>div {
  padding: 16px 0;
  border-top: 1px solid var(--ground-hair);
}

.ledger .led-detail>div:first-child {
  border-top: 0;
  padding-top: 0;
}

.ledger .led-detail .d-text {
  margin-top: 5px
}

/* the inscription: centred, upright, and the one line on the panel that is
   neither prose nor a quote -- so it is not `.pull`, which is italic. */
.ledger .led-foot {
  margin-top: clamp(48px, 6vw, 72px);
  padding-top: clamp(34px, 4vw, 46px);
  border-top: 1px solid var(--ground-hair);
  text-align: center;
}

.ledger .led-inscription {
  font-family: var(--word);
  font-weight: 500;
  font-size: var(--fs-prose);
  line-height: calc(1.65 * var(--lh-scale));
  letter-spacing: .015em;
  color: var(--ground-ink);
  margin: 0 auto;
  max-width: 68ch;
  text-wrap: balance;
}

.ledger .led-foot .cl-mark {
  margin-top: 18px;
  letter-spacing: .3em;
}

/* THE LEDGER IS NOT SHOWN ON A NARROW SCREEN, AND THAT IS A RULING RATHER
   THAN A COLLAPSE. It is a wide panel by construction -- a head with the
   imprint opposite it, the invitation against the three Membership levels
   beside it, the governing principle inscribed across the foot -- and the
   three rules below stack all of that into one column, which turns a panel
   read at a glance into the longest thing on the page. Held to one column it
   is not the Ledger; it is its contents in a list.

   `display: none` rather than `visibility` or a height, so it leaves the
   accessibility tree and the tab order with the pixels: a panel a reader
   cannot see but can still tab three links out of is worse than either
   answer. Nothing on the estate links to `#begin` or `#close`, so no
   in-page navigation goes with it -- checked, and worth re-checking before
   an anchor is written to it.

   ONE RULE FOR EVERY PAGE, because `.ledger` is one partial. `_ledger.html`
   closes the Home, College, Fellows, Membership, Residencies and Library
   pages in all seven languages, and its rules have always lived here in
   main.css rather than in the page sheets, so the hide sits with them.

   The three collapse rules are kept rather than deleted. The estate's habit
   is that a sheet dressing a component nobody renders reads as though the
   component is one refresh away -- but this one still renders above 900px,
   and these are the setting it comes back to the moment the line below is
   taken out. 900px is the breakpoint the panel already collapsed at, so
   there is one number here and not two. */
@media(max-width: 900px) {
  .ledger {
    display: none
  }

  .ledger .led-head {
    grid-template-columns: 1fr;
    align-items: start;
    gap: 14px
  }

  .ledger .led-body {
    grid-template-columns: 1fr;
    gap: 38px
  }

  .ledger>.seal-bg {
    right: -28%;
    opacity: .06
  }
}

/* ===== THE CODA — gone =====
   `.coda` and the `.fc-*` family it dressed are not in any template: the
   Ledger replaced all six closers, so nothing on the estate rendered them.
   A sheet still dressing a component nobody writes reads as though the
   component is one refresh away, and this one also carried a `.coda .fc-cta
   .btn` padding override -- which would have quietly out-weighed the shared
   button above for a panel that no longer exists. */

/* ===== THE EDITORIAL QUOTE =====
   The same pull quote was declared across five sheets in eight sizes -- from
   `clamp(16px,1.55vw,21px)` to `clamp(22px,2.4vw,30px)` -- five inks (#2c3a20,
   #3a3016, #ece5d2, `--cream`, `--gold-soft`), and two different typefaces: it
   was Cormorant italic in six rules and EB Garamond italic in three, so which
   face a quote wore depended on which page it was on.

   Worse, most of those sizes were raw clamps that never met `--fs-scale`, so
   the estate's one type control moved everything except the quotes.

   Ink from the ground, size from the scale, face settled on the display cut
   -- a pull quote is display type, and that is what the majority of the nine
   already said. */
.pull,
.bc-pull,
.cq p {
  font-family: var(--word);
  font-style: italic;
  font-size: var(--fs-quote);
  line-height: calc(1.55 * var(--lh-scale));
  color: var(--ground-ink);
}

/* ===== THE HEAD =====
   A kicker, a heading, and a gold rule beneath. The estate had TEN containers
   for it -- `pg-head`, `leadhead`, `bx-head`, `plate-tx`, `ch`, `fh`, `head`,
   and three sections that just dropped the three parts loose into `.wrap` --
   and EIGHT names for the rule, across 73 instances: 52x1 flat, 60x1, 76x2,
   78x2, 80x1, 82x2, and two double-fading centred ones at 64 and 70.

   The rule is a pseudo-element. Seventy-three empty <div>s and <span>s leave
   the markup, the rule cannot be forgotten or spelled a ninth way, and -- the
   part that mattered -- its gradient follows the alignment instead of being
   chosen. A left-aligned head fades to the right, a centred one fades at both
   ends. Nobody was choosing that; it just had to be remembered.

   80x2 is where the eight settle: 2px carries 41 of the 73 against 1px's 26,
   and 80 is the middle of the 76/78/82 cluster the heavy users sit in.

   Unscoped, for the same reason as the corner marks below: `.alv-ed` and
   `.alv-home` both need it and neither is a parent of the other.

   The ink is the ground's. `.kdark` used to darken the kicker by hand on
   light panels; `--ground-kick` has done that automatically since the ground
   contract went in. */
.head {
  margin-bottom: clamp(24px, 3vw, 42px);
  /* Asserted, not inherited. `text-align` comes down the tree, so a head
     inside a centred column was centred without asking -- which is what the
     front page's plate text did to all five of its heads. The alignment is
     the head's own business, and `.center` / `.right` are how it is changed. */
  text-align: left;
}

.head.left {
  text-align: left
}

.head .kick {
  display: block;
  margin-bottom: 6px;
  color: var(--ground-kick);
}

/* An unwritten kicker takes no room. Several heads carry an empty one so the
   section can gain a label later without a template change. */
.head .kick:empty {
  display: none
}

/* The head carries its own type. A shared component cannot lean on each
   scope having a base heading rule: `.alv-ed` has one, `.alv-home` gained one
   today, and `.alv-lib` has none -- so the closing panel's title came out as
   the body face at the browser's bold default on the Library, and correctly
   everywhere else. */
.head h1,
.head h2,
.head h3 {
  font-family: var(--word);
  font-weight: 500;
  font-size: var(--fs-h2);
  /* The leading and the space above are part of the type, and were being
     supplied by `.alv-ed h2` / `.alv-ed .head h2` -- so on the Library, which
     has no base heading rule, the title inherited the wrapper's 1.408 and got
     a 54px line box for a 38px letter, sitting low in its own row while the
     imprint opposite lined up with nothing. Both are out-specified by the
     scopes that already declare them, so this only fills the gap. */
  line-height: 1.08;
  margin: 6px 0 0;
  color: var(--ground-ink);
}

.head::after {
  content: "";
  display: block;
  width: 80px;
  height: 2px;
  background: linear-gradient(90deg, var(--gold), transparent);
  margin: clamp(16px, 2vw, 18px) 0 0;
}

.head.center {
  text-align: center
}

.head.center::after {
  background: linear-gradient(90deg, transparent, var(--gold), transparent);
  margin-left: auto;
  margin-right: auto;
}

.head.right {
  text-align: right
}

.head.right::after {
  background: linear-gradient(90deg, transparent, var(--gold));
  margin-left: auto;
}

/* Leading the column it sits inside rather than standing over a whole block.
   The prose beneath sets its own top margin, so the head adds none. Same word
   as `.sec.tight` and the same meaning: less room. */
.head.tight {
  margin-bottom: 0
}

/* ...and this is the prose saying it back. The rule above has promised since
   it was written that the block beneath sets the gap, and nothing was keeping
   that promise in one place: `.alv-home .body` carried a clamp, a Fellow's
   card carried a flat 14px, and the four figure blocks on the Fellows carried
   a `<br>` -- an empty line box, so the gap was whatever the wrapper's
   line-height happened to be and no stylesheet mentioned it at all. Three
   answers for one relationship, one of them invisible to the sheets.

   Written as an adjacency, and on `.tight` rather than on `.head`, so it
   fires exactly where the promise was made. `.body` is used on its own all
   over the editorial pages -- inside a `.figblock`, under a plate, as the one
   paragraph of a card -- and those keep whatever their own layout gives them.
   `.bd` is the same block on a Fellow's card, where the prose is a single
   paragraph rather than a wrapper full of them.

   Retuning the estate's head-to-prose rhythm is `--head-gap`. */
.head.tight + .body,
.head.tight + .bd {
  margin-top: var(--head-gap);
}

/* A head that carries its own divider instead -- see `.head.across`. */
.head.noline::after {
  display: none
}

/* ===== CORNER MARKS =====
   The College's photographs are cornered like a mounted plate. The ornament
   was declared NINE times across five sheets and no two copies agreed: six
   sizes (16, 18, 20, 22, 24, 26px), two weights, both golds, and offsets
   running from 6px inside the image to 8px outside it. Same story as the
   palette, and the same fix -- one component, and the page says which of the
   two treatments it wants.

   Deliberately UNSCOPED. Every other component here is written under
   `.alv-ed` or `.alv-home`, and this one has to reach both plus the figure
   documents, so scoping would mean three copies of every selector. What makes
   that safe is that the treatment class is the entry point: `.marks-out .cn`
   cannot match anything that has not asked for it. Which matters more than it
   sounds -- the Library uses `.cn` for something else entirely, the chapter
   NUMBER beside each contents row, sized in `ch`. A bare `.cn` rule here
   would land on it and wreck that page.

   The markup writes ALL FOUR marks on every photograph and `.marks-out` hides
   the two it does not use. The treatments are mixed across the estate by
   editorial judgement, so switching one has to be a single word rather than a
   template edit in two languages -- otherwise the distribution ends up being
   whatever the first pass happened to write. */
.marks-out,
.marks-in {
  position: relative;
}

.marks-out .cn,
.marks-in .cn {
  position: absolute;
  width: 22px;
  height: 22px;
  border: 0 solid var(--gold-soft);
  z-index: 3;
  pointer-events: none;
}

/* A separate mount: two marks, hairline, standing 9px clear of the frame.
   Airier, and it reads as something the photograph is set into. */
.marks-out .cn {
  border-width: 1px
}

.marks-out .cn.tr,
.marks-out .cn.bl {
  display: none
}

.marks-out .cn.tl {
  top: -9px;
  left: -9px;
  border-right-width: 0;
  border-bottom-width: 0
}

.marks-out .cn.br {
  bottom: -9px;
  right: -9px;
  border-left-width: 0;
  border-top-width: 0
}

/* A viewfinder: all four, heavier, drawn 8px over the image itself. The
   strongest containment of the two, and the reason the weight goes up is that
   a hairline laid over a photograph disappears into it. */
.marks-in .cn {
  border-width: 2px
}

.marks-in .cn.tl {
  top: 8px;
  left: 8px;
  border-right-width: 0;
  border-bottom-width: 0
}

.marks-in .cn.tr {
  top: 8px;
  right: 8px;
  border-left-width: 0;
  border-bottom-width: 0
}

.marks-in .cn.bl {
  bottom: 8px;
  left: 8px;
  border-right-width: 0;
  border-top-width: 0
}

.marks-in .cn.br {
  bottom: 8px;
  right: 8px;
  border-left-width: 0;
  border-top-width: 0
}

body {
  background: var(--green);
  color: var(--cream);
  font-family: 'EB Garamond', Georgia, serif;
  overflow-x: hidden;
}

p {
  font-size: var(--fs-body);
}

/* GRAIN */
body::after {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 9999;
  opacity: 0.035;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  /* The tile size has to be said out loud. That SVG carries a viewBox and no
     width/height, so it has an aspect ratio and no intrinsic size — and CSS
     then sizes it to the background positioning area, which here is the whole
     fixed viewport. A 200-unit noise field blown up to ~900px is not grain:
     it is soft blotches the size of a fist, sitting fixed over every flat
     colour on the site and, because this layer is fixed at z-index 9999, over
     the framed figures as well. At 200px the field renders at 1:1 and tiles,
     which is what `stitchTiles` is there for. The paper texture in
     alvara-editorial.css says the same thing the same way. */
  background-size: 200px 200px;
}

/* NAV */
.alv-nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 22px 56px;
  border-bottom: 1px solid var(--gold-line);
  /* Solid, all the way across. The bar is the mockups' scrolled state colour
     (`.nav.scr`, rgba(13,32,20,.92)) taken opaque: the mockups faded their nav
     into the hero and that fade only ever reads as a fade over the photograph
     — one half of the bar sitting on flat green, the other half with a horse
     ghosting through it. Opaque means `backdrop-filter` has nothing left to
     blur, so it goes with the transparency rather than costing a compositing
     layer for nothing. */
  /* background: #0D2014; */
  background: #0b1a11;
}

.alv-nav .nav-mark {
  font-family: 'Cormorant Garamond', serif;
  font-size: 33.1px;
  font-weight: 600;
  color: var(--cream);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  text-decoration: none;
}

.alv-nav .nav-mark span {
  color: var(--gold);
}

/* The gap tightens with the viewport so six items plus the language chooser
   stay on one line down to the burger breakpoint (1360px). */
.alv-nav .nav-links {
  display: flex;
  gap: clamp(24px, 2.5vw, 40px);
  list-style: none;
}

.alv-nav .nav-links a {
  font-size: 15px;
  letter-spacing: 2.5px;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--cream-45);
  text-decoration: none;
  font-family: 'EB Garamond', serif;
  transition: color 0.2s ease;
}

.alv-nav .nav-links a:hover,
.alv-nav .nav-links a.active {
  color: var(--gold);
}

.alv-nav .nav-burger {
  display: none;
  background: none;
  border: 0;
  cursor: pointer;
  width: 36px;
  height: 36px;
  padding: 8px;
  margin: -8px;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
}

.alv-nav .nav-burger span {
  display: block;
  width: 22px;
  height: 1px;
  background: var(--cream-65);
  transform-origin: center;
  transition: transform 0.25s ease, opacity 0.2s ease;
}

.alv-nav .nav-burger.is-open span:nth-child(1) {
  transform: translateY(6px) rotate(45deg);
}

.alv-nav .nav-burger.is-open span:nth-child(2) {
  opacity: 0;
}

.alv-nav .nav-burger.is-open span:nth-child(3) {
  transform: translateY(-6px) rotate(-45deg);
}

/* Language chooser */
.alv-nav .nav-lang {
  position: relative;
}

.alv-nav .nav-lang-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: none;
  border: 0;
  cursor: pointer;
  padding: 0;
  font-size: 15px;
  letter-spacing: 2.5px;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--cream-45);
  font-family: 'EB Garamond', serif;
  transition: color 0.2s ease;
}

.alv-nav .nav-lang-toggle:hover {
  color: var(--gold);
}

.alv-nav .nav-lang-globe {
  flex-shrink: 0;
}

.alv-nav .nav-lang-menu {
  position: absolute;
  top: calc(100% + 14px);
  right: 0;
  list-style: none;
  padding: 8px 0;
  margin: 0;
  background: rgba(19, 45, 30, 0.98);
  border: 1px solid var(--gold-line);
  backdrop-filter: blur(10px);
}

.alv-nav .nav-lang-menu li {
  padding: 0;
}

.alv-nav .nav-lang-menu a {
  display: block;
  padding: 8px 18px;
  font-size: 14px;
  letter-spacing: 1.5px;
  text-transform: none;
}

/* A language the College intends to publish in and has not published yet. It is
   a span rather than a dimmed anchor — see the note in _college_nav.html — and
   the menu had grown from two rows to six, so it also widens to hold the
   qualifier on one line. */
.alv-nav .nav-lang-menu {
  min-width: 210px;
}

.alv-nav .nav-lang-menu .is-soon {
  display: block;
  padding: 8px 18px;
  font-size: 14px;
  letter-spacing: 1.5px;
  text-transform: none;
  color: rgba(242, 237, 224, 0.38);
  cursor: default;
}

.alv-nav .nav-lang-menu .is-soon i {
  font-style: italic;
  font-size: 11.5px;
  letter-spacing: 0.06em;
  color: rgba(242, 237, 224, 0.28);
}

/* HERO — the old front page's, and DELIBERATELY no longer a bare `.hero`.

   These rules were left global when the front page moved to `hp-` classes, on
   the note that "the Portuguese home and several other pages still use them".
   That stopped being true. Every `class="hero"` in the estate now sits inside
   a scoped wrapper (.alv-ed, .alv-home, .alv-lib) with its own sheet, except
   the parked Series — which loads series/series.css and never main.css.

   So the rules matched nothing, and meanwhile a bare `.hero` here reached
   inside every one of those wrappers. Three of the four scoped sheets happened
   to set display, min-height and grid-template-columns themselves and so
   overrode it; the Library set none of the three and inherited a two-column
   55/45 grid at 100vh, which is not a thing anyone had written down.
   `.hero-image` and its friends below are left as they are: they are the same
   dead system, but they cannot reach anything without this rule. */

.hero-image {
  position: relative;
  overflow: hidden;
}

.hero-image::before {
  content: '';
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center center;
  opacity: 0.22;
  filter: sepia(0.3);
}

.hero-image::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(to right, var(--green) 0%, transparent 35%, transparent 70%, var(--green) 100%);
}

.hero-copy {
  position: relative;
  z-index: 2;
  padding: 130px 56px 80px 72px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.hero-institution {
  display: flex;
  align-items: center;
  gap: 20px;
  margin-bottom: 52px;
  opacity: 0;
  animation: fadeUp 0.6s ease forwards 0.1s;
}

.hero-institution-text {
  font-size: var(--fs-body-lg);
  color: var(--cream-45);
  letter-spacing: 1px;
  line-height: 1.5;
}

.hero-institution-text strong {
  display: block;
  color: var(--cream-65);
  font-weight: 400;
  font-size: var(--fs-body-lg);
  font-family: 'EB Garamond', serif;
}

.hero-wordmark {
  font-family: 'Cormorant Garamond', serif;
  font-size: clamp(72px, 9vw, 118px);
  font-weight: 600;
  color: var(--cream);
  line-height: 0.95;
  letter-spacing: 0.035em;
  margin-bottom: 36px;
  opacity: 0;
  animation: fadeUp 0.8s ease forwards 0.25s;
}

.hero-wordmark span {
  color: var(--gold);
}

.hero-rule {
  width: 44px;
  height: 1px;
  background: var(--gold);
  margin-bottom: 32px;
  opacity: 0;
  animation: fadeUp 0.6s ease forwards 0.45s;
}

.hero-tagline {
  font-family: 'EB Garamond', serif;
  font-size: clamp(18px, 2vw, 24px);
  font-style: italic;
  font-weight: 400;
  color: var(--cream-65);
  line-height: 1.5;
  margin-bottom: 40px;
  max-width: 460px;
  opacity: 0;
  animation: fadeUp 0.7s ease forwards 0.6s;
}

.hero-body {
  font-size: var(--fs-body);
  line-height: calc(1.85 * var(--lh-scale));
  color: var(--cream-45);
  max-width: 420px;
  margin-bottom: 48px;
  opacity: 0;
  animation: fadeUp 0.7s ease forwards 0.75s;
}

.hero-body p {
  margin-bottom: 12px;
}

.hero-close {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-body-lg);
  font-style: italic;
  color: var(--gold);
  opacity: 0;
  animation: fadeUp 0.7s ease forwards 0.9s;
}

/* BELOW HERO */
.below-hero {
  border-top: 1px solid var(--gold-line);
}

.bh-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 96px 72px;
}

.s-label {
  font-size: var(--fs-eyebrow-lg);
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 24px;
  font-family: 'EB Garamond', serif;
}

.s-title {
  font-family: 'EB Garamond', serif;
  font-size: clamp(32px, 3.5vw, 50px);
  font-weight: 400;
  color: var(--cream);
  line-height: 1.2;
  margin-bottom: 32px;
  max-width: 600px;
}

.s-body {
  font-size: var(--fs-body-lg);
  line-height: calc(1.9 * var(--lh-scale));
  color: var(--cream-65);
  max-width: 540px;
}

.s-body p {
  margin-bottom: 16px;
}

/* DISCIPLINE TWO COL */
.two-col {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  align-items: start;
}

.disc-list {
  margin-top: 8px;
}

.disc-item {
  padding: 20px 0;
  border-bottom: 1px solid var(--gold-line);
}

.disc-tag {
  font-size: var(--fs-eyebrow-lg);
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 8px;
  font-family: 'EB Garamond', serif;
}

.disc-text {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-prose);
  font-style: italic;
  color: var(--cream-65);
  line-height: 1.4;
}

/* SYSTEM */
.system-band {
  background: var(--green-deep);
  border-top: 1px solid var(--gold-line);
  border-bottom: 1px solid var(--gold-line);
}

.system-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 96px 72px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
}

.bands {
  margin-top: 40px;
}

.band-row {
  display: grid;
  grid-template-columns: 52px 1fr;
  gap: 24px;
  align-items: center;
  padding: 22px 0;
  border-bottom: 1px solid var(--hair);
}

.band-letter {
  font-family: 'EB Garamond', serif;
  font-size: 52px;
  font-weight: 400;
  font-style: italic;
  color: var(--gold);
  line-height: 1;
  text-align: center;
}

.band-desc {
  font-size: var(--fs-body-sm);
  color: var(--cream-45);
  line-height: calc(1.65 * var(--lh-scale));
}

/* FELLOWSHIP */
.fellowship-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 96px 72px;
}

.f-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  margin-top: 48px;
  align-items: start;
}

.std-item {
  padding: 28px 0;
  border-top: 1px solid var(--gold-line);
}

.std-tag {
  font-size: var(--fs-eyebrow);
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 12px;
  font-family: 'EB Garamond', serif;
}

.std-text {
  font-size: var(--fs-body-lg);
  color: var(--cream-65);
  line-height: calc(1.75 * var(--lh-scale));
}

.f-aside {
  border-left: 1px solid var(--gold-line);
  padding-left: 48px;
  padding-top: 28px;
}

.f-pull {
  font-family: 'EB Garamond', serif;
  font-size: 24px;
  font-style: italic;
  font-weight: 400;
  color: var(--cream);
  line-height: 1.55;
  margin-bottom: 28px;
}

.f-note {
  font-size: var(--fs-meta);
  color: var(--cream-45);
  line-height: calc(1.85 * var(--lh-scale));
}

/* CLOSE */
.close-wrap {
  border-top: 1px solid var(--gold-line);
  text-align: center;
  padding: 110px 72px;
  background: var(--green-deep);
}

.close-rule {
  width: 44px;
  height: 1px;
  background: var(--gold);
  opacity: 0.5;
  margin: 0 auto 52px;
}

.close-line {
  font-family: 'EB Garamond', serif;
  font-size: clamp(28px, 3.5vw, 44px);
  font-weight: 400;
  font-style: italic;
  color: var(--cream);
  letter-spacing: 0.3px;
}

.close-line em {
  color: var(--gold);
}

/* =====================================================================
   THE FOOTER

   One component, `_college_foot.html`, on every page of the estate that has
   a footer at all. The reader and the printed manual do not: both are
   full-viewport applications.

   THE STICKY FOOTER is `body:has(> .alv-foot)`, not `body`. Making every
   body a flex column would reach the two pages above as well — and
   `.alv-reader-page` sets a definite `height: 100vh`, under which flex
   children shrink rather than overflow, so its three panels would be
   squashed by a rule written for a marketing page. `:has()` asks the one
   question that actually decides it: does this page carry a footer? The
   `> ` is load-bearing — the footer is a direct child of <body> in every
   template, and a descendant match would take in a footer nested in an
   application shell.

   With `:has()` unsupported the footer simply sits under short content
   instead of at the foot of the viewport, which is what it did before.

   `100svh` rather than `100vh`: on a phone `vh` is the *largest* viewport,
   so with the browser's own bars showing, a "full height" page is taller
   than the screen and every short page gains a scrollbar that scrolls to
   nothing.
   ===================================================================== */
body:has(> .alv-foot) {
  display: flex;
  flex-direction: column;
  min-height: 100svh;
}

body:has(> .alv-foot) > .alv-foot {
  margin-top: auto;
}

.alv-foot {
  border-top: 1px solid var(--gold-line);
  padding: 56px 72px 32px;
  background: var(--green-deep);
  /* A flex child of the body above shrinks by default, and the footer is the
     one child that must not: it is the natural height of its columns. */
  flex: none;
}

/* The brand block beside the columns. It leads at every width — the columns
   wrap under it on a narrow screen rather than the wordmark wrapping under
   them, since the name is what says whose site this is. */
.alv-foot .foot-top {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: clamp(32px, 5vw, 72px);
}

/* The wordmark and its strapline, and nothing else — the standing paragraph
   under them went as extraneous. So the block asks for the width those two
   lines take rather than the measure a paragraph wanted, and stops growing
   there: given a share of the row it would push the columns right for no
   reason, the two lines being as wide as they are going to get. */
.alv-foot .foot-brand {
  flex: 0 1 auto;
}

.alv-foot .foot-name {
  font-family: 'Cormorant Garamond', serif;
  font-size: var(--fs-body-lg);
  font-weight: 600;
  color: var(--cream);
  letter-spacing: 0.24em;
  text-transform: uppercase;
}

/* The accent is gold, as it is on the nav's wordmark at the other end of the
   page — `.alv-nav .nav-mark span`, said again here because the two marks
   share no selector. The markup keeps the word in its own case and
   `text-transform` raises it, so what a screen reader announces is Alvará. */
.alv-foot .foot-name span {
  color: var(--gold);
}

.alv-foot .foot-sub {
  margin-top: 8px;
  font-size: var(--fs-eyebrow-lg);
  color: var(--cream-45);
  letter-spacing: 1.5px;
  text-transform: uppercase;
}

/* The columns. `auto-fit` rather than a fixed count because the signed-in
   footer carries four and the signed-out one three, and a grid told to hold
   four would leave a column of air on every public page. */
.alv-foot .foot-cols {
  flex: 1 1 520px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 28px clamp(24px, 3vw, 48px);
}

.alv-foot .foot-h {
  margin: 0 0 14px;
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  font-weight: 500;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gold);
}

.alv-foot .foot-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 9px;
}

.alv-foot .foot-list a,
.alv-foot .foot-out button {
  display: block;
  padding: 0;
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-note);
  line-height: 1.4;
  letter-spacing: 0.04em;
  color: var(--cream-80);
  text-decoration: none;
  background: none;
  border: 0;
  text-align: left;
  cursor: pointer;
  transition: color 0.2s ease;
}

/* Pin :link/:visited with a literal gold-free cream — browsers ignore var()
   on :visited (a privacy restriction) and fall back to the UA purple
   otherwise. rgba(242, 237, 224, 0.8) === var(--cream-80). */
.alv-foot .foot-list a:link,
.alv-foot .foot-list a:visited {
  color: rgba(242, 237, 224, 0.8);
}

.alv-foot .foot-list a:hover,
.alv-foot .foot-list a:focus-visible,
.alv-foot .foot-out button:hover,
.alv-foot .foot-out button:focus-visible {
  color: var(--gold);
}

/* A Branch is named by its ordinal alone. Its title went with a `.foot-aside`
   line under it: three of the four rows had nothing to put there, and the one
   that did ran to three lines on a phone — a subtitle louder than the row it
   belongs to. The reader names the Branch it opens; the footer only has to
   say which one. */

/* A destination with no page yet — the three policies, Branches Two and
   Three. The account menu's `.nav-acct-soon` idiom, kept identical so the
   two read as one convention: never a dimmed link, which is a promise the
   footer cannot keep. */
.alv-foot .foot-soon {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-note);
  line-height: 1.4;
  letter-spacing: 0.04em;
  color: var(--cream-30);
  cursor: default;
}

/* Ordinary inline flow, NOT a flex row. As a flex row a label too long for
   its column wraps while the mark stays pinned to the far edge, so "My
   payment methods" broke over two lines with SOON hanging in the air beside
   the first — which on a phone is every row in the column. Inline, the mark
   simply follows the last word wherever it lands. */
.alv-foot .foot-soon em {
  display: inline-block;
  margin-left: 8px;
  font-style: normal;
  font-size: 9px;
  letter-spacing: 1.6px;
  text-transform: uppercase;
  color: var(--cream-30);
  border: 1px solid var(--hair);
  border-radius: 2px;
  padding: 1px 5px;
}

.alv-foot .foot-out {
  margin: 0;
}

/* THE LEGAL RULE — copyright, the policies, and the cookie control. */
.alv-foot .foot-legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 14px 28px;
  margin-top: 44px;
  padding-top: 22px;
  border-top: 1px solid var(--hair);
}

.alv-foot .foot-copy {
  margin: 0;
  font-size: var(--fs-meta);
  letter-spacing: 0.06em;
  color: var(--cream-45);
}

/* THE REGISTERED PARTICULARS, on a line of their own beneath the rest.

   The legal rule is a flex row with the copyright at one end and the policies
   at the other, and a fourth item in it would wrap between the two at every
   width the estate is read at. `flex-basis: 100%` with `order` past both puts
   it under them as a line rather than as a competitor for the row — and it is
   the quietest thing in the footer on purpose: it is a disclosure a reader
   consults, not one they read, and Companies House requires it to be legible
   rather than prominent. `--fs-micro` and `--cream-30` are the smallest and
   faintest the estate already uses, so nothing new was minted for it. */
.alv-foot .foot-registered {
  flex-basis: 100%;
  order: 3;
  margin: 0;
  font-size: var(--fs-micro);
  line-height: 1.8;
  letter-spacing: 0.04em;
  color: var(--cream-30);
  /* The three lines are the partial's own `<br>`s, so the measure is not what
     decides them -- but the middle line still has to be free to wrap on a
     narrow screen, and `text-wrap: pretty` is what stops it leaving a single
     word stranded under the rest of it. */
  text-wrap: pretty;
}

.alv-foot .foot-policies {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 24px;
}

/* The live controls in the legal rule — the three policies and the cookie
   button — dressed as one thing because they sit in one row and are read as
   one row. Underlined, but at a weight below the copyright rather than above
   it: full cream made this bar the loudest thing in the footer.

   The button and the anchors are given the same declarations rather than the
   anchors inheriting the anchor defaults: a <button> carries none of a link's
   defaults, so anything left to inheritance would have set the three apart
   from the one beside them. */
.alv-foot .foot-policies a,
.alv-foot .foot-cookie {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-note);
  letter-spacing: 0.04em;
  color: var(--cream-45);
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-color: var(--gold-line);
  transition: color 0.2s ease;
}

.alv-foot .foot-policies a:hover,
.alv-foot .foot-policies a:focus-visible,
.alv-foot .foot-cookie:hover,
.alv-foot .foot-cookie:focus-visible {
  color: var(--gold);
}

@keyframes fadeUp {
  from {
    opacity: 0;
    transform: translateY(16px);
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* RESPONSIVE — Tablet */
/* RESPONSIVE — the nav collapses to the burger well before phone widths:
   six items plus the language chooser stop clearing the wordmark below
   ~1360px, and shrinking them further would break the labels across lines. */
@media (max-width: 1360px) {
  .alv-nav {
    flex-wrap: wrap;
  }

  .alv-nav .nav-burger {
    display: flex;
  }

  .alv-nav .nav-links {
    display: none;
    flex-basis: 100%;
    flex-direction: column;
    gap: 0;
    margin-top: 16px;
    padding-top: 16px;
    border-top: 1px solid var(--gold-line);
  }

  .alv-nav .nav-links.is-open {
    display: flex;
  }

  .alv-nav .nav-links li {
    padding: 12px 0;
  }

  .alv-nav .nav-lang-menu {
    position: static;
    min-width: 0;
    margin-top: 10px;
    background: none;
    border: 0;
    backdrop-filter: none;
    padding: 0;
  }

  .alv-nav .nav-lang-menu a {
    padding: 8px 0;
  }
}

@media (max-width: 1024px) {
  .alv-nav {
    padding: 20px 40px;
  }

  .hero-image {
    position: absolute;
    inset: 0;
    z-index: 0;
  }

  .hero-image::before {
    opacity: 0.12;
  }

  .hero-image::after {
    background: linear-gradient(to bottom, rgba(27, 63, 42, 0.6) 0%, transparent 30%, transparent 70%, var(--green) 100%);
  }

  .hero-copy {
    padding: 130px 48px 80px 48px;
  }

  .two-col,
  .system-inner,
  .f-grid {
    grid-template-columns: 1fr;
    gap: 48px;
  }

  .f-aside {
    border-left: none;
    border-top: 1px solid var(--gold-line);
    padding-left: 0;
    padding-top: 32px;
  }
}

/* RESPONSIVE — Mobile */
@media (max-width: 768px) {
  .alv-nav {
    padding: 16px 24px;
  }

  .alv-nav .nav-links a {
    font-size: 13px;
  }

  .alv-nav .nav-lang-toggle {
    font-size: 13px;
  }

  .hero-copy {
    padding: 110px 32px 64px 32px;
  }

  .hero-wordmark {
    font-size: clamp(56px, 14vw, 96px);
  }

  .bh-inner,
  .system-inner,
  .fellowship-inner {
    padding: 64px 32px;
  }

  .close-wrap {
    padding: 80px 32px;
  }

  .band-letter {
    font-size: 40px;
  }

  .band-row {
    grid-template-columns: 44px 1fr;
    gap: 18px;
  }

  /* The footer keeps its columns on a phone rather than stacking into one
     long list — two of 150px fit inside 320px and a stack of four headed
     lists is most of a screen of scrolling. `text-align` stays left: the
     lists are lists, and centred ones have no edge for the eye to run down. */
  .alv-foot {
    padding: 40px 24px 26px;
  }

  .alv-foot .foot-top {
    gap: 32px;
  }

  .alv-foot .foot-cols {
    flex-basis: 100%;
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  }

  .alv-foot .foot-legal {
    margin-top: 32px;
  }
}

/* INNER PAGES — shared title + eyebrow used by generic_page, about, contact */
.page-eyebrow {
  font-size: var(--fs-eyebrow-lg);
  letter-spacing: 5px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 24px;
  font-family: 'EB Garamond', serif;
}

.page-title {
  font-family: 'EB Garamond', serif;
  font-size: 34px;
  font-weight: 400;
  color: var(--cream);
  line-height: 1;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  margin-bottom: 36px;
}

/* =====================================================================
   THE COLLEGE — full page (typographic editorial; no imagery; closes on seal)
   All selectors scoped under .page-the-college.
   ===================================================================== */

.page-the-college {
  --col-deep: #132d1e;
  --col-darker: #0e2417;
  --col-gold-soft: rgba(184, 150, 46, 0.85);
  --col-gold-faint: rgba(184, 150, 46, 0.08);
  --col-gold-20: rgba(184, 150, 46, 0.2);
  --col-cream-85: rgba(242, 237, 224, 0.85);
  --col-cream-45: rgba(242, 237, 224, 0.45);
}

.page-the-college body,
.page-the-college main {
  font-size: var(--fs-body-lg);
}

/* Inline links within the College editorial pages read as gold, not the
   browser default. Shared across The College / Discipline / Curriculum / Bands. */
.page-the-college main a {
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--gold-line);
  transition: color 0.2s ease, border-color 0.2s ease;
}

.page-the-college main a:hover {
  border-bottom-color: var(--gold);
}

.page-the-college .col-slabel {
  display: block;
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 5px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 40px;
}

/* ========== HERO ========== */
.page-the-college .col-hero {
  padding-top: 88px;
  min-height: 100vh;
  display: grid;
  grid-template-columns: 1fr 1fr;
  border-bottom: 1px solid var(--gold-line);
}

.page-the-college .col-hero-left {
  padding: 80px 56px 80px 72px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  border-right: 1px solid var(--gold-line);
}

.page-the-college .col-hero-eyebrow {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow-lg);
  letter-spacing: 5px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 40px;
}

.page-the-college .col-hero-title {
  font-family: 'EB Garamond', serif;
  font-size: 34px;
  font-weight: 400;
  color: var(--cream);
  line-height: 1;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  margin-bottom: 36px;
}

.page-the-college .col-hero-rule {
  width: 100%;
  height: 1px;
  background: var(--gold-line);
  margin: 48px 0;
}

.page-the-college .col-hero-tag {
  display: block;
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 28px;
}

/* Three-verb architectural row — Holds · Examines · Awards */
.page-the-college .col-tri-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  border-top: 1px solid var(--gold-line);
  border-bottom: 1px solid var(--gold-line);
}

.page-the-college .col-tri-cell {
  padding: 36px 14px 28px;
  border-right: 1px solid var(--gold-line);
  text-align: center;
}

.page-the-college .col-tri-cell:last-child {
  border-right: none;
}

.page-the-college .col-tri-verb {
  font-family: 'EB Garamond', serif;
  font-size: clamp(40px, 5vw, 60px);
  font-weight: 400;
  font-style: italic;
  color: var(--cream);
  line-height: 1;
  letter-spacing: -1px;
}

.page-the-college .col-tri-gloss {
  display: block;
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--gold);
  opacity: 0.95;
  margin-top: 16px;
}

.page-the-college .col-hero-right {
  padding: 80px 72px 80px 56px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.page-the-college .col-hero-pull {
  font-family: 'EB Garamond', serif;
  font-size: 30px;
  font-style: italic;
  font-weight: 400;
  color: var(--cream);
  line-height: 1.28;
  margin-bottom: 40px;
  letter-spacing: -0.5px;
}

.page-the-college .col-hero-body {
  font-size: var(--fs-body);
  line-height: calc(1.95 * var(--lh-scale));
  color: var(--cream-65);
}

.page-the-college .col-hero-body p {
  font-size: var(--fs-body);
  margin-bottom: 18px;
}

.page-the-college .col-hero-body p:last-child {
  margin-bottom: 0;
}

.page-the-college .col-hero-body em {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  color: var(--col-cream-85);
  font-size: var(--fs-body-lg);
}

/* ========== SECTION 2 — WHAT THE COLLEGE IS ========== */
.page-the-college .col-what-is {
  background: var(--col-deep);
  border-bottom: 1px solid var(--gold-line);
}

.page-the-college .col-what-is-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 120px 72px;
  display: grid;
  grid-template-columns: 1fr 1.4fr;
  gap: 96px;
  align-items: start;
}

.page-the-college .col-what-is-left {
  position: sticky;
  top: 120px;
}

.page-the-college .col-what-is-statement {
  font-family: 'EB Garamond', serif;
  font-size: clamp(36px, 4.2vw, 33px);
  font-weight: 400;
  color: var(--cream);
  line-height: 1.08;
  letter-spacing: -0.5px;
  margin-bottom: 32px;
}

.page-the-college .col-what-is-rule {
  width: 48px;
  height: 1px;
  background: var(--gold);
  opacity: 0.4;
  margin: 24px 0;
}

.page-the-college .col-what-is-meta {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  font-size: var(--fs-body-lg);
  color: var(--col-cream-45);
  line-height: 1.55;
}

.page-the-college .col-what-is-body {
  font-size: var(--fs-body);
  line-height: calc(1.95 * var(--lh-scale));
  color: var(--cream-65);
}

.page-the-college .col-what-is-body p {
  font-size: var(--fs-body);
  margin-bottom: 22px;
}

.page-the-college .col-what-is-body p:last-child {
  margin-bottom: 0;
}

.page-the-college .col-what-is-body em {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  color: var(--col-cream-85);
}

.page-the-college .col-what-is-body p:first-child {
  font-family: 'EB Garamond', serif;
  font-size: clamp(24px, 2.6vw, 32px);
  font-style: italic;
  color: var(--cream);
  line-height: 1.35;
  margin-bottom: 32px;
  font-weight: 400;
}

/* ========== SECTION 3 — WHAT THE COLLEGE HOLDS ========== */
.page-the-college .col-holds {
  background: var(--green);
  border-bottom: 1px solid var(--gold-line);
}

.page-the-college .col-holds-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 120px 72px;
}

.page-the-college .col-holds-header {
  display: grid;
  grid-template-columns: 3fr 2fr;
  gap: 64px;
  align-items: end;
  margin-bottom: 80px;
}

.page-the-college .col-holds-statement {
  font-family: 'EB Garamond', serif;
  font-size: clamp(36px, 4.2vw, 33px);
  font-weight: 400;
  color: var(--cream);
  line-height: 1.08;
  letter-spacing: -0.5px;
}

.page-the-college .col-holds-aside {
  font-size: var(--fs-body);
  line-height: calc(1.9 * var(--lh-scale));
  color: var(--cream-65);
}

.page-the-college .col-branches {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1px;
  background: var(--gold-line);
  border: 1px solid var(--gold-line);
}

.page-the-college .col-bc {
  padding: 64px 40px;
  background: var(--green);
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  min-height: 380px;
}

.page-the-college .col-bc-wm {
  position: absolute;
  top: 24px;
  right: 32px;
  font-family: 'EB Garamond', serif;
  font-size: 140px;
  font-weight: 400;
  font-style: italic;
  color: rgba(184, 150, 46, 0.05);
  line-height: 1;
  pointer-events: none;
  user-select: none;
}

.page-the-college .col-bc-num {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--gold);
  opacity: 0.9;
  margin-bottom: 24px;
  position: relative;
  z-index: 1;
}

.page-the-college .col-bc-name {
  font-family: 'EB Garamond', serif;
  font-size: 30px;
  font-weight: 400;
  font-style: italic;
  color: var(--gold);
  line-height: 1.05;
  margin-bottom: 18px;
  position: relative;
  z-index: 1;
  letter-spacing: -0.5px;
}

.page-the-college .col-bc-rule {
  width: 24px;
  height: 1px;
  background: var(--col-gold-soft);
  opacity: 0.5;
  margin-bottom: 24px;
  position: relative;
  z-index: 1;
}

.page-the-college .col-bc-desc {
  font-size: var(--fs-ui);
  color: var(--cream-65);
  line-height: calc(1.85 * var(--lh-scale));
  flex: 1;
  position: relative;
  z-index: 1;
}

.page-the-college .col-bc-desc em {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  color: var(--col-cream-85);
  font-size: var(--fs-ui);
}

.page-the-college .col-holds-coda {
  margin-top: 64px;
  padding-top: 48px;
  border-top: 1px solid var(--gold-line);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 32px;
}

.page-the-college .col-holds-coda-rule {
  width: 48px;
  height: 1px;
  background: var(--gold);
  opacity: 0.3;
  flex-shrink: 0;
}

.page-the-college .col-holds-coda-text {
  font-family: 'EB Garamond', serif;
  font-size: 22px;
  font-style: italic;
  color: var(--cream-65);
  text-align: center;
}

/* ========== SECTION 4 — EXAMINING FUNCTION ========== */
.page-the-college .col-examines {
  background: var(--col-deep);
  border-bottom: 1px solid var(--gold-line);
}

.page-the-college .col-examines-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 120px 72px;
}

.page-the-college .col-examines-pair {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 64px;
  margin-bottom: 64px;
  align-items: start;
}

.page-the-college .col-ex-pair-cell {
  padding: 64px 48px 56px;
  background: rgba(242, 237, 224, 0.025);
  border: 1px solid var(--gold-line);
  position: relative;
  overflow: hidden;
}

.page-the-college .col-ex-pair-cell::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 32px;
  height: 1px;
  background: var(--gold);
  opacity: 0.5;
}

.page-the-college .col-ex-pair-label {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--gold);
  opacity: 0.7;
  margin-bottom: 32px;
}

.page-the-college .col-ex-pair-pull {
  font-family: 'EB Garamond', serif;
  font-size: clamp(54px, 6.4vw, 33px);
  font-weight: 400;
  font-style: italic;
  color: var(--gold);
  line-height: 0.95;
  letter-spacing: -1.5px;
}

.page-the-college .col-ex-pair-cell--cream .col-ex-pair-pull {
  color: var(--cream);
  opacity: 0.85;
}

.page-the-college .col-examines-body {
  font-size: var(--fs-body);
  line-height: calc(1.95 * var(--lh-scale));
  color: var(--cream-65);
  max-width: 780px;
}

.page-the-college .col-examines-body p {
  font-size: var(--fs-body);
  margin-bottom: 22px;
}

.page-the-college .col-examines-body p:last-child {
  margin-bottom: 0;
}

.page-the-college .col-examines-body em {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  color: var(--col-cream-85);
}

/* ========== SECTION 5 — THE STANDARD ========== */
.page-the-college .col-standard {
  background: var(--green);
  border-bottom: 1px solid var(--gold-line);
}

.page-the-college .col-standard-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 120px 72px;
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: 96px;
  align-items: center;
}

.page-the-college .col-std-marker {
  display: block;
  font-family: 'EB Garamond', serif;
  font-size: clamp(72px, 9vw, 33px);
  font-weight: 400;
  font-style: italic;
  color: var(--gold);
  line-height: 0.95;
  letter-spacing: -3px;
  margin-bottom: 32px;
}

.page-the-college .col-std-pull {
  font-family: 'EB Garamond', serif;
  font-size: clamp(30px, 3.4vw, 33px);
  font-weight: 400;
  font-style: italic;
  color: var(--cream);
  line-height: 1.22;
  letter-spacing: -0.5px;
}

.page-the-college .col-std-body {
  font-size: var(--fs-body);
  line-height: calc(1.95 * var(--lh-scale));
  color: var(--cream-65);
}

.page-the-college .col-std-body p {
  font-size: var(--fs-body);
  margin-bottom: 22px;
}

.page-the-college .col-std-body p:last-child {
  margin-bottom: 0;
}

.page-the-college .col-std-body em {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  color: var(--col-cream-85);
}

/* Two-statement contrast block — Consistency / Judgment */
.page-the-college .col-contrast {
  margin-top: 48px;
  padding-top: 32px;
  border-top: 1px solid var(--gold-line);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
}

.page-the-college .col-contrast-label {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--gold);
  opacity: 0.95;
  margin-bottom: 8px;
}

.page-the-college .col-contrast-word {
  font-family: 'EB Garamond', serif;
  font-size: clamp(28px, 3vw, 38px);
  font-weight: 400;
  font-style: italic;
  color: var(--cream);
  line-height: 1.05;
  letter-spacing: -0.5px;
}

.page-the-college .col-contrast-cell--neg .col-contrast-word {
  color: var(--col-cream-45);
  text-decoration: line-through;
  text-decoration-color: rgba(184, 150, 46, 0.4);
  text-decoration-thickness: 1px;
}

/* ========== CLOSE ========== */
.page-the-college .col-close {
  background: var(--col-deep);
  position: relative;
}

.page-the-college .col-close-inner {
  max-width: 960px;
  margin: 0 auto;
  padding: 140px 72px 120px;
  text-align: center;
}

.page-the-college .col-close-marker {
  width: 80px;
  height: 1px;
  background: var(--col-gold-soft);
  opacity: 0.9;
  margin: 0 auto 56px;
}

.page-the-college .col-close-line-1 {
  font-family: 'EB Garamond', serif;
  font-size: clamp(36px, 4.4vw, 33px);
  font-style: italic;
  font-weight: 400;
  color: var(--cream);
  line-height: 1.22;
  margin-bottom: 48px;
  letter-spacing: -0.5px;
}

.page-the-college .col-close-rule {
  width: 48px;
  height: 1px;
  background: var(--gold);
  opacity: 0.5;
  margin: 0 auto 48px;
}

.page-the-college .col-close-line-2 {
  font-family: 'EB Garamond', serif;
  font-size: 22px;
  font-style: italic;
  color: var(--gold);
  opacity: 0.85;
  line-height: 1.5;
  margin-bottom: 96px;
}

.page-the-college .col-close-seal {
  display: flex;
  justify-content: center;
  align-items: center;
}

.page-the-college .col-close-seal img {
  width: 300px;
  height: 300px;
  object-fit: contain;
  clip-path: circle(70% at 50% 50%);
  -webkit-clip-path: circle(70% at 50% 50%);
}

/* ========== RESPONSIVE — COLLEGE ========== */
@media (max-width: 1080px) {
  .page-the-college .col-hero {
    grid-template-columns: 1fr;
  }

  .page-the-college .col-hero-left {
    border-right: none;
    border-bottom: 1px solid var(--gold-line);
    padding: 60px 40px;
  }

  .page-the-college .col-hero-right {
    padding: 60px 40px;
  }

  .page-the-college .col-what-is-inner,
  .page-the-college .col-holds-inner,
  .page-the-college .col-examines-inner,
  .page-the-college .col-standard-inner {
    padding: 80px 40px;
  }

  .page-the-college .col-what-is-inner,
  .page-the-college .col-standard-inner {
    grid-template-columns: 1fr;
    gap: 48px;
  }

  .page-the-college .col-what-is-left {
    position: static;
  }

  .page-the-college .col-branches {
    grid-template-columns: 1fr;
  }

  .page-the-college .col-holds-header {
    grid-template-columns: 1fr;
    gap: 32px;
  }

  .page-the-college .col-examines-pair {
    grid-template-columns: 1fr;
    gap: 24px;
  }

  .page-the-college .col-close-inner {
    padding: 80px 40px 60px;
  }
}

@media (max-width: 640px) {
  .page-the-college .col-tri-row {
    grid-template-columns: 1fr;
    border-bottom: none;
  }

  .page-the-college .col-tri-cell {
    border-right: none;
    border-bottom: 1px solid var(--gold-line);
  }

  .page-the-college .col-tri-cell:last-child {
    border-bottom: 1px solid var(--gold-line);
  }

  .page-the-college .col-contrast {
    grid-template-columns: 1fr;
  }

  .page-the-college .col-holds-coda {
    flex-direction: column;
    gap: 20px;
  }

  .page-the-college .col-bc {
    padding: 48px 32px;
    min-height: auto;
  }
}

/* =====================================================================
   THE BANDS — full page (typographic; band letters carry the page)
   All selectors scoped under .page-thehe site's green / gold / cream palette
   so the Library reads as part of the College rather than a stray light page.

/* ---------- Article ---------- */
/* The article takes the Library's measure like every other reading block —
   `--measure` plus its own side padding, so the text inside it is the measure
   and not the measure minus the padding. It was a flat 760px, which happened
   to land near 74ch at one font size and would have drifted away from it at
   any other. */
.page-library-article .lib-article {
  max-width: calc(var(--measure) + 2.5rem);
  margin: 0 auto;
  padding: calc(88px + 2.5rem) 1.25rem 5rem;
}

.page-library-article .lib-crumb {
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--ground-mute);
  margin-bottom: 2.5rem;
}

.page-library-article .lib-crumb a {
  color: var(--ground-kick);
  text-decoration: none;
}

.page-library-article .lib-crumb a:hover {
  color: var(--ground-ink);
}

/* The trail is an ordered list, so it needs its own list styling: without
   this it renders as "1. THE LIBRARY / 2. WORKING EQUITATION" down the page.
   The markup is an <ol> because the order is meaningful — it is a path, and
   BreadcrumbList mirrors it by position. */
.page-library-article .lib-crumb ol {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0 0.5rem;
  margin: 0;
  padding: 0;
}

/* The separator is CSS and never a text character: written into the markup it
   is announced between every level by a screen reader, and it would also have
   to be kept out of the BreadcrumbList `name` values by hand. Same reasoning
   the handover applies to the trail itself. */
.page-library-article .lib-crumb li + li::before {
  content: "\203A";
  margin-right: 0.5rem;
  color: var(--gold-line);
}

.page-library-article .lib-crumb [aria-current] {
  color: var(--ground-mute);
}

/* Read next — the further-reading pointers, ruled publishable on 21 Aug 2026.
   Modest page furniture: it sits between sections and must not compete with a
   heading. The arrow is drawn here rather than written into the copy, for the
   same reason as the breadcrumb separator above. */
.page-library-article .lib-readnext {
  font-family: var(--body);
  font-size: var(--fs-note);
  color: var(--ground-ink-soft);
  border-left: 1px solid var(--gold-line);
  padding-left: 1rem;
  margin: 2rem 0;
}

.page-library-article .lib-readnext strong {
  font-family: var(--word);
  font-weight: 600;
  letter-spacing: .24em;
  text-transform: uppercase;
  font-size: var(--fs-label);
  color: var(--ground-kick);
}

.page-library-article .lib-readnext strong::after {
  content: "\2192";
  margin-left: 0.4rem;
  color: var(--gold-line);
}

.page-library-article .lib-readnext a {
  color: var(--ground-ink);
  text-decoration: none;
  border-bottom: 1px solid var(--gold-line);
}

.page-library-article .lib-readnext a:hover {
  color: var(--ground-kick);
}

/* The eyebrow is `.kick` now, as it is everywhere else on the estate: the
   same face, the same rung, the same tracking, and the ground contract's
   kicker colour rather than a hard-coded gold. */
.page-library-article .kick {
  display: inline-block;
  font-family: var(--word);
  font-size: var(--fs-eyebrow);
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--ground-kick);
  font-weight: 600;
  margin-bottom: 1rem;
}

.page-library-article .kick a {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid var(--gold-line);
}

.page-library-article .kick a:hover {
  color: var(--ground-ink);
}

.page-library-article .lib-standfirst {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  font-weight: 400;
  font-size: var(--fs-prose);
  line-height: 1.5;
  color: var(--ground-ink-soft);
  margin-bottom: 2rem;
}

.page-library-article .lib-figure {
  margin: 2.5rem 0;
}

.page-library-article .lib-figure img {
  width: 80%;
  height: auto;
  display: block;
  margin-inline: auto;
  border: 1px solid var(--gold-line);
}

.page-library-article .lib-figure figcaption {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  font-size: var(--fs-note);
  color: var(--ground-mute);
  margin-top: 0.75rem;
  text-align: center;
}

.page-library-article .lib-body {
  font-family: var(--body);
  font-size: var(--fs-body);
  line-height: calc(1.45 * var(--lh-scale));
  color: var(--ground-ink-soft);
}

.page-library-article .lib-body h4 {
  font-family: var(--word);
  font-weight: 500;
  font-size: var(--fs-prose);
  margin: 2rem 0 0.5rem;
  color: var(--ground-ink);
  scroll-margin-top: 110px;
}

/* Mini-title headings read as labels, not anchors — hide the permalink. */
.page-library-article .lib-body h4 .toc-link {
  display: none;
}

/* EB Garamond ships 400 and 500 (see base.html). A `strong` asks for 700,
   which no loaded face answers, so the browser synthesises one by smearing
   what it has — the same fault as a Cormorant title at
   400 falling back to Georgia. 600 is loaded for exactly this, and the
   emphasis is carried by colour too: the prose is `--ground-ink-soft` and
   this is the full ink.

   A link inside it does not compound: the link already has a colour and a rule
   under it, and adding weight made a bolded link read as a louder kind of link
   than the plain one beside it in the same sentence. */
.page-library-article .lib-body strong {
  font-weight: 600;
  color: var(--ground-ink);
}

.page-library-article .lib-body strong a {
  font-weight: 600;
}

.page-library-article .lib-body em {
  font-family: 'EB Garamond', serif;
  font-style: italic;
  color: var(--ground-ink);
}

.page-library-article .lib-body a {
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--gold-line);
  transition: border-color 0.2s ease;
}

.page-library-article .lib-body a:hover {
  border-bottom-color: var(--gold);
}

/* =====================================================================
/* =====================================================================
   MEMBERS — the welcome page and the Branch contents page are gone, and
   so is everything that dressed them: `.mem-*`, `.mbr-*`,
   `.page-members-article` and `.page-members-contents`, about 950 lines.

   Both pages were removed in August 2026. The welcome asked a rider to
   click *Continue* on a decision the College now makes at the door, and
   the contents listed the Articles the reader's own Branch Navigator
   lists beside the entry being read. Their addresses redirect into the
   reader — see apps.pages.views.MembersDoorView.

   The rules went with them rather than being left behind: a stylesheet
   still dressing a page nobody renders reads as though the page is one
   refresh away, and `.page-members` is still worn by the record, the
   paper, the result, the branch standing and the locked page — anything
   left here would have gone on reaching all five.

   What stays is the two rules below, which were inside that block and
   belong to neither page: the members' footer, and the global x-cloak.
   ===================================================================== */

.page-members .alv-foot {
  border-top: 1px solid rgba(184, 150, 46, 0.13);
  background: var(--green-deep);
}

[x-cloak] {
  display: none !important;
}

/* THE FRONT PAGE'S OWN CSS IS GONE FROM HERE.

   It was `.page-home` plus a set of `.hp-` classes, and it dressed the
   front page that the August 2026 design replaced. Nothing rendered any of
   it any more, but two of its rules named no `hp-` class and so still
   reached the new page through its body class — `.page-home section` and,
   worse, `.page-home p { color: var(--cream-65) }`, which set cream type on
   every paragraph. A passage that gives its prose a colour to inherit
   cannot beat that at any specificity, because the paragraph is targeted
   and inheritance is not: the front page's two ivory passages were cream
   on cream.

   The page is `.alv-home` now and home.css dresses all of it. */

/* ---------- responsive ---------- */

/* ==========================================================================
   THE MEMBERS' DOOR AND THE EXAMINATIONS

   Five surfaces added when the examinations became recorded sittings and the
   members' area went behind a login:

     .page-account       sign in, register, password reset, confirmation
     .page-paper         a paper being sat — its own page, no navigation
     .page-result        what a sitting evidenced, and what it opened
     .page-locked        an Article the rider's record has not opened
     .page-record        the rider's own record
     .page-branch-exam   the Branch Examination's standing page

   They share the members' palette declared at .page-members above; the
   variables below are the few this group needs that it did not.
   ========================================================================== */

.page-account,
.page-paper,
.page-result,
.page-locked,
.page-record,
.page-branch-exam {
  --ex-green-black: #0C1E13;
  --ex-gline: rgba(184, 150, 46, 0.34);
  --ex-gline-soft: rgba(184, 150, 46, 0.18);
  --ex-cream-72: rgba(242, 237, 224, 0.72);
  --ex-cream-50: rgba(242, 237, 224, 0.5);
  --ex-cream-28: rgba(242, 237, 224, 0.28);
  /* Right and wrong are the only two colours in the estate that are not the
     College's own. A pass must not read as gold, which is decoration here. */
  --ex-right: #6FA57F;
  --ex-wrong: #C97B63;
  background: var(--ex-green-black);
}

/* -- shared furniture ---------------------------------------------------- */

.page-account .acc-main,
.page-paper .pap-main,
.page-result .res-main,
.page-locked .lok-main,
.page-record .rec-main,
.page-branch-exam .bex-main {
  min-height: 70vh;
  padding: clamp(48px, 7vw, 96px) clamp(20px, 5vw, 48px);
}

.page-account .acc-wrap,
.page-result .res-wrap,
.page-record .rec-wrap,
.page-branch-exam .bex-wrap {
  max-width: 860px;
  margin: 0 auto;
}

/* A paper is read one question at a time and its options are prose. Narrower
   than the pages around it, for the same reason a book is. */
.page-paper .pap-wrap {
  max-width: 720px;
  margin: 0 auto;
}

.page-locked .lok-wrap {
  max-width: 560px;
  margin: 0 auto;
  text-align: center;
}

/* One name for one label. These were six -- .acc-kick, .pap-kick, .res-kick,
   .lok-kick, .rec-kick, .bex-kick -- all sharing this single rule, so they
   were already one thing wearing six names.

   The page scopes stay, and they have to: `.kick` is only ever defined scoped
   (`.alv-ed .kick`, `.alv-home .kick`) and there is no unscoped base rule, so
   a bare `.kick` on a `.page-*` template would render as nothing at all. */
.page-account .kick,
.page-paper .kick,
.page-result .kick,
.page-locked .kick,
.page-record .kick,
.page-branch-exam .kick {
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.6px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 14px;
}

.page-account .acc-h1,
.page-paper .pap-h1,
.page-result .res-h1,
.page-locked .lok-h1,
.page-record .rec-h1,
.page-branch-exam .bex-h1 {
  font-family: 'Cormorant Garamond', 'EB Garamond', serif;
  font-weight: 400;
  font-size: clamp(28px, 4.2vw, 42px);
  line-height: 1.15;
  color: var(--cream);
  margin: 0 0 12px;
}

.page-account .acc-stand,
.page-paper .pap-stand,
.page-record .rec-stand,
.page-branch-exam .bex-stand {
  font-size: var(--fs-body-sm);
  line-height: calc(1.7 * var(--lh-scale));
  color: var(--ex-cream-72);
  margin: 0 0 24px;
}

.page-account .acc-seal,
.page-locked .lok-seal,
.page-branch-exam .bex-seal {
  color: var(--gold);
  font-size: 24px;
  margin-bottom: 12px;
}

.page-account .acc-submit,
.page-paper .pap-submit {
  width: 100%;
  background: var(--gold);
  color: var(--green-deep);
  border: 1px solid var(--gold);
  padding: 14px 28px;
  font-family: 'EB Garamond', serif;
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.5px;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}

.page-account .acc-submit:hover,
.page-paper .pap-submit:hover:not(:disabled) {
  background: transparent;
  color: var(--gold);
}

.page-paper .pap-submit:disabled {
  opacity: 0.55;
  cursor: progress;
}

.page-account .acc-alt a,
.page-record .rec-more a,
.page-result .res-qref a {
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--ex-gline);
}

/* -- the paper ------------------------------------------------------------ */

.page-paper .pap-head {
  border-bottom: 1px solid var(--ex-gline);
  padding-bottom: 28px;
  margin-bottom: 36px;
}

/* Said once, at the top, and it must not be missable: this page was practice
   and a rider who remembers that must not assume it still is. */
.page-paper .pap-warn {
  border: 1px solid var(--gold);
  padding: 14px 18px;
  font-size: var(--fs-ui);
  line-height: calc(1.65 * var(--lh-scale));
  color: var(--cream);
  margin: 20px 0 0;
}

.page-paper .pap-error {
  border: 1px solid var(--ex-wrong);
  padding: 16px 20px;
  margin-bottom: 32px;
}

.page-paper .pap-error p {
  font-size: var(--fs-ui);
  line-height: calc(1.65 * var(--lh-scale));
  color: var(--cream);
  margin: 0 0 8px;
}

.page-paper .pap-error p:last-child {
  margin: 0;
}

.page-paper .pap-grouph {
  font-family: 'EB Garamond', serif;
  font-weight: 400;
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.6px;
  text-transform: uppercase;
  color: var(--gold);
  border-bottom: 1px solid var(--ex-gline-soft);
  padding-bottom: 8px;
  margin: 40px 0 24px;
}

.page-paper .pap-q {
  border: none;
  margin: 0 0 34px;
  padding: 0;
}

.page-paper .pap-qstem {
  font-size: var(--fs-body-lg);
  line-height: calc(1.6 * var(--lh-scale));
  color: var(--cream);
  padding: 0;
  margin-bottom: 14px;
}

.page-paper .pap-qno {
  color: var(--gold);
  margin-right: 6px;
}

.page-paper .pap-opts {
  list-style: none;
  margin: 0;
  padding: 0;
}

.page-paper .pap-opt {
  display: grid;
  grid-template-columns: 22px 24px 1fr;
  align-items: baseline;
  gap: 10px;
  border: 1px solid var(--ex-gline-soft);
  padding: 12px 16px;
  margin-bottom: 8px;
  cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}

.page-paper .pap-opt:hover {
  border-color: var(--ex-gline);
  background: rgba(242, 237, 224, 0.03);
}

/* The chosen answer is marked by the row, not only by the radio — a 14px dot
   is not an answer to "which did I pick" on a ten-question paper. */
.page-paper .pap-opt:has(input:checked) {
  border-color: var(--gold);
  background: rgba(184, 150, 46, 0.08);
}

.page-paper .pap-opt:has(input:focus-visible) {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}

.page-paper .pap-opt input {
  accent-color: var(--gold);
  width: 16px;
  height: 16px;
}

.page-paper .pap-opt-ltr {
  color: var(--gold);
  font-size: var(--fs-note);
  letter-spacing: 1px;
}

.page-paper .pap-opt-txt {
  font-size: var(--fs-body-sm);
  line-height: calc(1.6 * var(--lh-scale));
  color: var(--ex-cream-72);
}

.page-paper .pap-foot {
  border-top: 1px solid var(--ex-gline);
  padding-top: 28px;
  margin-top: 44px;
  text-align: center;
}

.page-paper .pap-progress {
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--ex-cream-50);
  margin: 0 0 18px;
}

.page-paper .pap-footnote {
  font-size: var(--fs-note);
  line-height: calc(1.6 * var(--lh-scale));
  color: var(--ex-cream-50);
  margin: 16px 0 0;
}

.page-paper .pap-back {
  display: inline-block;
  margin-top: 14px;
  font-size: var(--fs-meta);
  color: var(--ex-cream-28);
  text-decoration: none;
  border-bottom: 1px solid transparent;
}

.page-paper .pap-back:hover {
  color: var(--ex-cream-50);
  border-bottom-color: var(--ex-gline-soft);
}

/* -- the result ----------------------------------------------------------- */

.page-result .res-head {
  border-bottom: 1px solid var(--ex-gline);
  padding-bottom: 24px;
  margin-bottom: 32px;
}

.page-result .res-date {
  font-size: var(--fs-note);
  color: var(--ex-cream-50);
  margin: 0;
}

.page-result .res-verdict {
  border: 1px solid var(--ex-gline);
  border-left-width: 3px;
  padding: clamp(24px, 3.5vw, 36px);
  text-align: center;
  margin-bottom: 40px;
}

.page-result .res-verdict.is-pass {
  border-left-color: var(--ex-right);
}

.page-result .res-verdict.is-short {
  border-left-color: var(--ex-wrong);
}

.page-result .res-band {
  font-family: 'Cormorant Garamond', 'EB Garamond', serif;
  font-size: clamp(34px, 6vw, 54px);
  line-height: 1;
  color: var(--cream);
  letter-spacing: 2px;
  margin-bottom: 8px;
}

.page-result .res-verdict.is-pass .res-band {
  color: var(--ex-right);
}

.page-result .res-verdict.is-short .res-band {
  color: var(--ex-wrong);
}

.page-result .res-mark {
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.4px;
  text-transform: uppercase;
  color: var(--ex-cream-50);
  margin-bottom: 20px;
}

.page-result .res-say {
  font-size: var(--fs-body-sm);
  line-height: calc(1.7 * var(--lh-scale));
  color: var(--ex-cream-72);
  max-width: 54ch;
  margin: 0 auto 24px;
}

.page-result .res-acts,
.page-locked .lok-acts,
.page-branch-exam .bex-acts {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  justify-content: center;
}

.page-result .res-act,
.page-locked .lok-act,
.page-branch-exam .bex-act {
  display: inline-block;
  border: 1px solid var(--ex-gline);
  padding: 11px 20px;
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--ex-cream-72);
  text-decoration: none;
  transition: border-color 0.2s ease, color 0.2s ease;
}

.page-result .res-act:hover,
.page-locked .lok-act:hover,
.page-branch-exam .bex-act:hover {
  border-color: var(--gold);
  color: var(--cream);
}

.page-result .res-act--main,
.page-locked .lok-act--main,
.page-branch-exam .bex-act--main {
  background: var(--gold);
  border-color: var(--gold);
  color: var(--green-deep);
}

.page-result .res-act--main:hover,
.page-locked .lok-act--main:hover,
.page-branch-exam .bex-act--main:hover {
  background: transparent;
  color: var(--gold);
}

.page-result .res-ar,
.page-locked .lok-ar,
.page-branch-exam .bex-ar {
  margin-left: 8px;
}

.page-result .res-h2,
.page-record .rec-h2 {
  font-family: 'EB Garamond', serif;
  font-weight: 400;
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.6px;
  text-transform: uppercase;
  color: var(--gold);
  border-bottom: 1px solid var(--ex-gline-soft);
  padding-bottom: 8px;
  margin: 44px 0 20px;
}

.page-result .res-h3 {
  font-family: 'EB Garamond', serif;
  font-weight: 400;
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--ex-cream-50);
  margin: 32px 0 16px;
}

.page-result .res-comps {
  list-style: none;
  margin: 0;
  padding: 0;
}

.page-result .res-comp {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: 11px 0;
  border-bottom: 1px solid var(--ex-gline-soft);
  font-size: var(--fs-body-sm);
  color: var(--ex-cream-72);
}

.page-result .res-comp-n {
  color: var(--gold);
  letter-spacing: 1px;
}

.page-result .res-note {
  font-size: var(--fs-ui);
  line-height: calc(1.65 * var(--lh-scale));
  color: var(--ex-cream-50);
  margin: 0 0 24px;
}

.page-result .res-q {
  border-left: 2px solid var(--ex-gline-soft);
  padding: 0 0 0 18px;
  margin-bottom: 26px;
}

.page-result .res-q.is-right {
  border-left-color: var(--ex-right);
}

.page-result .res-q.is-wrong {
  border-left-color: var(--ex-wrong);
}

.page-result .res-qmark {
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: 2.2px;
  text-transform: uppercase;
  margin: 0 0 8px;
}

.page-result .res-q.is-right .res-qmark {
  color: var(--ex-right);
}

.page-result .res-q.is-wrong .res-qmark {
  color: var(--ex-wrong);
}

.page-result .res-qstem {
  font-size: var(--fs-body);
  line-height: calc(1.6 * var(--lh-scale));
  color: var(--cream);
  margin: 0 0 10px;
}

.page-result .res-qno {
  color: var(--gold);
  margin-right: 5px;
}

.page-result .res-qline {
  font-size: var(--fs-ui);
  line-height: calc(1.6 * var(--lh-scale));
  color: var(--ex-cream-72);
  margin: 0 0 5px;
}

.page-result .res-qline b {
  color: var(--ex-cream-50);
  font-weight: 400;
  font-size: var(--fs-eyebrow);
  letter-spacing: 1.6px;
  text-transform: uppercase;
  margin-right: 6px;
}

.page-result .res-qwhy {
  font-size: var(--fs-ui);
  line-height: calc(1.65 * var(--lh-scale));
  font-style: italic;
  color: var(--ex-cream-50);
  margin: 10px 0 0;
}

/* Why the rider's own answer is wrong, as against why the right one is right.
   Ruled and set brighter: it is about a choice they made, and it is the first
   thing they look for. */
.page-result .res-qwhy--yours {
  border-left: 2px solid rgba(201, 162, 74, 0.45);
  padding-left: 12px;
  color: rgba(242, 237, 224, 0.72);
}

.page-result .res-qref {
  font-size: var(--fs-meta);
  margin: 10px 0 0;
}

/* -- the locked page ------------------------------------------------------ */

.page-locked .lok-say {
  font-size: var(--fs-body-lg);
  line-height: calc(1.65 * var(--lh-scale));
  color: var(--cream);
  margin: 0 0 20px;
}

.page-locked .lok-why {
  font-size: var(--fs-ui);
  line-height: calc(1.7 * var(--lh-scale));
  color: var(--ex-cream-50);
  margin: 0 0 32px;
}

/* -- the record ----------------------------------------------------------- */

.page-record .rec-head {
  border-bottom: 1px solid var(--ex-gline);
  padding-bottom: 24px;
  margin-bottom: 12px;
}

.page-record .rec-bands,
.page-record .rec-articles {
  list-style: none;
  margin: 0;
  padding: 0;
}

.page-record .rec-bandrow,
.page-record .rec-arow {
  display: grid;
  grid-template-columns: 44px 1fr auto;
  gap: 14px;
  align-items: baseline;
  padding: 12px 0;
  border-bottom: 1px solid var(--ex-gline-soft);
}

.page-record .rec-band,
.page-record .rec-aband {
  font-family: 'Cormorant Garamond', 'EB Garamond', serif;
  font-size: 26px;
  line-height: 1;
  color: var(--gold);
  text-align: center;
}

.page-record .rec-arow.is-locked .rec-aband,
.page-record .rec-arow.is-locked .rec-atitle {
  color: var(--ex-cream-28);
}

.page-record .rec-arow.is-passed .rec-aband {
  color: var(--ex-right);
}

.page-record .rec-bandbr,
.page-record .rec-atitle {
  font-size: var(--fs-body-sm);
  color: var(--cream);
}

.page-record .rec-atitle a {
  color: var(--cream);
  text-decoration: none;
  border-bottom: 1px solid var(--ex-gline-soft);
}

.page-record .rec-atitle a:hover {
  border-bottom-color: var(--gold);
}

.page-record .rec-bandsince,
.page-record .rec-astate {
  font-size: var(--fs-eyebrow);
  letter-spacing: 1.8px;
  text-transform: uppercase;
  color: var(--ex-cream-50);
  white-space: nowrap;
}

.page-record .rec-none,
.page-record .rec-prog,
.page-record .rec-more {
  font-size: var(--fs-body-sm);
  line-height: calc(1.7 * var(--lh-scale));
  color: var(--ex-cream-72);
  margin: 0 0 18px;
}

.page-record .rec-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-ui);
}

.page-record .rec-table th {
  text-align: left;
  font-weight: 400;
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--ex-cream-50);
  border-bottom: 1px solid var(--ex-gline);
  padding: 8px 10px 8px 0;
}

.page-record .rec-table td {
  padding: 11px 10px 11px 0;
  border-bottom: 1px solid var(--ex-gline-soft);
  color: var(--ex-cream-72);
  vertical-align: top;
}

.page-record .rec-table a {
  color: var(--gold);
  text-decoration: none;
}

.page-record .rec-resit {
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: 1.6px;
  text-transform: uppercase;
  color: var(--ex-cream-28);
  margin-left: 8px;
}

/* The record's table is the one place here with more columns than a phone
   has room for. It scrolls inside itself rather than pushing the page wide. */
@media (max-width: 640px) {
  .page-record .rec-table {
    display: block;
    overflow-x: auto;
    white-space: nowrap;
  }
}

/* -- the Branch Examination standing page --------------------------------- */

.page-branch-exam .bex-head {
  border-bottom: 1px solid var(--ex-gline);
  padding-bottom: 24px;
  margin-bottom: 32px;
}

.page-branch-exam .bex-panel {
  border: 1px solid var(--ex-gline);
  border-left-width: 3px;
  padding: clamp(24px, 3.5vw, 36px);
  text-align: center;
}

.page-branch-exam .bex-panel.is-pass {
  border-left-color: var(--ex-right);
}

.page-branch-exam .bex-panel.is-locked {
  border-left-color: var(--ex-cream-28);
}

.page-branch-exam .bex-band {
  font-family: 'Cormorant Garamond', 'EB Garamond', serif;
  font-size: clamp(32px, 5.5vw, 48px);
  line-height: 1;
  color: var(--gold);
  margin-bottom: 14px;
}

.page-branch-exam .bex-panel.is-pass .bex-band {
  color: var(--ex-right);
}

.page-branch-exam .bex-say,
.page-branch-exam .bex-panel p {
  font-size: var(--fs-body-sm);
  line-height: calc(1.7 * var(--lh-scale));
  color: var(--ex-cream-72);
  max-width: 54ch;
  margin: 0 auto 18px;
}

.page-branch-exam .bex-progress {
  font-size: var(--fs-eyebrow);
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gold);
  margin-bottom: 24px;
}

/* -- the nav's account menu ------------------------------------------------
   Everything about the *account*, as against the College, behind one icon.
   Built on .nav-lang so the two controls behave and look identical; only what
   genuinely differs is restated here.
   ------------------------------------------------------------------------ */

/* The toggle is worded, like the language one beside it — but the word is the
   first thing to go when the bar runs out of room.

   The band is bounded at *both* ends on purpose. Below 1361px the nav is a
   burger and the popup flattens into it, where the toggle stops being one
   control among several and becomes the heading over its own section; a lone
   glyph reads as a stray mark there, so the word must stay. Above it, adding
   ACCOUNT to six College items overlapped the brand at 1440 and was tight at
   1520 — measured, not guessed — so the word returns only once there is room
   for it. The icon alone is unambiguous beside the globe. */
@media (min-width: 1361px) and (max-width: 1560px) {
  .alv-nav .nav-acct-name {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
}

/* Even icon-only, an eighth control does not clear the wordmark at the bottom
   of the horizontal band. The gap's floor drops for the last stretch above the
   burger — scoped to `.nav-has-account`, so the signed-out bar keeps exactly
   the spacing it was designed with. */
@media (min-width: 1361px) and (max-width: 1460px) {
  .alv-nav.nav-has-account .nav-links {
    gap: clamp(18px, 1.7vw, 40px);
  }
}

/* Wide enough for the longest row — "My payment methods" and its tag — on one
   line. It wrapped at 214px and dropped the tag beneath the label, which read
   as two rows rather than one disabled one. */
.alv-nav .nav-acct-menu {
  min-width: 258px;
  padding: 0;
}

/* Anchors, the disabled placeholders and the sign-out button are one column of
   rows: same box, same rhythm. The button carried none of it before, which is
   what read as broken. */
.alv-nav .nav-acct-menu a,
.alv-nav .nav-acct-soon,
.alv-nav .nav-acct-out button {
  display: block;
  width: 100%;
  box-sizing: border-box;
  text-align: left;
  padding: 10px 18px;
  font-family: 'EB Garamond', serif;
  font-size: 14px;
  letter-spacing: 1.5px;
  text-transform: none;
  background: none;
  border: 0;
  color: var(--cream-80);
  transition: color 0.2s ease, background 0.2s ease;
}

.alv-nav .nav-acct-menu a:hover,
.alv-nav .nav-acct-out button:hover {
  color: var(--gold);
  background: rgba(184, 150, 46, 0.08);
}

.alv-nav .nav-acct-out button {
  cursor: pointer;
}

.alv-nav .nav-acct-menu a.active {
  color: var(--gold);
}

/* Whose account this is. Not a row — it is a heading over them, and must not
   invite a click. */
.alv-nav .nav-acct-who {
  margin: 0;
  padding: 12px 18px 10px;
  border-bottom: 1px solid var(--gold-line);
  font-size: 12px;
  line-height: 1.3;
  letter-spacing: 1.2px;
  color: var(--gold);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 260px;
}

/* Dimmed, and saying why. A placeholder that only looked disabled would read
   as a broken link; the tag is what tells the difference.

   A flex row, so the tag sits at the right-hand edge and the two placeholders
   line their tags up with each other rather than each trailing its own label
   at whatever width it happens to be. */
.alv-nav .nav-acct-soon {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  white-space: nowrap;
  color: var(--cream-30);
  cursor: default;
}

.alv-nav .nav-acct-soon em {
  flex: none;
  font-style: normal;
  font-size: 9px;
  letter-spacing: 1.6px;
  text-transform: uppercase;
  color: var(--cream-30);
  border: 1px solid var(--hair);
  padding: 1px 5px;
}

/* Sign out is the last thing in the list and the only one that changes state,
   so it is ruled off from the rest. */
.alv-nav .nav-acct-out {
  margin: 0;
  border-top: 1px solid var(--gold-line);
}

/* Flattened into the burger menu, as the language list is at the same width. */
@media (max-width: 1360px) {
  .alv-nav .nav-acct-menu {
    min-width: 0;
  }

  .alv-nav .nav-acct-menu a,
  .alv-nav .nav-acct-soon,
  .alv-nav .nav-acct-out button {
    padding: 8px 0;
  }

  /* Flattened into the burger, the rows are as wide as the drawer and
     `space-between` threw the tag at the far edge — off the screen on a
     phone, since the drawer is sized by its widest item. The tag follows its
     label instead, and the label may wrap under it if it must. */
  .alv-nav .nav-acct-soon {
    justify-content: flex-start;
    white-space: normal;
  }

  .alv-nav .nav-acct-who {
    padding: 0 0 8px;
    max-width: none;
  }

  .alv-nav .nav-acct-out {
    border-top: 0;
  }
}

/* -- narrow ---------------------------------------------------------------- */

@media (max-width: 720px) {
  .page-account .acc-wrap {
    grid-template-columns: 1fr;
  }

  .page-account .acc-aside {
    border-left: none;
    border-top: 1px solid var(--ex-gline);
    padding-left: 0;
    padding-top: 24px;
  }

  .page-paper .pap-opt {
    grid-template-columns: 22px 24px 1fr;
  }

  .page-record .rec-bandrow,
  .page-record .rec-arow {
    grid-template-columns: 36px 1fr;
  }

  .page-record .rec-bandsince,
  .page-record .rec-astate {
    grid-column: 2;
  }
}

/* =====================================================================
   HOME — the Membership call to action. One filled control, sitting above
   the closing statement: the front page argues the standard, and the prices
   are a page of their own behind this.
   ===================================================================== */

/* ---------------------------------------------------------------------------
   THE POLICY PAGES — Terms, Privacy, Cookies.

   `generic_page.html` has always written `.container`, `.container--narrow`
   and `.prose`, and main.css has never carried a rule for any of them. It went
   unnoticed because until September 2026 no page used the template: the four
   legacy slugs it was written for have no markdown behind them and 404.

   Nothing here names a colour. The ground contract above hands down
   `--ground-ink` for a heading, `--ground-ink-soft` for the prose, and the
   rest; the point of joining that list is that a document changes ground by
   changing one selector rather than by re-picking seven values.

   The container is the estate's `.wrap` — 1200px with the same gutter — and
   the prose sits at its own measure inside it. Those are two different jobs:
   the wrap sets where the page's margins are, and the measure sets how long a
   line is allowed to get. A legal document has nothing to put beside the
   text, so the measure is centred in the wrap rather than left in it.
   --------------------------------------------------------------------------- */
main:has(> .page-content) {
  flex: 1;
  background: var(--sec-ground);
  color: var(--ground-ink-soft);
}

.page-content .container {
  width: 100%;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 clamp(24px, 5vw, 80px);
}

/* `.container--narrow` is the estate's `.wrap` — same 1200px, same gutter.
   The template writes both classes on one element, so this is what wins.

   The MEASURE is set on the prose inside it rather than on the wrap, which is
   how the editorial pages are built: the wrap says where the page's margins
   are, the measure says how long a line may get, and they are two different
   questions. Setting the measure on the wrap answers both with one number and
   leaves a legal document sitting in a column narrower than the nav above it. */
.page-content .container--narrow {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 clamp(24px, 5vw, 80px);
}

/* Left in the wrap, not centred in it — again the editorial arrangement. A
   heading and its prose share one left edge, and the eye returns to that edge
   on every line of a document read at length. */
.page-content .page-title,
.page-content .prose > * {
  max-width: 74ch;
}

.page-content .page-header {
  padding-top: clamp(56px, 9vw, 112px);
}

.page-content .page-title {
  color: var(--ground-ink);
}

.page-content .content-section {
  padding-bottom: clamp(64px, 10vw, 120px);
}

.page-content .prose {
  font-family: var(--body);
  font-size: calc(17px * var(--fs-scale));
  line-height: 1.62;
  color: var(--ground-ink-soft);
}

.page-content .prose > * + * {
  margin-top: 1.05em;
}

/* A numbered clause is a landmark in a document somebody is scanning rather
   than reading, so it gets air above it and the heading ink, which is darker
   than the prose beneath it by design. */
.page-content .prose h2 {
  font-family: var(--word);
  font-weight: 600;
  font-size: calc(25px * var(--fs-scale));
  line-height: 1.2;
  color: var(--ground-ink);
  margin-top: 2.2em;
  margin-bottom: .55em;
}

.page-content .prose h3 {
  font-family: var(--word);
  font-weight: 600;
  font-size: calc(19px * var(--fs-scale));
  color: var(--ground-ink);
  margin-top: 1.7em;
  margin-bottom: .4em;
}

.page-content .prose h2:first-child,
.page-content .prose h3:first-child {
  margin-top: 0;
}

/* The markdown TOC extension appends a pilcrow anchor to every heading. Left
   unstyled it is a blue ¶ after each one. Hidden until the heading is hovered
   or the anchor focused, which is the Library's own answer to the same tag. */
.page-content .prose .toc-link {
  opacity: 0;
  margin-left: .35em;
  text-decoration: none;
  color: var(--ground-kick);
  transition: opacity .2s;
}

.page-content .prose h2:hover .toc-link,
.page-content .prose h3:hover .toc-link,
.page-content .prose .toc-link:focus-visible {
  opacity: .55;
}

/* Every link on a document page, not only the ones inside `.prose`. Scoped
   there first, the secondary action under the registration form came out in
   the browser's default blue on the paper. The nav and the footer are outside
   `.page-content` and keep their own treatment. */
.page-content a {
  color: var(--ground-ink);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-color: var(--ground-hair);
  transition: color .2s ease;
}

.page-content a:hover,
.page-content a:focus-visible {
  color: var(--ground-kick);
  text-decoration-color: var(--ground-kick);
}

.page-content .prose ul,
.page-content .prose ol {
  padding-left: 1.4em;
}

.page-content .prose li + li {
  margin-top: .4em;
}

.page-content .prose strong {
  font-weight: 600;
  color: var(--ground-ink);
}

.page-content .prose em {
  color: var(--ground-ink);
}

.page-content .prose table {
  width: 100%;
  border-collapse: collapse;
  font-size: calc(15px * var(--fs-scale));
  margin-top: 1.4em;
}

/* The table breaks the measure, and only the table. 74ch is chosen for a line
   of prose; four columns held to it wrap "Purpose" onto five lines and turn a
   thing meant to be scanned into a thing that has to be read. It reaches out
   symmetrically so the prose above and below still governs the centre line,
   and only where there is room for it to. */
@media (min-width: 1040px) {
  .page-content .prose table {
    /* `.prose > *` caps every child at the measure, which is what makes the
       measure a measure. The table is the exception and has to say so, or the
       max-width simply clamps the extra width back off again. */
    max-width: none;
    width: min(100%, calc(74ch + 240px));
  }
}

.page-content .prose thead th {
  font-family: var(--word);
  font-weight: 600;
  text-align: left;
  color: var(--ground-kick);
  border-bottom: 1px solid var(--ground-hair);
  padding: 0 14px 8px 0;
}

.page-content .prose tbody td {
  vertical-align: top;
  padding: 9px 14px 9px 0;
  border-bottom: 1px solid var(--ground-hair);
}

.page-content .prose tbody tr:last-child td {
  border-bottom: 0;
}

.page-content .prose code {
  font-size: .88em;
  color: var(--ground-ink);
  background: rgba(60, 52, 24, .07);
  border-radius: 2px;
  padding: 1px 5px;
}

/* The version line at the foot of each document. */
.page-content .prose hr {
  border: 0;
  border-top: 1px solid var(--ground-hair);
  margin: 2.6em 0 1.4em;
}

.page-content .prose hr + p {
  font-size: var(--fs-meta);
  letter-spacing: .04em;
  color: var(--ground-mute);
}

@media (max-width: 720px) {
  .page-content .prose table {
    display: block;
    overflow-x: auto;
  }
}


/* ---------------------------------------------------------------------------
   THE REGISTRAR'S OFFICE FORM

   Unstyled, it was white boxes with grey borders and black text on the paper,
   and a cream button on a cream ground that could not be seen at all. It
   reads the ground contract like everything else on these pages.
   --------------------------------------------------------------------------- */
.page-content .contact-form {
  max-width: 62ch;
  margin-top: 2.4em;
}

.page-content .form-field {
  margin-bottom: 1.5em;
}

.page-content .form-field label {
  display: block;
  font-family: var(--word);
  font-size: var(--fs-eyebrow-sm, calc(12px * var(--fs-scale)));
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--ground-kick);
  margin-bottom: .5em;
}

.page-content .form-field input[type="text"],
.page-content .form-field input[type="email"],
.page-content .form-field input[type="tel"],
.page-content .form-field textarea,
.page-content .form-field select {
  width: 100%;
  font-family: var(--body);
  font-size: calc(16px * var(--fs-scale));
  color: var(--ground-ink);
  background: rgba(255, 255, 255, .38);
  border: 1px solid var(--ground-hair);
  border-radius: 2px;
  padding: 11px 13px;
  transition: border-color .2s ease, background .2s ease;
}

.page-content .form-field input:focus,
.page-content .form-field textarea:focus,
.page-content .form-field select:focus {
  outline: none;
  border-color: var(--ground-kick);
  background: rgba(255, 255, 255, .62);
}

.page-content .form-field textarea {
  resize: vertical;
  min-height: 8em;
}

/* The checkbox keeps its label beside it rather than above: it is a sentence
   the reader agrees with, not a field they fill in. */
.page-content .form-field--checkbox label {
  display: flex;
  align-items: center;
  gap: 10px;
  font-family: var(--body);
  font-size: calc(16px * var(--fs-scale));
  letter-spacing: 0;
  text-transform: none;
  color: var(--ground-ink-soft);
}

.page-content .form-field--checkbox input {
  width: 17px;
  height: 17px;
  accent-color: var(--ground-kick);
  flex: none;
}

.page-content .char-count {
  margin-top: .4em;
  font-size: var(--fs-meta);
  color: var(--ground-mute);
}

/* Errors are hidden until the field is actually invalid. `has-error` is the
   class the form's own script toggles; the markup carries the messages inline
   with `role="alert"`, so leaving them visible would open the page by telling
   the reader everything they have done wrong before they have done anything.

   These out-specify the template's own inline block, which is the di-web-fe
   fork's and styles the same elements against `--spacing-4`, `--radius-md`
   and `--text-sm` -- none of which this estate defines, so all of it resolves
   to nothing. See the note in the template. */
.page-content .field-error {
  display: none;
  margin-top: .4em;
  font-size: var(--fs-meta);
  color: #8a2f22;
}

.page-content .form-field.has-error .field-error {
  display: block;
}

.page-content .form-field.has-error input,
.page-content .form-field.has-error textarea {
  border-color: #8a2f22;
}

.page-content .contact-form .btn,
.page-content .reg-form .btn {
  font-family: var(--word);
  font-size: calc(13px * var(--fs-scale));
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--sec-ground);
  background: var(--ground-ink);
  border: 1px solid var(--ground-ink);
  border-radius: 2px;
  padding: 14px 34px;
  cursor: pointer;
  transition: background .2s ease, color .2s ease;
}

.page-content .contact-form .btn:hover,
.page-content .contact-form .btn:focus-visible,
.page-content .reg-form .btn:hover,
.page-content .reg-form .btn:focus-visible {
  background: var(--ground-kick);
  border-color: var(--ground-kick);
  color: var(--sec-ground);
}

.page-content .contact-form .btn[aria-busy="true"],
.page-content .reg-form .btn[disabled] {
  opacity: .6;
  cursor: progress;
}

.page-content #form-message {
  margin-top: 1.2em;
  font-size: calc(16px * var(--fs-scale));
  color: var(--ground-ink);
}


/* The eyebrow over a document's title — "Membership" above "The December
   Intake". The estate's kicker treatment, reading the ground rather than
   naming the gold, so it darkens on paper as everything else does. */
.page-content .page-kick {
  display: block;
  font-family: var(--word);
  font-size: calc(12px * var(--fs-scale));
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--ground-kick);
  margin-bottom: 10px;
}

/* The opening statement of a document. Larger than the prose under it, and
   the one place the December-intake copy is quoted, so it is set apart. */
.page-content .prose .lede {
  font-size: calc(19px * var(--fs-scale));
  line-height: 1.5;
  color: var(--ground-ink);
}

/* The secondary action beneath a form — "Or speak to the Registrar's Office."
   Quieter than the button it follows, which is the whole point of it. */
.page-content .reg-secondary {
  margin-top: 1.6em;
  font-size: calc(16px * var(--fs-scale));
  color: var(--ground-ink-soft);
}

/* ---------------------------------------------------------------------------
   THE REGISTRAR'S FORM — the Contact page, in the College's design.

   The design's look, in the estate's type and the estate's palette. Those
   three things were the brief for this sheet and the mapping is close to
   one-to-one, because `main:has(> .page-content)` already declares a LIGHT
   ground contract that the design had independently arrived at: its #ece4d0
   paper is `--sec-ground`, its #1e3527 ink is `--ground-ink`, its hairline is
   `--ground-hair`. Only the gold differs, and deliberately — the design's
   #c9a24a sits at about 2.3:1 on cream, which is decoration rather than text,
   and `--ground-kick` is the darker gold the estate uses on light panels for
   exactly that reason.

   The one visual idea worth naming: THE CONTROLS ARE UNDERLINED, NOT BOXED.
   A form of ten boxed inputs reads as a database; a rule under each answer
   reads as a letter being filled in, which is what this is. It is the design's
   decision and the whole reason the page looks like the College rather than
   like a checkout.
   --------------------------------------------------------------------------- */
/* The page opens on the form: no heading, no introduction. `.page-header`
   carried the estate's top padding and went with them, which left the crest
   sitting UNDER the fixed navigation -- drawn, laid out, and behind an opaque
   green bar. The padding moves here, to the element that is now first. */
.page-contact .page-content {
  padding-top: clamp(56px, 9vw, 112px);
  padding-bottom: clamp(64px, 8vw, 120px);

  /* WHAT A VISITOR HAS WRITTEN, in the design's own colour. It is lighter
     than the label above it on purpose: the questions are the College's and
     are set in its ink, and the answers are the visitor's. An answer in the
     same weight and colour as the question makes the two read as one block of
     the College's own text. */
  --reg-answer: #6b6a55;

  /* And the design's ghost for a control nobody has answered yet. It has to
     be a token of its own rather than `--ground-mute`, which is #6f6a52 --
     four points from the answer colour, so a chosen country and an unchosen
     one rendered as the same grey and the placeholder read as a choice. */
  --reg-ghost: #a89d82;
}

/* THE CREST. The College's mark at the head of the letter, from the design.
   Two gradients fading out from a lozenge -- three elements rather than one
   border, because a border cannot fade from both ends at once. */
.page-content .reg-crest {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 7px;
  margin-bottom: 2em;
}

.page-content .reg-crest-word {
  font-family: var(--display, var(--word));
  font-weight: 500;
  font-size: calc(15px * var(--fs-scale));
  letter-spacing: .32em;
  color: var(--ground-ink);
  /* The tracking is applied to the right of every letter including the last,
     which pushes the word off centre by exactly one space. */
  text-indent: .32em;
}

.page-content .reg-crest-word span { color: var(--ground-kick); }

.page-content .reg-crest-rule {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
}

.page-content .reg-crest-line {
  flex: 1;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--ground-kick));
  opacity: .55;
}

.page-content .reg-crest-line:last-child {
  background: linear-gradient(90deg, var(--ground-kick), transparent);
}

.page-content .reg-crest-lozenge {
  width: 4px;
  height: 4px;
  background: var(--ground-kick);
  transform: rotate(45deg);
}

.page-content .reg-form {
  max-width: 34rem;
  margin: 2.4em auto 0;
  animation: reg-rise .5s ease both;
}

@media (prefers-reduced-motion: reduce) {
  .page-content .reg-form { animation: none; }
}

@keyframes reg-rise {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: none; }
}

/* The letterhead: whose desk this is on the left, the date on the right.
   The design's own row, and it reads as a letter being opened rather than as
   a form being begun. */
.page-content .reg-letterhead {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 14px;
  margin-bottom: 1.9em;
  font-size: var(--fs-eyebrow-sm);
  text-transform: uppercase;
}

.page-content .reg-office {
  letter-spacing: .26em;
  color: var(--ground-kick);
  /* The tracking is applied after the last letter too, so without this the
     row is off its left margin by exactly one space. */
  text-indent: .26em;
}

.page-content .reg-date {
  letter-spacing: .16em;
  color: var(--ground-mute);
  white-space: nowrap;
}

/* Fields are a stack with one gap, not a margin per row: sibling margins
   collapse against each other and against the fieldset, which is how a form
   comes to have three different spacings down one column. */
.page-content .reg-form .form-field {
  margin-bottom: 0;
}

.page-content .reg-form > .form-field,
.page-content .reg-form > [data-when],
.page-content .reg-form > .reg-acts,
.page-content .reg-form > .reg-alert {
  margin-bottom: 1.5em;
}

.page-content .reg-form [data-when] > * + * { margin-top: 1.5em; }

.page-content .reg-form label,
.page-content .reg-form legend {
  display: block;
  font-family: var(--word);
  font-size: var(--fs-eyebrow);
  letter-spacing: .2em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--ground-ink);
  margin-bottom: .7em;
  padding: 0;
}

/* UNDERLINED, not boxed. Out-specifies the shared `.form-field` rule above,
   which dresses the estate's other forms and is left alone. */
.page-content .reg-form input[type="text"],
.page-content .reg-form input[type="email"],
.page-content .reg-form input[type="tel"],
.page-content .reg-form input[type="date"],
.page-content .reg-form textarea,
.page-content .reg-form select {
  width: 100%;
  font-family: var(--body);
  font-size: calc(16px * var(--fs-scale));
  color: var(--reg-answer);
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--ground-hair);
  border-radius: 0;
  padding: 2px 0 7px;
  transition: border-color .2s ease;
}

/* A select still showing its blank option is NOT an answer, and must not be
   set as one -- "Choose a country" in the colour of a chosen country reads as
   a country somebody chose. */
.page-content .reg-form select:has(option[value=""]:checked) {
  color: var(--reg-ghost);
}

.page-content .reg-form select {
  /* The chevron is drawn here because the native one cannot be recoloured,
     and an arrow in the browser's grey is the one part of the control that
     would not be the College's. */
  appearance: none;
  padding-right: 1.6em;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' fill='none' stroke='%238a6d1e' stroke-width='1.6'/></svg>");
  background-repeat: no-repeat;
  background-position: right .1em center;
}

/* THE FOCUS RING IS THE UNDERLINE. A box drawn around a control whose whole
   treatment is a rule beneath it undoes the treatment at the moment the
   visitor is looking hardest at it. Two pixels of the estate's gold is a
   clearer indicator than a hairline outline anyway, and it is the design's
   own answer.

   `box-shadow` rather than a thicker border, so the control does not move by
   a pixel as it is focused. */
.page-content .reg-form input:focus,
.page-content .reg-form textarea:focus,
.page-content .reg-form select:focus {
  outline: none;
  border-bottom-color: var(--ground-kick);
  box-shadow: 0 1px 0 0 var(--ground-kick);
  background-color: transparent;
}

/* The textarea is the one boxed control, so its focus is the box. */
.page-content .reg-form textarea:focus {
  border-color: var(--ground-kick);
  box-shadow: none;
}

.page-content .reg-form textarea {
  resize: vertical;
  min-height: 7em;
  border: 1px solid var(--ground-hair);
  padding: .7em .8em;
}

/* The dial code and the number are one question. The code is sized to its
   content so the number keeps the rest of the line. */
.page-content .reg-tel-row {
  display: flex;
  gap: 14px;
  align-items: end;
}

/* Sized so the DIAL CODE is what is read: a `<select>` shows its chosen
   option's text and has no way to show one thing closed and another open, so
   the code leads the label and the control is cut to about the width of it.
   What follows the code is the country, and it truncates -- which is the
   right thing to lose. */
.page-content .reg-tel-row select {
  flex: 0 0 6.5em;
  text-overflow: ellipsis;
}
.page-content .reg-tel-row input { flex: 1 1 auto; min-width: 0; }

/* Required and optional, in the label's own type and in brackets — not a
   size of their own floated to the margin, which read louder than the
   question it was qualifying. */
.page-content .reg-mark {
  font-size: inherit;
  letter-spacing: inherit;
  font-weight: 400;
  color: var(--ground-mute);
  margin-left: .5em;
}

/* The asterisk is the phone's mark and is hidden here — see the note in
   `_registrar_mark.html`. Both it and the word are in the markup at every
   width; only which of them is drawn changes. */
.page-content .reg-mark-star { display: none; }

.page-content .reg-help {
  font-size: var(--fs-meta);
  line-height: 1.55;
  color: var(--ground-mute);
  margin: -.15em 0 .6em;
  text-transform: none;
  letter-spacing: 0;
}

.page-content .reg-count {
  font-size: var(--fs-micro);
  color: var(--ground-mute);
  text-align: right;
  margin-top: .4em;
}

/* The deadline is a pair of choices, not a list of radios: two words side by
   side, the chosen one filled. The input stays in the DOM and keeps the
   keyboard and the screen reader; only its appearance is replaced. */
.page-content .reg-deadline {
  border: 0;
  padding: 0;
  margin: 0;
}

.page-content .reg-yesno { display: flex; gap: 10px; }

.page-content .reg-yesno label {
  display: inline-flex;
  align-items: center;
  margin: 0;
  padding: 9px 22px;
  border: 1px solid var(--ground-hair);
  cursor: pointer;
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: .16em;
  color: var(--ground-ink-soft);
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}

.page-content .reg-yesno input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

.page-content .reg-yesno label:hover { border-color: var(--ground-kick); }

.page-content .reg-yesno label:has(input:checked) {
  background: var(--ground-ink);
  border-color: var(--ground-ink);
  color: var(--sec-ground);
}

.page-content .reg-yesno label:has(input:focus-visible) {
  outline: 2px solid var(--ground-kick);
  outline-offset: 2px;
}

/* The honeypot: off-screen rather than `display: none`, which some bots skip
   and some accessibility tools flag. */
.page-content .reg-hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.page-content .reg-alert {
  border-left: 2px solid #9a5b3c;
  background: rgba(154, 91, 60, .07);
  padding: .9em 1.1em;
  font-size: var(--fs-ui);
  color: var(--ground-ink);
}

.page-content .reg-acts {
  display: flex;
  align-items: center;
  gap: 20px;
  margin-top: 2em;
}

.page-content .reg-form .btn {
  font-family: var(--word);
  font-size: var(--fs-meta);
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--sec-ground);
  background: var(--ground-ink);
  border: 1px solid var(--ground-ink);
  border-radius: 0;
  padding: 14px 34px;
  cursor: pointer;
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}

.page-content .reg-form .btn:hover,
.page-content .reg-form .btn:focus-visible {
  background: var(--ground-kick);
  border-color: var(--ground-kick);
  color: var(--sec-ground);
}

.page-content .reg-form .btn[disabled],
.page-content .reg-form .btn.is-sending { opacity: .55; cursor: progress; }

/* Going back is a link's job wearing a button's markup — it has to be a
   submit so the answers on this page travel with it. */
.page-content .reg-back {
  background: none;
  border: 0;
  padding: 0;
  font-family: var(--word);
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--ground-mute);
  cursor: pointer;
}

.page-content .reg-back:hover,
.page-content .reg-back:focus-visible { color: var(--ground-kick); }

.page-content .reg-privacy {
  margin-top: 2em;
  padding-top: 1.2em;
  border-top: 1px solid var(--ground-hair);
  font-size: var(--fs-micro);
  line-height: 1.65;
  color: var(--ground-mute);
}

/* ===== THE ACKNOWLEDGEMENT, SET AS A LETTER =====
   The design's idea and a good one: what the College sends is correspondence,
   and a receipt-shaped acknowledgement reads as a transaction. The gold
   diamond between two hairlines is the design's own ornament, kept because it
   is the one flourish on the page and it earns its place closing a letter. */
.page-content .reg-done {
  max-width: 34rem;
  margin: 2.4em auto 0;
  padding: 2.4em 2.6em;
  border: 1px solid var(--ground-hair);
  background: rgba(255, 255, 255, .28);
  animation: reg-rise .5s ease both;
}

/* `.reg-done p` below is 0,3,0 and this is a `<p>`, so unqualified it lost
   its gold to the body rule three lines down -- the cascade collision that
   looks like a colour that was never set. */
.page-content .reg-done p.reg-done-k {
  font-family: var(--word);
  font-size: var(--fs-eyebrow-sm);
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--ground-kick);
  margin: 0 0 .8em;
}

.page-content .reg-done h2 {
  font-family: var(--display, var(--word));
  font-weight: 500;
  font-size: calc(24px * var(--fs-scale));
  line-height: 1.25;
  color: var(--ground-ink);
  margin: 0 0 1.2em;
  text-wrap: balance;
}

.page-content .reg-done p.reg-done-dear { margin-bottom: .8em; }

.page-content .reg-done p {
  font-size: var(--fs-body-sm);
  line-height: 1.7;
  color: var(--ground-ink-soft);
}

.page-content .reg-done p.reg-done-meta {
  display: flex;
  flex-wrap: wrap;
  gap: .4em 1.2em;
  margin-top: 2em;
  padding-top: 1.4em;
  border-top: 1px solid var(--ground-hair);
  font-size: var(--fs-micro);
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--ground-mute);
}

.page-content .reg-done .reg-done-ref {
  margin-left: auto;
  color: var(--ground-kick);
  font-variant-numeric: tabular-nums;
}

.page-content [hidden] { display: none; }

@media (max-width: 560px) {
  .page-content .reg-done { padding: 1.6em 1.4em; }
  .page-content .reg-tel-row { flex-wrap: wrap; }
  .page-content .reg-tel-row select { flex: 1 1 8em; }

  /* REQUIRED BECOMES AN ASTERISK AND OPTIONAL SAYS NOTHING.

     A label here is uppercase Inter at .2em of tracking, which is a wide
     setting: "WHAT IS YOUR ENQUIRY ABOUT? (REQUIRED)" takes three lines on a
     phone, and the qualifier — the least important half of the row — is what
     takes two of them. So the word is put away and the convention every form
     uses takes its place.

     `.reg-mark--opt` goes entirely: with required marked, unmarked already
     means optional, and a row that has to say so twice is the reason the
     labels were three lines long.

     VISUALLY HIDDEN, NOT REMOVED. The word is what a screen reader announces
     and what requirement 12.3 is about; the asterisk is `aria-hidden` and
     tells the eye alone. Hiding the word with `display: none` would take
     "required" off a telephone for the readers who most need to be told. */
  .page-content .reg-mark-star {
    display: inline;
    color: var(--gold);
    font-weight: 600;
  }

  .page-content .reg-mark--opt { display: none; }

  .page-content .reg-mark-word {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }
}

/* =====================================================================
   NOT FOUND
   ---------------------------------------------------------------------
   The page had no sheet at all. `.error-page`, `.error-title`,
   `.btn--primary` and the rest were the di-web-fe fork's markup and nothing
   here ever answered them, so a 404 rendered as unstyled headings and two
   plain blue links on the estate's green — which is not a College page with
   a message on it, it is a page that looks broken confirming that something
   is broken.

   It is the estate's own furniture now: the nav above, the footer below, the
   cream ground of `.page-content`, and the `.btn` / `.btn.fill` pair every
   other call to action on the site is set in.

   CENTRED, which nothing else in `.page-content` is. That is deliberate and
   it is the one place it is right: every other page there is a document, and
   a document is read down a left edge the eye returns to on every line. This
   is one short block with nothing above or below it, and centring is what
   says it is a notice rather than the beginning of something.
   ===================================================================== */
.page-content.err {
  display: flex;
  align-items: center;
  padding: clamp(64px, 12vw, 140px) 0 clamp(72px, 10vw, 150px);
}

.page-content.err .err-panel {
  /* `.page-content .prose > *` holds a document to 74ch and leaves it in the
     wrap. Neither applies here: this is a notice, so it takes a measure of
     its own and is centred in the column rather than left in it. */
  max-width: 46ch;
  margin: 0 auto;
  text-align: center;
}

/* The College's mark, at the weight it carries on Membership: present, not
   announced. It is the only thing above the code and it is what says whose
   page this is before a word is read. */
.page-content.err .err-seal {
  display: block;
  width: clamp(84px, 12vw, 118px);
  height: auto;
  margin: 0 auto clamp(26px, 4vw, 40px);
  opacity: .5;
}

/* The number is the eyebrow, not the heading. It is set as the estate sets an
   eyebrow — small, tracked, gold — because "404" is a fact about the request
   and the heading is the sentence a person reads. Set the other way round it
   is a very large number shouting at somebody who has just made a typing
   mistake. */
.page-content.err .err-code {
  font-family: var(--word);
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: .3em;
  /* The tracking is applied after the last character too; without this the
     block is off its own centre by half a space. */
  text-indent: .3em;
  text-transform: uppercase;
  color: var(--ground-kick);
  margin: 0 0 .9em;
}

.page-content.err .err-title {
  font-family: var(--word);
  font-weight: 500;
  font-size: clamp(30px, 4.4vw, 52px);
  line-height: 1.12;
  color: var(--ground-ink);
  margin: 0;
}

.page-content.err .err-lede {
  font-size: var(--fs-body-lg);
  line-height: 1.65;
  color: var(--ground-ink-soft);
  margin: 1.1em 0 0;
}

/* The two ways out. `flex-wrap` and `justify-content: center` are what makes
   this the same block on a telephone: below about 380px the pair stacks, and
   stacked buttons that are centred as a row are centred as a column too. */
.page-content.err .err-acts {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
  margin-top: clamp(30px, 4.5vw, 44px);
}

/* `.btn` is written for the green ground, where its hollow state is gold on
   dark. On this cream one the same border needs the ink beside it to be the
   page's rather than the cream it would otherwise inherit; the filled twin
   already carries its own colours and is untouched. */
.page-content.err .btn:not(.fill) {
  color: var(--ground-ink);
}

.page-content.err .btn:not(.fill):hover,
.page-content.err .btn:not(.fill):focus-visible {
  color: var(--g3);
}

@media (max-width: 480px) {
  /* A button at 34px of side padding and .2em of tracking is wider than a
     small phone once the label is a phrase; the pair is given the column
     rather than being left to overflow it. */
  .page-content.err .err-acts { flex-direction: column; }
  .page-content.err .err-acts .btn { justify-content: center; }
}

/* ---------------------------------------------------------------------------
   "READ THIS IN YOUR OWN LANGUAGE?" — the country suggestion.

   TOP RIGHT, UNDER THE NAV. It began in the bottom-left corner, which is where
   a cookie bar goes, and that is the trouble: a reader's eye is at the top of a
   page they have just opened, and an offer sitting in the corner they will
   reach last is one nobody takes.

   THE 88px IS THE ESTATE'S OWN NAV CLEARANCE, not a number measured for this.
   `.alv-nav` is `position: fixed; top: 0` with 22px of vertical padding around
   a 36px brand and a 1px rule — 81px — and `.page-the-college .col-hero`
   already clears it with 88px. Same number here on purpose: if the bar ever
   changes height these two want changing together, and a second value invented
   for this component is how they come to disagree.

   RIGHT EDGE ON THE NAV'S OWN GUTTER. 56px is `.alv-nav`'s horizontal padding
   at every width, so the pill lines up with the rightmost control in the bar
   above it rather than hanging out past it.

   Z-INDEX 90, WHICH IS BELOW THE NAV'S 100, and that is the whole reason it is
   not higher. `.nav-lang-menu` is `position: absolute; top: calc(100% + 14px);
   right: 0` — it drops out of the nav on exactly this spot, so a pill drawn
   over the nav would cover the language chooser at the moment a reader opened
   it to do by hand what this is offering to do for them. Below the nav, an
   open menu simply covers the pill, which is the right way round. Nothing on
   a page goes above z-index 3, so 90 still clears the content.

   It stays below the cookie dialog (10000/10001) as before: consent is
   answered first, and a reader should not be choosing a language through a
   scrim. The film grain at 9999 is `pointer-events: none` and 3.5% opaque, so
   passing under it costs nothing.

   The dismiss control is written by JavaScript, so nothing here may assume it.
   --------------------------------------------------------------------------- */
.lang-offer {
  position: fixed;
  top: 88px;
  right: 56px;
  z-index: 90;
  max-width: min(320px, calc(100vw - 112px));
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: flex-end;
  gap: 6px 18px;
  padding: 13px 20px;
  background: var(--green-deeper);
  border: 1px solid var(--gold-line);
  box-shadow: 0 10px 30px rgba(0, 0, 0, .45);
  font-family: 'EB Garamond', Georgia, serif;
  font-size: 14.5px;
  line-height: 1.35;
}

.lang-offer-take {
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid var(--gold-dim);
  padding-bottom: 1px;
  letter-spacing: .2px;
  transition: color .2s ease, border-color .2s ease;
}

.lang-offer-take:hover,
.lang-offer-take:focus-visible {
  color: var(--cream);
  border-color: var(--cream);
}

.lang-offer-no {
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  font-size: 12.5px;
  color: var(--cream-80);
  cursor: pointer;
  opacity: .7;
  transition: opacity .2s ease;
}

.lang-offer-no:hover,
.lang-offer-no:focus-visible { opacity: 1 }

.lang-offer-take:focus-visible,
.lang-offer-no:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 3px;
}

/* ON A PHONE IT GOES TO THE FOOT, and that is not a retreat to where it
   started. Under the nav there is no free band on a narrow screen: the
   Library's own `.libnav-m` sits immediately below the bar and is the whole of
   that page's navigation at this width, so a pill parked under the nav covers
   the control a reader taps to get anywhere. Rendered side by side with the
   banner off, that is exactly what it did.

   The objection to the bottom-LEFT corner was that nothing is looked at down
   there. A full-width strip at the foot of a phone is the opposite: it is the
   thumb's own resting place, which is why every cookie bar in the world is
   there. Wide screens keep the top right, where there is room beside the nav
   and the eye already is.

   It still yields to the consent dialog, which is fixed to the same edge at
   10000 — consent is answered first and this waits behind its backdrop. */
@media (max-width: 700px) {
  .lang-offer {
    top: auto;
    bottom: 12px;
    left: 12px;
    right: 12px;
    max-width: none;
    justify-content: space-between;
    padding: 12px 16px;
    font-size: 14px;
  }
}
