/**
 * Contact — page stylesheet (story 1 of spec-contact-page).
 *
 * Pairs with templates/contact.php + contact.js. Enqueued by the Neve child
 * theme's functions.php ONLY when the rendered post is a WordPress Page
 * (`is_page()`) whose assigned Template slug is `templates/contact.php` —
 * the second entry in `$joetennis_page_template_assets`. That map has no
 * default fallback: a Page on any other template, this site's Home and Blog
 * included, misses the lookup and loads nothing from here.
 *
 * It goes out through the same `joetennis_child_enqueue_template_pair()`
 * emitter the seven project templates and about.css use, so it carries the
 * same three base dependencies — `joetennis-child-style`,
 * `joetennis-site-fonts` and `joetennis-site-interactive-states`. The third
 * is the load-order edge the whole interactive-states model rests on
 * (functions.php:517-523): omit it and WP_Styles is free to put this sheet
 * AHEAD of the shared one, which would silently lose every override declared
 * here with no visible diff in either file. Every token the rules below read
 * is declared in that sheet's `:root`, so the edge is load-bearing here
 * rather than theoretical.
 *
 * THIS SHEET DECLARES NO COLOUR VALUE OF ITS OWN. Not one hex, not one
 * rgba(). Every colour below is a `var()` onto a role
 * site-interactive-states.css already decided for the white ground —
 * `--ground-ink`, `--ground-edge`, and the four `--state-link-*` roles.
 * That is deliberate and it is the whole of this file's colour policy,
 * and it has survived the page growing a form, a panel and a headline:
 * every colour this page needs was decided in the states sheet, against
 * the ground it is measured on. SPEC.md's `#8cc201` constraint is the
 * sharp end of the same
 * rule (`checks/06:129-169` now pins that value to two ROLES across every
 * `theme/*.css`, so a fork here would be caught — but the general form of
 * the mistake would not be). Story 2 introduces this theme's first form
 * controls and WILL have values to decide; it decides them in
 * `token-contract.md` and `state-values.md` first, not here.
 *
 * WHY THE LINKS ARE ENUMERATED HERE AT ALL, which is the one thing in this
 * file that is not obvious. site-interactive-states.css:1830-1845 states,
 * as a deliberate boundary, that there is NO `a { color }` rule anywhere in
 * that sheet — blanket colour on anchors is exactly the blast radius
 * enumerating exists to avoid — and that the price of the boundary is that
 * "Neve's own `a:focus, a:hover` tints every unenumerated anchor to the
 * SECONDARY accent", which is the same hue as the sitewide "you are here"
 * marker. Its enumerated prose-link group ends at
 * `body .nv-content-wrap.entry-content a`, and A PAGE TEMPLATE NEVER
 * PRODUCES THAT WRAPPER: this template replaces Neve's own page content
 * template, so `.contact-page` sits directly inside `main#content.neve-main`
 * with no `.entry-content` anywhere in its ancestry (verified against the
 * live /about/ render, 2026-09-25). So Contact's two links reach none of
 * those rules, and left alone they would hover purple. The block below is
 * this page joining that enumerated list from the template-sheet side,
 * reading the same four tokens rather than restating their values — which
 * is the outcome that baseline block's own note asks for.
 *
 * SPECIFICITY IS (0,2,0) AND EVERY CONTESTED PROPERTY IS STATED, per the
 * lesson flush-split.css:1068-1072 and about.css:270-275 both record from
 * live bugs: state every property Neve's hover states, at a specificity
 * that clears Neve outright rather than tying it and depending on `$deps`
 * order to break the tie. Neve's `a:hover, a:focus` is (0,1,1); (0,2,0)
 * wins on class count. Neve also renders `text-decoration: var(--linkdeco)`
 * on content links, so `--linkdeco` is set alongside `text-decoration` in
 * every state — setting only one of the two leaves the other free to
 * contradict it.
 *
 * THE FORM RULES ARE HERE AND THE COLOUR RULES ARE NOT, which is the
 * split CAP-3 asked for rather than an accident of who wrote what. This
 * sheet owns the form's GEOMETRY — the grid, the measures, the gaps, the
 * padding, the breakpoint. site-interactive-states.css owns its STATE —
 * every ink, edge, fill and ring, on both grounds. deferred-work named
 * the specific failure that split avoids: colour overridden onto Neve's
 * geometry, decided half at a time.
 *
 * (This paragraph read "NO FORM RULES, and the absence is the story
 * boundary" from story 1 until story 5 — three stories after the form
 * landed. Kept as a note rather than silently replaced, because it is
 * the same trap templates/contact.php's own docblock records twice: a
 * summary of what a file contains is the last thing anyone updates.)
 *
 * THE BEM PREFIX IS `contact-page__`, and the root is `.contact-page` —
 * deliberately not the bare template slug the seven project sheets use.
 * `contact` is a single common dictionary word and contact.js resolves its
 * root with `document.querySelector()`, which takes the FIRST match in
 * document order. templates/contact.php:43-52 carries the full argument;
 * keep every selector added here under `contact-page`.
 */

/* =====================================================================
   THE COLUMN -- WHICH IS NOW THE SITE BAND, AND EVERYTHING UNDER THIS
   HEADING DESCRIBES THE ARRANGEMENT IT REPLACED.

   READ THIS PARAGRAPH FIRST AND THE REST AS HISTORY, 2026-09-30. This
   page no longer has a column of its own. `.contact-page` IS the site's
   band: `max-width: var(--container)` (1400) with
   `padding-inline: var(--band-gutter)` inside it, which is the same box
   `about.css:300` gives `.about-page__band` and the same one the header
   and footer resolve. The rule this block spends fifty lines justifying
   -- `width: min(1200px, 100% - 2 * var(--band-gutter, 15px))` -- is
   gone.

   WHY IT WENT, and it is the one thing this page was actually getting
   wrong rather than merely differently. A 1200px cap inside a 1400px
   band is 1288 - 1200 = 88px narrower than the chrome around it, so the
   panel's edge sat ~44px inside the header logo and the footer at every
   width above the cap. The block below notices the inequality and reads
   it as a safety property -- "this panel is still never wider than the
   header band above it" -- which is true and was never the goal. The
   goal is the alignment invariant `spec-sitewide-alignment-band` exists
   for: the logo, the headline and the panel edge on ONE line. Never
   wider is not the same as flush, and this is what that distinction
   cost.

   WHAT SURVIVES AND IS STILL LOAD-BEARING: the `var(--band-gutter, 15px)`
   fallback argument at the end of this block. An unresolved custom
   property still invalidates the function it sits in, and the band's
   `padding-inline` still carries that fallback for exactly the reason
   given there. The 760 -> 1200 history is worth keeping because it
   records WHY a two-column field grid needs width, which is the reason
   the band is an improvement rather than merely a different number.

   ---------------------------------------------------------------------

   One centred measure, and the prose sits in it. There is nothing else on
   this page yet — story 2's form joins this column rather than sitting
   beside it, which is why the measure is on the ROOT rather than on an
   inner `__content` wrapper: an inner wrapper would have to be emitted by
   the template, and the template deliberately emits nothing but
   `the_content()`.

   STORY 5 WIDENED THIS FROM 760px TO 1200px, and the block at :320 below
   predicted the change in as many words: "if Joe wants the drawn width, the
   change is this template's column rather than this block -- and it is a
   layout story, not a fix." This is that story. Layout D is a panel, not a
   prose column: the page's only prose is one headline set across it, and
   everything under that headline is a two-column field grid that was
   running at ~300px per column against the prototype's ~540.

   THAT PARAGRAPH IS FROM STORY 5 AND ITS SECOND HALF IS NOW HISTORY. It
   recorded that `min()` capped on `--container` at mobile and tablet once
   the measure went to 1200. v1.14.0 dropped the `--container` term
   altogether in favour of `100% - 2 * gutter`, which subsumes it -- so
   there is no dial in this rule any more and no tier for 1200 to sit above.
   The MECHANISM note it was defending still holds and is restated below.

   `min(1200px, 100% - 2 * var(--band-gutter, 15px))` is this codebase's
   prose measure, in the form legal.css:35 states at length -- read that
   comment for the full reasoning rather than re-deriving it here. 1200px is
   the panel's own measure; the second term is the sitewide gutter; the
   `min()` is which of the two is binding at this viewport.

   IT CHANGED FORM AT v1.14.0. It was `max-width: min(1200px,
   var(--container, 1200px))` plus `padding: 64px 15px 96px`, which is the
   same thing ONLY WHILE THE GUTTER IS A CONSTANT. `--band-gutter` ramps to
   56px at 1400, and a border-box `max-width` of 1200 with 56px of padding
   inside it leaves 1088 -- the gutter eating into a panel it was never
   sized against. The gutter belongs OUTSIDE a narrow measure and INSIDE a
   full-width band. THAT MATTERS MORE ON THIS PAGE THAN ANYWHERE ELSE: the
   whole reason this measure moved from 760 to 1200 was a two-column field
   grid running at ~300px per column against the prototype's ~540, so a
   silent 112px loss here is a return trip toward the bug this layout story
   exists to fix. Desktop columns go 570 -> 585 instead.

   THE `--container` TERM WAS DROPPED, NOT LOST -- `100%` subsumes it, for
   the reason legal.css:56 gives. The 1200px CAP STILL CLEARS THE BAND at
   the new dial: the chrome's content width at 1400 is 1400 - 112 = 1288,
   and 1200 < 1288, so this panel is still never wider than the header band
   above it. Check that inequality if the dial is ever lowered below
   ~1312px, because nothing asserts it.

   THE 15px INSIDE THE `var()` IS NOT DECORATION: an unresolved custom
   property inside `min()` makes the whole function invalid at
   computed-value time, which drops `width` back to `auto` — the panel
   would silently go full-bleed, which is the one failure this rule exists
   to prevent. With the fallback it degrades to a flat 15px inset, i.e. to
   what shipped through v1.13.41.

   `box-sizing: border-box` IS RETAINED AND IS NO LONGER LOAD-BEARING
   HORIZONTALLY -- there is no horizontal padding left for it to govern.
   ===================================================================== */
.contact-page {
	/* THE PAGE RHYTHM UNIT, and it is About's. `about.css` declares
	   `--about-gap: 20px` and derives every gap, inset and page margin on
	   /about/ from it or an integer multiple; this page now follows the
	   same rhythm, so the two read as one site rather than two pages that
	   happen to share a palette. It is DECLARED HERE rather than read from
	   about.css because that sheet loads only on /about/ -- the same
	   scoping fact recorded at `--shape-input-radius`. A page's rhythm is
	   a page-level decision, though, so two pages each declaring their own
	   at the same value is not the duplication problem the radii are.
	   Scoped to this element rather than `:root` because this sheet
	   declares nothing globally. */
	--contact-gap: 20px;

	/* About's panel inset, hand-copied for the same scoping reason as the
	   rhythm unit above (`about.css:--about-panel-inset`, /about/ only). */
	--contact-panel-inset: clamp(20px, 3vw, 40px);

	display: flex;
	flex-direction: column;
	gap: var(--contact-gap);
	box-sizing: border-box;
	max-width: var(--container, 1400px);
	margin-inline: auto;
	padding-inline: var(--band-gutter, 15px);
	padding-block: calc(var(--contact-gap) * 3) calc(var(--contact-gap) * 5);
	font-family: var(--font-body);
	color: var(--ground-ink);
}

/* The page's own heading, if the content carries one. Neve's typography
   theme_mods bind `--h2fontsize`/`--h2letterspacing`/`--h2fontweight` from
   an inline <style> this repo does not declare — CLAUDE.md's typography
   entry records that every heading on this site has been inheriting that
   tracking without anyone deciding it — so the size and weight here are
   left to Neve on purpose and only the rhythm below the heading is this
   sheet's. Do not add a `font-size` without measuring a bare <h2> on a
   live page first; that entry exists because doing it the other way round
   produced a value that looked decided and was not. */
.contact-page h2 {
	font-family: var(--font-heading);
	margin: 0 0 16px;
}

.contact-page p {
	font-size: 18px;
	line-height: 1.6;
	margin: 0 0 20px;
}

/* The intro line reads one step larger than the lines under it, which is
   the only hierarchy this page has and the only thing distinguishing the
   sentence from the two contact lines below it. `:first-of-type` rather
   than a `__intro` class, because the copy lives in page 28's
   `post_content` and is edited in wp-admin — a class would require the
   editor to remember to apply one, and forgetting it would fail silently
   into "the intro looks like a body line". Document order is a thing the
   editor cannot forget. */
.contact-page > p:first-of-type {
	font-size: 21px;
	line-height: 1.5;
	margin-bottom: 32px;
}

.contact-page > :last-child {
	margin-bottom: 0;
}

/* THE BREADCRUMB IS GONE, 2026-09-30, and this line is here so the next
   person does not rebuild it. It was one segment carrying the page's own
   title, added 2026-09-25 when a visually-hidden <h1> was the only thing
   naming the page. Story 5 gave the page a real visible headline, and
   templates/contact.php's own comment recorded the consequence at the
   time: "the two now say the same thing twice". The refinement that
   aligned this page to /about/ removed the duplicate -- /about/ has no
   breadcrumb either, and a single-segment breadcrumb was already
   documented here as telling the visitor nothing the marked nav item
   does not. Three rules and their reasoning were deleted with it; git
   has them. Nothing in checks/ asserted it. */

/* =====================================================================
   THE TWO LINKS — CAP-2

   The email address and the LinkedIn URL are the page's whole current
   substance and the fallback for the one failure CAP-4 can have that no
   check in this repo can catch: mail transport. They are plain anchors in
   page content, so they are operable with JavaScript disabled by
   construction — nothing on this page depends on script, and contact.js
   ships with no behaviour at all.

   Four rules, one per state, reading the four `--state-link-*` roles.
   Values are NOT restated here; see the file docblock.
   ===================================================================== */

/* `:not(.button)` keeps a "Get in touch" CTA dropped into this page's
   content on site-interactive-states.css's button rules rather than
   pulling it down to link ink — the same guard that sheet's own prose-link
   group carries at :1334-1339, and the same reason. */
.contact-page a:not(.button) {
	color: var(--state-link-rest-fg);
	border-radius: var(--shape-link-radius);
	font-weight: 400;
	/* THE REST UNDERLINE IS READ, NOT RESTATED, since 2026-10-03. This
	   rule hard-coded `none` on both properties until then, which meant
	   this page could not be fixed by moving the ground role -- see
	   site-interactive-states.css's block on
	   --state-link-rest-decoration. Do not put a literal back here. */
	text-decoration: var(--state-link-rest-decoration);
	--linkdeco: var(--state-link-rest-decoration); /* Neve renders `text-decoration: var(--linkdeco)`. */
	/* Stated at rest so hovering changes the underline's THICKNESS only
	   (auto -> 2px) rather than also shifting its position. */
	text-underline-offset: 2px;
}

/* THE REST STATE NOW CARRIES AN UNDERLINE, FIXED 2026-10-03 BY JOE, and
   the sentence this block used to open with was FALSE -- which is the
   reason it is corrected here rather than quietly replaced.

   It said `--state-link-rest-fg` (#0b6b78) "measures 3.39:1 against
   --ground-ink (#16191d) on white, which clears the 3:1 floor", and
   concluded that "these two links are safe unadorned". The real figure is
   **2.85:1**, under the floor. 3.39:1 is that teal against pure BLACK.
   The error was inherited verbatim from site-interactive-states.css, which
   is the honest part of the story and the dangerous one: this sheet
   deferred to a shared derivation, named it, and was wrong because the
   shared derivation was. Deferring to a single source is still right; it
   is just not a substitute for the measurement.

   THE LINK IT MATTERED FOR is "See the Privacy Statement." -- mid-sentence,
   where the colour-only test actually bites. The second link on this page
   is its own line and had little to be compared against either way.

   The ink does not move: restoring the underline gives 1.4.1 the
   non-colour carrier it asks for, so the colour-only comparison stops
   applying and #0b6b78 (6.20:1 on the page) stays. The rest rule above
   now READS `--state-link-rest-decoration` instead of hard-coding `none`,
   which is what makes this page reachable from the ground role at all.
   The hover underline below is no longer the only channel -- it moves
   colour AND thickness on top of a rest state that is already marked. */
.contact-page a:not(.button):hover {
	color: var(--state-link-hover-fg);
	text-decoration: underline;
	text-decoration-thickness: 2px;
	text-underline-offset: 2px;
	--linkdeco: underline;
}

.contact-page a:not(.button):focus-visible {
	color: var(--state-link-focus-fg);
	text-decoration: underline;
	--linkdeco: underline;
	outline: 2px solid var(--state-link-focus-ring);
	outline-offset: 2px;
}

/* An address is not a sentence and must not be broken like one. A long
   `mailto:` label wrapping mid-address reads as two addresses; on a narrow
   viewport `overflow-wrap: anywhere` is the escape hatch that keeps it from
   overflowing the column instead. */
.contact-page a[href^="mailto:"] {
	overflow-wrap: anywhere;
}

/* THE ERROR SUMMARY'S LINKS, and they are the one place on this page where
   the four rules above are WRONG. Story 3 (CAP-4).

   The three rules above bind the page's anchors to `--state-link-*`, which
   site-interactive-states.css decided against the WHITE ground: teal
   (#0b6b78) on #ffffff. The summary sits inside the slate panel, where that
   same teal is 1.35:1 -- an unreadable link, in the one block whose entire
   job is to be read after something went wrong. (That figure read 1.44:1
   from story 3 until 2026-09-25, when story 4's review re-measured the
   pair. The correction changes nothing about the decision -- both numbers
   are far under the floor and the rules below are unchanged -- but a
   contrast figure nobody re-measures is how a stale one survives, and this
   file carries several.)

   WHY THE CORRECTION IS HERE AND NOT IN THE STATES SHEET, which owns state
   everywhere else. Those four rules are in THIS file, and this file loads
   AFTER the shared one by a `$deps` edge. A correction written over there
   would have to out-specify a rule that loads later, which means a
   specificity contest against `:hover` and `:focus-visible` at (0,3,0) each.
   Written here it is the same specificity and simply later in source order,
   which is the cheapest thing that can possibly work. The shared sheet
   records the hand-off at its own end.

   UNDERLINED IN EVERY STATE. This used to distinguish it from the page's two
   content links, on the reasoning that those "earn their bare rest state
   from a measured 3.39:1 against the surrounding ink". BOTH HALVES OF THAT
   WERE WRONG: the figure was 2.85:1, under the floor, and as of 2026-10-03
   the content links are not bare either -- they underline at rest too. So
   this rule is no longer the exception it describes; it is now the ordinary
   case, and what remains distinctive is only that it is underlined in every
   state unconditionally rather than reading the ground role. That is still
   right here, because these are a list of things to go and fix with no prose
   around them to contrast with. */
.contact-page__summary a:not(.button) {
	color: var(--state-input-error-fg);
	text-decoration: underline;
	text-underline-offset: 2px;
	--linkdeco: underline;
}

.contact-page__summary a:not(.button):hover {
	color: var(--color-form-panel-fg);
	text-decoration-thickness: 2px;
}

.contact-page__summary a:not(.button):focus-visible {
	color: var(--color-form-panel-fg);
	outline: 2px solid var(--ground-default-ring);
	outline-offset: 2px;
}

/* =====================================================================
   THE FORM PANEL — layout only (story 2 of spec-contact-page, CAP-3).

   NOT ONE COLOUR VALUE IS DECLARED BELOW, which is this sheet's standing
   policy and is stricter here than it looks: the panel's own slate fill
   and its white ink are read from `--color-form-panel-bg` /
   `--color-form-panel-fg`, declared with the rest of the form family in
   the `.contact-page` block of site-interactive-states.css. Interaction
   state has ONE owner in this codebase, and a component surface that
   only this page paints is still a value that belongs beside the states
   it is measured against — the ring, the error edge and the label ink
   are all chosen against this exact fill, and splitting them across two
   sheets is how a ground and its contrast figures drift apart.

   THE PANEL SITS INSIDE THIS TEMPLATE'S COLUMN rather than breaking out
   of it, and that is unchanged since story 2 — but the column itself is
   now the prototype's 1200px rather than the 760px prose measure, so the
   departure this paragraph used to record is closed.

   WHAT THAT DEPARTURE COST, KEPT BECAUSE IT IS THE EVIDENCE FOR THE
   CHANGE: the two-column field grid ran at roughly 300px per column
   against the prototype's ~540, so the name/email pair and the
   phone/checkbox pair were tighter than drawn. Both still held a full
   email address at 17px, which is why it shipped. The note ended "if Joe
   wants the drawn width, the change is this template's column rather
   than this block — and it is a layout story, not a fix"; story 5 is
   that layout story and made exactly that change, at :89.

   IN LAYOUT D THE PANEL IS ALSO NO LONGER "the same column as the words
   above it", because there are no words above it. The page's one piece
   of prose is the headline INSIDE the panel, so the column's job changed
   from holding a measure of text to holding a slab — which is what makes
   1200 right now and 760 right then, rather than one of them having been
   wrong.

   BOTH HALVES OF THAT PARAGRAPH WENT FALSE ON 2026-09-30 and it is kept
   because the reasoning is still the reason the panel is a slab. There
   ARE words above it now -- the headline moved out onto the white band,
   /about/'s arrangement -- and the panel is no longer 1200 but the band's
   own width. What did not change is what the paragraph was arguing: this
   column holds a slab rather than a measure of text, which is why it
   takes the full band and why `max-width: 62ch` appears on the prose
   INSIDE it instead. See THE COLUMN at the top of this file.
   ===================================================================== */
.contact-page__panel {
	/* 20px, NOT 48. The band above supplies 20px of `gap` and this adds
	   the second 20, giving the 40px About measures between its H1 and its
	   first panel. Stated here rather than folded into the band's gap
	   because the gap governs EVERY band child and this margin governs one
	   -- a page that grows a second block between the two would want the
	   gap, not this. */
	margin-top: var(--contact-gap);

	/* THE INSET IS ABOUT'S, replacing `clamp(32px, 5.5vw, 80px)`.
	   `clamp(20px, 3vw, 40px)` is what about.css spends on its six
	   panels, and the extra 8px on top is the drawing's own: Layout E
	   states `calc(inset + 8px)` at the top so the statement inside a
	   panel is not optically closer to the edge than the copy beneath it.
	   THE OLD PAIR WAS ALSO "THE PROTOTYPE'S OWN" -- read the note this
	   replaced in git history if the ratio argument is ever wanted; it was
	   right about its own drawing and that drawing is superseded. */
	padding: calc(var(--contact-panel-inset) + 8px) var(--contact-panel-inset) var(--contact-panel-inset);

	/* 28px, from the shared sheet. It is a STATIC ROUNDED BOX and so a
	   standing CAP-7 exception -- registered in
	   site-interactive-states.css's exception list, which is also where
	   the ruling and the debt it now owes are written down. */
	border-radius: var(--shape-panel-radius);

	background-color: var(--color-form-panel-bg);
	color: var(--color-form-panel-fg);
}

/* =====================================================================
   THE STATEMENT — the page's <h1>, rendered by `the_content()` from a
   level-1 Heading block in page 28.

   THE SELECTOR REACHES THROUGH A WRAPPER BECAUSE IT HAS TO. The heading
   is editor output, so this template cannot put a class on it; what it
   can do is wrap `the_content()` in a div that carries one, which
   templates/contact.php does for the `id` anyway. `.wp-block-heading` is
   deliberately NOT used — it is the block editor's class and this rule
   should still hold if the block is pasted as plain HTML.

   TYPE COMES FROM THE PROTOTYPE AS A RATIO, NOT AS PIXELS.
   `clamp(32px, 4.2vw, 56px)` and `letter-spacing: -2px` are the drawing's
   own; the vw middle term is what carries the relationship across
   viewports the drawing was not drawn at. 1.08 line-height because a
   two-line headline at 56px with normal leading opens a gap the drawing
   does not have.

   `letter-spacing` AND `font-family` ARE BOTH STATED, for the reason
   CLAUDE.md's typography entry records and `.contact-page__panel-title`
   below repeats: Neve binds `--h1letterspacing: -2px` from an inline
   <style> driven by theme_mods this repo does not declare, and paints it
   from a low-specificity element selector. -2px happens to be what that
   mod currently emits. Stating it means this headline keeps the value it
   was drawn with if the Customizer ever moves, rather than inheriting a
   tracking nobody decided.

   `text-wrap: balance` is the one property here that is not in the
   drawing as a value — it is how the drawing's "balanced to break over
   about two lines" is expressed. Unsupported browsers get the ordinary
   greedy break, which is the same headline one word differently placed.

   THE COLOUR IS A ROLE AND THE ROLE IS A REFERENCE. `--state-statement-fg`
   resolves to `--color-tab-current`, declared exactly once in
   site-interactive-states.css; `checks/06` fails the suite on a third
   declaration of that value anywhere in theme/*.css.

   THE MARGIN IS THE GAP TO THE FORM and it is the drawing's clamp. It is
   stated on the wrapper rather than the heading so that a page whose
   content grows a second block still separates cleanly from the fields.
   ===================================================================== */
.contact-page__statement {
	/* NO MARGIN. It was `clamp(36px, 4.5vw, 64px)` while the statement sat
	   INSIDE the panel and had to hold itself off the fields. It is now a
	   band child, and the band's `gap` plus the panel's own `margin-top`
	   are what separate them -- 20 + 20 = 40px, which is About's
	   measured H1-to-first-panel distance. Leaving the old clamp here
	   would have added up to 64px on top of that and nothing would have
	   looked broken, just wrong. */
	margin: 0;
}

/* THREE PROPERTIES LEFT THIS RULE ON 2026-09-30 AND THAT IS WHAT MAKES THE
   TWO PAGES MATCH. Joe, on the installed v2.0.1: "The heading - the H1 -
   isn't the same size on Contact as it is on About."

   `font-size: clamp(32px, 4.2vw, 56px)`, `line-height: 1.08` and
   `letter-spacing: -2px` are gone. They were the Layout D drawing's own
   and they were correct about that drawing; what they could not be correct
   about is /about/, because ABOUT DECLARES NONE OF THEM. about.css's
   heading block states the omission as a rule -- "NO `font-size` AND NO
   `letter-spacing` ON ANY HEADING... Neve's typography theme_mods emit an
   inline <style> binding `--h1fontsize`, `--h2letterspacing` and friends"
   -- so /about/'s headline takes Neve's h1 dial and this one was frozen at
   56px. Two pages cannot share a size while one reads a dial and the other
   holds a literal.

   SO THE FIX IS A DELETION, WHICH IS WHY IT IS THE RIGHT ONE. Both
   headlines now resolve from the same `--h1fontsize`, so they match today
   AND stay matched if that dial is ever moved. Stating the number here
   again, at About's current rendered value, would have matched them for
   exactly as long as nobody touched the Customizer -- and CLAUDE.md's
   typography entry exists because this repo has already made that mistake
   by measuring a rendered heading and writing the number down.

   THE HEADLINE GETS BIGGER, AND THAT IS THE POINT rather than a side
   effect: about.css describes "a 72px display line", against the 56px this
   rule was capping at. Expect a visibly larger Contact headline.

   ABOUT'S OWN COMMENT CLAIMED THIS WAS ALREADY TRUE -- it reads "legal.css
   and contact.css leave both alone; so does this" -- and it was wrong about
   this file when it was written. The deletion makes the claim honest rather
   than needing it corrected.

   WHAT STAYS, AND WHY EACH: `font-weight: 800` because About states it too,
   by Joe's 2026-09-29 ruling, and for the reason recorded there -- 2.14:1
   at weight 400 across a display line is the worst pairing on the page, and
   Neve's `neve_h1_typeface_general.fontWeight` is 400. `font-family` and
   `color` because About's `:is(h1..h6)` and heading-accent rules set the
   same two. `margin: 0` because the band owns the gap.

   `text-wrap: balance` IS THE ONE THING ABOUT DOES NOT HAVE, kept
   deliberately. It is not a size property, and the two pages need it
   differently: About's headline hard-breaks on a `<br>` the editor typed,
   so it has nothing to balance. This one is a single sentence that wraps on
   its own, and at the band's full width it lands on two lines -- balance is
   what keeps those two even. Unsupported browsers get the greedy break. */
.contact-page__statement h1 {
	font-family: var(--font-heading);
	font-weight: 800;
	text-wrap: balance;
	color: var(--state-statement-fg);
	margin: 0;
}

/* Anything else the editor puts in that field. There should be nothing —
   page 28 holds one Heading block — but "should" is not a mechanism, and
   a stray paragraph left to the parent theme would be the usual invisible
   failure. This gives it an ink that is right for the ground it is on,
   and a sane measure.

   THE INK CHANGED GROUND ON 2026-09-30 AND THE OLD VALUE WOULD HAVE BEEN
   WHITE ON WHITE. It was `var(--color-form-panel-fg)` — #ffffff, correct
   while this wrapper sat inside the slate panel and the only thing it
   could be read against was slate. The wrapper is now a band child on the
   WHITE page, so that value would have rendered a stray paragraph
   invisible: present in the DOM, selectable, announced by a screen
   reader, and unreadable on screen.

   NOBODY WOULD HAVE REPORTED IT, which is why it is worth this much
   comment for a rule that currently matches nothing. Page 28 holds one
   Heading block today, so there is no paragraph to be invisible; the rule
   exists for the day someone adds a sentence in wp-admin, and that is
   precisely the day nobody is reading this file. It was found by auditing
   every `var()` in this subtree after the <h1> came out of the panel —
   the same audit that caught the headline rendering black, which WAS
   visible. One move, two broken roles, one of them silent. */
.contact-page__statement p {
	max-width: 62ch;
	margin: 16px 0 0;
	color: var(--ground-ink);
}

.contact-page__panel-head {
	margin-bottom: 28px;
}

/* The panel's heading. `font-family` and the tracking are stated rather
   than inherited for the reason CLAUDE.md's typography entry records:
   Neve binds `--h2fontsize`, `--h2fontweight` and `--h2letterspacing`
   from an inline <style> driven by theme_mods this repo does not
   declare, and paints `letter-spacing` from a low-specificity element
   selector — so every heading on this site has been inheriting a
   tracking nobody decided. -1px happens to be what that theme_mod
   currently emits for h2; stating it means this heading keeps the value
   the panel was drawn with if the Customizer ever moves.

   This rule is (0,1,0) and the generic `.contact-page h2` above is
   (0,1,1), so the margin is restated here rather than left to lose. */
.contact-page__panel-title {
	font-family: var(--font-heading);
	font-size: 28px;
	font-weight: 800;
	line-height: 1.15;
	letter-spacing: -1px;
	margin: 0 0 6px;
}

/* THE FIELD GRID. Two columns, and every field that needs the full
   measure says so with `--wide` rather than the grid knowing about its
   children by position. `minmax(0, 1fr)` rather than `1fr`: a grid
   track's default `min-width: auto` is its content's minimum, and a
   textarea's is wide enough to push the track past its share and
   overflow the panel. */
.contact-page__form {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 24px 32px;
	align-items: start;
}

.contact-page__field {
	display: grid;
	gap: 8px;
}

.contact-page__field--wide,
.contact-page__actions {
	grid-column: 1 / -1;
}

/* THE CHECKBOX RUNS THE FULL MEASURE SINCE STORY 5, and the 40px it used
   to carry is gone with the reason for it. It sat in the grid cell beside
   Phone, padded down to that input's centre line — a measured alignment
   to a neighbour, released at the stacking breakpoint where there was no
   neighbour left to align to. Layout D puts Company beside Name and Phone
   beside Email, so the checkbox has no neighbour at any width: it is a
   question, not a field, and it gets its own line.

   4px of top padding, which is the drawing's, and the only thing left of
   the alignment: it settles the 22px box against the label's cap height
   rather than its line box. */
.contact-page__check {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	padding-top: 4px;
	grid-column: 1 / -1;
}

.contact-page__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 16px 24px;
	margin-top: 4px;
}

/* The submit's box. Its four states — ink, fill, edge and the 999px
   radius that marks it as the one operable box on this panel — come from
   the sitewide `button[type="submit"]` rules in
   site-interactive-states.css, which is why no colour appears here.
   Padding is this sheet's because Neve only emits `--primarybtnpadding`
   for `.button.button-primary`, never for a bare submit, so without a
   value here the control would take the UA's. */
.contact-page__submit {
	font-family: var(--font-body);
	font-size: 16px;
	font-weight: 600;
	line-height: 1;
	letter-spacing: 0.02em;
	padding: 15px 32px;
	cursor: pointer;
}

/* =====================================================================
   THE HANDLER'S OWN BLOCKS -- story 3 (CAP-4/CAP-5). Layout only; every
   colour is a `var()` onto a role site-interactive-states.css decided,
   per this sheet's docblock.

   WHAT WAS HERE UNTIL STORY 3: a `.contact-page__submit-note` rule, for
   the caption that said sending was not connected yet. The note and its
   rule went out together with the `disabled` attribute -- a caption that
   is no longer true is worse than no caption.
   ===================================================================== */

/* THE HONEYPOT. `display: none` is the SIGHT half of hiding it; the markup
   carries the other two halves (`aria-hidden` on the wrapper,
   `tabindex="-1"` on the input) because CSS can do neither. All three are
   needed: templates/contact.php argues why at the field itself.

   IT IS OUTSIDE THE GRID because `display: none` removes it from the grid's
   flow entirely, so there is no empty cell to account for. */
.contact-page__trap {
	display: none;
}

/* All three sit OUTSIDE the <form>, between the panel's head and the grid,
   so they take the panel's full width without needing a grid span. That
   placement is also why a rejected submission puts the summary above the
   fields it names rather than in the middle of them. */
.contact-page__summary,
.contact-page__notice,
.contact-page__sent {
	margin: 0 0 24px;
	max-width: 62ch;

	/* THE SMALL RADIUS, because About splits by BOX SIZE and these are
	   small boxes on a large panel. `--shape-input-radius` rather than a
	   literal 11px: these cards sit among the fields and should move with
	   them if that value ever does.

	   AND IT IS SAFE HERE IN A WAY IT WAS NOT ON A FIELD, which is worth
	   the arithmetic because the same change deleted the input's left
	   rule for exactly this reason. `.contact-page__summary` keeps a
	   `border-left: 4px` colour carrier (site-interactive-states.css), and
	   a radius curves the ends of that run. An 11px radius consumes 11px
	   at each end: on a 45px-tall field that is ~49% of the run and the
	   rule reads as a smear, which is why the field's went. A summary is
	   four lines and up -- 120px and taller -- so the same 22px is under
	   20% and the straight run still plainly reads as a rule. Measured as
	   a proportion, not eyeballed. */
	border-radius: var(--shape-input-radius);
}

/* THE 16px CLEARS A BORDER THIS FILE DOES NOT DRAW. The summary's
   `border-left: 4px` is in site-interactive-states.css, because it is a
   colour carrier and that sheet owns colour -- so this padding is sized
   against a value in another file, and changing the border width there
   leaves this number wrong with nothing to flag it. Named at both ends
   rather than moved, because moving either half would put it in the sheet
   whose banner says it does not belong there. */
.contact-page__summary {
	padding: 4px 0 4px 16px;
}

/* (0,1,1) to clear `.contact-page h2`'s type ramp: this is a heading inside
   a panel, sized against the list under it rather than against the page. */
.contact-page .contact-page__summary-title {
	margin: 0 0 8px;
	font-family: var(--font-heading);
	font-size: 18px;
	font-weight: 700;
	letter-spacing: normal;
}

.contact-page__summary-list {
	margin: 0;
	padding-left: 20px;
	font-size: 16px;
	line-height: 1.5;
}

/* (0,1,1) to clear `.contact-page p`'s 18px and its bottom margin -- the
   same reason the submit note needed it. */
.contact-page .contact-page__notice {
	font-size: 16px;
	line-height: 1.5;
}

/* The per-field message sits under its control, inside the field's own
   stack, so it needs no margin of its own beyond the gap. `display: block`
   because it is a <span>: it carries the error id the control's
   `aria-describedby` points at, and a <p> inside the field's flow would
   inherit the prose column's type. */
.contact-page__error {
	display: block;
	font-size: 15px;
	line-height: 1.4;
	font-weight: 700;
}

/* The confirmation's paragraphs take the panel's measure, not the page's.
   (0,2,1) to clear `.contact-page p`. */
.contact-page .contact-page__sent p {
	margin: 0 0 12px;
	font-size: 18px;
	line-height: 1.55;
}

.contact-page .contact-page__sent p:last-child {
	margin-bottom: 0;
}

/* The three focusable containers the handler moves focus to with
   `tabindex="-1"` + `autofocus`. Their ring is the panel's, which
   site-interactive-states.css counter-bound for exactly these elements
   before they existed -- black would be 2.50:1 on slate.

   `:focus`, NOT `:focus-visible`, and this is the one place on this site
   where that is the right way round. Focus arrives here from `autofocus`
   rather than from a keypress, and `:focus-visible`'s heuristic is about
   whether the USER's last interaction was a keyboard one -- so on a fresh
   page load it can decline to match, leaving focus somewhere with no visible
   indicator, which is the failure the ring exists to prevent. The cost of
   the broader selector is a ring if someone clicks the text, which is a
   cosmetic oddity rather than a barrier. */
.contact-page__summary:focus,
.contact-page__notice:focus,
.contact-page__sent:focus {
	outline: 2px solid var(--ground-default-ring);
	outline-offset: 4px;
}

/* =====================================================================
   THE PRIVACY LINK -- story 4 (CAP-6)

   One line under the Send button, pointing at /privacy/. Shipped in the
   same build as the page it points at, which is CAP-6's rule rather than
   a scheduling nicety: the alternative is a link to a 404 sitting under
   the button on the site's only conversion path.

   IT IS FORCED ONTO ITS OWN ROW. `.contact-page__actions` is a wrapping
   flex row, so without `flex-basis: 100%` this paragraph sits BESIDE the
   submit at any width that fits both -- which is the one place the story
   says it must not be. `flex: 1 0 100%` puts it beneath at every width,
   and the 16px row gap in `.contact-page__actions` above is the space
   between them.

   THE `p` MARGIN RESET IS LOAD-BEARING, not tidying. `.contact-page p`
   at (0,1,1) sets `margin: 0 0 20px` on every paragraph inside this root
   -- this one included -- and a bottom margin here would hang 20px of
   empty slate off the end of the panel. The selector is (0,2,0) so it
   wins on specificity rather than on source order.
   ===================================================================== */
.contact-page__actions .contact-page__privacy {
	flex: 1 0 100%;
	margin: 0;
	font-size: 15px;
	line-height: 1.4;
}

/* THE ASTERISK KEY. It sits on the same flex line as the Send button
   rather than wrapping with the privacy sentence below it, which is the
   drawing's arrangement and is also the useful one: the legend has to be
   in eye at the moment the two marked fields are.

   `white-space: nowrap` because "* Required" breaking across two lines is
   an asterisk with nothing beside it, which reads as an error rather than
   as a key.

   The mark inside takes its colour and weight from
   site-interactive-states.css's `.contact-page__required` rule, the same
   one the two field labels use — that is the point of it being the same
   class. This rule sets only the line it sits on.

   (0,2,0) and `margin: 0` for the same load-bearing reason the privacy
   line above states: `.contact-page p` at (0,1,1) would hang 20px of
   empty slate here. */
.contact-page__actions .contact-page__required-note {
	margin: 0;
	font-size: 15px;
	line-height: 1.4;
	white-space: nowrap;
}

/* THE LINK IS INSIDE THE SLATE PANEL, which makes the page's four content
   link rules WRONG here for exactly the reason the error summary's are --
   see that block above. `--state-link-rest-fg` is teal (#0b6b78) decided
   against #ffffff, and on #3C5158 it measures 1.35:1.

   SO THE REST STATE IS THE PANEL'S OWN INK, `--color-form-panel-fg`
   (#ffffff, 8.37:1 on this fill -- the figure
   site-interactive-states.css:1524 already carries for this exact pair),
   AND THE UNDERLINE IS NOT OPTIONAL.
   Every other word on this panel is that same white, so colour cannot be
   the channel that says this one is a link -- WCAG 1.4.1 has nothing to
   compare. The underline is the whole affordance, present in every state,
   and hover thickens it rather than replacing it. Same shape, same
   reasoning and the same specificity trick as `.contact-page__summary a`:
   (0,2,1) to match the four rules above and win on source order.

   THE FOCUS RING READS A ROLE THAT WAS BOUND FOR THIS ELEMENT BEFORE IT
   EXISTED. site-interactive-states.css:1598-1611 counter-binds
   `--ground-default-ring` to #00e5ff on `.contact-page` and names "story
   4's Privacy Statement link" in the list of things it is pre-empting:
   the `:root` ring is #000000, chosen against a white page, and it
   measures 2.50:1 on this slate. Reading the role rather than restating
   a colour is what lets that pre-emption actually land.

   `.contact-page__sent` IS IN THIS SELECTOR LIST AND THAT IS A FIX, NOT A
   TIDY-UP. The confirmation's "Send another message" link has shipped since
   v1.13.30 reading the page's teal through `.contact-page a:not(.button)`,
   on a slate panel, at the same 1.35:1 this block opens by rejecting -- a
   link the visitor essentially cannot see, on the one screen that exists so
   the site's call to action does not dead-end. Nobody caught it because it
   was the only link in that block and there was nothing beside it to look
   wrong against. Story 4's second privacy link is what put one there, so
   the two would have rendered side by side, one readable and one not.
   Correcting it here costs a selector and no new value; the alternative was
   shipping the contrast bug and the thing that reveals it in one build. */
.contact-page__privacy a:not(.button),
.contact-page__sent a:not(.button) {
	color: var(--color-form-panel-fg);
	text-decoration: underline;
	text-underline-offset: 2px;
	--linkdeco: underline;
}

.contact-page__privacy a:not(.button):hover,
.contact-page__sent a:not(.button):hover {
	color: var(--color-form-panel-fg);
	text-decoration-thickness: 2px;
}

.contact-page__privacy a:not(.button):focus-visible,
.contact-page__sent a:not(.button):focus-visible {
	color: var(--color-form-panel-fg);
	text-decoration-thickness: 2px;
	outline: 2px solid var(--ground-default-ring);
	outline-offset: 2px;
}

/* =====================================================================
   THE DIRECT ROUTE — "Or email me directly at …", under the Send button.

   IT IS A SIBLING OF THE FORM, NOT A CELL IN IT, and that is the one
   structural thing about this block. The drawing has it inside the form
   as a full-width row; the template emits it after the form instead, so
   that it also renders on the confirmation, where the form is gone and
   the reader has already committed. Visually identical either way — it
   is the last thing in the panel in both states — and the rule below
   supplies the spacing the grid's `gap` would have.

   THE RULE ABOVE IT IS A HAIRLINE ON WHITE AT 18%, which is the
   drawing's `rgba(255,255,255,.18)`. It is a separator inside a panel
   rather than a control boundary, so 1.4.11's 3:1 does not apply to it —
   the affordance it marks is the link's own underline, and the two
   things either side of the rule are readable without it.

   THIS SHEET STILL DECLARES NO COLOUR VALUE. The rule's alpha white is
   the one thing that looks like an exception and is not: it is a tint of
   the panel's own ink applied as a separator, not a role the states
   sheet decides, and it composites against whatever fill the panel
   carries rather than pinning a hex. The ink, the link and the ring all
   read roles as everything else here does.
   ===================================================================== */
.contact-page__direct {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 8px 12px;
	margin-top: 32px;
	padding-top: 24px;
	border-top: 1px solid rgb(255 255 255 / 18%);
	/* 18px, About's body size, up from 16. The route to Joe that does not
	   involve the form should not be the smallest thing on the panel. */
	font-size: 18px;
	line-height: 1.5;
	color: var(--state-input-hint-fg);
}

/* The address itself is the route. It reads the same three link states
   the privacy line does, and for the same reason — teal on slate is
   1.35:1, so rest is the panel's own ink and the underline is the whole
   affordance. (0,2,0) to clear the four page-level link rules above,
   which are decided against white. */
/* EVERY ONE OF THESE THREE LOST THE CASCADE AND SHIPPED THAT WAY, FOUND
   2026-10-03 BY JOE LOOKING AT THE PAGE. The values below were always
   right; none of them reached the element. Measured live before the fix:
   the address rendered #0b6b78 on the #3C5158 panel at **1.35:1**, and
   hovering it went to #000000 at 2.51:1.

   THE ARITHMETIC, because it is the whole bug and it is invisible in a
   diff. `:not()` contributes the specificity of its ARGUMENT, so the
   page's own four link rules are higher than they look:

     .contact-page a:not(.button)                      (0,2,1)
     .contact-page a:not(.button):hover                (0,3,1)
     .contact-page__direct .contact-page__direct-address        (0,2,0)  LOST
     .contact-page__direct .contact-page__direct-address:hover  (0,3,0)  LOST

   The intended rules carry TWO classes and no element, so they tie on
   count and lose on the element -- and source order never got consulted,
   because specificity is decided first. The sibling rules at
   `.contact-page__privacy a:not(.button)` do not have this problem for a
   reason worth seeing: their link is a DESCENDANT `a`, so they pick up
   the same element term the page rule has and win on order. This link
   carries its class ITSELF, so the shape that works two blocks up does
   not work here. That is the trap.

   FIXED WITH `:not(.button)` RATHER THAN BY REORDERING, so these win on
   specificity alone: (0,3,0) for rest against the page's (0,2,1), and
   (0,4,0) for hover and focus against its (0,3,1). Source order is not
   load-bearing any more. `.button` is a real guard here too -- a CTA
   dropped in this block should keep its button paint.

   THIS IS THE THIRD TIME THIS EXACT BUG HAS BEEN FOUND ON THIS PANEL,
   and the block above records the first two: `.contact-page__sent`'s
   link shipped at this same 1.35:1 from v1.13.30, and story 4's privacy
   link would have rendered beside it. Both were pulled into a (0,2,1)
   selector list. This one was written as its own block instead and so
   missed the fix -- the comment up there even has a "THE DIRECT ROUTE"
   section pointing at it. checks/05 7e now greps for the raised form.

   NO TEAL IS AVAILABLE ON THIS PANEL, which is why the fix is the
   panel's own white rather than a hover hue. Joe asked for a teal hover
   on 2026-10-03; on #3C5158 the white-ground teal is 1.35:1 and the
   dark-ground teal #0f8c9d is 2.10:1, both far under the 4.5:1 text
   floor, and no underline affects 1.4.3. The teal hover landed on the
   dark PAGE instead (site-ground-dark.css), where #0f8c9d is 4.82:1.
   White here also matches the Privacy Statement link two elements up,
   which is the same panel and the same decision. */
.contact-page__direct .contact-page__direct-address:not(.button) {
	color: var(--color-form-panel-fg);
	text-decoration: underline;
	text-underline-offset: 3px;
	--linkdeco: underline;
}

.contact-page__direct .contact-page__direct-address:not(.button):hover {
	color: var(--color-form-panel-fg);
	text-decoration-thickness: 2px;
}

.contact-page__direct .contact-page__direct-address:not(.button):focus-visible {
	color: var(--color-form-panel-fg);
	text-decoration-thickness: 2px;
	outline: 2px solid var(--ground-default-ring);
	outline-offset: 2px;
}

/* "Copy address" — a text button, and the one control on this page that
   is not a link and not a form field.

   IT IS SQUARE-CORNERED AND UNFILLED, WHICH LOOKS LIKE A FAMILY C
   VIOLATION AND IS NOT. Round-means-clickable applies to the four
   control categories site-interactive-states.css enumerates; this is a
   text button styled as text, the same shape "Send another message" has
   on the confirmation, and giving it a 999px pill beside the Send button
   would read as a second submit.

   IT ONLY EXISTS WITH SCRIPT. The template ships it `hidden` and
   contact.js reveals it, so there is no state in which this renders
   inert. The `:hover`/`:focus-visible` pair is stated because a bare
   <button> on this site inherits Neve's own, which paints
   `var(--primarybtnhoverbg)` — the #2f5aae the Content Module tab bar
   was caught by at v1.13.11, and the reason CLAUDE.md's palette entry
   says to check what ELEMENT the parent theme paints. */
.contact-page__direct .contact-page__copy {
	font-family: var(--font-body);
	font-size: 15px;
	font-weight: 500;
	line-height: 1.5;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	color: var(--color-form-panel-fg);
	text-decoration: underline;
	text-underline-offset: 3px;
	cursor: pointer;
}

.contact-page__direct .contact-page__copy:hover {
	background: none;
	color: var(--color-form-panel-fg);
	text-decoration-thickness: 2px;
}

.contact-page__direct .contact-page__copy:focus-visible {
	background: none;
	color: var(--color-form-panel-fg);
	outline: 2px solid var(--ground-default-ring);
	outline-offset: 2px;
}

/* The live region. It is empty until the button is pressed, so it takes
   no space and needs no reserved line — the row wraps if it has to. */
.contact-page__direct .contact-page__copy-status {
	font-size: 15px;
}

/* ONE COLUMN AT THE SITEWIDE BREAKPOINT. 768px is this codebase's
   convention (single-project.css, flush-split.css, site-footer.css and
   four others), and it is KEPT at 768 rather than moved to the
   prototype's 640 now that the panel is the drawn width.

   THE REASONING THAT PUT IT HERE HAS BEEN SUPERSEDED AND THE NUMBER HAS
   NOT, which is worth separating. It read: the prototype was drawn
   against a 1200px panel where two columns still held at 700px, and this
   panel is 760px at its widest, so its columns reach the same tightness
   sooner. Story 5 made the panel 1200, so that argument is spent. What
   keeps 768 is the other half: it is this codebase's breakpoint, seven
   sheets use it, and a page that reflows 128px before its neighbours for
   no reason a reader can see is a worse page than one whose columns go
   single a little early. Responsive behaviour is the template's to
   decide; the mockup fixed the relationships, not the width it was drawn
   at. */
@media (max-width: 768px) {
	.contact-page__form {
		grid-template-columns: 1fr;
	}
}
