/* ==========================================================================
   myk-btn — the Mykrobial button primitive
   ==========================================================================

   WHAT THIS IS
   ------------
   A COPY of Salient's CTA button, relabelled into the Mykrobial namespace and
   retuned to the Figma comps. Not a wrapper around Salient's classes and not a
   from-scratch button: a copy we own, where every difference from the donor is
   a CSS custom property rather than a fork.

   This is the founder's stated method for any component with no one-for-one
   match: "start with the closest Salient button, then alter it just with CSS
   variables to get to the shape we want, so the functionality is still all
   there." Anything you need to change about a Mykrobial button should be
   reachable by setting a token on a scope. If it is not, add a token here —
   do not copy this block into a section sheet. That is how we ended up with
   three separate implementations of the same 1px stroke (see §4).

   THE DONOR
   ---------
   Salient's "Call To Action" element in its `basic` style, as served by the
   live mirror at http://127.0.0.1:5010 and vendored into this build.

     markup    .nectar-cta > .nectar-button-type > .link_wrap
                                                 > .link_text > .text
     primary   [data-style="basic"][data-using-bg="true"]
     outline   [data-style="basic"][data-using-bg="false"]
               .border_thickness_1px.border_color_ffffff.hover_border_color_ffffff

   Vendored donor rules, verbatim, with the file each came from:

     css/build/style.q-98889c766d.css
       .nectar-cta[class*=border_thickness] .link_wrap,
       .nectar-cta[data-using-bg=true] .link_wrap
                                     {display:inline-flex;align-items:center;
                                      cursor:pointer}
       .nectar-cta .link_wrap        {position:relative;text-decoration:inherit;
                                      speak:none}
       .nectar-cta .link_wrap .link_text
                                     {padding-right:36px;position:relative;
                                      display:inline-block}          <-- §3
       .nectar-cta[data-using-bg=true] .text          {margin-right:10px}   <-- §3
       .nectar-cta[data-style=basic] .link_wrap .link_text  {padding-right:0}
       .nectar-cta[data-style=basic][data-using-bg=true] .text {margin-right:0}
       body[data-button-style^=rounded] .nectar-cta .link_wrap:before
                                     {border-radius:200px}

     uploads/sites/37/salient/salient-dynamic-styles-multi-id-37.q-6d7044fbbd.css
       body[data-button-style^="rounded"] .nectar-cta:not([data-style="material"]) .link_wrap
                                     {border-radius:200px!important;
                                      box-shadow:none; transition: … .45s
                                      cubic-bezier(0.25,1,0.33,1)}
       .nectar-cta .nectar-button-type
                                     {font-family:Inter;
                                      text-transform:uppercase!important;
                                      letter-spacing:.1em;font-size:14px;
                                      font-weight:600}                <-- §3

   WHY THE DONOR'S NESTING IS NOT REPRODUCED
   -----------------------------------------
   Salient's five-level chain exists so its shortcode has hooks for the icon,
   arrow, underline and text-reveal styles. In the `basic` style — the one we
   are copying — every one of those hooks is switched OFF by Salient's own
   rules (`padding-right:0`, `margin-right:0`, no arrow, no underline). What is
   left is a single inline-flex box with a stadium radius and a label. So
   `.myk-btn` is that one box.

   The chain is still supported (§6) for markup that already carries it —
   `sections/18-cta-expand.html` uses the raw Salient chain and is correct —
   so a section can adopt this component without a markup rewrite.

   PROVENANCE NOTE, recorded because it is load-bearing
   ---------------------------------------------------
   The `.mk-pill` this component replaces was authored without a Salient
   ancestor (`sections/00-hero.html` line 281 says so). Transcribing the donor
   independently lands on the same declarations `.mk-pill` already had. That
   is evidence the pill was a correct reproduction of the donor all along, and
   it is why this migration is expected to be pixel-neutral at rest rather
   than an improvement. The value delivered here is ownership, one source of
   truth, and a token surface — not a fidelity gain.

   A NAIVE SWAP TO THE DONOR'S CLASSES HAS ALREADY BEEN TRIED AND FAILED
   --------------------------------------------------------------------
   Provenance lane P1 replaced the hero CTA with the raw `.nectar-cta` chain
   and 00-hero REGRESSED +0.27 pp (4.352 -> 4.622); the patch was reverted.
   Root cause as filed: Salient's 36px `.link_text` padding — an icon gap for
   an icon our button does not have — pushed the label advance 173 -> 197.11.
   §3 neutralises that through a token. Note the donor's OWN `basic` style
   already zeroes it, so the regression means P1 landed on a non-`basic`
   style; either way the token makes the outcome independent of that guess.
   ========================================================================== */


/* ==========================================================================
   §1. TOKENS — the entire retune surface
   --------------------------------------------------------------------------
   Set these on a scope (`:root`, a section, an element) to restyle a button.
   Every value below is the MYKROBIAL default; the donor's value is named in
   the comment wherever the two differ, so the delta is always visible.
   ========================================================================== */
.myk-btn {
  /* --- box ------------------------------------------------------------- */
  --myk-btn-pad-y:        var(--mk-pill-pad-y, 8px);
  --myk-btn-pad-x:        var(--mk-pill-pad-x, 18px);
  /* Per-side x padding. Board `3269:5586` draws every CTA family symmetric
     (8/18), so both default to `--myk-btn-pad-x` and nothing changes for the
     seven CTAs. They exist because the board's GROUP family is NOT symmetric —
     `3269:5640`/`3269:5650` pad 18 left / 24 right to balance their icon (§3.5
     BUILD RULE G2) — and the footer newsletter pair is a GROUP instance
     (24/26 and 26/24, `figma-truth/21-logos-footer.spec.md` §1.2.3). Added as
     TOKENS rather than a section override, per the component's own contract. */
  --myk-btn-pad-l:        var(--myk-btn-pad-x);
  --myk-btn-pad-r:        var(--myk-btn-pad-x);
  --myk-btn-height:       40px;
  --myk-btn-radius:       var(--mk-radius-pill, 54px); /* donor 200px — both
                                                          clamp to a stadium on
                                                          a 40px box, so this is
                                                          a notation difference,
                                                          not a paint one */
  --myk-btn-gap:          var(--mk-space-10, 10px);    /* Figma itemSpacing 10 */
  --myk-btn-justify:      normal;                      /* MIN/flex-start: the
                                                          label's LEFT edge is
                                                          the one Figma places */

  /* --- paint ----------------------------------------------------------- */
  --myk-btn-bg:           transparent;
  /* R19-06: `--myk-header-btn-fg` is declared ONLY inside `#header-outer
     .light-text`/`.dark-text` (site.css §1B.2) — everywhere else on the page
     it is unset, so this falls straight through to the historical literal.
     This is the whole mechanism: the header's two tone states retarget this
     ONE token, at the ONE place every `.myk-btn` already reads it from
     (§2.1b below), instead of a per-element `color … !important` restated at
     hand-computed specificity in three different files. See site.css §1B.2
     for the full citation of the founding doc's DRY rule this answers. */
  --myk-btn-fg:           var(--myk-header-btn-fg, var(--mk-ink-inverse, #ffffff));
  --myk-btn-border:       transparent;
  --myk-btn-border-width: 0px;
  --myk-btn-blur:         var(--mk-pill-blur, blur(4px));  /* Figma
                                                          BACKGROUND_BLUR 4 */

  /* --- type ------------------------------------------------------------ */
  --myk-btn-font:         var(--mk-font-sans, "Poppins", sans-serif);
                                                    /* donor: Inter          */
  --myk-btn-size:         var(--mk-size-base, 16px);/* donor: 14px           */
  --myk-btn-weight:       var(--mk-w-regular, 400); /* donor: 600            */
  --myk-btn-track:        var(--mk-track-nav, 1px); /* donor: .1em — PIXELS
                                                       here, do not convert  */
  --myk-btn-leading:      var(--mk-lh-node, 24px);
  --myk-btn-case:         none;                     /* donor: uppercase!important */

  /* --- the donor's icon geometry, kept reachable ------------------------ */
  /* Salient reserves room for the icon it ships in the label's right inset.
     Figma's button has no icon, so both are 0 — but they are TOKENS, not a
     blanket override, so an icon variant can restore the donor's exact
     geometry by setting them back to 36px / 10px. This is the P1 regression,
     parameterised. */
  --myk-btn-icon-gap:     0px;                      /* donor: 36px           */
  --myk-btn-icon-advance: 0px;                      /* donor: 10px           */
  /* CSS hangs `letter-spacing` off the LAST character; Figma's hug does not
     carry it. Sections that measured the phantom pixel set this to the track. */
  --myk-btn-track-trim:   0px;

  /* --- motion ---------------------------------------------------------- */
  /* ONE HOVER CLOCK. Everything a hover changes — fill, ring, label colour,
     the growth and the shadow — runs on `--myk-btn-hover-dur` /
     `--myk-btn-hover-ease` so the whole state lands together.

     THIS IS THE FOUNDERS' "ROLLOVER STATES ARE NOT CONSISTENT" FIX, and the
     mechanism is exactly what `review/branding/buttons.md` §8.2 diagnosed:
     before this pass the ring, the fill and the label each ran on a different
     clock AND each ring RENDERER ran on its own, so the same button class
     behaved three ways —
       default renderer  box-shadow ring, NO transition declared -> ring SNAPS
       --ring-outline    outline ring,    NO transition declared -> ring SNAPS
       --ring-layer      ::after border,  450ms                  -> ring GLIDES
     against a 300ms fill and a 450ms label. Ecology carries `--ring-layer`,
     which is precisely the button the founders singled out.

     The value is the donor's own hover-layer clock, measured in §4.2 from
     portfolio-layered: `opacity .3s ease, transform .3s ease` on the layer
     that APPEARS on hover. Every property below is that layer, so it is that
     clock. Recorded as a deliberate reconciliation: the 450ms
     `cubic-bezier(.15,.75,.5,1)` that `color` and `--ring-layer` used before
     is `--mk-motion-dur-hover`, a build token with no donor or board behind
     it, and the alternative reading (unify UP to 450ms) is equally consistent
     but slower than anything measured. See SHARED-REQUESTS.md REQ-BTN-1.

     `--myk-btn-fill-dur` / `--myk-btn-fill-ease` are RETAINED as the source
     these default from, so a section that already overrides them keeps
     working and keeps its whole button on one clock rather than half of it.
     Reduced motion still resolves through `--mk-motion-dur-fill`, which
     tokens.css collapses to 1ms (§7). */
  --myk-btn-fill-dur:     var(--mk-motion-dur-fill, 300ms);
  --myk-btn-fill-ease:    var(--mk-ease-fill, ease);
  --myk-btn-hover-dur:    var(--myk-btn-fill-dur);
  --myk-btn-hover-ease:   var(--myk-btn-fill-ease);
  /* `box-shadow` is the DEFAULT ring renderer and `outline-color` is
     `--ring-outline`'s; both were absent from this list, which is why both
     snapped. `--ring-layer`'s ::after is transitioned at §4 on the same two
     tokens. All three renderers now behave identically. */
  --myk-btn-transition:   color         var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
                          box-shadow    var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
                          outline-color var(--myk-btn-hover-dur) var(--myk-btn-hover-ease);

  /* --- hover ----------------------------------------------------------- */
  /* THE BOARD'S HOVER, and there are only TWO of them in the whole system.
     `review/branding/buttons.md` §3.1–§3.5, read as a set:

       PRIMARY   -> linear-gradient(90deg,#2BD8D8,#137983) + label #FFFFFF
       EVERYTHING ELSE (secondary §3.2, tertiary §3.3, group §3.5)
                 -> fill #F4F9FB + label #1EB2BC

     Both add `0 4px 4px rgba(0,0,0,.15)` (`#00000026`) and both GROW by 2px
     per side (padding 8/18 -> 10/20). NAV ITEM (§3.4) is the one family that
     does neither: BUILD RULE N1 is "a white text-opacity change and nothing
     else", so `--ghost` / `--active` / `--icon` neutralise all five values
     below rather than opting out of the mechanism.

     So the default here is the NON-PRIMARY hover, and `--primary` overrides
     two values. Before this pass the default was `--mk-teal`, which appears
     nowhere on the board as a hover and produced the inversion the founders
     saw: our secondary hovered TO turquoise, the board hovers FROM white
     outline TO near-white fill WITH a turquoise label.

     `--myk-btn-hover-border: transparent` because the hover nodes' `#FFFFFF`
     strokes are phantoms — §2's bounds-bleed test, `3269:5600` and
     `3269:5632`, zero inflation. On a `#F4F9FB` fill a white ring is invisible
     either way; transparent is what the board actually says. */
  --myk-btn-hover-bg:      var(--mk-pill-hover-fill,  #f4f9fb);  /* 3269:5607 */
  --myk-btn-hover-fg:      var(--mk-pill-hover-label, #1eb2bc);  /* 3269:5608 */
  --myk-btn-hover-border:  transparent;                          /* §2 phantom */
  --myk-btn-hover-shadow:  0 4px 4px rgba(0, 0, 0, .149);        /* #00000026  */
  /* Per-SIDE growth. The board grows by +4px on BOTH axes at every width
     (padding 8/18 -> 10/20, h40 -> h44). BUILD RULE M1 reconciled this to the
     donor's `scale(1.07)`, and that reconciliation is REJECTED here with a
     measurement: a uniform scale is proportional and the board's growth is
     absolute, so 1.07 gives +14.7px on the 210px hero CTA, +6.9px on the 99px
     nav CTA and +22.5px on the 322px ecology CTA. Three different growths on
     one page is the defect this pass exists to remove. §3.1's own B3 note says
     it: "a single uniform `scale` is only exact for a 40px-wide button."
     +2px per side is exact at every width, and §4.2's real lesson — "nothing
     about the text box changes" — is honoured by growing the LAYER, not the
     button (§2.4). */
  --myk-btn-hover-grow:    2px;
  --myk-btn-hover-opacity: 1;
}


/* ==========================================================================
   §2. THE COMPONENT
   ========================================================================== */

/* --- 2.1 base — the donor's `.link_wrap`, collapsed --------------------- */
.myk-btn {
  display: inline-flex;             /* donor: [data-using-bg=true] .link_wrap */
  align-items: center;              /* donor: same rule                       */
  justify-content: var(--myk-btn-justify);
  gap: var(--myk-btn-gap);
  padding: var(--myk-btn-pad-y) var(--myk-btn-pad-r)
           var(--myk-btn-pad-y) var(--myk-btn-pad-l);
  height: var(--myk-btn-height);
  border: 0;
  border-radius: var(--myk-btn-radius);
  background: var(--myk-btn-bg);
  -webkit-backdrop-filter: var(--myk-btn-blur);
  backdrop-filter: var(--myk-btn-blur);
  font-family: var(--myk-btn-font);
  font-weight: var(--myk-btn-weight);
  font-size: var(--myk-btn-size);
  line-height: var(--myk-btn-leading);
  letter-spacing: var(--myk-btn-track);
  text-transform: var(--myk-btn-case);
  color: var(--myk-btn-fg);
  text-align: center;
  text-decoration: none;            /* donor: `text-decoration:inherit`, which
                                       inherits the demo's underline; Figma has
                                       none */
  white-space: nowrap;
  position: relative;               /* donor: `.link_wrap{position:relative}`  */
  isolation: isolate;               /* confines the fill layer's stacking      */
  cursor: pointer;                  /* donor: same rule as the inline-flex     */
  transition: var(--myk-btn-transition);
}

/* --- 2.1b THE LABEL COLOUR NEEDS TWO CLASSES, AND FINDING OUT WHY WAS THE
       SINGLE BIGGEST DISCOVERY OF THE BUTTON SWEEP ------------------------- */
/*
   `.myk-btn { color: var(--myk-btn-fg) }` above is (0,1,0) and it LOSES, in
   both states, to two rules Salient ships globally:

       body a       { color: #ffac66 }   (0,1,1)   <- the demo's accent orange
       a:hover      { color: inherit  }   (0,1,1)

   Read `CSS.getMatchedStylesForNode` under a forced `:hover` on three separate
   buttons to confirm it; all three return the same ladder, with the
   component's declaration below both.

   THE CONSEQUENCE IS EXACTLY THE FOUNDERS' COMPLAINT, and it is a deeper cause
   than the one `buttons.md` §8.2 found. `a:hover{color:inherit}` means every
   anchor-based button's HOVER LABEL is whatever its SECTION happens to
   inherit — not what the button system says. Measured across the page before
   this rule existed, with `--myk-btn-hover-fg` correctly computing to
   `#1eb2bc` on all of them:

       ecology CTA x3, "Resources in your area"   hover label -> #FFFFFF
       nav CTA, both who-and-why pills, amenities hover label -> #1A2328
       footer "Join"                              hover label -> #1EB2BC

   Three different hover labels from ONE token, decided by which section the
   button was standing in. The footer Join is the tell: it is the only one of
   the eleven that is a `<button>` and not an `<a>`, so `a:hover` never matched
   it and the token reached it untouched.

   It also explains a rest-state oddity nobody had chased: the amenities CTA's
   `<a>` computed `#ffac66` AT REST — Salient's accent orange, straight from
   `body a` — and was invisible only because that section pinned a colour on
   the label span instead of on the button.

   The doubled class is (0,2,0) and beats both. No `!important`: the header
   cascade in §5 already needs one because Salient forces colour there, and
   adding a second irreversible weapon here would make a section unable to
   retarget its own label. */
.myk-btn.myk-btn { color: var(--myk-btn-fg); }

/* --- 2.2 the label — where the donor's icon geometry lands --------------- */
/* `> *` is the label element, whatever it is called: the nav uses
   `<span class="menu-title-text">`, the hero a bare `<span>`, section 18 the
   donor's own `.text`. Keeping it structural means the component does not
   care which markup a section brought with it.
   z-index 1 lifts the label above the §2.4 fill layer. */
.myk-btn > * {
  position: relative;
  z-index: 1;
  padding-right: var(--myk-btn-icon-gap);
  margin-right: calc(var(--myk-btn-icon-advance) - var(--myk-btn-track-trim));
}

/* --- 2.3 variants ------------------------------------------------------- */

/* PRIMARY — hero "Start your safe stay" (3085:146) and the 18/19 CTA cards.
   Figma fill #1eb2bc. The node ALSO declares a #ffffff stroke that does not
   render: the export bounds bleed +0.0/+0.0, which they could not if a centred
   1px stroke were painted. So: fill, no ring. */
.myk-btn--primary {
  --myk-btn-bg:            var(--mk-pill-solid-fill, #1eb2bc);
  --myk-btn-border-width:  0px;
  /* PROMOTED FROM `sections/00-hero.css` PART C.7 (D06), per REQ-HERO-2, which
     asked for exactly this and said "delete it from the section sheet — do not
     leave both." Done: C.7's rules are gone, its evidence kept as a pointer.

     `3269:5600` "Primary Button Hover State":
       fill    linear-gradient(90deg, #2BD8D8 0%, #137983 100%)
               — axis proven by RENDER sampling, not by decoding
               gradientTransform: across the 91px body f=0.00 (43,215,215) ·
               0.50 (31,169,173) · 1.00 (20,123,132), and identical top-to-
               bottom, so there is no vertical component. 90deg, left is light.
       shadow  DROP_SHADOW #00000026 offset(0,4) radius 4
       box     pad 10/20, h44 — the +2px-per-side growth, inherited from §1
       label   stays #FFFFFF, unlike every other family
     Bleed-tested before use: `3269:5598` exports 107x40 for a 107x40 node
     (zero inflation) and `3269:5600` exports 99x52 for a 91x44 node, which is
     the shadow (4 each side, 8 below), not a stroke. NO RING IN EITHER STATE.

     THE `opacity: 0.87` LIFT THAT USED TO LIVE HERE IS DELETED. It is not in
     the Figma system anywhere — `buttons.md` §8.1 traces it to the
     resort/rooms donor — and it was the shared root cause of five of the seven
     failing buttons. An opacity lift also cannot reach a gradient, which is
     why the replacement is a cross-fade and not a tuned number. */
  --myk-btn-hover-bg:      linear-gradient(90deg, #2BD8D8 0%, #137983 100%);
  --myk-btn-hover-fg:      var(--mk-ink-inverse, #ffffff);
  --myk-btn-hover-opacity: 1;
}

/* OUTLINE — nav "Begin recovery" (3085:152) and the 04-ecology CTA.
   Measured off the Figma export, and these are the numbers to hold:
     interior   BIT-EXACTLY transparent — 5720/5720 px at rgba(0,0,0,0)
     stroke     exactly 1.00 CSS px #ffffff, strokeAlign CENTER
     label      #ffffff, Poppins Medium 500
     effect     BACKGROUND_BLUR radius 4
     radius     40px authored (54 token clamps to the same stadium) */
.myk-btn--outline {
  --myk-btn-bg:           transparent;
  /* R19-06: same mechanism as `--myk-btn-fg` above — `--myk-header-cta-*` is
     declared only inside the header's two tone states (site.css §1B.2) and
     is unset everywhere else, so an outline button anywhere outside the
     header is byte-for-byte unchanged. Previously the header's "Begin
     recovery" CTA was the ONLY outline button on the page with a dark-text
     variant at all, expressed as four properties restated wholesale in
     site.css whenever `.dark-text` was active; now it is the SAME token this
     variant has always exposed, just sourced from the header when the header
     supplies one. */
  --myk-btn-border:       var(--myk-header-cta-border, var(--mk-pill-outline-stroke, #ffffff));
  --myk-btn-border-width: 1px;
  --myk-btn-hover-border: var(--myk-header-cta-hover-border, transparent);      /* §2 phantom, unless the header overrides it */
  /* R20-03 (`r20:header`, FT-20260830): turquoise text as the CTA's own
     constant identity, background fill swapping to black on hover — see
     site.css's round-20 banner (just above `#header-outer.light-text`) for
     the full read of the founder's verbal description and why
     `figma-truth/_zoom/00-hero-cta.png` turned out NOT to be this button.
     `--myk-btn-fg` was never set on THIS variant before (it fell straight
     through to the base `.myk-btn` chain, §1, which is what the nav LINKS
     still use) — this is the one line that gives the CTA its own rest-label
     colour, independent of the nav links' own tone-adaptive one, with the
     exact same "unset outside the header" fallback shape as every other
     token on this block, so 04-ecology's outline CTA (the only other
     `.myk-btn--outline` consumer) is unaffected. */
  --myk-btn-fg:           var(--myk-header-cta-fg, var(--myk-header-btn-fg, var(--mk-ink-inverse, #ffffff)));
  --myk-btn-hover-fg:     var(--myk-header-cta-hover-fg, var(--mk-pill-hover-label, #1eb2bc));
  /* R20-03: the fill half of the swap. Unset outside the header (falls to
     the base `.myk-btn` default, `--mk-pill-hover-fill` #f4f9fb — today's
     04-ecology hover, unchanged) and solid black (`--mk-ink-strong`,
     tokens.css:88) inside it. */
  --myk-btn-hover-bg:     var(--myk-header-cta-hover-bg, var(--mk-pill-hover-fill, #f4f9fb));
}

/* NAV ITEM — BUILD RULE N1, and it is the one family that opts out of the
   whole §2.4 hover.
   Board `3269:5620/5622/5624` (§3.4): default, hover and selected are all
   40px tall with NO fill, NO ring, NO shadow and NO growth. Hover is "a 75% ->
   100% white text-opacity change and nothing else". Verified there by
   edge-step scan: default and hover show no step at the boundary at all — the
   backdrop photograph continues through unchanged.

   So `--ghost` / `--active` neutralise all five hover values instead of
   opting out of the mechanism. The layer still exists and still paints
   nothing, which keeps ONE implementation rather than a second code path.
   (Inside the header it does not even exist: §5 sets `content: none` on these
   links' ::before and restores it only for `--outline`.)

   ⚠️ STALE-COMMENT CORRECTION, R20-02 (`r20:header`, FT-20260830): this
   paragraph used to claim the 75% half lived in `sections/00-hero.css`
   PART D. IT DID ONCE, but PART D's own D.1 (`foldback:hero-nav`,
   2026-08-18 — a real lane, not a guess) re-derived the question from the
   SafeStay hero board itself (854:363, nodes 3017:589/3016:403, both 100%
   fill, no opacity) and explicitly DELETED that candidate rule as wrong:
   "Do not apply the ladder to `.mk-nav__list`." PART D today declares no
   rules at all — this file's comment was simply never updated when that
   happened, and R19-06 (2026-08-29) mechanically token-ised whatever was
   live by then (already flat 100%) without re-opening the question, so the
   ladder was genuinely gone, live, until this round.

   R20-02 RESTORED IT ANYWAY, HEADER-WIDE, via `--myk-header-btn-fg` in
   `css/site.css` (`#header-outer.light-text`/`.dark-text` — NOT this file,
   same "scoped in the header, not defaulted here" shape as before, just a
   different mechanism than the stale claim above described) — on the
   strength of the founder's own live, current verbal instruction this round
   ("whatever the equivalent is that we did with the white"), which is a
   DELIBERATE REVERSAL of the Aug-18 finding, not a rediscovery of a bug.
   Full trail: site.css's own round-20 banner and
   `founder-trace/helix/R20-02.md`. Both readings have real receipts behind
   them; if she says this reads wrong, reverting is dropping the `.75` step
   in both `#header-outer` tone blocks back to their flat 100% values.

   ORIGINAL SETTLING, KEPT FOR THE RECORD: the two sources disagreed about
   the RESTING pixel — the branding board said 75% (`3269:5620`),
   `figma-truth/00-hero.spec.md` §4 said `nav.link` (`3017:589`) is
   `#ffffff`. `media-misc.md` §4.3 (`3271:6085`, `opacity: 0.75`) and the
   founders' own D45/D48 corroborated the 75% figure — but for a DIFFERENT
   asset (the branding-site nav component), which is exactly what PART D's
   D.1 used to rule the ladder out for THIS hero nav specifically. A
   `--ghost` button used outside the header still has no header evidence
   either way, so the default here stays at the inherited `--myk-btn-fg` and
   the ladder — whichever way it currently reads — stays scoped to where its
   receipts are.

   ⚠️ NEVER WRITE `--myk-btn-hover-fg: var(--myk-btn-fg)` HERE. It reads as
   "hover keeps the resting colour" and it is a CUSTOM-PROPERTY CYCLE: §2.4's
   hover rule sets `--myk-btn-fg: var(--myk-btn-hover-fg)`, so the pair
   references itself, both become guaranteed-invalid at computed-value time,
   `color` falls back to the inherited value and the label turns whatever the
   surrounding section is. Measured while it was live: both nav links hovered
   to `rgb(26,35,40)` — the header's inherited ink — instead of white. The
   literal value is written out instead, and it is N1's own: white at 100%. */
.myk-btn--ghost,
.myk-btn--active {
  --myk-btn-hover-bg:     transparent;
  /* R19-06: `--myk-header-btn-hover-fg`, NOT `--myk-btn-fg` — still the exact
     cycle this file's own note above warns against, just against a
     DIFFERENT property name than the literal it replaces. Declared only
     inside `#header-outer.light-text`/`.dark-text` (site.css §1B.2), so a
     ghost/active button anywhere else keeps today's literal unchanged. */
  --myk-btn-hover-fg:     var(--myk-header-btn-hover-fg, var(--mk-ink-inverse, #ffffff));   /* 3269:5622 */
  --myk-btn-hover-border: transparent;
  --myk-btn-hover-shadow: none;
  --myk-btn-hover-grow:   0px;
}

/* GHOST — the three plain nav links. Figma declares #00000026; an isolated
   export contains no such pixels, so it is not painted. */
.myk-btn--ghost  { --myk-btn-bg: var(--mk-pill-ghost-fill, transparent); }

/* ACTIVE — the current-page nav item. Figma declares #0000001a at blendMode
   LUMINOSITY; verified at 4x against 854:363, it paints NOTHING. It could not
   have worked here in any case: `isolation: isolate` above confines the blend
   to the button's own stacking context, so it would blend against
   transparency. Left as an explicit transparent so the intent is on record. */
.myk-btn--active { --myk-btn-bg: var(--mk-pill-active-fill, transparent); }

/* ICON — search and hamburger frames. No fill and no blur, unlike the text
   buttons, and a fixed box rather than a hugging one. */
.myk-btn--icon {
  --myk-btn-bg:      none;
  --myk-btn-blur:    none;
  --myk-btn-justify: center;
  --myk-btn-pad-y:   0px;
  --myk-btn-pad-x:   0px;
  --myk-btn-hover-bg:     transparent;
  /* R19-06: same ambient token the nav links now share
     (`--myk-header-btn-hover-fg`), still never `var(--myk-btn-fg)` — see the
     cycle note on the NAV ITEM block above, unchanged reasoning, different
     property name. This CLOSES a real gap found while consolidating: no rule
     anywhere previously gave the search icon's HOVER state a dark-text
     variant (only its rest colour had one, in the old site.css §1B.2) —
     hovering the icon while `.dark-text` was active computed
     `var(--mk-ink-inverse)` = white, over a light section = invisible. The
     icon and the nav links already share every OTHER header tone rule
     (myk-btn.css §5 lists them in one selector group for the same reason:
     both are `.myk-btn` elements with no colour-inheriting wrapper) — this
     makes hover consistent with that, verified live post-fix. */
  --myk-btn-hover-fg:     var(--myk-header-btn-hover-fg, var(--mk-ink-inverse, #ffffff));
  --myk-btn-hover-border: transparent;
  --myk-btn-hover-shadow: none;
  --myk-btn-hover-grow:   0px;
  flex: 0 0 auto;
}
/* The hamburger is `div.slide-out-widget-area-toggle.myk-btn--icon` and Salient
   draws its bars with pseudo-elements on a descendant. Suppress the §2.4 layer
   outright rather than merely making it transparent, so no icon frame can
   inherit a paint layer it was never meant to have. */
.myk-btn.myk-btn--icon::before { content: none; }

/* Label weight is a MODIFIER, not a variant: the nav CTA is Poppins Medium and
   the hero CTA is Poppins Regular on the same button. 00-hero §4 is explicit —
   "Not a mistake — reproduce it." */
.myk-btn--nav-cta  { --myk-btn-weight: var(--mk-w-medium, 500); }
.myk-btn--hero-cta { --myk-btn-weight: var(--mk-w-regular, 400); }

/* --- 2.4 the ring, and the hover cross-fade ----------------------------- */

/* DEFAULT RING RENDERER — a CENTRE-aligned stroke built from half outset plus
   half inset. Figma's `strokeWeight:1, strokeAlign:CENTER` straddles the box
   edge (47.5-48.5 on a box whose top is 48); a plain `inset 0 0 0 1px` is an
   INSIDE stroke and paints 48.0-49.0, which is the whole error.
   Kept as `box-shadow` rather than `border` so it takes no layout space, and
   rather than `outline` so the focus ring below stays available.
   Predicted to degrade to "a blurry 2px grey ring at DPR 1"; MEASURED instead
   at device rows 174.2/175.1 against a correct downsample of 174.9/174.9 —
   within 1 luma. Prediction lost to measurement; this form stays.

   Declared on `--outline` rather than on the base so ringless variants keep a
   computed `box-shadow: none`. On the base it would resolve to a 0-spread
   transparent shadow — visually identical, but a needless difference in the
   computed-style fingerprint the migration is verified against. */
.myk-btn--outline {
  box-shadow:
    0 0 0 calc(var(--myk-btn-border-width) / 2) var(--myk-btn-border),
    inset 0 0 0 calc(var(--myk-btn-border-width) / 2) var(--myk-btn-border);
}

/* THE HOVER MECHANIC — ONE LAYER, EVERY VARIANT, and this is the change that
   makes "the rollover states are consistent" true by construction instead of
   by discipline.

   WHAT IT WAS: this block existed only for `--outline`. `--primary` got a bare
   `opacity: .87`, the two bespoke buttons (16-amenities-52, 21-logos-footer)
   got nothing or their own copy, and 02-who-why-b retargeted the tokens to a
   third behaviour. FIVE hover treatments for two designed states.

   WHAT IT IS: the layer is on `.myk-btn`, so every variant has the same
   mechanism and differs only by TOKEN. A family that must not paint sets
   `--myk-btn-hover-bg: transparent` and `--myk-btn-hover-grow: 0px` (see NAV
   ITEM above); it does not get a second code path.

   THE CROSS-FADE is the resort/rooms "Book Now" mechanic, measured:
   `opacity 0 -> 1` at `0.3s ease`. It is NOT `background-position` and NOT
   `transform: scaleX` — a scaleX wipe squashes both stadium caps into
   ellipses mid-transition, which the reference does not do. It is also the
   ONLY mechanic that can reach `--primary`'s hover at all: `background` does
   not interpolate between a flat colour and a gradient, so an opacity lift or
   a colour tween would cut. §4.2 names this exactly — "the colour change is a
   cross-fade of two stacked pills, not a `background-color` tween."

   THE GROWTH IS ON THE LAYER, NOT ON THE BUTTON, and that is load-bearing:
   §4.2's measured lesson from portfolio-layered is "nothing about the text box
   changes … the grow happens on a pseudo behind the label, so the label stays
   pin-sharp and static while the pill swells around it." Growing the element
   instead costs a document reflow on every hover AND breaks on this page in
   three specific places — the nav CTA has a pinned `width: 169px` (§5) so it
   could only grow vertically; the two 18-cta-expand pills are flex items in a
   row that would re-lay-out; the footer Join sits in a `<form>` row. An
   absolutely-positioned layer changes none of them.

   `inset` is animated per-longhand rather than as the shorthand, because the
   shorthand's interpolation is not something this build has measured.

   The doubled class raises these to (0,2,1) so Salient's
   `li[class*="menu-item-btn-style"] > a::before` (0,1,3) cannot clobber the
   transition — which it was doing, and which silently defeated the
   `prefers-reduced-motion` override in tokens.css. */
.myk-btn.myk-btn::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;                       /* above the element's own background,
                                       below the §2.2 label at z-index 1     */
  border-radius: inherit;
  background: var(--myk-btn-hover-bg);
  /* THE SHADOW IS DECLARED ON THE HOVER STATE, NOT HERE, AND THAT IS A BUG FIX
     RATHER THAN A STYLE CHOICE. `opacity: 0` makes a resting shadow invisible,
     so carrying it on the base rule looks equivalent — until another rule
     forces this pseudo to `opacity: 1`, at which point the shadow paints at
     REST on a button whose resting pixels are a parity gate. That is not
     hypothetical: it happened during this pass, measured on the hero CTA at
     `::before {opacity: 1, box-shadow: rgba(0,0,0,.15) 0 4px 4px}` while a
     concurrent lane was using the same pseudo as a resting pill. State paint
     belongs on the state. */
  box-shadow: none;
  opacity: 0;
  pointer-events: none;
  transition: opacity    var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              box-shadow var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              top        var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              right      var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              bottom     var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              left       var(--myk-btn-hover-dur) var(--myk-btn-hover-ease);
}
.myk-btn.myk-btn:hover::before,
.myk-btn.myk-btn:focus-visible::before {
  opacity: 1;
  box-shadow: var(--myk-btn-hover-shadow);
  inset: calc(0px - var(--myk-btn-hover-grow));
  /* Salient's vendored `a:hover{color:inherit}` (0,1,1) beats `.myk-btn{color:var(--myk-btn-fg)}`
     (0,1,0). Flipping only the custom property left the label WHITE on the near-white
     #F4F9FB hover fill — unreadable. This doubled selector is (0,2,0) and wins. */
  color: var(--myk-btn-fg);
}

/* Ring, label and fill land on ONE curve (§1's hover clock), so the stroke
   does not snap while the fill is still arriving — the exact mechanism behind
   the founders' "this one hovers differently". */
.myk-btn.myk-btn:hover,
.myk-btn.myk-btn:focus-visible {
  --myk-btn-border: var(--myk-btn-hover-border);
  --myk-btn-fg:     var(--myk-btn-hover-fg);
  opacity: var(--myk-btn-hover-opacity);
}

/* --- 2.5 focus --------------------------------------------------------- */
/* Salient does not merely omit a focus ring inside `.sf-menu`, it actively
   SUPPRESSES one: `.sf-menu .menu-item a{outline:0 none}` (0,2,1) and
   `.sf-menu:not(.buttons) a:focus{outline:0 none}` (0,3,1). A bare
   `.myk-btn:focus-visible` (0,2,0) therefore never fires on a nav button —
   measured, not reasoned. The second selector is (0,4,1) and wins.
   Keyboard focus on a keyboard-focusable control is WCAG 2.4.7 (AA). */
.myk-btn:focus-visible,
.mk-nav__list .menu-item a.myk-btn:focus-visible {
  outline: 2px solid var(--mk-ink-inverse);
  outline-offset: 3px;
}


/* ==========================================================================
   §3. THE DONOR'S ICON GAP — neutralised by TOKEN, not by override
   --------------------------------------------------------------------------
   Applied above in §2.2 as `padding-right: var(--myk-btn-icon-gap)` and
   `margin-right: var(--myk-btn-icon-advance)`, both 0 by default.

   To build an icon variant later, do NOT re-introduce Salient's numbers by
   hand — set the tokens and the donor's exact geometry comes back:

       .myk-btn--with-icon { --myk-btn-icon-gap: 36px;
                             --myk-btn-icon-advance: 10px; }

   The donor's TYPOGRAPHY is the other half of the same problem and is handled
   the same way: `.nectar-cta .nectar-button-type` forces Inter / 14px / 600 /
   uppercase / .1em, none of which is Figma. §1 replaces all five with tokens
   rather than fighting them per-section — and §6 re-states them at chain
   specificity, because on the chain shape Salient's own selector is live.
   ========================================================================== */


/* ==========================================================================
   §4. ALTERNATE RING RENDERERS — opt-in, each with the measurement that
       earned it
   --------------------------------------------------------------------------
   The same 1px CENTRE-aligned stroke was independently implemented three times
   in this build, because Chrome rasterises a half-pixel differently depending
   on how it is expressed and on what the element's position scheme is. All
   three are correct where they were measured, so all three live here with
   their evidence instead of one winning by argument and silently regressing
   the other two sections.

   Pick by CONTEXT, and re-measure if you change one:
     default          static / flex-positioned buttons.  box-shadow pair.
     --ring-outline   a button whose box must not grow.  `outline` takes no
                      layout space at all and needs no pseudo-element.
     --ring-layer     an ABSOLUTELY POSITIONED button — the only case where
                      the default is wrong, see below.
   ========================================================================== */

/* RING RENDERER B — `outline` straddling the edge.
   `border` would sit fully inside under the global `*{box-sizing:border-box}`
   and eat 1px of the content box, narrowing the button. `outline` with a
   -0.5px offset reproduces Figma's straddle exactly and takes no layout space.
   Measured on 02-who-why-b, the lowest-error section in the build. */
.myk-btn--ring-outline {
  box-shadow: none;
  outline: var(--myk-btn-border-width) solid var(--myk-btn-border);
  outline-offset: calc(var(--myk-btn-border-width) / -2);
}
.myk-btn--ring-outline:focus-visible {
  outline: 2px solid var(--mk-ink-inverse);
  outline-offset: 3px;
}

/* RING RENDERER C — a painted `::after` layer, for absolutely positioned
   buttons ONLY.
   Chrome PIXEL-SNAPS the painted border box of an absolutely positioned
   element to whole device pixels, so a declared half-pixel is discarded before
   it reaches the raster and the centre correction never happens. Measured on
   the 04-ecology CTA: the ring region scored MAE 16.91 (top) / 16.16 (bottom),
   and a synthetic +0.5/+0.5 shift of the built pixels dropped it to 3.10/2.52,
   which is what identified the snap.
   `translate` is applied AFTER the snap, as a paint-time transform, and is NOT
   snapped — it re-introduces the half pixel with antialiasing, which is what
   Figma's centred stroke looks like once its 2x export is downsampled.
   The two declarations are a PAIR: `inset` sizes the ring to the outer box,
   `translate` puts it back on the half-pixel grid. Neither works alone. */
.myk-btn--ring-layer { box-shadow: none; }
.myk-btn--ring-layer::after {
  content: "";
  position: absolute;
  inset: calc(var(--myk-btn-border-width) / -2);
  translate: calc(var(--myk-btn-border-width) / -2)
             calc(var(--myk-btn-border-width) / -2);
  border: var(--myk-btn-border-width) solid var(--myk-btn-border);
  border-radius: inherit;
  pointer-events: none;
  z-index: 2;
  /* THE FOUNDERS' ECOLOGY BUTTON, AND THE ONE LINE THAT FIXES IT.
     This ring used to run at `--mk-motion-dur-hover` (450ms,
     cubic-bezier(.15,.75,.5,1)) while the other two renderers had NO
     transition at all and the fill ran at 300ms. `buttons.md` §8.2: "same
     colours, same fill cross-fade, but one ring snaps and the other glides —
     against a 300ms fill, a 450ms ring reads as lagging. That is the visible
     difference." Now it reads §1's single hover clock, the same one the other
     two renderers were just given.
     The RENDERER stays. §4's half-pixel measurement for it is sound and it is
     the more accurate reproduction of a CENTER stroke on an absolutely
     positioned element; the defect was the clock, never the layer. */
  transition: border-color var(--myk-btn-hover-dur) var(--myk-btn-hover-ease);
}


/* ==========================================================================
   §5. THE HEADER CASCADE
   --------------------------------------------------------------------------
   MOVED HERE VERBATIM from css/site.css so the component is one file. These
   rules are not decoration and not duplication: Salient's nav styling is both
   more specific than a class and partly `!important`, so the component's own
   values have to be re-stated at a specificity that wins inside the header.
   They must stay in sync with §1/§2 — that is the cost of Salient's cascade,
   and it is cheaper than the alternative, which is losing.
   ========================================================================== */

/* Salient's nav-link rule is `#top nav > ul > li > a` (1,0,4) and the demo's
   dynamic stylesheet layers Inter / 13px / 600 / uppercase / 0.1em on top of
   it, plus a `color: … !important` per header state. Figma says Poppins
   Regular 16 / 24, sentence case, 1px tracking, white (00-hero §4). */
#header-outer #top .mk-nav__list > li > a.myk-btn,
#header-outer.transparent #top .mk-nav__list > li > a.myk-btn,
#header-outer #top a.myk-btn.myk-btn--icon,
#header-outer.transparent #top a.myk-btn.myk-btn--icon {
  padding: var(--myk-btn-pad-y) var(--myk-btn-pad-x);
  font-family: var(--myk-btn-font);
  font-size: var(--myk-btn-size);            /* 16, not Salient's 13 */
  font-weight: var(--myk-btn-weight);        /* 400, not Salient's 600 */
  line-height: var(--myk-btn-leading);       /* 24 */
  letter-spacing: var(--myk-btn-track);      /* 1px, not Salient's 0.1em */
  text-transform: var(--myk-btn-case);       /* Figma labels are sentence case */
  color: var(--myk-btn-fg) !important;       /* Salient forces colour !important */
  opacity: 1;
  /* Salient's `#header-outer.transparent #top nav > ul > li > a` (2,1,4) sets
     `transition: opacity .2s, color .2s` and — critically — DROPS box-shadow
     from the list, so the outline button's ring snapped to teal instantly
     while the fill animated under it. Measured: `getComputedStyle(a).transition
     === "opacity 0.2s, color 0.2s"`, not the component's author value.
     This block is (2,3,2) and wins.

     `outline-color` joins the list for the same reason `box-shadow` did: it is
     `--ring-outline`'s renderer, and a nav button carrying that variant would
     otherwise snap here even though §1 transitions it everywhere else. Kept in
     sync with §1's `--myk-btn-transition` — same three properties, same clock;
     this block exists only to out-specify Salient, never to differ. */
  transition: color         var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              box-shadow    var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              outline-color var(--myk-btn-hover-dur) var(--myk-btn-hover-ease);
}
#header-outer #top .mk-nav__list > li > a.myk-btn.myk-btn--nav-cta {
  font-weight: var(--myk-btn-weight);        /* nav CTA is Medium — 00-hero §4 */
}
/* The demo's animated underline is a pseudo-element on the link. Figma has no
   underline; the active state is the button, not a rule. The second selector
   restores the pseudo-element the first one killed, for the one button that
   needs it as its fill layer (§2.4). */
#header-outer #top .mk-nav__list > li > a::before,
#header-outer #top .mk-nav__list > li > a::after { content: none; }
#header-outer #top .mk-nav__list > li > a.myk-btn--outline::before { content: ""; }

/* Icon frames: boxes read straight from 00-hero §2.2 — search 54 x 34 (y
   offset 3 inside the 40px row), menu 60 x 40 with the 18x14 dehaze glyph
   centred. */
#mk-search-toggle.myk-btn--icon { width: 54px; height: 34px; }
#header-outer .slide-out-widget-area-toggle.myk-btn--icon { width: 60px; height: 40px; }

/* Nav button widths, pinned to Figma 00-hero.spec.md §2.2.
   The nav <ul> right edge is already exact (built 1022.00 = Figma 120+902),
   but every button renders 0.03-0.94px WIDER than Figma because the width is
   text-driven and rendered Poppins advance widths differ slightly from the
   ones Figma laid out with. The five errors accumulate leftwards through the
   flex row: 0.44+0.25+0.03+0.92+0.94 = 2.58, which is exactly the measured x
   error on the FIRST item (built 323.42 vs Figma 326.00). One compounding
   defect, not five independent ones.
   Pinning the five widths zeroes it. Alignment stays MIN (`--myk-btn-justify`
   is `normal`) so the label's LEFT edge — the one Figma positioned — lands
   exactly right and the sub-pixel surplus is absorbed by the right padding. */
#header-outer #top .mk-nav__list > li > a.myk-btn { box-sizing: border-box; }
#header-outer #top .mk-nav__list > li:nth-child(1) > a.myk-btn { width: 127px; }  /* Resources      */
#header-outer #top .mk-nav__list > li:nth-child(2) > a.myk-btn { width: 117px; }  /* Find help      */
#header-outer #top .mk-nav__list > li:nth-child(3) > a.myk-btn { width: 128px; }  /* Safe stays     */
#header-outer #top .mk-nav__list > li:nth-child(4) > a.myk-btn { width: 107px; }  /* For pros       */
#header-outer #top .mk-nav__list > li:nth-child(5) > a.myk-btn { width: 169px; }  /* Begin recovery */

/* --------------------------------------------------------------------------
   THE HEADER CTA AFTER THE STRUCTURAL MOVE — single-owner pass, 2026-08-17.
   --------------------------------------------------------------------------
   The CTA is no longer the fifth <li> of `.mk-nav__list`; it is a sibling of
   the nav inside `.mk-header__actions` (see _shell/head-tail.html for why).
   FOUR rule families above stopped matching it the moment that landed, and
   each one was silently doing work:

     * `font-weight: var(--myk-btn-weight)` — the CTA is Medium (00-hero §4);
     * the `width: 169px` pin (nth-child(5)) — without it the button renders
       169.94, its text-driven width. MEASURED CONSEQUENCE at 1280: the CTA
       moved 853 -> 852.06 and the flex:1 wordmark absorbed the 0.94, which
       cost 00-hero +0.058 pp of fidelity against the artboard. That is the
       whole reason the pin exists (see the note above it): Poppins' rendered
       advance widths differ from the ones Figma laid out with, and the five
       errors compound leftwards through the flex row;
     * `content: none` on ::before/::after — Salient's animated underline is a
       pseudo-element on the link, and Figma has no underline;
     * `::before { content: "" }` restored for `--outline`, which needs it as
       its fill layer (§2.4).

   Re-pointed here rather than rewritten in place, so the nav-item forms above
   stay readable as what they are — the four TEXT links' rules.
   Specificity is (2 ids, 3 classes, 1 type), matching the originals.
   The 169px pin is RELEASED at <= 690 by css/_band-mobile.css §2.1, exactly as
   it was for the old selector: at the 15px phone type step the button's own
   content width is 162.5, and a tier with no artboard has no drift to zero.
   -------------------------------------------------------------------------- */
#header-outer #top .mk-header__actions > .menu-item > a.myk-btn.myk-btn--nav-cta {
  font-weight: var(--myk-btn-weight);
  box-sizing: border-box;
  width: 169px;
}
#header-outer #top .mk-header__actions > .menu-item > a::before,
#header-outer #top .mk-header__actions > .menu-item > a::after { content: none; }
#header-outer #top .mk-header__actions > .menu-item > a.myk-btn--outline::before { content: ""; }

/* R19-06: colour forced here, unconditionally, the same shape as the nav
   links/icon rule above it in this file (§5's opening block) — one
   `!important` declaration, tone carried entirely by what `--myk-btn-fg`
   resolves to (site.css §1B.2), not by which state happens to be active.
   Previously this element's REST colour relied on §2.1b's un-`!important`
   `.myk-btn.myk-btn{color:var(--myk-btn-fg)}` in light-text, and ONLY got a
   forced, `.dark-text`-only `!important` restated in site.css for the dark
   case — an asymmetry that existed nowhere else in the header's tone system.
   Both states now go through the identical rule. */
#header-outer #top .mk-header__actions > .menu-item > a.myk-btn {
  color: var(--myk-btn-fg) !important;
}


/* ==========================================================================
   §6. CHAIN SHAPE — the same tokens, applied to the donor's own markup
   --------------------------------------------------------------------------
   For sections that already ship Salient's five-level chain. Add `myk-btn` to
   the `.nectar-cta` element; the box is then the inner `.link_wrap`, so the
   tokens have to land there instead of on the root.

   INERT UNLESS `myk-btn` IS PRESENT — a bare `.nectar-cta` elsewhere on the
   page is untouched by this file.

   The `.nectar-cta` prefix carries the specificity needed to beat Salient's
   own `body[data-button-style^="rounded"] .nectar-cta:not([data-style="material"])
   .link_wrap` (0,4,1) and `.nectar-cta .nectar-button-type` typography.
   ========================================================================== */
.nectar-cta.myk-btn { display: inline-block; }
body .nectar-cta.myk-btn .link_wrap {
  display: inline-flex;
  align-items: center;
  justify-content: var(--myk-btn-justify);
  box-sizing: border-box;
  padding: var(--myk-btn-pad-y) var(--myk-btn-pad-r)
           var(--myk-btn-pad-y) var(--myk-btn-pad-l);
  height: var(--myk-btn-height);
  border: var(--myk-btn-border-width) solid var(--myk-btn-border);
  border-radius: var(--myk-btn-radius);
  background-color: var(--myk-btn-bg);
  -webkit-backdrop-filter: var(--myk-btn-blur);
  backdrop-filter: var(--myk-btn-blur);
  cursor: pointer;
  position: relative;
  transition: var(--myk-btn-transition);
}
/* Salient's `.nectar-button-type` typography is live on this shape, so every
   one of its five declarations is re-stated from tokens. `text-transform` is
   the only one it forces with `!important`. */
body .nectar-cta.myk-btn .link_text {
  display: inline-flex;
  align-items: center;
  padding-right: var(--myk-btn-icon-gap);
  font-family: var(--myk-btn-font);
  font-size: var(--myk-btn-size);
  font-weight: var(--myk-btn-weight);
  line-height: var(--myk-btn-leading);
  letter-spacing: var(--myk-btn-track);
  text-transform: var(--myk-btn-case) !important;
  text-decoration: none;
  color: var(--myk-btn-fg);
}
body .nectar-cta.myk-btn .text {
  margin-right: calc(var(--myk-btn-icon-advance) - var(--myk-btn-track-trim));
}
/* THE CHAIN SHAPE GETS THE SAME §2.4 STATES, on `.link_wrap` instead of on the
   root, because on this shape `.link_wrap` is the box.
   D41 §5 obligation 6 asked for exactly this and named its absence as the
   thing that pushed `18-cta-expand` into forking the component: "§6 drives the
   chain shape but §2.4's hover only works on the flat shape — that asymmetry
   is what pushed this section into a fork, and it must be written where a
   builder will hit it." No button on the page uses the chain today (that
   section was retargeted to the flat shape and is correct), so this is a
   guardrail, not a live path — but a guardrail that is missing is how the
   fifth fork gets written. */
body .nectar-cta.myk-btn .link_wrap::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  background: var(--myk-btn-hover-bg);
  box-shadow: var(--myk-btn-hover-shadow);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              top     var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              right   var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              bottom  var(--myk-btn-hover-dur) var(--myk-btn-hover-ease),
              left    var(--myk-btn-hover-dur) var(--myk-btn-hover-ease);
}
body .nectar-cta.myk-btn .link_wrap:hover::before,
body .nectar-cta.myk-btn .link_wrap:focus-visible::before {
  opacity: 1;
  inset: calc(0px - var(--myk-btn-hover-grow));
}
body .nectar-cta.myk-btn .link_text { position: relative; z-index: 1; }
body .nectar-cta.myk-btn .link_wrap:hover,
body .nectar-cta.myk-btn .link_wrap:focus-visible {
  --myk-btn-border: var(--myk-btn-hover-border);
  --myk-btn-fg:     var(--myk-btn-hover-fg);
  opacity: var(--myk-btn-hover-opacity);
}
body .nectar-cta.myk-btn .link_text:focus-visible {
  outline: 2px solid var(--mk-ink-inverse);
  outline-offset: 3px;
  border-radius: var(--myk-btn-radius);
}


/* ==========================================================================
   §7. REDUCED MOTION
   --------------------------------------------------------------------------
   Not declared here. `css/tokens.css` collapses `--mk-motion-dur-hover` and
   `--mk-motion-dur-fill` to 1ms under `prefers-reduced-motion: reduce`, and
   every duration above resolves through those two tokens, so the whole
   component follows automatically — including the §2.4 cross-fade, which is
   the only animation it owns.
   Verified by driving the live page: with the media feature emulated, the
   cross-fade layer computes `transition: opacity 1e-05s`.
   Do not add a separate `@media (prefers-reduced-motion)` block here; a second
   source of truth for motion is how the cross-fade got silently un-reduced
   once already (Salient's `li[class*="menu-item-btn-style"] > a::before` was
   winning the transition and the token never reached it).
   ========================================================================== */


/* ==========================================================================
   §8. THE HOVER FLIP, PROMOTED OUT OF THE HEADER — founder A04
   --------------------------------------------------------------------------
   Lane `r3:motion-vocab`. Founder item A04 of
   founder-trace/FT-20260819-jehnean-review.md, verbatim:

     "Flip animation on hover for: 'Start your safe stay', exposure quiz,
      symptoms quiz, 'See all 47 amenities', and both closing-CTA buttons.
      (Nav items + 'Begin recovery' already do it.)"

   The parenthesis is the whole instruction: the mechanic exists and is liked,
   and the ask is REACH, not design. So nothing here is new. Every declaration
   below is the same value already shipping on the five header buttons in
   `sections/00-hero.css` part C.3 — which is itself a byte-for-byte copy of
   salient-truth/portfolio-layered/assets/style.q-e11f637b79.css @77924-78277.

   WHY THIS IS A COPY AND NOT A MOVE, stated plainly because a reader will ask.
   Part C.3 is scoped `#header-outer`, and its own header records why: an
   unscoped `a:hover` rule "reaches all 20 sections". That reasoning is sound
   and the header block is LANDED behaviour the founder named as working, so it
   is not being edited by this lane. This block reaches the same primitive
   through a CLASS scope (`.myk-btn--flip`), which has no such blast radius.

   The two therefore overlap on the five header buttons — deliberately, and
   harmlessly: `#header-outer a:hover .nectar-text-reveal-button__text` is
   (1,1,1) and wins over this block's (0,3,0) on every property, and every
   value it wins with is IDENTICAL to the one here. There is no state in which
   the two disagree. When part C.3 is eventually retired, delete it and add
   `.myk-btn--flip` to the five nav anchors; nothing else changes.

   THE GEOMETRY, so it is not re-derived from scratch a third time. Both boxes
   are h tall. The twin is parked at `bottom: -120%`, i.e. its top edge at 1.2h,
   fully below the `overflow: hidden` wrapper. On hover the face takes -100%
   (-h); the twin is its CHILD pseudo and inherits that, putting the twin's top
   at 0.2h; the twin's own -20% (-0.2h) lands it at exactly 0 — the pixel the
   face occupied. One shape, two labels, zero jump. THE ASYMMETRY IS THE
   ARITHMETIC: make both -100% and the twin overshoots by 0.2h.

   WHY THE WRAPPER IS NOT `.myk-btn` ITSELF — the obvious shortcut, and it is a
   regression. The clip needs `overflow: hidden`, and `.myk-btn` has two layers
   that deliberately paint OUTSIDE its box: §2.4's cross-fade grows to
   `inset: calc(0px - var(--myk-btn-hover-grow))` (that is the founder's
   "'Start your safe stay' grow + gradient", in the WHAT LANDED list), and §4's
   `--ring-layer::after` sits at `inset: calc(var(--myk-btn-border-width) / -2)`.
   `overflow: hidden` on `.myk-btn` clips both. The wrapper is therefore a span
   INSIDE the label, injected by js/myk-motion.js §4, which also leaves
   §2.2's `.myk-btn > *` matching the same element it matches today.
   ========================================================================== */

/* The clip box. `position: relative` is ADDED rather than copied — part C.3
   gets its containing block from Salient's `#top nav > ul > li > a`, which does
   not exist outside the header, and `bottom: -120%` is meaningless without a
   known containing block. */
.myk-btn--flip .nectar-text-reveal-button {
  overflow: hidden;
  display: block;
  position: relative;
  transform: translateZ(0);
  /* Part C.3 line 3 is `line-height: 1.3`, and the header then has to undo it
     one rule later (`#header-outer .myk-btn .nectar-text-reveal-button
     {line-height: var(--myk-btn-leading, 24px)}`) because 1.3 x 16px = 20.8px
     shortens the label box and lifts the text 1.6px inside a 40px pill that
     Figma pins. Skipping straight to the corrected value: the flip arithmetic
     is entirely in percentages and does not care what h is. */
  line-height: var(--myk-btn-leading, 24px);
}

.myk-btn--flip .nectar-text-reveal-button__text {
  display: block;
  transition: transform var(--myk-flip-dur, .55s) var(--myk-flip-ease, cubic-bezier(.25, 1, .33, 1));
}

.myk-btn--flip .nectar-text-reveal-button__text::after {
  content: attr(data-text);
  position: absolute;
  left: 0;
  bottom: -120%;
  /* The twin is out of flow, so it would otherwise wrap "Start your safe stay"
     and "See all 47 amenities" to two lines inside a one-line clip. */
  white-space: nowrap;
  transition: transform var(--myk-flip-dur, .55s) var(--myk-flip-ease, cubic-bezier(.25, 1, .33, 1));
}

/* `:focus-visible` as well as `:hover`, which part C.3 does not do. A keyboard
   reader gets the same affordance as a mouse reader; the label swap is the only
   feedback these pills have besides the fill, and the fill is already mirrored
   onto `:focus-visible` at §2.4. Consistency with the component, not an
   invention. */
.myk-btn--flip:hover .nectar-text-reveal-button__text,
.myk-btn--flip:focus-visible .nectar-text-reveal-button__text          { transform: translateY(-100%); }
/* R6-01 (FT-20260820 round 6, lane r6:hero-polish) — the landed twin carries a
   -0.25px correction on top of the donor's -20%.

   MEASURED, not felt: the r5 screenshot ink census extended to the flip state
   (_tools/cta-ink-census.py --flip; instrument review/sweep31/cdp.py, fresh
   headless Chrome, cache disabled, 3 loads x 2 promotion states) puts the
   settled reveal ink ONE DEVICE PIXEL LOW of the static label at BOTH
   calibration scales — dsf1 x clip4: static delta_fullink -0.25 / flip +0.50;
   dsf2 x clip2 at 1512x945: static 0.00 / flip +0.50. The box arithmetic is
   exact (twin lands on the face box to 0.003px, probed on all six body flips
   AND the five header flips — review/r6/r6-hero-polish/probe-all-flips.py,
   probe-nav-flips.py); the sag is sub-pixel landing arithmetic: -120% parks
   against the wrapper's 23.9974px used height, the landed -20% resolves
   against the twin's own box, and the residue snaps one device pixel down.
   -0.25px re-centres the landed state to delta 0.00 while static stays at its
   census-calibrated -0.25. Both states inside the |delta| <= 0.5px gate, and
   the two paint paths now measure IDENTICAL at instrument resolution.

   THE HEADER OVERLAP (see the block comment above): part C.3's (1,1,1) rules
   still beat this (0,3,0) block on the five header buttons and still carry the
   donor-exact -20%, so nav rendering is UNCHANGED by this correction. If C.3
   is ever retired onto this block, re-run the flip census before assuming the
   nav inherits the correction cleanly.

   WHAT THIS DOES NOT FIX, recorded so R6-01 does not loop: the census also
   measured the hover state's one-sided shadow skirt (Figma 3269:5600
   DROP_SHADOW #00000026 offset(0,4) r4) — below the grown pill the backdrop
   darkens by up to 8.7 luminance decaying over 4+ css px, and above it the
   delta is 0.0 (review/r6/r6-hero-polish/probe-dsf2.py output, rows 191-207
   vs 0-14). A geometrically centred label against a pill whose silhouette is
   extended 4px downward by shadow READS high. That is a Figma hover-state
   design fact, not an implementation defect; changing it is a founder call,
   filed as a question in founder-trace/helix/R6-01.md. */
.myk-btn--flip:hover .nectar-text-reveal-button__text::after,
.myk-btn--flip:focus-visible .nectar-text-reveal-button__text::after   { transform: translateY(calc(-20% - 0.25px)); }


/* ==========================================================================
   §9. A05 · THE SEARCH ICON SPINS ON HOVER
   --------------------------------------------------------------------------
   Founder A05: "Search icon: spin on hover. Click treatment TBD later."

   THE SECOND SENTENCE IS HONOURED BY BUILDING NOTHING FOR IT. There is no
   `:active` rule, no `.is-open` state and no toggle here. The founder said the
   click treatment is undecided; inventing one and shipping it would make her
   review a guess instead of a blank. `#mk-search-toggle` keeps its plain
   `href="#searchbox"` behaviour untouched.

   `rotate`, not `transform: rotate()`. The independent property composes with
   whatever `transform` the SVG or a future icon variant carries, so this rule
   can never fight one. (Same reasoning as css/myk-motion.css decision 1.)

   THE CLOCK IS NOT A NEW ONE. .55s cubic-bezier(.25,1,.33,1) is §8's flip
   clock, which is the nav's clock, which is portfolio-layered's clock. The
   founder's round-3 note asks for motion that is "slower, more relaxed"; a full
   revolution on the 300ms fill clock reads as a twitch, and a second, faster
   hover curve in the header would be exactly the "this one hovers differently"
   defect that buttons.md §8.2 chased down. One hover clock across the page.

   NO MARKUP CHANGE. The rule keys off the id already in _shell/head-tail.html
   and the `<svg>` already inside it — which matters, because that file is
   shared and `r3:menu-x` is working in the same header this round.
   ========================================================================== */

#mk-search-toggle svg {
  transition: rotate var(--myk-flip-dur, .55s) var(--myk-flip-ease, cubic-bezier(.25, 1, .33, 1));
}
#mk-search-toggle:hover svg,
#mk-search-toggle:focus-visible svg {
  rotate: 360deg;
}

/* One clock, declared once, referenced by §8 and §9. Declared at the END rather
   than in §1 so that this lane's addition is a pure append and §1's token block
   — which several lanes read — is not re-flowed. Both consumers carry the same
   literal as a fallback, so deleting this block degrades to identical values
   rather than to no transition. */
:root {
  --myk-flip-dur:  .55s;
  --myk-flip-ease: cubic-bezier(.25, 1, .33, 1);
}
