/* pico-theme.css — thepico.in's design layer, aligned to the hkborah.com contract.
 *
 * Generated. Safe to re-apply after a rebuild: re-run the generator and reload
 * this one file. Nothing here mutates assets/styles-BkY_AgdN.css.
 *
 * Loaded LAST in <head>, so these equal-specificity rules win, and being
 * unlayered they also beat anything Tailwind emitted inside @layer utilities.
 *
 * Three things this file exists to fix, none of which the token layer alone
 * could touch:
 *   1. the four Google-Fonts weights, replaced by self-hosted subsets
 *   2. eight declarations that hardcode Inter / Space Grotesk / ui-monospace
 *      instead of reading the token, so changing the token changed nothing
 *   3. the accent, which is one value where hkborah now needs two roles
 */

/* 1. Self-hosted, subsetted faces. The character set is the union of this site
 *    and hkborah.com, so a copy edit on either cannot silently fall back to a
 *    system font. hkborah's own subsets lack 24 characters this site uses. */
@font-face{font-family:'Public Sans';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/public-sans-400.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'Public Sans';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/public-sans-500.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'Public Sans';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/public-sans-600.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'Archivo';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/archivo-500.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'Archivo';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/archivo-600.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'Archivo';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/archivo-700.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/ibm-plex-mono-400.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/ibm-plex-mono-600.woff2') format('woff2');unicode-range:U+20-7e, U+b7, U+2013-2014, U+2018-2019, U+201c-201d, U+2026, U+2191, U+2193, U+221e, U+25aa, U+25ad-25af, U+25b3, U+25b6, U+25b8, U+25cf, U+2691, U+26a0, U+2713, U+2715}

/* 2. The contract: one hue in two roles, hkborah's type stack, its primitives.
 *    Surfaces, hairlines and motion already matched and are left alone. */
:root {
  --font-sans:    'Public Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-display: 'Archivo', 'Public Sans', system-ui, sans-serif;
  --font-mono:    'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Consolas,
                  'Liberation Mono', 'Courier New', monospace;

  /* As text or a mark on the dark surfaces it must clear 4.5:1 against the
     lightest surface it lands on; as a fill under white text it must clear
     4.5:1 the other way. The single original value managed neither. */
  --accent:      oklch(65.5% 0.163 21.5);
  --accent-deep: oklch(57% 0.195 21.5);
  --accent-soft: color-mix(in oklab, var(--accent) 14%, transparent);
  --accent-line: color-mix(in oklab, var(--accent) 55%, transparent);

  /* Fills carry white text; rings and error states are the lighter role. */
  --primary:         var(--accent-deep);
  --ring:            var(--accent);
  --destructive:     var(--accent);
  --chart-1:         var(--accent);
  --sidebar-primary: var(--accent-deep);
  --sidebar-ring:    var(--accent);

  /* Named status roles, so failing and succeeding states stop borrowing the
     accent by hand. One hue, so the names point at the colours that exist. */
  --status-error: var(--accent);
  --status-ok:    var(--foreground);

  /* Secondary tone, matched to hkborah's --titanium-dim (was oklch(75%)). */
  --titanium-dim:     oklch(60% 0 0);
  --muted-foreground: oklch(60% 0 0);

  /* Spacing scale: 4px base, which names the 12px and 20px middle steps. */
  --space-1: .25rem;  --space-2: .5rem;   --space-3: .75rem;  --space-4: 1rem;
  --space-5: 1.5rem;  --space-6: 2rem;    --space-7: 2.5rem;
  --measure: 64ch;

  /* Native widgets follow the theme instead of the platform's light default. */
  color-scheme: dark;
}

/* 3. Declarations that hardcoded a family instead of reading the token. */
:root,:host{font-family:var(--font-sans)}
code,kbd,samp,pre{font-family:var(--font-mono)}
.mono-label{font-family:var(--font-mono)}
.font-display{font-family:var(--font-display)}
.note-prose code{font-family:var(--font-mono)}

/* 4. Legibility floor. hkborah's smallest text is 11px; these nine rules sat
 *    between 6.4px and 10.9px. Nothing below 11px may render. */
.mono-label{font-size:.6875rem}
.note-prose th,.text-\[0\.45rem\],.text-\[0\.4rem\],.text-\[0\.55rem\],.text-\[0\.5rem\],.text-\[0\.62rem\],.text-\[0\.65rem\],.text-\[0\.6rem\]{font-size:.6875rem}

/* 5. The old accent literal, now driven by the role token — the SVG fills and
 *    strokes, the marker and underline colours, and the quote rule. */
.fill-\[oklch\(0\.601_0\.201_21\.5\)\]{fill:var(--accent)}
.stroke-\[oklch\(0\.601_0\.201_21\.5\)\]{stroke:var(--accent)}
.accent-\[oklch\(0\.601_0\.201_21\.5\)\]{accent-color:var(--accent)}
.note-prose a{-webkit-text-decoration:underline var(--accent);text-decoration:underline var(--accent)}
.note-prose a:hover{color:var(--accent)}
.note-prose ul>li::marker{color:var(--accent)}
.note-prose blockquote{border-left:2px solid var(--accent)}

/* 6. --primary is shadcn's *fill* token: the background of a solid button.
 *    The markup also reaches for text-primary, stroke-primary and border-primary,
 *    where the deep fill colour only manages 3.8:1 on --panel. hkborah separates
 *    the two roles, so here the role is decided per utility: text and marks take
 *    the lighter token, backgrounds keep the deep one. The token is substituted
 *    inside the original value so a colour-mix opacity survives intact. */
.border-primary{border-color:var(--accent)}
.border-primary\/30{border-color:var(--accent)}
.border-primary\/30{border-color:color-mix(in oklab, var(--accent) 30%, transparent)}
.border-primary\/40{border-color:var(--accent)}
.border-primary\/40{border-color:color-mix(in oklab, var(--accent) 40%, transparent)}
.border-primary\/50{border-color:var(--accent)}
.border-primary\/50{border-color:color-mix(in oklab, var(--accent) 50%, transparent)}
.fill-primary{fill:var(--accent)}
.stroke-primary{stroke:var(--accent)}
.text-primary{color:var(--accent)}
.text-primary\/40{color:var(--accent)}
.text-primary\/40{color:color-mix(in oklab, var(--accent) 40%, transparent)}
.outline-primary{outline-color:var(--accent)}
.group-hover\:text-primary:is(:where(.group):hover *){color:var(--accent)}
.hover\:border-primary:hover{border-color:var(--accent)}
.hover\:text-primary:hover{color:var(--accent)}
.focus\:border-primary:focus{border-color:var(--accent)}
.focus-visible\:outline-primary:focus-visible{outline-color:var(--accent)}
.xl\:border-primary{border-color:var(--accent)}
.node-hover:hover{stroke:var(--accent)}

/* 7. Exhibit captions are justified, as hkborah's are
 *    (`.exhibit__caption { text-align: justify; hyphens: auto }` there). Without
 *    hyphens a justified line can open rivers, so the two travel together. */
figure figcaption { text-align: justify; hyphens: auto; }

/* 8. Headline above exhibit 01. React owns the DOM order of the hero block, and
 *    it re-renders from the route chunk, so a markup reorder is reverted on
 *    hydration. CSS order is not React's to overwrite, so the reorder lives
 *    here: the credential strip, then the headline, then the exhibit. */
/* Scoped with :has(> h1) to the hero block. Unscoped, the order values below
   also hit any other .reveal.space-y-10 block -- and a sibling left at the
   default order 0 then sorts ahead of a first child pinned to order 1, which
   silently flipped the VEGA head above its own content. */
.reveal.space-y-10:has(> h1) { display: flex; flex-direction: column; }
.reveal.space-y-10:has(> h1) > .scroll-mt-24 { order: 3; }
/* h1 and h2 share an order on purpose: equal order falls back to DOM order, so
   the h2 lands directly under the h1. Left unset it would default to 0 and sort
   above everything, since the other children are 1, 2 and 3. */
.reveal.space-y-10:has(> h1) > h1,
.reveal.space-y-10:has(> h1) > h2 { order: 2; }
.reveal.space-y-10:has(> h1) > :first-child { order: 1; }

/* 9. Section heads, matched to hkborah's .section-head / .section-head--center:
 *    a block constrained to 48rem, centred, with the lead centred beneath it.
 *    thepico's section H2s were left-aligned and mostly full container width
 *    (1200px), where hkborah's are centred at 768px.
 *
 *    Two deliberate exclusions:
 *    - the manifesto article keeps its left alignment; it carries a 2px left
 *      accent border, so centring it would fight its own design.
 *    - the footer column headings are h2s too, but they live in <footer>, and
 *      every rule here is scoped to <section>. */
section div:has(> h2.display-xl) {
  /* width:100% matters: this block is also a flex item (see the order rule
     above), and auto inline margins on a flex item shrink it to its content
     instead of letting max-width do the constraining. */
  width: 100%;
  max-width: 48rem;
  margin-inline: auto;
  text-align: center;
}

/* Closing call-to-action: one line plus a button, centred. Matches hkborah's
   .section-cta, which is a centred flex column. */
section div:has(> h2.max-w-3xl) {
  align-items: center;
  text-align: center;
}

/* 10. "Reading this exhibit" block. The panel is 1198px wide but the prose was
 *     capped at max-w-3xl (768px) and left-aligned, so it sat in the left 64%
 *     of its box. Owner request: fill the box and justify. */
div.max-w-3xl.space-y-3 {
  max-width: none;
  text-align: justify;
}

/* 11. Hero: centre the headline pair, and separate it from the exhibit.
 *     Both headings were start-aligned, and the exhibit wrapper met the h2's
 *     box exactly (0px), so the two read as one block. */
.reveal.space-y-10:has(> h1) > h1,
.reveal.space-y-10:has(> h1) > h2 {
  text-align: center;
}
.reveal.space-y-10:has(> h1) > .scroll-mt-24 {
  margin-top: 2rem;
  /* space-y-10 puts a 40px margin-bottom on every child but the last in DOM
     order. This wrapper is last visually (order 3) but second in the DOM, so
     that margin became 40px of trailing space after the exhibit. */
  margin-bottom: 0;
}

/* 12. Hero bottom padding. The hero's inner container carried py-20 (80px top
 *     and bottom), which left 121px of empty space between the end of exhibit
 *     01 and the next section. Reduce the bottom edge only; the top stays.
 *     The :not() guard keeps this hero-only now that the governance section
 *     also carries an h1 -- see rule 27. */
main > section:has(h1):not(.hk-split-head) > div:first-child {
  padding-bottom: 1.5rem;
}

/* 13. Hero credential strip. hkborah's .hero__meta centres with
 *     justify-content: center -- it is a flex row, so text-align would do
 *     nothing -- and treats the runs inside as phrase-length rather than
 *     labels: .hero__meta .mono-label { font-size: .75rem; text-transform:
 *     none; letter-spacing: .04em }. Same values here. The mono voice stays;
 *     the caps and the .26em tracking go. */
.reveal.space-y-10:has(> h1) > :first-child {
  justify-content: center;
}
.reveal.space-y-10:has(> h1) > :first-child .mono-label {
  font-size: .75rem;
  text-transform: none;
  letter-spacing: .04em;
}

/* 14. Hero height. The section carried min-height: calc(100vh - 5rem) with
 *     align-items: center, so on any viewport taller than the content the
 *     section stretched and the slack split above and below -- 290px above and
 *     211px below at 1500px tall. hkborah's .hero has no min-height at all: it
 *     is exactly as tall as its content plus padding. Matching that. Same
 *     :not() guard as rule 12, for the same reason. */
main > section:has(h1):not(.hk-split-head) {
  min-height: 0;
}

/* 15. VEGA section body. Two owner requests have shaped this block.
 *
 *     First: it was a two-column grid -- the prose and its button in a 552px
 *     column, exhibit 02 in a 608px column beside it -- and became one column,
 *     the exhibit full width, the prose and its button centred.
 *
 *     Then: the prose was asked to sit between the section heading and exhibit
 *     02, where it had been sitting below the exhibit. The exhibit had been
 *     pulled above the prose with order 1, so both order overrides are now gone
 *     and the two grid items follow the DOM's own sequence -- prose, then
 *     exhibit. That is the sequence asked for, and it takes no markup move.
 *
 *     Scoped to a .grid that is a direct child of a .reveal.space-y-10 block and
 *     holds a figure, so it cannot catch a grid elsewhere. Checked against
 *     /deployments, where the deployment cards sit in grids with a different
 *     parent: this selector matches 1 element site-wide, on the homepage. */
.reveal.space-y-10 > .grid:has(> figure) {
  grid-template-columns: 1fr;
}
.reveal.space-y-10 > .grid:has(> figure) > :not(figure) {
  /* inline-level children (the button is inline-flex) centre with the text */
  text-align: center;
}

/* 16. (retired) VEGA section prose. This rule removed the paragraph's max-w-xl
 *     (576px) so it spanned its block instead of reading as a column beside
 *     nothing. Owner request since: every prose block on the homepage carries the
 *     same 48rem measure, so the paragraph now sets that in its own markup --
 *     max-w-3xl with mx-auto -- and nothing needs overriding here.
 *
 *     Kept as a stub so the rule numbers below stay stable and the history is
 *     legible. The rule's other half -- centring the grid's non-figure children,
 *     which is rule 15's text-align -- is untouched. */

/* 17. Every red button, one hover effect: white in, red label out -- the same
 *     as hkborah's .btn--solid, which wipes --ink in and flips the label to
 *     --accent-deep.
 *
 *     thepico's red buttons all carry bg-primary, but their hover did one of
 *     two nothing-much things: the fill-wipe ones wiped --primary over
 *     --primary, so the wipe was invisible; the others only dimmed with
 *     hover:opacity-90. Both are replaced with the real inversion.
 *
 *     Scoped to anchors and buttons so a decorative bg-primary block is not
 *     affected, and to .bg-primary so the transparent ghost buttons keep their
 *     own treatment. */
/* hkborah spells this token --ink; thepico calls the same white --foreground.
   Using --ink here resolved to nothing, which made the hover background
   transparent rather than white. */
a.bg-primary.fill-wipe::before,
button.bg-primary.fill-wipe::before {
  background: var(--foreground);
}
a.bg-primary:hover, a.bg-primary:focus-visible,
button.bg-primary:hover, button.bg-primary:focus-visible {
  background-color: var(--foreground);
  color: var(--accent-deep);
  /* the border is drawn in --primary; on white it would ring the button, and
     hkborah's solid button carries no visible frame */
  border-color: var(--foreground);
  /* replaces hover:opacity-90, which would wash the white out */
  opacity: 1;
}

/* 19. Eyebrow straps. "Reference Architecture" and every item like it -- the
 *     mono-label phrase sitting directly above a heading -- takes the same
 *     treatment as the hero's credential strap, which is hkborah's phrase-length
 *     role: .75rem, no caps, .04em tracking, centred.
 *
 *     Selected structurally (:has(+ h2)), not by text length, so it catches
 *     every eyebrow on every page without a class-per-item audit. The heading it
 *     introduces is centred with it -- a centred eyebrow over a left-aligned
 *     heading reads as a mistake.
 *
 *     Two things stay as they are:
 *     - the manifesto keeps left alignment; it carries a 2px left accent border
 *       and centring it fights its own design (same call as the section heads).
 *     - the exhibit panels' own labels -- "Exhibit 01", "The Safe Sigma
 *       Equation", "Reading this exhibit" -- are labels and in-panel straps, not
 *       eyebrow phrases, so they keep the uppercase label voice. hkborah draws
 *       the same line: caps are kept for the short label tier. */
p.mono-label:has(+ h1),
p.mono-label:has(+ h2),
p.mono-label:has(+ h3) {
  font-size: .75rem;
  text-transform: none;
  letter-spacing: .04em;
  text-align: center;
}
p.mono-label:has(+ h1) + h1,
p.mono-label:has(+ h2) + h2,
p.mono-label:has(+ h3) + h3 {
  text-align: center;
  margin-inline: auto;
}
/* The manifesto no longer needs an exclusion here: the owner asked for it to be
   centred, see rule 20. */

/* 20. Manifesto. Owner request: the heading and the blockquote, centred. This
 *     reverses an earlier decision to keep it left-aligned, which was made
 *     because the block carries a 2px left accent border. The border stays;
 *     only the alignment and the box position change.
 *
 *     margin-inline: auto is included because the box was pinned to the left of
 *     its wider container (margin-left 0 in a 1200px column), so centring the
 *     text alone would have left the whole block sitting off to the left. */
article.border-l-2 {
  text-align: center;
  margin-inline: auto;
  /* The border is gone on owner request, and with it the left padding that
     existed only to inset the text past the border. Left-only padding would
     push a centred block half its value to the right, so it goes too. */
  border-left-width: 0;
  padding-left: 0;
}

/* 21. The governance line in the band under the manifesto:
 *     "Governance must precede capability to prevent exponential remediation
 *     costs". Owner request to centre it.
 *
 *     The class signature font-display + text-xl + font-medium matches exactly
 *     two elements on the page -- this line, and the VEGA section's lead, which
 *     is already centred. So this cannot catch anything else, and is a no-op on
 *     the other match. The band's top and bottom rules are untouched. */
p.font-display.text-xl.font-medium {
  text-align: center;
}

/* 22. The two labelled sections on /capabilities whose labels read
 *     "The Commercial Architecture" and "Core Deployment Use Cases".
 *
 *     They were a different class from the "Capabilities" label they should
 *     match: text-[0.65rem] tracking-[0.3em] uppercase in Public Sans at 11px
 *     with 3.3px tracking and a sans face. "Capabilities" is mono-label, the
 *     phrase-length role: IBM Plex Mono at .75rem, no caps, .04em. So this
 *     matches the reference on all four counts, including the face -- the mono
 *     voice is what makes that label look like what it is.
 *
 *     Selected by the shared class signature, which only these two carry. */
p[class*="tracking-[0.3em]"] {
  font-family: var(--font-mono);
  font-size: .75rem;
  text-transform: none;
  letter-spacing: .04em;
  text-align: center;
}

/* And the sections those labels head: all their text centred. Scoped with
   :has() to the sections containing such a label, so it cannot reach the first
   section or any other. Elements that were deliberately justified -- the
   exhibit captions and the "Reading this exhibit" prose, both on owner
   request -- keep their justify, since centring them would undo that. */
/* Scoped by a marker class added to the two sections on this page, NOT by
   :has(label). The label class turns out to exist on four other pages too
   (Engagement Model, Publications, The Register, In progress, Strategic
   Deployment Review), so :has() was centring whole sections there as well --
   not what was asked for. The label treatment above stays site-wide, since it
   is the same kind of label; only the section centring is scoped. */
section.hk-centre-body {
  text-align: center;
}

/* 23. The opening block of the /capabilities page: the heading "Architecting
 *     Predictability in an Age of Probabilistic Risk." and the two paragraphs
 *     under it. Owner request to centre them.
 *
 *     The wrapper holds exactly those three children and no figure, so centring
 *     it cannot reach the exhibit beside it. (The exhibit used to sit above this
 *     block; owner request moved it below, and the scoping still holds either way.) margin-inline: auto is included because
 *     the box is 896px inside a 1200px column and was pinned left, so centreing
 *     the text alone would have left the whole block sitting off-centre. */
.reveal.mt-14.max-w-4xl.space-y-6 {
  text-align: center;
  margin-inline: auto;
}

/* 24. The head block above it, on the same page. Its h1 already had
 *     text-align: centre, but the box itself was pinned left -- margin-left 0,
 *     896px wide starting at x=40 -- so the centred text sat 152px left of the
 *     page centre (its box centred on 488 where the column centres on 640).
 *     The intent was centring; the box had simply never been given it.
 *     Scoped with :has(> h1) so it is the head block and nothing else. */
div.reveal.max-w-4xl.space-y-6:has(> h1),
/* The same defect on the two labelled sections further down this page: their
   text was centred, but those boxes were also pinned left, so their content sat
   152px left of centre. A block that opens with an eyebrow should sit where the
   eyebrow sits. */
/* Hooked on the label's own class signature rather than .mono-label: rule 22
   restyles those two eyebrows to look like mono-labels, but their class is still
   text-[0.65rem] tracking-[0.3em], so a .mono-label hook silently missed them. */
div.reveal.max-w-4xl:has(> p[class*="tracking-[0.3em]"]) {
  margin-inline: auto;
}

/* 25. The two intro blocks on /architecture -- "Commissioning sequence / Three
 *     layers, laid in order" and "Engagement Model / The PICO Deployment
 *     Roadmap". Owner request: centre both.
 *
 *     Their text was already half-centred: rule 19 centres a mono-label eyebrow
 *     and the h2 beneath it, and rule 22 centres the tracking-[0.3em] eyebrow on
 *     the Engagement Model block. But the 768px wrapper itself was pinned to the
 *     left of the 1200px column -- margin-left 0, starting at x=50 -- so its
 *     content centred on 434 where the column centres on 651: 217px left of the
 *     page centre. Rule 24 fixed the same defect further up this page; this is
 *     the same fix, and the eyebrow's own position is the tell -- it sat on 434
 *     too, because centred text in a pinned box is still pinned.
 *
 *     margin-inline: auto moves the box onto the centre line; text-align: centre
 *     then brings the h2 and the body paragraph along with the eyebrow that was
 *     already centred inside it.
 *
 *     Anchored on the class signature rather than on the label, for the reason
 *     rule 24 records: the two eyebrows do not share a class, one being
 *     .mono-label and the other text-[0.65rem] tracking-[0.3em]. The signature
 *     is exactly these two blocks site-wide -- the only other max-w-3xl reveal
 *     wrappers, on /testimonials and the homepage grid, carry space-y-4. */
div.reveal.max-w-3xl.space-y-5 {
  margin-inline: auto;
  text-align: center;
}

/* 26. Hero thesis. Owner request: copy between the headline pair and exhibit 01.
 *
 *     Rule 8 makes the hero block a flex column with three order slots -- the
 *     credential strip (1), the headline pair (2), the exhibit wrapper (3) -- so
 *     a new child carries the default order 0 and an unpinned paragraph would
 *     have sorted above the credential strip. It is pinned to 2 instead, which
 *     drops it into the headline pair's slot. Equal order falls back to DOM
 *     order, and there the two paragraphs follow the h2, so the block reads
 *     credential strip, headline, thesis, exhibit.
 *
 *     space-y-10 in this build applies margin-BLOCK-END to every child but the
 *     last -- not margin-top, as v3 did -- so the h2 handed 40px down to the copy
 *     and the lede handed another 40px to its own body: 64px and 57px measured,
 *     where a lede and the body it introduces are meant to read as one block.
 *     Those two hand-offs are zeroed and the pair takes its spacing from
 *     margin-top alone. The grouping then reads correctly -- 28px from the
 *     headline into the lede, 14px from the lede into its body, so the block is
 *     still tighter within than it is against the headline above it.
 *
 *     Exhibit 01 needs no adjustment: the last paragraph is the last DOM child,
 *     so space-y leaves it no trailing margin, and rule 11's 2rem is what
 *     separates the copy from the exhibit. */
.reveal.space-y-10:has(> h1) > .hero-thesis,
.reveal.space-y-10:has(> h1) > .hero-thesis-body {
  order: 2;
}
.reveal.space-y-10:has(> h1) > h2,
.reveal.space-y-10:has(> h1) > .hero-thesis {
  margin-bottom: 0;
}
.reveal.space-y-10:has(> h1) > .hero-thesis {
  margin-top: 1.75rem;
}
.reveal.space-y-10:has(> h1) > .hero-thesis-body {
  margin-top: .875rem;
}

/* 27. The split head on the governance section (owner request): "Governance must
 *     precede capability" is an <h1> at display-xl size, and "to prevent
 *     exponential remediation costs" an <h2> matching the VEGA section's lead
 *     exactly -- font-display, text-xl, text-2xl at sm, text-3xl at lg,
 *     tracking-tight.
 *
 *     Two overlay rules have to be told about this section.
 *
 *     First, rule 9 centres a section head by matching a direct `h2.display-xl`
 *     child. The h2 here is deliberately not display-xl any more, so that match
 *     is gone and the block would fall back to the left edge of the 1200px
 *     column. Rule 9's geometry is repeated below, keyed on the marker class
 *     instead of on the heading's own classes, so a further tweak to the head
 *     cannot silently un-centre the block again.
 *
 *     Second, rules 12 and 14 both select `main > section:has(h1)`, and the hero
 *     was the only match until this section gained an h1. Both now exclude the
 *     marker: the hero keeps its reduced 24px bottom padding, and this section
 *     keeps its py-24 (96px), so the 192px separation from exhibit 05 is intact
 *     (without the guard, rule 12 would cut it by 72px).
 *
 *     The :first-child in the selector matters now that exhibit 05 lives inside
 *     this section too (owner request): the container holds two .reveal children
 *     -- the head block and the exhibit wrapper -- and only the head is a section
 *     head. Without it the exhibit would also be squeezed to 48rem and centred. */
section.hk-split-head > div > .reveal:first-child {
  width: 100%;
  max-width: 48rem;
  margin-inline: auto;
  text-align: center;
}

/* 28. The header between 1024px and 1279px. The nav link row appears at lg (1024px),
 *     but logo + links + the motion toggle + the CTA only fit from 1280px up. In that
 *     band the row overflowed by 85px, and the browser took the space from the logo,
 *     whose w-auto let it shrink to zero width -- so the logo was invisible at every
 *     width from 1024 to 1279.
 *
 *     The toggle is declared `hidden xl:inline-flex`, i.e. it is meant to be absent
 *     below 1280px, but something later in the cascade keeps it displayed: a CSSOM
 *     scan for a matching `display` declaration finds no rule, so the winner is not
 *     reachable by selector inspection. This restates the intent for that band and
 *     frees the 175px the header needs there. The toggle stays in the header at
 *     >=1280px and in the mobile menu below 1024px, and the OS reduced-motion
 *     setting is honoured either way, so no one loses the ability to ask for less
 *     motion. */
@media (min-width: 1024px) and (max-width: 1279.98px) {
  header nav div > button[aria-pressed] {
    display: none !important;
  }
}
