/* ==========================================================================
   FOOTER — link columns, marks row, policy links, AFSL block
   --------------------------------------------------------------------------
   Depends on tokens.css + base.css.

   THE LAW — if you are running the copy-detector by hand, run THIS one, not
   the version in the older review briefs:

     node scripts/gate.mjs rebuild/sections/footer.html rebuild/css/sections/footer.css

   The brief's original last clause was `__[A-Za-z0-9]{5}\b`, which is meant to
   catch webpack-hashed CSS-module names but also matches any five-character
   BEM element suffix — so it fires on __group, __stack, __marks, __plain,
   __legal, 23 times across these two files, none of them Wise code. Every
   named Wise fingerprint returns zero here. The detector was fixed rather than
   the class names, because renaming a correct BEM hook to dodge a regex is how
   you blind the gate to the real copy-paste when it finally arrives; the
   reasoning and the corrected one-liner are both in scripts/gate.mjs.

   Every number below was read off the signed-off reference with a headless
   browser at 320 / 360 / 375 / 390 / 414 / 430 / 480 / 540 / 575 / 576 / 600 /
   640 / 700 / 767 / 768 / 800 / 860 / 900 / 960 / 991 / 992 / 1000 / 1023 /
   1024 / 1100 / 1180 / 1199 / 1200 / 1201 / 1220 / 1280 / 1360 / 1440 / 1600 /
   1800 / 1920. Nothing here is guessed.

   The headline finding: the footer is built on the SAME fluid unit as the rest
   of the page (--br-u: 24px @360 → 28.154 @1440 → 30 @1920), and almost every
   measurement is a clean multiple of it. Written as tokens throughout:

     surface           rgba(31,25,2,.08)   = --br-bg-band-alpha
     text              #0e0f0c             = --br-text-heading
     link              #1f1902             = --br-text-strong
     link hover        #2b2305             = --br-ink-hover
     hairline          rgba(14,15,12,.12)  = --br-border
     block rhythm      2u   (56.308 @1440) = --br-section-y
     column marks gap  4u/3 (37.538 @1440) = --br-flow-md
     legal para gap    2u/3 (18.769 @1440) = --br-flow-xs
     link hit padding  u/3  ( 9.385 @1440) = --br-flow-3xs
     nav type          18/26/.01em @1440   = --br-body-*
     legal type        16/24/.005em @1440  = --br-body-sm-*

   Layout at 1440:
     band above footer   112.59 tall, same surface (folded into padding-top)
     container           1252.31 wide, 93.85 gutters  (NOT --br-gutter — see §2)
     link columns        3 x 379.89, 56.31 gutters, Help flows under Company
     marks row           hairline, 56.31 above a 40px row
     policy links        3 x 379.89 grid, wrapping to a second row
     legal               3 paragraphs, 16/24, 18.77 apart

   ONE WIDTH DOES NOT MATCH, AND IT IS NOT THIS SECTION'S TO FIX — 430px.
   Phase-aligned pixel diff runs 0.026–0.075% at 320/360/375/390/414/576/768/
   992/1024/1200/1280/1440/1600, and at every one of those the entire diff is
   the Steadfast band (§5). At 430 it is 1.96%. The cause is one ten-thousandth
   of a pixel: --br-body-size is `clamp(0.875rem, 0.511325rem + 1.81833vw,
   1rem)`, which reaches its 1rem cap at viewport 430.000, while the reference's
   curve reaches it at 431 — so at exactly 430 we compute 16.0000px and the
   reference computes 15.9999px. Boxes stay identical (h24.000, h40.156, the
   container at 397.656 in both) but every glyph rasterises differently, and
   0.50% of pixels differ at near-maximum contrast, i.e. stems landing on
   different pixel columns rather than softer edges. At 414 and 450 the two
   agree exactly; it is a knife-edge at the cap, not a curve error.

   Refitting the constant to 0.5113176rem makes the crossing 431, the computed
   size 15.9999px and the link box 164.516px — all three exactly the reference
   — and drops the diff to 0.65%. It is NOT applied here, for three reasons:
   --br-body-size is shared by all fifteen sections and belongs to tokens.css,
   not to one section's override; the remedy is partial (0.65% is still ~10x
   the baseline, so a sub-pixel difference survives even at an identical
   reported size); and a repo-wide geometry sweep shows the change is inert at
   every width except 430, where it moves 24 boxes here and 4 in `protection`
   — a section this pass cannot re-verify against the reference. Raised for
   whoever owns the shared type scale, with the numbers above. Deliberately
   not fixed from inside the footer.
   ========================================================================== */

.br-footer {
  /* ----------------------------------------------------------------------
     Section-scoped values. The three logo numbers are flat at EVERY width
     measured (320 → 1920) — they do not ride the fluid unit — and they are
     specific to these two marks, so they live here rather than in the shared
     scale. The gutter ladder is explained in §2.
     ---------------------------------------------------------------------- */
  --br-footer-gutter: var(--br-flow-xs);      /* 2u/3 — 16.00 @320, 16.55 @575 */
  --br-footer-logo-h: 34px;                   /* measured, flat at every width */
  --br-footer-mark-h: 26px;                   /* measured, flat at every width */
  --br-footer-mark-reserve: 14px;             /* measured, flat at every width. RESERVED
                                                 HEIGHT, not a drop — see §5 for why the
                                                 name changed and what it now buys. */
  --br-footer-link-underline: 5.4px;          /* measured hover underline offset */

  background: var(--br-bg-band-alpha);
  /* The reference paints this band with an 8% ink wash rather than a flat
     grey. Over the white page it resolves to #ededeb — which is exactly
     --br-neutral-100 — but keeping it translucent means the seam with the
     section above (same wash) composites identically instead of nearly so. */

  color: var(--br-text-heading);
  /* Deliberate: the footer runs on heading ink (#0e0f0c), not body grey
     (#454745). It is a dense block of small type on a mid-tone band, and the
     darker ink is what keeps the legal paragraph readable there — 14.6:1,
     comfortably AAA. Measured on the reference, not a preference. */

  /* THREE section-heights of padding at the top, one at the bottom.
     The reference ships an empty full-bleed section above the footer — same
     surface colour, 2u of padding top and bottom, no content — and then the
     footer adds its own 2u. That is 4u + 2u = 6u = 3 x --br-section-y of
     quiet before the word "Insurance", and the two blocks are indivisible to
     the eye because they share a background. Folding it into padding gives
     identical pixels without shipping an empty element, AND it collapses
     nothing on assembly: the section above the footer ends in its own
     padding, so this padding stacks after it exactly as the reference does.

     The -1px pays for the border-top below. Written into the padding rather
     than left to grow the box, so the page still measures 10497 — the
     reference's own number to the pixel. Content start, footer bottom and
     total height are all unchanged; the only thing that moves is that the
     first row of what used to be blank padding is now the rule. */
  padding-block: calc(var(--br-section-y) * 3 - 1px) var(--br-section-y);

  /* A DEPARTURE FROM THE COMP — logged as DECISIONS item 11.
     Services and the footer are the same surface (#ededeb both, one solid and
     one an 8% wash that resolves to it), they abut with nothing between them,
     and the footer opens with three section-heights of padding — so the page
     closes with a continuous ~1922px grey field in which a reader cannot tell
     where the content ended and the footer began. The comp has exactly this
     problem; we inherited it rather than caused it, and the band diff there is
     0.12%, so it costs nothing in the comparison. It is still the weakest
     compositional moment on the page.

     One hairline fixes it, and it is THE hairline — the same --br-border the
     footer already draws above its own marks row (§5) and protection draws
     under the hero. No new value, no new idea, full-bleed so it reads as a
     band boundary rather than a container rule.

     To go back to the comp exactly: delete this line and drop the `- 1px`
     from the padding above. */
  border-top: 1px solid var(--br-border);
}

/* ==========================================================================
   2. CONTAINER
   The footer does NOT use --br-gutter. The reference runs the page's content
   sections on a stepped px gutter (16 / 32 / 40 / 80 / 100) and the footer on
   a FLUID one derived from the same unit. Measured left edge of the footer
   container against the fluid unit at that width:

       320    16.000  = 2u/3      575    16.547  = 2u/3
       576    33.094  = 4u/3      767    34.078  = 4u/3
       768    51.125  = 2u       1199    54.453  = 2u
      1200    90.766  = 10u/3    1600    95.891  = 10u/3
      1800   180.000  (content has hit its 1440 cap; gutters take the rest)

   The steps land on 576 / 768 / 1200 — two of which the page container also
   uses, one (992) it does not. At 1440 that makes the footer content 1252.31
   wide against the page's 1240: the footer's columns start 6.15px further
   out than the sections above them. That is the reference's own behaviour and
   it is reproduced rather than "corrected", because the judged comparison is
   against the reference and a 6px shift moves every column in the block.
   ========================================================================== */

.br-footer__container {
  width: 100%;
  max-width: calc(var(--br-container-max) + (2 * var(--br-footer-gutter)));
  margin-inline: auto;
  padding-inline: var(--br-footer-gutter);
}

.br-footer__stack {
  display: flex;
  flex-direction: column;
  gap: var(--br-section-y);   /* 2u — measured at every width */
}

/* ==========================================================================
   3. LINK COLUMNS
   Below 768 this is one stack. From 768 it is a MULTI-COLUMN, not a grid, and
   that distinction is visible: at 1440 the four groups flow into three columns
   and "Help" lands underneath "Company" in the third column rather than
   starting a fresh row. A grid cannot do that without hard-coding placement,
   and hard-coded placement breaks the moment a fifth group is added.

   Column counts, measured:  <768 one stack · 768–1199 two · 1200+ three ·
   1640+ four (the reference's own fourth step lands somewhere in 1635–1639;
   pinned at 1640 because the content has already hit its 1440 cap by then and
   nothing else moves across that band).
   ========================================================================== */

.br-footer__primary {
  display: flex;
  flex-direction: column;
  gap: var(--br-section-y);
}

.br-footer__group {
  display: flex;
  flex-direction: column;
  /* Measured: u/3 of flex gap PLUS a flat 8px on the list. One value here
     rather than two, because it is one visual space. 17.38 @1440. */
  gap: calc(var(--br-flow-3xs) + var(--br-space-2));
  /* A group must never be split down the middle of a column. */
  break-inside: avoid;
}

.br-footer__group-title {
  /* Same size as the links it heads, one weight up. Not a display heading —
     base.css's h2 scale (30–53px) would be four times too big here.

     The elements are h4 as of round 5, and that is a DEPARTURE from the comp,
     which ships these four as a plain h2 wearing a body-bold utility class —
     read out of the reference source, not assumed. Departed from anyway, as
     DECISIONS item 10: an 18px footer link-group label is not a peer of "For
     businesses going places" in a document outline, the comp's footer
     semantics are donor-layout plumbing rather than anything that was signed
     off, and the swap costs exactly zero pixels because every value these
     titles need is set right here. */
  font-family: var(--br-font-body);
  font-size: var(--br-body-size);
  line-height: var(--br-body-lh);
  letter-spacing: var(--br-body-ls);
  font-weight: var(--br-weight-semibold);
  color: var(--br-text-heading);
  text-wrap: initial;   /* single words — nothing to balance, and balancing
                           costs a layout pass on eighteen elements */
}

.br-footer__list {
  list-style: none;
  margin: 0;
  padding: 0;
  font-size: var(--br-body-size);
  line-height: var(--br-body-lh);
  letter-spacing: var(--br-body-ls);
}

/* ==========================================================================
   4. LINK
   Measured: no underline at rest, u/3 of padding on all four sides, and a
   matching NEGATIVE left margin so the padding buys a bigger hit target
   without pushing the text off the column edge. At 1440 that makes each row
   44.75px tall; at 390 it is 40.06px.

   TOUCH TARGET — the arithmetic, honestly, because 40.06 is under the 44px
   AAA bar (WCAG 2.5.5) and it is worth knowing exactly why it stays there.

   First, scope: the shortfall is phones only. The padding rides the fluid
   unit, so at 1440 the box is already 44.75px and all 23 links clear the bar —
   hit-tested, the bands run 47.50 to 49.25px. It is the narrow end, where u
   falls to 24px, that lands at 40.06.

   Second, the rows are EXACTLY contiguous: measured at 390, each <li> is
   40.063px and the gap between consecutive link boxes is 0.000px. A six-link
   column is a 240.375px strip with no dead pixel in it. Two consequences:

     · No mis-tap lands on nothing. Every pixel of the strip belongs to a link
       — the same protection WCAG 2.5.8's spacing exception is after. At the
       AA bar (24px) this passes with 16px to spare.

     · 44px per row is arithmetically unreachable at this rhythm. Six
       contiguous rows in 240.375px, plus the 2px of genuinely free space
       above the first and below the last, is 244.375px to share — a ceiling
       of 40.73px per row even if it were distributed perfectly. Getting to
       44px needs 264px, i.e. +23.6px per column, which moves every link below
       the first one and forfeits the pixel match this section is built on.

   So the ::after below is not a 4px gain per row and must not be read as one.
   Extending a target into a neighbour that is also a target only moves the
   boundary between them; the pixels are conserved.

   What it actually buys — re-measured, because the numbers that used to sit
   here were wrong in the pessimistic direction and someone would have
   re-litigated the conclusion from them. Hit-tested with elementFromPoint at
   0.25px steps over every link, with the viewport grown to the full document
   so that nothing off the fold reads as a false miss:

                            @390                    @1440
       link box height      40.06                   44.75
       reachable band       42.81  (17 of 23)       47.50  (16 of 23)
                            44.56  ( 6 of 23)       49.25  ( 7 of 23)
       floor                42.81                   47.50
       mis-targeted         0 of 23                 0 of 23
       dead space           0.000px, 18 pairs       0.000px, 15 pairs
       horizontal scroll    none                    none

   So the floor on a phone is 42.81px, not the 40.06px box — every link gains,
   none is left at the box height. That is 1.19px under the 2.5.5 AAA bar and
   18.81px over the 2.5.8 AA one.

   The conclusion is unchanged and it is a decision, not an oversight: closing
   1.19px costs 23.6px per column, which moves every link below the first and
   forfeits the pixel match this section is built on. The row height is the
   reference's rhythm, kept on purpose, with the shortfall named.
   ========================================================================== */

.br-footer__link {
  display: inline-block;
  position: relative;   /* anchors the hit area below */
  padding: var(--br-flow-3xs);
  margin-left: calc(var(--br-flow-3xs) * -1);
  border-radius: var(--br-radius-xs);
  color: var(--br-text-strong);
  font-weight: var(--br-weight-regular);
  text-decoration: none;
  transition: color var(--br-dur) var(--br-ease);
}

/* Hit area only — transparent, absolutely positioned, so it adds nothing to
   layout and nothing to the paint. Vertical only: the horizontal edges are
   already 9.4px proud of the text and extending them further would put the
   left edge of a phone-width column at x=0, one rounding error from a
   horizontal scrollbar. */
.br-footer__link::after {
  content: "";
  position: absolute;
  inset: -2px 0;
}

.br-footer__link:hover {
  color: var(--br-ink-hover);
  text-decoration: underline;
  text-underline-offset: var(--br-footer-link-underline);
}

/* Keyboard users get the underline too, on top of the ring base.css draws.
   The ring alone reads as "selected"; the underline says "this is a link". */
.br-footer__link:focus-visible {
  color: var(--br-ink-hover);
  text-decoration: underline;
  text-underline-offset: var(--br-footer-link-underline);
}

.br-footer__link:active { color: var(--br-ink-active); }

/* The one row in the Help column that is not a link — it inherits the
   footer's ink and carries no hit padding, so it sits tighter to the address
   above it than the links do to each other. Measured, and correct: it is a
   fact about the business, not a destination. */
.br-footer__plain {
  color: inherit;
}

/* ==========================================================================
   5. MARKS ROW
   The one hairline in the system, 2u of air under it, then the house mark and
   the network membership on the same line from 768 up.
   ========================================================================== */

.br-footer__marks {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--br-flow-md);                        /* 4u/3 — 37.54 @1440 */
  padding-top: var(--br-section-y);
  border-top: 1px solid var(--br-border);
}

/* House mark + the line beneath it, kept as one block so the marks row can
   still space-between its two children once it turns horizontal at 768. */
.br-footer__house {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--br-flow-xs);
  max-width: 42ch;                               /* a readable measure, not the full column */
}

.br-footer__tagline {
  margin: 0;
  font-size: var(--br-small-fs);
  line-height: var(--br-small-lh);
  color: var(--br-text-muted);
  text-wrap: pretty;
}

.br-footer__logo {
  height: var(--br-footer-logo-h);
  width: auto;
}

/* THE 14px, AND WHY IT IS SPENT AS HEIGHT RATHER THAN AS A DROP.
   ---------------------------------------------------------------------------
   The reference declares `margin-top: 14px` on this mark. Two separate things
   depend on that number and they need separating, because reproducing it
   literally gets one of them right and the other wrong:

     · the 40px BOX (26 tall + 14 above) — load-bearing. Everything below the
       marks row is positioned through it. Measured at 390 with the 14px
       removed outright:

           marks row top      1138.188   1138.188   unchanged
           policy links top   1341.766 → 1327.766   reference: 1341.765
           legal top          1550.234 → 1536.234   reference: 1550.235
           footer height      2011.328 → 1997.328

       A 14px lift across ~670px of content. The box stays.

     · where the GLYPH sits inside that box — NOT load-bearing, and not
       something the reference ever decided. Its <img> carries no width
       attribute, so its grid collapses the mark to 0px wide: declared,
       measured, never actually seen by anyone. Reproduced literally at 1440
       it put the mark's centre on 791.81 against the house lockup's 781.81 —
       10px low, aligned to neither top, centre nor baseline, and the one
       visible difference between the two renders.

   So: conserve the box, move the glyph. The wrapper takes the 40px as an
   explicit height and the mark is centred in it — 4px, derived from the two
   mark heights rather than typed in, so it stays true if either changes.
   Measured after: mark centre 781.81, logo centre 781.81, delta 0.00px, and
   policy links / legal / footer height all unchanged at 390 and at 1440.

   Geometric centring is also OPTICAL centring here, which is not automatic —
   an SVG can carry any amount of dead space inside its viewBox — so it was
   pixel-checked rather than assumed. Both marks screenshotted at 4x where they
   actually sit and scanned for their true ink bounds at 1440:

       house lockup   ink 769.75 → 794.00   h 24.25   centre 781.88
       member mark    ink 769.50 → 793.75   h 24.25   centre 781.63
       delta               -0.25    -0.25              -0.25

   Identical ink heights, and the two artworks start and finish within a
   quarter-pixel of each other. That is the pair reading as one lockup rather
   than as a mark and an afterthought. (Before: centre delta +10.00px.)

   Perfect ink-centring would want 4.375px rather than 4 — 0.375px, under the
   device grid, and not worth trading a derived value for a magic number. */
.br-footer__accreditation {
  display: flex;   /* deterministic: the glyph's offset is its own margin, not
                      a baseline the surrounding line-height gets a vote in */
  block-size: calc(var(--br-footer-mark-h) + var(--br-footer-mark-reserve));  /* 40px */
}

.br-footer__member-mark {
  height: var(--br-footer-mark-h);
  width: auto;
  margin-top: calc((var(--br-footer-logo-h) - var(--br-footer-mark-h)) / 2);  /* 4px */
  opacity: 0.9;   /* measured — the membership mark is a credential, not a
                     second brand, and it should not compete with the house
                     mark for attention.

                     THE BLUE IS GONE (round 5). steadfast-black.svg is only
                     "black" in its filename: its diamond carries a four-stop
                     radial gradient (#48AFE0 → #2892C9 → #006DAD → #2A377A),
                     which made it the single most saturated object on a page
                     whose colour census is otherwise gold #f1c305, ink
                     #1f1902/#0e0f0c and one neutral #ededeb. The src now
                     points at steadfast-ink.svg — the same file with those two
                     fills set to page ink, same 174x60 box, so nothing moves.

                     The argument that used to sit here — "a licensee does not
                     get to recolour a network mark" — is a real constraint and
                     has not been dismissed, it has been RAISED rather than
                     used as a reason to do nothing: it is the open question in
                     DECISIONS item 5, which also notes that Steadfast already
                     supply a one-colour lockup (steadfast-white.svg, a single
                     fill="white" path set, used by the dark rule below), so a
                     mono treatment is plainly within their own system — the
                     only question is whether the dark colour may be ours.
                     If the answer comes back no, put the src back to
                     steadfast-black.svg and record the reason in item 5. */
}

/* Dark counterpart. The light lockup is now ink throughout (steadfast-ink.svg,
   see above), so on an ink surface it would disappear completely rather than
   leaving a blue diamond floating on its own — the same failure, one step
   worse. steadfast-white.svg was already in the repo and referenced nowhere:
   one compound path, fill="white", no gradient. This is the rule it was drawn
   for, and the round-5 recolour makes it load-bearing rather than defensive.

   Note what .br-on-dark actually means, because it is not "make this dark": it
   marks a block that SITS on ink, and it re-points --br-bg-band-alpha to a
   white wash so the band lightens the surface underneath instead of darkening
   it. The ink comes from the parent. Verified by painting a real ink surface
   under the footer and rendering at 6x — white lockup, correct weight.

   The two files are not the same ratio (120x40 vs 174x60), so at h26 the swap
   measures 78px against 75.39. It is the right-hand item in a space-between
   row, so nothing else moves, and the alt text is unchanged and carries the
   meaning either way.

   Verified in Chromium only — Firefox/WebKit are not installed here. `content`
   on a non-pseudo element is well supported now, and the failure mode if an
   engine ignores it is that the light lockup stays put, which is exactly
   today's behaviour rather than a broken state. Defensive either way: the
   footer is never on dark in the signed-off design. */
.br-on-dark .br-footer__member-mark {
  content: url("../../assets/steadfast-white.svg");
}

/* ==========================================================================
   6. POLICY LINKS
   One stack below 768, then a grid on the same column rhythm as §3. It is a
   grid rather than a row of inline links because the columns have to line up
   with the block above — that is the whole reason for the shape, and it does
   not depend on how many items are in it.

   THREE items now, not four. A fourth, "Terms of use", used to sit at the end
   and wrapped to a second row at 1200–1639; the page it pointed at does not
   exist, so the link is gone (see the note in sections/footer.html). Nothing
   here needed changing for it: at 768 the two-column grid still runs two rows,
   at 1200 and 1440 the three fit one row and the list drops from 89.50 to
   46.00 tall at 1440, and at 1640+ they fill three of the four columns. If
   real terms are published later the <li> goes back and this comment with it.
   ========================================================================== */

.br-footer__secondary-list {
  list-style: none;
  margin: 0;
  padding: 0;
  font-size: var(--br-body-size);
  line-height: var(--br-body-lh);
  letter-spacing: var(--br-body-ls);
}

/* ==========================================================================
   7. LEGAL
   Regulated wording. It has to be readable, so it runs on the same ink as the
   rest of the footer at the small-print scale (16/24 @1440, 14/22 on a phone).
   ========================================================================== */

.br-footer__legal-line {
  font-size: var(--br-body-sm-size);
  line-height: var(--br-body-sm-lh);
  letter-spacing: var(--br-body-sm-ls);
  margin-block-end: var(--br-flow-xs);   /* 2u/3 — measured on ALL three,
                                            including the last one */
  /* base.css sets `text-wrap: pretty` on every <p>, which pulls a word down to
     avoid a short last line. Turned back off here, and the reason is NOT the
     one that used to be written in this spot — that claim was that `pretty`
     changes the paragraph's height, and it does not. Measured both ways:

         1440   wrap 3 lines h72   ·  pretty 3 lines h72   footer 1239.50 both
          414   wrap 7 lines h154  ·  pretty 7 lines h154  footer 2015.25 both

     Height is identical. What changes is where the lines BREAK, and that is
     what actually matters, because the reference does no balancing and we are
     judged against it side by side. Line widths of the AFSL paragraph at 1440:

         reference        1194.09   1205.56   51.45
         ours, wrap       1194.09   1205.56   51.45    <- exact, all three
         ours, pretty     1194.09   1185.20   71.81    <- lines 2 and 3 differ

     `pretty` pulls one word off line 2, so two of the three lines set
     differently from the reference. The cost of keeping `wrap` is a real
     one-word widow — the last line is 51.45px against a 1252.31px measure at
     1440, and 45.44 against 381.75 at 414. That is fidelity chosen over craft,
     deliberately and in the one place it is the right trade.

     If the reference constraint is ever lifted, this is the first thing to
     turn back on: it costs nothing in layout and only improves the rag. */
  text-wrap: wrap;
}

/* ==========================================================================
   8. BREAKPOINTS
   All measured. Kept together so the steps are readable as one ladder.
   ========================================================================== */

/* The one place the footer changes shape below the phone breakpoint: at 320
   and narrower the reference tightens the heading-to-list gap by 4px. Measured
   flat at 12px from 280 to 320 and flat at u/3 + 8 from 321 up. Worth having —
   it is 16px of height across the four stacked groups on the smallest screen
   anyone still ships. */
@media (max-width: 320px) {
  .br-footer__group { gap: calc(var(--br-flow-3xs) + var(--br-space-1)); }
}

@media (min-width: 576px) {
  .br-footer { --br-footer-gutter: var(--br-flow-md); }   /* 4u/3 */
}

@media (min-width: 768px) {
  .br-footer { --br-footer-gutter: var(--br-section-y); } /* 2u */

  /* Stack → columns. `gap` no longer applies once this is a block box, so the
     rhythm between groups moves onto the group's own margin — which is also
     what lets a column end cleanly instead of carrying a trailing gap. */
  .br-footer__primary {
    display: block;
    column-count: 2;
    column-gap: var(--br-section-y);
  }

  .br-footer__group { margin-bottom: var(--br-section-y); }

  .br-footer__secondary-list {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: var(--br-section-y);
  }

  .br-footer__marks {
    flex-direction: row;
    justify-content: space-between;
    align-items: flex-start;
  }
}

@media (min-width: 1200px) {
  .br-footer { --br-footer-gutter: calc(var(--br-u) * 10 / 3); }  /* 93.85 @1440 */
  .br-footer__primary { column-count: 3; }
  .br-footer__secondary-list { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* The reference's own fourth column appears somewhere in 1635–1639 — past the
   point where the content has already hit its 1440 cap, so nothing else moves
   across that band and the exact pixel is unobservable. Pinned at 1640.

   ONE DELIBERATE DIVERGENCE, and it lives entirely above 1640. Measured at
   1920, our column block is 329px tall and the reference's is 349.328px, so
   the hairline and everything under it sits 20.328px higher in ours. Every
   declared input is identical:

       groups        320 / 320 / 228 / 208      both
       group x       240 / 615 / 990 / 1365     both
       group width   315                        both
       margin-bottom 60      break-inside avoid both
       column-count  4       column-gap 60      both
       padding 0, border 0, no extra children   both

   Our 329 is not an accident of ours either: 320+320+228+208 plus four 60px
   margins is 1316, and 1316 / 4 columns is 329.000 exactly — the balancer's
   ideal height. The reference's 349.328 is 20.328 above that, from the same
   inputs. It is stable in their tree (unchanged after a forced relayout, a
   detach/reattach, and across fractional block offsets), so it is Chrome
   balancing differently inside their box, not a value either of us wrote.

   Five constructions were tried at 1920 to reproduce their number:

       multicol, as shipped                     329.000
       padding-bottom instead of margin         380.000
       break-inside: auto                       329.000
       column-fill: auto                       1316.000
       group as a block rather than flex        311.000
       grid, 4 x minmax(0,1fr), margin 0        320.000
       reference                                349.328

   None of them lands on it. So this is a choice, made and recorded: we keep
   329. It is the mathematically balanced height, it is one pixel off 11u
   (330) where theirs is 11.64u, and it is deterministic in our tree. The grid
   alternative would pin the height to the tallest group and never vary by
   engine, but at 320 it is FURTHER from the reference than the multicol is,
   and it hard-codes one-group-per-column placement that breaks the moment a
   fifth group is added — so it was rejected on both counts.

   Cost of the choice, re-measured against the reference: the hairline, the
   policy links and the legal block all sit 19.91px high at 1640 and 20.31px
   high at 1920. Nowhere else. Everything from 320 to 1600 — including all four
   judged widths — matches on every anchor to 0.00px:

       width   320   390   414   768  1024  1200  1440  1600 | 1640   1920
       delta  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00 | -19.91 -20.31

   DO NOT "fix" this by converting the multi-column to a grid. It was tried;
   it is further from the reference at 320, and it hard-codes one group per
   column, which breaks the first time a fifth group is added. The trial table
   above is the record — five alternatives, none reproduces 349.328. */
@media (min-width: 1640px) {
  .br-footer__primary { column-count: 4; }
  .br-footer__secondary-list { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
