/**
 * Vivid Frequency v11.7.55 - Theme Component Primitives
 * The Spiritual Agency · spiritual.agency
 *
 * SCOPE
 * This file holds Layer 2 component primitives that ship with the theme:
 *   §0  Blocksy palette bridge        (Blocksy --theme-palette-color-N -> SA tokens)
 *   §1  VF wrapper                  (.vf, .vf--light, .vf-inner)
 *   §2  Container reset             (body:has(.vf) constraints cancellation)
 *   §3  Structural void-space fix   (generalised to all .vf--* variants)
 *   §4  Light-mode header palette
 *   §5  Component primitives        (.vf-eyebrow, .vf-btn family, .vf-cta-row, .vf-pullquote)
 *   §6  Hero pattern                (.h-hero, .h-stage, .h-grad, .h-trust)
 *   §7  Inline <code> chip
 *   §8  Active menu state
 *   §9  Section rhythm + overflow protection
 *   §10 Archive cards & content cards (mode-aware via --vf-surface-alt)
 *   §11 Header submenu cascade        (mode-aware via --vf-surface-alt)
 *   §12 Header menu spread
 *   §13 Light-Mode Shakti Pink swap (variable override → Shakti Deep)
 *   §14 Footer menu cascade           (mode-aware via --vf-heading)
 *   §15 P1 Wisdom Star foundation     (reading spine + reading type + inverting island)
 *   §16 P2 Studio foundation          (reading skin + eyebrow + stat strip + full-bleed hero; .sa-pq/.sa-lede/figcaption global)
 *   §17 Mega-menu panel (cascade, per-pillar accents, pillar-anchor clearance via --vf-header-height)
 *
 * PAGE-SPECIFIC LAYOUTS LIVE ELSEWHERE
 *   Home, About, Plant a Tree, Services hub, service singles, project singles
 *   are all migrated to Blocksy Content Blocks. Reusable component patterns
 *   (tier card grids, partner marquee, tree strip, final-CTA, pullquote) are
 *   GreenShift Reusable Templates. Truly global rules are in the GreenShift
 *   gspb_global_settings.custom_css option.
 *
 * !important USAGE
 * Permitted only against Blocksy and GreenShift inline-style cascade fights.
 * Each !important is justified by a comment naming the conflicting source.
 * If a future change can remove an !important without regression, do it.
 * ============================================================================ */


/* ============================================================================
   §0 · BLOCKSY PALETTE BRIDGE
   Wire Blocksy's --theme-palette-color-N tokens to VF brand tokens at :root.
   Puts Blocksy chrome (buttons, links, badges) on the VF cascade so they
   inherit VF colours WITHOUT requiring Customiser colorPalette config. The
   intent was always there per style.css palette comments ("Blocksy C1",
   "Blocksy C2") but the runtime wiring was missing - this completes it.
   Discovered during vivid-frequency clone session 2: after foundation
   theme_mods nuke, the .ct-header-cta button rendered as Blocksy default
   blue/rectangular because no theme_mod colorPalette and no VF wiring.
   Same architectural family as §10 cards and §11 submenu (Blocksy primitives
   consuming VF tokens).
   ============================================================================ */
:root {
  --theme-palette-color-1: var(--sa-shakti-start);      /* C1 - Shakti Pink (primary brand) */
  --theme-palette-color-2: var(--sa-shakti-crimson);    /* C2 - Shakti Crimson (hover) */
  --theme-palette-color-3: var(--sa-void);              /* C3 - Void (text) */
  --theme-palette-color-4: var(--sa-deep-violet-dark);  /* C4 - Deep Violet (headings light) */
  --theme-palette-color-5: rgba(13, 13, 26, 0.15);      /* C5 - subtle borders */
  --theme-palette-color-6: rgba(13, 13, 26, 0.05);      /* C6 - surface alt light */
  --theme-palette-color-7: var(--sa-parchment);         /* C7 - Parchment (light text on dark) */
  --theme-palette-color-8: #ffffff;                     /* C8 - Pure white */

  /* §M.4 - VF subhead semantic token (eyebrows / subtitles / sec-num).
     Dark = Anahata Green; auto-flips to Anahata Deep in light via §13's
     --sa-anahata-green swap. Explicit light value also set in §13. */
  --vf-subhead: var(--sa-anahata-green);
}

/* Blocksy header CTA button - pill shape, generous padding to match VF aesthetic.
   Background and text colours flow from the palette tokens above via Blocksy's
   own button CSS, so no explicit bg/color rules needed here. */
.ct-header-cta .ct-button {
  border-radius: 50px;
  padding:       12px 22px;
}


/* ============================================================================
   §1 · VF WRAPPER
   Adding `.vf` to a page wrapper opts the page into the Vivid Frequency
   chrome layer: full-bleed escape, sane typography, mode-aware canvas.
   Variant skins (.vf--home, .vf--about, etc.) layer page-specific styles
   from their Content Blocks.
   ============================================================================ */
.vf {
  position:            relative;
  width:               100vw;
  max-width:           100vw;
  margin-inline:       calc(50% - 50vw);
  padding-block-start: 0;
  font-family:         var(--sa-font);
  color:               var(--vf-text);
  background:          var(--vf-surface);
  font-size:           16px;
  line-height:         1.65;
  overflow-x:          hidden;
  isolation:           isolate;
  box-sizing:          border-box;
}

.vf *,
.vf *::before,
.vf *::after { box-sizing: border-box; }

.vf img { display: block; max-width: 100%; height: auto; }
.vf a   { color: inherit; text-decoration: none; }

.vf-inner {
  max-width:      var(--vf-content-max);
  margin-inline:  auto;
  padding-inline: var(--vf-gutter-x);
}


/* ============================================================================
   §2 · CONTAINER RESET
   When .vf is present anywhere in the body, cancel WP/Blocksy's content-area
   constraints so the wrapper can be edge-to-edge. Hides Blocksy's default
   page-title hero on .vf pages.
   ============================================================================ */
body:has(.vf) main#main,
body:has(.vf) article[class*="type-"],
body:has(.vf) article[class*="type-"] > *,
body:has(.vf) .entry-content,
body:has(.vf) .entry-content.is-layout-constrained {
  max-width:      none;
  width:          100%;
  padding-inline: 0;
  margin-inline:  auto;
}

body:has(.vf) .entry-header,
body:has(.vf) .single_post_title_wrapper {
  display: none;
}


/* ============================================================================
   §3 · STRUCTURAL VOID-SPACE FIX
   v11.0.4 §I, generalised in v11.2 to any .vf--* page variant.
   Without this, WP main#main + article + entry-content wraps .vf--* pages
   with default page padding, leaving a visible gap between hero and viewport.
   Flattens every wrapper in the chain when any .vf--* variant class is
   present. Justifies !important: Blocksy is-layout-constrained and WP page
   template both inject inline padding/margin/max-width.
   R3/S6 AUDIT (A2-P5): the nine is-layout-constrained !important here (plus the
   four single-template ones below) were audited as a structural fight against
   WP core's injected max-width, not a counter to one of our own faults. Removal
   needs a theme.json / block-pattern opt-out of is-layout-constrained on the .vf
   wrapper; until that lands they are kept by decision, not oversight. */
/* ============================================================================ */
body.page main#main:has([class*="vf--"]) {
  padding: 0 !important;
  margin:  0 !important;
}

body.page main#main:has([class*="vf--"]) > .ct-container-full,
body.page main#main:has([class*="vf--"]) article.page,
body.page main#main:has([class*="vf--"]) .entry-content,
body.page main#main:has([class*="vf--"]) .entry-content.is-layout-constrained {
  max-width: 100% !important;
  width:     100% !important;
  padding:   0    !important;
  margin:    0    !important;
}

body main#main .entry-content > [class*="vf--"],
body main#main .entry-content.is-layout-constrained > [class*="vf--"] {
  max-width: 100% !important;
  width:     100% !important;
  margin:    0    !important;
}

/* Single-service / single-project / single-hosting templates run their
   .vf wrappers full-bleed in the same way. !important justified: WP article
   selectors set max-width inline on the singular template wrapper. */
body.single-service .vf,
body.single-project .vf,
body.single-hosting .vf {
  margin-inline:  calc(50% - 50vw) !important;
  width:          100vw !important;
  max-width:      100vw !important;
  padding-inline: 0     !important;
}


/* ============================================================================
   §4 · HEADER PALETTE
   Header bg and menu link colour are both cascade-driven via tokens -
   single rules, no body-class prefix needed since the tokens flip at
   body level (style.css :root vs body.vf--light) and cascade through
   inheritance to the header.
     --vf-surface : void in dark, parchment in light
     --vf-heading : parchment in dark, Deep Violet in light
   Without these overrides, Blocksy's blocksy-dynamic-global-css paints
   the middle row --theme-palette-color-8 (white) in both modes.
   !important justified: Blocksy header inline transparent-row + link
   colour rules.
   ============================================================================ */
header.ct-header [data-row="middle"] {
  background-color: var(--vf-surface) !important;
}
/* Transparent at-top row (was the post-3511 VF HEADER SPIKE, now native).
   !important required: Blocksy paints the row via
   [data-header*="type-1"] .ct-header [data-transparent-row="yes"][data-row*="middle"]
   at (0,4,0) and the opaque arm above is only (0,2,1). Proven CP2a. */
header.ct-header [data-transparent-row="yes"][data-row="middle"] {
  background-color: transparent !important;
}

/* Header menu link colour. Re-point the variables Blocksy declares directly
   on its exact per-element nav selector, mirroring the section 14 footer model.
   Blocksy's generated global.css sets, on
     [data-header*="type-1"] .ct-header [data-id="menu"] > ul > li > a,
   --theme-link-initial-color: var(--theme-text-color). A custom-property
   declaration on the element beats an inherited nav-level re-point, and
   vf-overrides.css loads after global.css, so source order wins at equal
   specificity. No !important. Both initial AND hover are pinned to --vf-heading
   to hold the existing behaviour: the prior !important pinned rest and hover
   alike, so top-level header links show no hover colour shift. The header CTA
   is [data-id="button"], a separate item the menu selector does not match, so
   this leaves the button untouched and the old :not(.ct-button) narrowing is
   unnecessary by construction. */
[data-header*="type-1"] .ct-header [data-id="menu"] > ul > li > a {
  --theme-link-initial-color: var(--vf-heading);
  --theme-link-hover-color:   var(--vf-heading);
}

/* Submenu chevron icon-color override. Blocksy's Customizer sets
   --theme-link-initial-color: #ffffff for the header menu, and inside
   nav[class*=menu] .ct-menu-link, Blocksy re-points --theme-icon-color
   to --theme-link-initial-color. That makes the SVG chevron's fill pure
   white, which is invisible on the parchment surface in light mode.
   (In void mode, white-on-near-black happens to be visible, so the bug
   only surfaces in light mode.) Re-pointing --theme-icon-color to
   --vf-heading aligns the chevron with the menu text in both modes:
   parchment in dark, Deep Violet in light. */
header.ct-header .ct-menu-link {
  --theme-icon-color: var(--vf-heading);
}


/* ============================================================================
   §5 · COMPONENT PRIMITIVES
   ============================================================================ */

/* -- Eyebrow ---------------------------------------------------------- */
.vf-eyebrow {
  display:          inline-flex;
  align-items:      center;
  gap:              0.5rem;
  padding:          0.4rem 1rem;
  border-radius:    var(--vf-radius-pill);
  font-family:      var(--sa-font);
  font-size:        11px;
  font-weight:      var(--sa-weight-label);
  letter-spacing:   var(--sa-track-label);
  text-transform:   uppercase;
  background:       color-mix(in srgb, var(--sa-anahata-green) 8%, transparent);
  border:           1px solid color-mix(in srgb, var(--sa-anahata-green) 25%, transparent);
  color:            var(--vf-subhead);   /* §M.4 - was var(--sa-anahata-green); token-driven (lime dark / Anahata Deep light), no visual change */
  margin-block-end: 1rem;
}

.vf--light .vf-eyebrow,
body.vf--light .vf-eyebrow {
  background:   color-mix(in srgb, var(--sa-anahata-deep) 8%, transparent);
  border-color: color-mix(in srgb, var(--sa-anahata-deep) 25%, transparent);
  color:        var(--sa-anahata-deep);
}


/* -- Buttons ---------------------------------------------------------- */
.vf-btn {
  display:         inline-flex;
  align-items:     center;
  gap:             0.5rem;
  padding:         0.875rem 1.75rem;
  border-radius:   var(--vf-radius-pill);
  font-family:     var(--sa-font);
  font-weight:     var(--sa-weight-heading);
  font-size:       15px;
  line-height:     1.2;
  border:          1px solid transparent;
  text-decoration: none;
  cursor:          pointer;
  transition:      transform 0.15s, box-shadow 0.2s, border-color 0.2s, background 0.2s;
}
.vf-btn:hover { transform: translateY(-2px); }

/* Canonical primary button - sculpted-gradient (cosmetic13, "Linear-style").
   The previous glass approximation depended on backdrop atmosphere
   bleeding through a 55% clearance zone in the gradient. That worked on
   chakra-blob hero sections (/home/) and atmospheric CTA sections
   (.sa-about-cta::before) but failed on flat panels (/contact/). The
   Vivid Frequency button is now solid sculpted gradient - no glass
   conceit. Works on any backdrop because it owns its own depth.

   Architecture:
   - Background: top-to-bottom gradient from --vf-btn-tint to a derived
     darker stop via color-mix(... 60%, black). --vf-btn-tint is declared
     in style.css :root as the literal #FF0060 (Shakti Pink, ES10),
     making the default primary button mode-invariant. Chakra modifiers
     (.vf-btn--primary-blue / -violet / -green) override --vf-btn-tint
     at the element level with their chakra tokens, which §13-flip to
     their -deep variants in light mode - chakra primary buttons remain
     mode-following by design.
   - Border: removed in favour of an outer ring via box-shadow's 0-spread
     layer - gives a crisper edge than a 1px border at the same alpha.
   - Multi-layer box-shadow stack: (1) tinted ring, (2) inset top
     highlight, (3) tinted close shadow, (4) deeper diffused drop.
   - Text: --vf-btn-text (= --sa-parchment) - declared in style.css :root
     as the canonical Theme Button Colour. Parchment-on-Shakti-Pink is
     3.70:1 (AA-Large), and the text-shadow rgba(0,0,0,0.25) below lifts
     perceived contrast comfortably past AA. Same regime in both modes
     now that the surface is mode-invariant. */
/* §5 - .vf-btn.vf-btn--primary dual-class: component owns its
   visual properties at (0,2,0), defends against ambient context
   rules like canvas link-resets (e.g. .sa-home a { color: inherit }
   at (0,1,1)). Component encapsulation per ground-up principle -
   see bridge principle.ground_up_over_patch_2026_05_19 and
   vf.v11_6_0.light_mode_button_text_bug_2026_05_18. */
.vf-btn.vf-btn--primary {
  background: linear-gradient(180deg,
    var(--vf-btn-tint) 0%,
    color-mix(in oklab, var(--vf-btn-tint) 60%, #000) 100%
  );
  border:    none;
  color:     var(--vf-btn-text);
  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);   /* lifts parchment perceived contrast past AA on Shakti Pink (3.70:1 → reads ~AA+) in both modes (ES10) */
  box-shadow:
    0 0 0 1px color-mix(in oklab, var(--vf-btn-tint) 45%, transparent),
    inset 0 1px 0 rgba(255, 255, 255, 0.20),
    0 8px 16px -8px color-mix(in oklab, var(--vf-btn-tint) 55%, transparent),
    0 16px 32px -16px rgba(0, 0, 0, 0.35);
}
.vf-btn.vf-btn--primary:hover {
  background: linear-gradient(180deg,
    /* §5 - was 110% (malformed; the over-100% mix loses alpha and renders
       translucent in Blink/WebKit - verified empirically, void+light). 85%
       is well-formed and produces an opaque glossy sheen top stop. Glass-as-
       design is committed for v11.7 as .vf-btn--glass - see
       vf.v11_7.glass_button_variant_design_track_2026_05_19. */
    color-mix(in oklab, var(--vf-btn-tint) 85%, #fff) 0%,
    color-mix(in oklab, var(--vf-btn-tint) 70%, #000) 100%
  );
  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.30);   /* hover lifts shadow alpha 0.25 → 0.30 in step with the rest of the layer-alpha bumps */
  box-shadow:
    0 0 0 1px color-mix(in oklab, var(--vf-btn-tint) 65%, transparent),
    inset 0 1px 0 rgba(255, 255, 255, 0.30),
    0 12px 24px -8px color-mix(in oklab, var(--vf-btn-tint) 65%, transparent),
    0 20px 40px -16px rgba(0, 0, 0, 0.45);
}

.vf-btn--ghost {
  background:              color-mix(in srgb, var(--sa-parchment) 6%, transparent);
  border-color:            color-mix(in srgb, var(--sa-parchment) 30%, transparent);
  color:                   var(--sa-parchment);
  backdrop-filter:         blur(10px);
  -webkit-backdrop-filter: blur(10px);
}
.vf-btn--ghost:hover {
  border-color: color-mix(in srgb, var(--sa-anahata-green) 60%, transparent);
  background:   color-mix(in srgb, var(--sa-anahata-green) 8%, transparent);
}

.vf--light .vf-btn--ghost,
body.vf--light .vf-btn--ghost {
  background:   color-mix(in srgb, var(--sa-void) 6%, transparent);
  border-color: color-mix(in srgb, var(--sa-void) 30%, transparent);
  color:        var(--sa-void);
}
.vf--light .vf-btn--ghost:hover,
body.vf--light .vf-btn--ghost:hover {
  border-color: var(--sa-void);
  background:   color-mix(in srgb, var(--sa-void) 8%, transparent);
}

.vf-btn--light {
  background: #fff;
  color:      var(--sa-shakti-start);
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15);
}
.vf-btn--light:hover { box-shadow: 0 14px 40px rgba(0, 0, 0, 0.22); }

.vf-btn--void {
  background:   var(--sa-void);
  color:        var(--sa-parchment);
  border-color: color-mix(in srgb, var(--sa-parchment) 25%, transparent);
}
.vf-btn--void:hover { background: #000; }

.vf-btn--outline-light {
  background: transparent;
  color:      #fff;
  border:     2px solid color-mix(in srgb, var(--sa-parchment) 50%, transparent);
}
.vf-btn--outline-light:hover {
  border-color: #fff;
  background:   color-mix(in srgb, var(--sa-parchment) 10%, transparent);
}

/* Hero / main-CTA size modifier - proportional to eyebrow pill (~30px)
   and heading hierarchy. ~52-56px rendered. Composes with the base
   .vf-btn line-height 1.2. */
.vf-btn--lg {
  padding:    1.125rem 2.5rem;
  font-size:  16px;
  gap:        0.625rem;
}
@media (max-width: 640px) {
  .vf-btn--lg {
    padding:    1rem 2rem;
    font-size:  15px;
  }
}

.vf-cta-row {
  display:            flex;
  flex-wrap:          wrap;
  gap:                0.875rem;
  align-items:        center;
  margin-block-start: 1.25rem;
}


/* -- Pullquote (used by "Vivid - Pullquote" Reusable Template) ------- */
.vf-pullquote {
  display:          flex;
  gap:              1.5rem;
  align-items:      flex-start;
  padding:          1.5rem;
  border-left:      4px solid var(--sa-shakti-start);
  background:       color-mix(in srgb, var(--sa-shakti-start) 4%, transparent);
  border-radius:    0 12px 12px 0;
  margin-block:     2rem;
  font-family:      var(--sa-font);
}
.vf-pullquote__img {
  flex-shrink:   0;
  width:         80px;
  height:        80px;
  border-radius: 50%;
  overflow:      hidden;
}
.vf-pullquote__img img {
  width:      100%;
  height:     100%;
  object-fit: cover;
}
.vf-pullquote__body { flex: 1; }
.vf-pullquote__quote {
  font-size:        1.15rem;
  line-height:      1.5;
  font-style:       italic;
  margin-block-end: 0.75rem;
  color:            var(--vf-text);
}
.vf-pullquote__cite {
  font-size:      0.85rem;
  font-weight:    var(--sa-weight-heading);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color:          var(--vf-text-subtle);
}
@media (max-width: 640px) {
  .vf-pullquote      { flex-direction: column; }
  .vf-pullquote__img { width: 64px; height: 64px; }
}


/* ============================================================================
   §5b · OVERLAY CLEARANCE TOKEN  (CP2b, header adoption)
   Single source of truth for the transparent-overlay-header clearance, consumed
   by §6 (hero), §6b (no-hero pages), §6c (project toprail), §6d (service hero).
   Paired token: an at-rest value plus an admin-bar value, because the WP admin
   bar is 32px desktop but 46px at <=782px, so a flat calc(+32px) is wrong at
   mobile. Literals preserve the canonical 180/160/140 and 212/192/186 exactly. */
:root { --vf-overlay-clear: 180px; --vf-overlay-clear-adminbar: 212px; }
@media (max-width: 1023px) { :root { --vf-overlay-clear: 160px; --vf-overlay-clear-adminbar: 192px; } }
@media (max-width: 767px)  { :root { --vf-overlay-clear: 140px; --vf-overlay-clear-adminbar: 186px; } }


/* ============================================================================
   §6 · HERO PATTERN
   Canonical hero used by Home, Home Light, About, Plant a Tree, service
   singles, and project singles. Page-specific backgrounds (chakra blob mesh,
   void mesh, etc.) layer in via the page Content Block's CSS.

   Header clearance is STATIC. Replaces the broken v11.1.0 calc-based
   architecture per bridge memory vf.v11_calc_breakage_diagnosis. Blocksy
   does not reliably emit --has-transparent-header on the front end, so the
   calc resolved to 0px and the static fallback in Customizer post 7 was
   what kept pages usable. v11.2 makes the static value the canonical rule.
   ============================================================================ */
.h-hero, .h-hero-v11 {
  position: relative; isolation: isolate; overflow: hidden;
  padding-inline: var(--vf-hero-pad-x);
  padding-top: var(--vf-overlay-clear);
  padding-bottom: var(--vf-hero-pad-bottom);
  background: var(--vf-surface);
  color: var(--vf-text);
  margin: 0;
}
.admin-bar .h-hero, .admin-bar .h-hero-v11 { padding-top: var(--vf-overlay-clear-adminbar); }

/* §6 · Home hero (.h-hero-v11) overlay clearance authority.
   The Home hero reusable emits a page-scoped inline rule
   .sa-home .h-hero-v11 { padding: clamp(3rem,5vw,5rem) ... } at 0,2,0,
   a pre-overlay internal padding that under-clears the transparent header
   and out-ranks the base rule above (0,1,0). Authored here at 0,2,1 (no
   page name, no !important) so the theme owns hero overlay clearance on
   its own and the post-3511 DB empty is a true no-op for Home. */
body .h-hero.h-hero-v11           { padding-top: var(--vf-overlay-clear); }
body.admin-bar .h-hero.h-hero-v11 { padding-top: var(--vf-overlay-clear-adminbar); }
.single-service .h-hero, .single-project .h-hero, .single-hosting .h-hero { padding-top: 200px; }
.admin-bar.single-service .h-hero, .admin-bar.single-project .h-hero,
.admin-bar.single-hosting .h-hero { padding-top: 232px; }

.h-hero .h-stage {
  position:       relative;
  z-index:        3;
  max-width:      920px;
  margin:         0 auto;
  text-align:     center;
  display:        flex;
  flex-direction: column;
  align-items:    center;
}

.h-hero .h-eyebrow {
  display:        inline-flex;
  background:     color-mix(in srgb, var(--sa-shakti-start) 14%, transparent);
  border:         1px solid color-mix(in srgb, var(--sa-shakti-start) 32%, transparent);
  color:          var(--sa-shakti-end);
  padding:        0.4rem 1rem;
  border-radius:  var(--vf-radius-pill);
  font-size:      0.78rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  font-weight:    var(--sa-weight-heading);
  margin:         0 auto 1.5rem;
}

.h-hero h1 {
  margin:         0 auto 1.5rem;
  text-align:     center;
  max-width:      880px;
  color:          var(--vf-heading);
  font-size:      clamp(2.5rem, 5vw, 4.5rem);
  line-height:    1.05;
  font-weight:    var(--sa-weight-heading);
  letter-spacing: -0.025em;
}

.h-hero h1 .h-grad {
  background:              var(--vf-grad-crown);
  -webkit-background-clip: text;
  background-clip:         text;
  color:                   transparent;
  -webkit-text-fill-color: transparent;
}

.h-hero .h-hero-sub {
  margin:      0 auto 2.5rem;
  text-align:  center;
  max-width:   680px;
  color:       var(--vf-text-muted);
  font-size:   1.075rem;
  line-height: 1.7;
}

.h-hero .h-cta-row {
  display:         flex;
  justify-content: center;
  gap:             1rem;
  flex-wrap:       wrap;
  margin:          0 auto 2.5rem;
}

.h-hero .h-trust {
  display:         flex;
  justify-content: center;
  align-items:     center;
  flex-wrap:       wrap;
  gap:             0.6rem 1.25rem;
  font-size:       0.78rem;
  letter-spacing:  0.05em;
  color:           var(--vf-text-subtle);
}


/* §M.3 - Trust strip light-mode contrast fix
   .h-trust uses --vf-text-subtle which resolves to rgba(13,13,26,0.5) in
   light mode - too low contrast on the chakra-wash hero background. Use
   Anahata Deep at full opacity (matches the body paragraph treatment and
   the .h-trust-dot light-mode colour at L481 below). */
.vf--light .h-hero .h-trust,
body.vf--light .h-hero .h-trust {
  color: var(--sa-anahata-deep);
}
.h-hero .h-trust-dot {
  width:         6px;
  height:        6px;
  border-radius: 50%;
  background:    var(--sa-anahata-green);
  display:       inline-block;
  box-shadow:    0 0 0 2px rgba(167, 255, 0, 0.18);
}

.vf--light .h-hero .h-trust-dot,
body.vf--light .h-hero .h-trust-dot {
  background: var(--sa-anahata-deep);
  box-shadow: 0 0 0 2px rgba(61, 101, 0, 0.20);
}

/* Chakra blob background - populated by page CB markup */
.h-hero .chakra-blobs-bg {
  position:       absolute;
  inset:          0;
  width:          100%;
  height:         100%;
  z-index:        0;
  pointer-events: none;
}

/* Aurora hero canvas (P6) - same slot as the blob layer it replaces */
.h-hero .aurora-bg {
  position:       absolute;
  inset:          0;
  width:          100%;
  height:         100%;
  z-index:        0;
  pointer-events: none;
  display:        block;
}

/* Staggered entrance reveal - IntersectionObserver in page JS toggles .sa-in */
.h-stage.sa-rv > * {
  opacity:    0;
  transform:  translateY(18px);
  transition: opacity   0.7s cubic-bezier(0.2, 0.7, 0.3, 1),
              transform 0.7s cubic-bezier(0.2, 0.7, 0.3, 1);
}
.h-stage.sa-rv.sa-in > *               { opacity: 1; transform: translateY(0); }
.h-stage.sa-rv.sa-in > .vf-chakrapulse { transition-delay: 0.10s; }
.h-stage.sa-rv.sa-in > .h-eyebrow,
.h-stage.sa-rv.sa-in > .vf-eyebrow     { transition-delay: 0.20s; }
.h-stage.sa-rv.sa-in > h1              { transition-delay: 0.35s; }
.h-stage.sa-rv.sa-in > .h-hero-sub     { transition-delay: 0.55s; }
.h-stage.sa-rv.sa-in > .h-cta-row      { transition-delay: 0.75s; }
.h-stage.sa-rv.sa-in > .h-trust        { transition-delay: 0.95s; }

@media (max-width: 780px) {
  .h-hero h1       { font-size: clamp(2.25rem, 8vw, 3.5rem); line-height: 1.1; }
  .h-hero .h-trust { font-size: 0.72rem; gap: 0.5rem 0.9rem; }
}

@media (prefers-reduced-motion: reduce) {
  .h-stage.sa-rv > * {
    opacity:    1 !important;
    transform:  none !important;
    transition: none !important;
  }
}


/* ============================================================================
   §7 · INLINE <code> CHIP
   Prose-scale companion to the .sa-cbp multi-line code block (which ships as
   the "Vivid - Code Block (Terminal)" GreenShift Reusable Template, NOT here).
   Both patterns share the GitHub-dark grey-blue palette per bridge memory
   vf.inline_code_pattern + vf.code_block_pattern, so inline mentions and
   multi-line samples on the same page read as one visual family.

   The :not([class]) guard scopes the rule to bare <code> only - fenced code
   blocks (.wp-block-code, .gspb_code-block) and the .sa-cbp syntax tokens
   (c/k/s/n/f/v) all carry classes and are unaffected.
   ============================================================================ */
code:not([class]) {
  background:     var(--vf-code-surface);
  color:          #e6edf3;
  border:         1px solid var(--vf-code-border);
  border-radius:  6px;
  padding:        1px 6px 2px;
  font-family:    'JetBrains Mono', 'Fira Code', ui-monospace, Menlo, Monaco, Consolas, monospace;
  font-size:      0.88em;
  letter-spacing: 0;
  vertical-align: baseline;
}

/* Reset on block-level <pre><code> so the chip styles don't bleed into
   multi-line code blocks. */
pre code:not([class]) {
  background:    none;
  border:        none;
  border-radius: 0;
  padding:       0;
}

/* Light-mode variant - chip stays neutral grey-blue but text flips to
   Deep Violet for legibility on parchment. 15% opacity (was 8%) - at 8%
   chips were below typical recognition threshold on parchment. */
.vf--light code:not([class]),
body.vf--light code:not([class]) {
  color:        var(--sa-deep-violet-dark);
}


/* ============================================================================
   §8 · ACTIVE MENU STATE
   Active menu items use --sa-shakti-start. In Void Mode this resolves
   to Shakti Pink #FF0060 (high contrast on void). In Light Mode, §13's
   variable swap re-resolves it to Shakti Deep #6B0030 (AAA on parchment).
   One rule, mode-aware via cascade. No light-mode-specific override needed.
   !important justified: Blocksy menu link inline colour rules.
   ============================================================================ */
.menu-item.current-menu-item     > a:not(.ct-column-heading),
.menu-item.current_page_item     > a:not(.ct-column-heading),
.menu-item.current-menu-ancestor > a:not(.ct-column-heading),
.menu-item.current-menu-parent   > a:not(.ct-column-heading) {
  color: var(--sa-shakti-start) !important;
}


/* ============================================================================
   §9 · SECTION RHYTHM + OVERFLOW PROTECTION
   Consistent vertical rhythm across .vf-tagged pages. Prevents horizontal
   scroll caused by chakra-pulse animations and partner marquees.
   ============================================================================ */
.vf > section,
[class*="vf--"] > section {
  padding-block: var(--vf-section-pad-y);
}

/* :not(html):not(body) guards the vf--light / vf--dark mode-class prefix
   collision: overflow-x:clip must never reach the document root or <body>
   (their scroll chain has to stay identical to a normal post), but it still
   clips the page-family wrappers. S2 CHECKPOINT 3. Estate-wide [class*="vf--"]
   sweep tracked in vf.followup.vf_wildcard_mode_class_collision_2026_05_22 */
.vf,
[class*="vf--"]:not(html):not(body) {
  overflow-x: clip;
}

.vf-chakrapulse,
.chakrapulse {
  display:   inline-flex;
  max-width: 100%;
  flex-wrap: nowrap;
}

.partner-strip .marquee-wrap,
.marquee-wrap {
  overflow:  hidden;
  max-width: 100vw;
}

/* ============================================================================
   §6b · NO-HERO PAGE OVERLAY CLEARANCE  (CP2b, header adoption)
   Strategy A default-on: every transparent-header .page clears at the content
   wrapper (main#main), EXCEPT bleed/hero templates which opt out via :has() over
   the known hero classes, plus an explicit body.vf-bleed escape for future pages.
   !important + (1,3,2)/(1,4,2) beats §2's
   body.page main#main:has([class*="vf--"]){padding:0!important} at (1,2,2).
   No :has([class*="vf--"]) qualifier: /enterprise/ and /care-plans/ carry no
   vf-- wrapper and must still clear. Proven CP2a. */
body.page:not(.vf-bleed):not(:has(.h-hero, .h-hero-v11, .sv-hero, .vf-star__hero, .sa-hero, .sa-msc2-hero, .sa-cls-hero, .sa-shw-hero)) main#main {
  padding-top: var(--vf-overlay-clear) !important;
}
body.admin-bar.page:not(.vf-bleed):not(:has(.h-hero, .h-hero-v11, .sv-hero, .vf-star__hero, .sa-hero, .sa-msc2-hero, .sa-cls-hero, .sa-shw-hero)) main#main {
  padding-top: var(--vf-overlay-clear-adminbar) !important;
}

/* ============================================================================
   §6c · PROJECT SINGLE TOPRAIL CLEARANCE  (CP2b)
   The project CPT is excluded from §6b by the .page scope, so clear its toprail
   directly. No existing theme rule out-specifies body.single-project .toprail
   (0,2,1); CP2a landed it at 180 without !important, so none is added here. */
body.single-project .toprail { padding-top: var(--vf-overlay-clear); }
body.admin-bar.single-project .toprail { padding-top: var(--vf-overlay-clear-adminbar); }

/* ============================================================================
   §6d · SERVICE SINGLE HERO CLEARANCE  (CP2b)
   Lifted verbatim from the former Customizer post 3511 (block 1) so the DB can
   be emptied later without service singles losing clearance. Flat 128px, proven
   clean in CP1. */
body.single-service [data-vertical-spacing*="top"] { padding-top: 0; }
body.single-service .sa-hero, body.single-service .sa-msc2-hero,
body.single-service .sa-cls-hero, body.single-service .sa-shw-hero { padding-top: calc(var(--vf-overlay-clear) + 1.5rem); }
body.admin-bar.single-service .sa-hero, body.admin-bar.single-service .sa-msc2-hero,
body.admin-bar.single-service .sa-cls-hero, body.admin-bar.single-service .sa-shw-hero { padding-top: calc(var(--vf-overlay-clear-adminbar) + 1.5rem); }

/* ============================================================================
   §10 · ARCHIVE CARDS & CONTENT CARDS (mode-aware via --vf-surface-alt)
   Blocksy paints .entry-card background as var(--theme-palette-color-8) =
   #FFFFFF in both modes (Blocksy palette is not mode-aware). On the void
   canvas in dark mode this renders as a white card floating on black -
   jarring against the rest of the chrome which flips correctly.

   Cards consume --vf-surface-alt for their surface (style.css :root and
   .vf--light blocks): #1A1A26 in dark, #ffffff in light. Card text follows
   --vf-heading (parchment in dark, Deep Violet in light) for body and title.
   Card meta uses --sa-anahata-green which is auto-remapped to --sa-anahata-deep
   under .vf--light (style.css line 135) - so meta renders as lime on the dark
   card and Anahata Deep on the light card without any explicit mode qualifier.

   Pattern: cards ARE mode-aware via the surface cascade (--vf-surface-alt),
   not a fixed-parchment exception. Locked: bridge_memory key
   vivid-frequency.card_surface_pattern.

   Applies to:
     - .entry-card (Blocksy archive cards)
     - .vf-card (reserved for future GreenShift card patterns)
     - .ct-content-block-card (reserved for future CB card wrappers)
   ============================================================================ */
.entry-card,
.vf-card,
.ct-content-block-card {
  background-color: var(--vf-surface-alt) !important;
}

.entry-card,
.vf-card,
.ct-content-block-card,
.entry-card p,
.vf-card p,
.ct-content-block-card p,
.entry-card .entry-excerpt,
.entry-card .entry-content {
  color: var(--vf-heading) !important;
}

.entry-card .entry-title,
.entry-card .entry-title a:not(:hover),
.vf-card .vf-card-title,
.ct-content-block-card .ct-content-block-card-title {
  color: var(--vf-heading) !important;
}

.entry-card .entry-meta,
.entry-card .entry-meta a:not(:hover),
.entry-card .meta-author,
.entry-card .meta-date,
.entry-card .meta-comments,
.vf-card .vf-card-meta,
.ct-content-block-card .ct-content-block-card-meta {
  color: var(--sa-anahata-green) !important;
}

/* Category pill (.ct-term-1 etc.) retains Blocksy's per-term colour - don't force */


/* ============================================================================
   §X  Mode Toggle (Rung 1)
   Inline header item rendered by Blocksy's header builder. Chakra
   spectrum ring (T1 → T7 closing) matches the logo ring treatment.
   Ring is mode-independent - always shows the full spectrum. The
   inner glyph (sun/moon) flips via --vf-heading and currentColor:
   parchment in dark mode (on void header), Deep Violet in light
   (on parchment header). Symmetric to the §4 header rules.
   ============================================================================ */

.vf-mode-toggle {
	position:         relative;
	display:          inline-flex;
	align-items:      center;
	justify-content:  center;
	width:            36px;
	height:           36px;
	padding:          0;
	margin:           0;
	background:       transparent;
	color:            var(--vf-heading);
	border:           none;
	border-radius:    var(--vf-radius-pill);
	cursor:            pointer;
	isolation:        isolate;
	transition:       color var(--sa-transition-base),
	                  background-color var(--sa-transition-base);
	-webkit-appearance: none;
	        appearance: none;
}

/* Chakra spectrum ring - replaces the solid border. 1.5px conic-gradient
   stroke around the button via mask compositing. */
.vf-mode-toggle::before {
	content:        '';
	position:       absolute;
	inset:          0;
	border-radius:  50%;
	padding:        1.5px;
	background:     conic-gradient(
	                  from 0deg,
	                  var(--sa-t1)   0deg,
	                  var(--sa-t2)  51deg,
	                  var(--sa-t3) 102deg,
	                  var(--sa-t4) 154deg,
	                  var(--sa-t5) 205deg,
	                  var(--sa-t6) 257deg,
	                  var(--sa-t7) 308deg,
	                  var(--sa-t1) 360deg
	                );
	-webkit-mask:
		linear-gradient(#000 0 0) content-box,
		linear-gradient(#000 0 0);
	-webkit-mask-composite: xor;
	        mask-composite: exclude;
	pointer-events: none;
	z-index:        -1;
}

.vf-mode-toggle:hover::before,
.vf-mode-toggle:focus-visible::before {
	filter: brightness(1.15);
}

.vf-mode-toggle:focus-visible {
	outline:        2px solid var(--sa-anahata-green);
	outline-offset: 2px;
}

.vf-mode-toggle__icon {
	display: block;
	width:   18px;
	height:  18px;
	stroke:  currentColor;
	fill:    none;
}

/* Convention B (destination glyph - matches GitHub/Twitter/Vercel):
   the visible icon represents what clicking will do.
   Default state (dark mode): sun visible - click to go light.
   Light mode: moon visible - click to go back to dark. */
.vf-mode-toggle__icon--sun  { display: inline-block; }
.vf-mode-toggle__icon--moon { display: none; }

body.vf--light .vf-mode-toggle__icon--sun  { display: none; }
body.vf--light .vf-mode-toggle__icon--moon { display: inline-block; }


/* ============================================================================
   §11 · HEADER SUBMENU CASCADE
   Blocksy renders submenus as <ul class="sub-menu"> with <a class="ct-menu-link">
   children. VF puts the submenu surface on the mode cascade so the dropdown
   flips parchment/void with light/dark mode - same pattern as §10 cards.
   Without these rules, the submenu inherits Blocksy parent-theme defaults
   which are NOT mode-aware (manifests as dark dropdown in light mode).
   ============================================================================ */
.sub-menu {
  background-color: var(--vf-surface-alt) !important;
}
.sub-menu .ct-menu-link {
  color: var(--vf-heading);
}
.sub-menu .ct-menu-link:hover {
  color: var(--sa-shakti-start);
}
/* R3 A2-P1 follow-up. The two direct-colour rules above sit at 0,2,0 and tie
   Blocksy's nav[class*="menu"] .ct-menu-link painter, so they lose on source
   order; they were only ever upheld by the old section 4 blanket !important
   (removed in R3 A2-P1). Re-point the variable on Blocksy's exact header
   submenu selector instead (0,4,0, wins on source order), the same mechanism
   as the section 4 top-level fix and the section 14 footer. Without this,
   regular dropdown links fall back to Blocksy white and read white-on-white on
   the parchment submenu surface in light mode. The mega panel keeps its own
   section 17b/17c rules. */
[data-header*="type-1"] .ct-header [data-id="menu"] .sub-menu .ct-menu-link {
  --theme-link-initial-color: var(--vf-heading);
  --theme-link-hover-color:   var(--sa-shakti-start);
}

/* ══════════════════════════════════════════════════════════════════
 * §12 - HEADER MENU SPREAD (cascade-aware surface family #5)
 * Distributes menu items across available header width when menu sits
 * in start placement alongside logo. Without this, Blocksy's default
 * `grid-template-columns: auto auto` shrinks the start column to
 * content width, clustering the menu against the logo on the left.
 * ══════════════════════════════════════════════════════════════════ */
.ct-header [data-row="middle"][data-column-set="2"] > div {
  grid-template-columns: 1fr auto;
}

.ct-header [data-row="middle"][data-column-set="2"] [data-column="start"] [data-items="primary"] {
  width: 100%;
}

.ct-header [data-row="middle"][data-column-set="2"] [data-column="start"] .header-menu-1 {
  flex: 1;
}

.ct-header [data-row="middle"][data-column-set="2"] [data-column="start"] .header-menu-1 .menu {
  justify-content: space-between;
  width: 100%;
}


/* ============================================================================
   §13 · LIGHT-MODE SHAKTI PINK SWAP (variable override pattern)
   Replaces every --sa-shakti-start reference with Shakti Deep when body has
   .vf--light. Single override; cascades through §0 palette bridge (C1),
   §8 active menu state, all body-link rules, button text, pullquote accents,
   submenu hover. Mirrors how Anahata Green → Anahata Deep is already handled
   elsewhere for light-mode body text.

   v11.5.3 UPDATE: --vf-grad-shakti now composes from --sa-shakti-start and
   --sa-shakti-end (style.css brand-gradients refactor), and this block now
   also swaps --sa-shakti-end, so .vf-btn--primary backgrounds resolve to
   solid Shakti Deep in light mode. STILL NOT swapped:
   - --sa-shakti-gradient (literal hex, needs a deep-magenta companion first)

   WCAG: Shakti Deep #6B0030 on Parchment #FAFAF7 = 12.2:1 (AAA, all sizes).
   ============================================================================ */
body.vf--light {
  /* Shakti Pink → Shakti Deep, Anahata Green → Anahata Deep swaps.
     Composes through --vf-grad-shakti which resolves from --sa-shakti-start
     and --sa-shakti-end. The Anahata swap eliminates bright lime accents
     on parchment (Vikas: "the green blob has been bugging me" - cosmetic7).

     §M.4 - Pillar accent tokens. Rewired in v11.6.0 to consume canonical
     brand tokens (--sa-anahata-green, --sa-shakti-start, --sa-spirit-blue,
     --sa-electric-violet). All five pillar accents now flip pillar-scoped here (body scope), the robust
     pattern: a body-scoped brand-token remap cannot reach a :root-declared
     --vf-pillar-* alias (var() resolves at declaration scope, then inherits),
     so the pillar token itself is remapped. The --sa-shakti-start /
     --sa-shakti-end / --sa-anahata-green swaps below STAY for their non-pillar
     consumers (parchment body text, the canonical Shakti button/gradient base);
     the pillar flips no longer depend on them. Create -> Shakti Deep, Build ->
     Spirit Deep, Grow -> Anahata Deep, Automate -> Ajna Deep, Support ->
     Manipura Deep (vf.brand.{shakti,spirit,anahata,ajna,manipura}_deep). --sa-shakti-gradient now composes from the start/end
     refs, so it collapses to solid Shakti Deep here too. */
  --sa-shakti-start:    var(--sa-shakti-deep);
  --sa-shakti-end:      var(--sa-shakti-deep);
  --sa-anahata-green:   var(--sa-anahata-deep);
  --vf-pillar-create:   var(--sa-shakti-deep);    /* Create -> Shakti Deep; base shakti-start stays #FF0060 for the button (vf.brand.shakti_deep) */
  --vf-pillar-build:    var(--sa-spirit-deep);    /* Build & Host -> Spirit Deep (vf.brand.spirit_deep) */
  --vf-pillar-grow:     var(--sa-anahata-deep);   /* Grow -> Anahata Deep (vf.brand.anahata_deep) */
  --vf-pillar-automate: var(--sa-ajna-deep);      /* Automate & Scale -> Ajna Deep; base --sa-electric-violet stays vivid for content packs (vf.brand.ajna_deep) */
  --vf-pillar-support:  var(--sa-manipura-deep);  /* Care & Support -> Manipura Deep (vf.brand.manipura_deep) */
  --vf-subhead:         var(--sa-anahata-deep);   /* §M.4 - explicit light value (defensive; also auto-flips via the anahata-green swap above) */
}

  /* §13 has no light-mode override for .vf-btn--primary. The default
     button surface is mode-invariant Shakti Pink #FF0060, declared as
     --vf-btn-tint in :root (style.css); §13's --sa-shakti-start swap is
     bypassed by design (ES10). Chakra-modifier primary buttons continue
     to follow §13 via their per-element --vf-btn-tint overrides. */


/* ============================================================================
   §14 · FOOTER MENU CASCADE (ES-FIX A3b, 2026-06-10)
   Blocksy's Customizer sets --theme-link-initial-color: #ffffff for the
   footer menu, which is not mode-aware: the seven footer menu links render
   white-on-parchment (invisible) in light mode. Re-point the consumed
   variables on the footer menu nav to the mode-aware tokens instead of
   fighting Blocksy's own link rule with a direct colour declaration:
     --vf-heading : parchment in dark, Deep Violet in light
                    (same treatment as the §4 header menu)
     #FF0060      : hover accent, mode-invariant Shakti Pink literal (ES7).
                    var(--sa-shakti-start) gets §13-flipped to Shakti Deep
                    in light, which is muddy on parchment and indistinct
                    from the base ink (no discernible hover difference).
                    Per the banked per-page chakra override pattern,
                    interactive controls that must stay warm in both modes
                    kill the §13 flip at the root with a literal; precedent
                    is the /membership active toggle (#FF0060 direct).
   Variable re-pointing wins by cascade, not specificity: no !important.
   Chakra and spectrum elements are untouched per the ES2 exemption list.
   ============================================================================ */
.ct-footer nav[class*="menu"] {
  --theme-link-initial-color: var(--vf-heading);
  --theme-link-hover-color:   #FF0060;   /* ES7: mode-invariant Shakti Pink, see header note */
}

/* A3b follow-up (2026-06-10): Blocksy's generated global.css declares the
   variable DIRECTLY on the link elements at the selector below, and a
   custom-property declaration on the element itself always beats the
   inherited nav-level re-point above (CSSOM trace on the deployed
   31c731d confirmed the links still resolved #ffffff in light mode).
   Mirror Blocksy's exact selector; vf-overrides.css loads after the
   generated global.css, so source order decides at equal specificity.
   Still no !important. The nav-level rule above stays for any other
   footer menus that lack the per-item declaration. */
[data-footer*="type-1"] .ct-footer [data-id="menu"] > ul > li > a {
  --theme-link-initial-color: var(--vf-heading);
  --theme-link-hover-color:   #FF0060;   /* ES7: mode-invariant Shakti Pink, see header note */
}


/* ============================================================================
   §15 · P1 WISDOM STAR FOUNDATION
   No-rail width-tier reading spine, reading typography, and the reusable
   inverting-contrast-island primitive. The spine and type are scoped to the
   .vf--wisdom-star wrapper; the island is a theme-level primitive. Consumes
   the --vf-reading-* tokens from style.css :root. Inert on the live site
   until the CP3 Star layout consumes it.
   ============================================================================ */

/* a. No-rail width-tier spine, scoped to the Star wrapper */
.vf--wisdom-star .vf-tier-read  { max-width: var(--vf-reading-measure); margin-inline: auto; }
.vf--wisdom-star .vf-tier-wide  { max-width: 960px; margin-inline: auto; }   /* tunable literal */
.vf--wisdom-star .vf-tier-bleed { width: 100vw; margin-inline: calc(50% - 50vw); }

/* b. Reading typography, scoped to the Star reading zone */
.vf--wisdom-star .vf-tier-read { font-size: var(--vf-reading-body-size); line-height: var(--vf-reading-leading); }
.vf--wisdom-star h1 { font-family: var(--sa-font); font-weight: 700; font-size: clamp(2.5rem, 5vw, 3.5rem); line-height: 1.1; }
.vf--wisdom-star h2 { font-family: var(--sa-font); font-weight: 700; font-size: clamp(1.75rem, 3vw, 2rem); }
.vf--wisdom-star h3 { font-family: var(--sa-font); font-weight: 700; font-size: clamp(1.375rem, 2vw, 1.5rem); }

/* §16h's reading-measure cap, mirrored to Wisdom (Vikas 2026-06-20: "Wisdom
   should follow this pattern"). The WP constrained layout caps each child at
   65ch, but `ch` is font-relative, so a 32px section H2 otherwise resolves to
   ~1472px and hangs left of the body column. Cap the section headings at the
   body's pixel measure so heading + body share one left edge. 47.5rem = the
   body 65ch at the 16px reading size (fixed rem, holds at every viewport).
   Fixes the live Wisdom article's latent offset. Verified live: H2 left/width
   112/1473 -> 469/760, matching the body paragraph. */
.vf--wisdom-star .vf-star__body > :is(h2, h3, h4) {
  max-width:     var(--vf-reading-measure);
  margin-inline: auto;
}
/* Reading-column width (Vikas 2026-06-21: at 65ch the desktop column read
   half-empty). The Star/Studio CB caps every post-content child at 65ch
   (font-relative) via its generated .wp-container-...post-content rule; re-cap
   prose, headings, lists, quotes and figures at the wider fixed
   --vf-reading-measure so the column fills more of a wide desktop while staying
   short of edge-to-edge. Both pillars. Figures ride the same measure (large
   scans downscale crisply; a lone tall panel upscales ~14%, acceptable). The
   :is(h2,h3,h4) caps above now also resolve to this token, so the heading +
   body share one fixed pixel edge with no ch-vs-rem drift. */
.vf--wisdom-star .vf-star__body  > :not(.alignwide):not(.alignfull),
.vf--studio      .vf-studio__body > :not(.alignwide):not(.alignfull) {
  max-width:     var(--vf-reading-measure);
  margin-inline: auto;
}

.vf--wisdom-star .vf-meta { font-size: 0.9375rem; }   /* ~15px */
/* body-copy links: persistent underline for reading clarity; colour inherited (#FF0060 Void, #6B0030 light via §13) */
.vf--wisdom-star .vf-tier-read a { text-decoration: underline; text-underline-offset: 0.15em; }

/* d. Star threshold = fixed-Void island ink pin (2026-06-21).
   The threshold band pins --sa-void as its background in BOTH modes (Star CB
   inline CSS), so its standfirst ink must stay parchment in both modes. A
   global `p { color: var(--vf-text) }` (Blocksy) otherwise re-colours the
   excerpt <p> with the dark light-mode ink, which inheritance from the
   parchment-pinned wrapper cannot beat (a direct element rule always wins over
   an inherited value), vanishing the standfirst on the Void band in light mode.
   Pin parchment on the paragraph directly; the two-class selector beats the
   element rule. Void state is unchanged (--vf-text already resolves to
   parchment there). */
.vf--wisdom-star .vf-star__standfirst,
.vf--wisdom-star .vf-star__standfirst .wp-block-post-excerpt__excerpt {
  color: var(--sa-parchment);
}

/* c. Inverting-contrast-island primitive (reusable theme-level; tonal opposite of the page in BOTH modes) */
.vf-island--invert {
  --vf-surface:      var(--sa-parchment);
  --vf-text:         var(--sa-deep-violet-dark);
  --vf-heading:      var(--sa-deep-violet-dark);
  --vf-text-muted:   rgba(13, 13, 26, 0.7);
  --vf-text-subtle:  rgba(13, 13, 26, 0.5);
  background-color:  var(--vf-surface);
  color:             var(--vf-text);
}
body.vf--light .vf-island--invert {
  --vf-surface:      var(--sa-void);
  --vf-text:         var(--sa-parchment);
  --vf-heading:      var(--sa-parchment);
  --vf-text-muted:   rgba(250, 250, 247, 0.78);
  --vf-text-subtle:  rgba(250, 250, 247, 0.55);
}
/* Declares the tokens on the consuming element per the PR-26 lesson (element
   beats ancestor). Distinct from the fixed-Void and fixed-Parchment islands
   and from the same-direction surface-rhythm panel. */



/* ============================================================================
   §16 · P2 STUDIO FOUNDATION
   Reading skin, signature furniture (eyebrow + stat strip), and the Void-
   cinematic hero for the Studio single-article template. Parallels §15 (Wisdom
   Star) but carries Studio's distinct editorial skin: engineering-storytelling
   voice, build-report stat texture, artefact-anchored hero.

   SCOPE. Everything here is scoped under the .vf--studio wrapper EXCEPT the
   .sa-pq and .sa-lede primitives in §16e, which are authored as ESTATE-GLOBAL
   bare-class primitives per vf.pq_pull_quote + vf.typography.variant_lead
   (their nature, like .sa-cbp). The .vf--studio class is applied by the Studio
   Content Block (CP-3), mirroring CB 3775's "vf vf--wisdom-star" wrapper; this
   section is inert on the live site until that CB ships.

   REUSE, NOT REDEFINE (do not duplicate here):
     - .sa-cbp        - ships as the GreenShift "Vivid - Code Block (Terminal)"
                        Reusable + one global rule in gspb_global_settings.
     - inline <code>  - §7 of this file (prose chip, mode-aware).
     - .vf-island--invert - §15c (the inverting "key takeaway / what we'd do
                        differently" island; tonal opposite of the page in both
                        modes). The Studio "what we'd do differently" callout
                        consumes this primitive as-is.

   Consumes the --vf-reading-* tokens and the --sa-t1..t7 spectrum from
   style.css :root. Reading body width is delivered by the CB's core/post-content
   WP CONSTRAINED LAYOUT (contentSize = reading measure, wideSize = wide tier),
   NOT by a tier utility on the post-content wrapper - the standing P1 learning.
   The .vf-tier-* utilities below are for SINGLE-element regions only (title,
   meta, standfirst, hero, stat strip, code/figure break-outs).
   ============================================================================ */

/* a. No-rail width-tier spine + reading typography, scoped to .vf--studio.
   Studio runs a wider wide-tier than the Wisdom Star (1080 vs 960) so code
   blocks and architecture diagrams breathe (design-of-record §4). Headings are
   Plus Jakarta Sans 700 - NOT 800 - with a faintly tighter track than Wisdom
   for the technical register. */
.vf--studio .vf-tier-read  { max-width: var(--vf-reading-measure); margin-inline: auto; }
.vf--studio .vf-tier-wide  { max-width: 1080px; margin-inline: auto; }            /* tunable literal - Studio wide tier */
.vf--studio .vf-tier-bleed { width: 100vw; margin-inline: calc(50% - 50vw); }

.vf--studio .vf-tier-read { font-size: var(--vf-reading-body-size); line-height: var(--vf-reading-leading); }
.vf--studio h1 { font-family: var(--sa-font); font-weight: 700; font-size: clamp(2.5rem, 5vw, 3.5rem); line-height: 1.08; letter-spacing: -0.02em; }
.vf--studio h2 { font-family: var(--sa-font); font-weight: 700; font-size: clamp(1.75rem, 3vw, 2rem); letter-spacing: -0.015em; }
.vf--studio h3 { font-family: var(--sa-font); font-weight: 700; font-size: clamp(1.375rem, 2vw, 1.5rem); letter-spacing: -0.01em; }
.vf--studio .vf-meta { font-size: 0.9375rem; }   /* ~15px - Studio meta line (date / reading-time / tradition) */
/* body-copy links: persistent underline for reading clarity; colour inherited
   (#FF0060 Void, #6B0030 light via §13) */
.vf--studio .vf-tier-read a { text-decoration: underline; text-underline-offset: 0.15em; }

/* b. Eyebrow - the signature VF editorial element, used generously as a section
   label above H2s (variant_eyebrow: 11px / 500 / 0.13em, uppercase). A bare
   label, NOT the §5 .vf-eyebrow pill - own class so the two never collide.
   Colour follows the mode-aware --vf-subhead token (lime dark / Anahata Deep
   light), the estate's eyebrow/subhead convention. */
.vf--studio .vf-studio-eyebrow {
  display:          block;
  font-family:      var(--sa-font);
  font-size:        11px;
  font-weight:      500;
  letter-spacing:   0.13em;
  text-transform:   uppercase;
  color:            var(--vf-subhead);
  margin-block-end: 0.5rem;
}

/* c. Stat strip - SIGNATURE build-report band (design-of-record §7, elevated to
   a signature element). 3–4 stats: big number (variant_stat: 32px+ / 700 /
   -0.02em) over a small caption-scale label. Responsive auto-fit grid, rules
   above + below, mode-aware via token-driven ink and a token-derived border. */
.vf--studio .vf-studio-stats {
  display:               grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap:                   1.5rem 2rem;
  margin-block:          2.5rem;
  padding-block:         1.75rem;
  border-block:          1px solid color-mix(in srgb, var(--vf-text) 15%, transparent);
}
.vf--studio .vf-studio-stat {
  display:        flex;
  flex-direction: column;
  gap:            0.35rem;
}
.vf--studio .vf-studio-stat__num {
  font-family:    var(--sa-font);
  font-size:      clamp(1.5rem, 3vw, 1.9rem);  /* reduced from 2.5rem max so a long value ("Unlimited") clears its grid column instead of colliding with the next stat */
  font-weight:    700;
  letter-spacing: -0.02em;
  line-height:    1;
  color:          var(--vf-heading);
}
.vf--studio .vf-studio-stat__label {
  font-size:      12px;                        /* caption / eyebrow scale */
  font-weight:    500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color:          var(--vf-text-subtle);
}

/* d. Hero - Wisdom-parallel full-bleed image band with the title BELOW it.
   Standing rule (Vikas 2026-06-20): a Studio single uses a full-bleed hero
   IMAGE, never a screenshot; screenshots live in the body as figures. Mirrors
   the Wisdom Star hero (CB 3775 .vf-star__hero / __head / __title / __meta),
   scoped to .vf--studio. The image is a CSS background on a .vf-tier-bleed
   cover band fed by the GreenShift dynamic background from the _vf_hero_image
   post meta; the title + meta sit in the header below it. Mode-aware: the band
   shows the --vf-surface token where the image does not cover. (Supersedes the
   prior body-hero .vf-studio-hero region, removed in 11.7.2 - the hero now
   lives in the template.) */

/* Wrapper - no rail; non-bleed content caps at --vf-content-max */
.vf--studio { max-width: var(--vf-content-max); margin-inline: auto; }

/* Comfortable mobile gutters on the read/wide tier wrappers (title / meta) */
.vf--studio .vf-tier-read,
.vf--studio .vf-tier-wide { padding-inline: clamp(1.25rem, 5vw, 2rem); }

/* Full-bleed hero band - cover image via GS dynamic background (_vf_hero_image) */
.vf--studio .vf-studio__hero {
  min-height:          clamp(280px, 42vw, 560px);
  background-color:    var(--vf-surface);
  background-size:     cover;
  background-position: center;
  background-repeat:   no-repeat;
}

/* Header - title + meta, BELOW the hero */
.vf--studio .vf-studio__head { padding-block: clamp(2rem, 5vw, 3.5rem) 0; }
.vf--studio .vf-studio__title { margin-block: 0 0.85rem; }
/* kill GreenShift's inner-heading default margin; .vf-studio__title owns spacing */
.vf--studio .vf-studio__head .gspb-dynamic-title-element { margin-block: 0; }
.vf--studio .vf-studio__meta {
  display:      flex;
  flex-wrap:    wrap;
  align-items:  baseline;
  gap:          0.4rem 0.85rem;
  margin-block: 0;
  color:        var(--vf-text-muted);
}
.vf--studio .vf-studio__meta .vf-studio__date::after {
  content:             "·";
  color:               var(--vf-text-muted);
  opacity:             .6;
  margin-inline-start: 0.85rem;
}

/* Body - reading column is the WP-native constrained layout (65ch / 1080 / 100vw).
   The wrapper carries vertical rhythm only; mobile side-gutters go on non-bleed
   children so .alignfull stays edge-to-edge. */
.vf--studio .vf-studio__body { padding-block: clamp(1rem, 3vw, 2rem); }
.vf--studio .vf-studio__body > :not(.alignfull) { padding-inline: clamp(1.25rem, 5vw, 2rem); }

/* e. .sa-pq + .sa-lede - ESTATE-GLOBAL bare-class primitives (NOT .vf--studio-
   scoped), authored here per vf.pq_pull_quote + vf.typography.variant_lead.
   Mode-aware (follow page tokens, no pinned surface), no italics
   (vf.typography.no_italics_rule). DEPLOY CONSEQUENCE (pre-cleared by Vikas,
   P2): globalising these also styles post 3372's existing bare .sa-pq/.sa-lede,
   which currently render as default blockquote/paragraph - intended improvement,
   no layout risk. */

/* Lede / standfirst - variant_lead: 20px / 400 / normal. Sets the article's
   opening tone; slightly muted, larger than body. */
.sa-lede {
  font-family:   var(--sa-font);
  font-size:     1.25rem;          /* 20px */
  font-weight:   400;
  line-height:   1.6;
  letter-spacing: 0;
  font-style:    normal;
  color:         var(--vf-text-muted);
  margin-block:  0 1.75rem;
}

/* Pull-quote - variant_pullquote: 22px / 700 / normal, NOT italic. Left accent
   rule from the Shakti accent (mode-aware via §13: Shakti Pink dark / Shakti
   Deep light). One restrained .accent emphasis per quote. <cite> sits below,
   caption-scale, muted, with a leading separator glyph. */
.sa-pq {
  margin-block:         2.5rem;
  padding-inline-start: 1.5rem;
  border-inline-start:  3px solid var(--sa-shakti-start);
}
.sa-pq blockquote {
  margin:      0;
  font-family: var(--sa-font);
  font-size:   1.375rem;           /* 22px */
  font-weight: 700;
  line-height: 1.4;
  font-style:  normal;
  color:       var(--vf-heading);
}
.sa-pq blockquote .accent {
  background-image:         var(--vf-grad-shakti);
  -webkit-background-clip:  text;
  background-clip:          text;
  color:                    transparent;
  -webkit-text-fill-color:  transparent;
}
.sa-pq cite {
  display:            block;
  margin-block-start: 0.75rem;
  font-size:          0.8125rem;   /* ~13px caption scale */
  font-weight:        500;
  font-style:         normal;
  letter-spacing:     0.04em;
  color:              var(--vf-text-subtle);
}
.sa-pq cite::before { content: "— "; }

/* f. REUSE-ONLY marker - .sa-cbp, inline <code> (§7), .vf-island--invert (§15c)
   are consumed by the Studio template as-is; intentionally NOT redefined here. */

/* g. Figure captions - .vf--studio figcaption. Caption treatment for the two
   in-body wide-tier figures (variant_caption: 12px / 400 / muted via
   --vf-text-subtle). Mode-aware through the token (no pinned ink); a modest
   top margin seats the caption just beneath its image. Scoped to .vf--studio
   so it never leaks to figure captions on other surfaces. No italics
   (vf.typography.no_italics_rule). */
.vf--studio figcaption {
  font-family:        var(--sa-font);
  font-size:          12px;
  font-weight:        400;
  line-height:        1.5;
  letter-spacing:     0;
  font-style:         normal;
  color:              var(--vf-text-subtle);
  margin-block-start: 0.625rem;
}

/* h. Reading-measure alignment + stat word-break (11.7.3 render polish).
   ROOT CAUSE of the section-title offset: the WP constrained layout caps each
   post-content child at `65ch`, but `ch` is FONT-RELATIVE, so the same `65ch`
   resolves to a different pixel width per element - body copy (16px) ~760px, a
   section H2 (32px) ~1472px (hangs far left), an 11px eyebrow ~517px (sits
   indented). Three fonts = three left edges. The body keeps its font-relative
   65ch (correct for prose measure); the section headings and the eyebrow are
   capped at the SAME pixel measure so eyebrow + H2 + body share one left edge.
   47.5rem matches the body's 65ch at the 16px reading size, and the body font
   is a fixed rem so the match holds at every viewport. (The Wisdom Star carries
   the same latent offset - a separate Wisdom touch-up.) Verified live on
   /blog/spirit-crm/: eyebrow/H2/body left edges 590/112/468 -> 469/469/468. */
.vf--studio .vf-studio__body > :is(h2, h3, h4) {
  max-width:     var(--vf-reading-measure);
  margin-inline: auto;
}
/* Eyebrow: same cap so the section label lines up above its H2 (augments §16b). */
.vf--studio .vf-studio-eyebrow {
  max-width:     var(--vf-reading-measure);
  margin-inline: auto;
  text-align:    left;
}

/* Stat strip - keep a multi-syllable number ("Unlimited") on one line; the
   narrow auto-fit column was letting the browser hyphen-break it mid-word.
   Verified live: the cell collapsed from 80px (2 lines) back to 40px (1 line). */
.vf--studio .vf-studio-stat__num {
  overflow-wrap: normal;
  word-break:    keep-all;
  hyphens:       none;
}


/* ============================================================================
   §7b · MULTI-LINE CODE BOX  (.wp-block-code)
   The standard Gutenberg code block, styled as a terminal panel for the Studio
   and Wisdom-Star reading spines. Shares the GitHub-dark grey-blue palette with
   the §7 inline chip and the .sa-cbp Reusable, so inline mentions and multi-line
   samples read as one family. Deliberately mode-INVARIANT: a terminal stays a
   dark panel on Parchment as well as Void (a fixed island, like §15c), which is
   why surface/ink are pinned literals rather than mode-flipping tokens.
   ============================================================================ */
.vf--studio .wp-block-code,
.vf--wisdom-star .wp-block-code {
  background:      #0d1117;
  color:           #e6edf3;
  border:          1px solid rgba(110, 118, 129, 0.40);
  border-radius:   12px;
  padding:         1.15rem 1.3rem;
  margin-block:    1.85rem;
  font-family:     'JetBrains Mono', 'Fira Code', ui-monospace, Menlo, Monaco, Consolas, monospace;
  font-size:       0.86rem;
  line-height:     1.62;
  overflow-x:      auto;
  -webkit-overflow-scrolling: touch;
  tab-size:        2;
}
.vf--studio .wp-block-code code,
.vf--wisdom-star .wp-block-code code {
  background: none;
  border: 0;
  padding: 0;
  color: inherit;
  font: inherit;
  white-space: pre;
}

/* §7b (light-mode ink pin) - the §7 `body.vf--light code:not([class])` rule
   (0,0,2,2) flips EVERY bare <code> to deep-violet in light mode, including the
   bare <code> inside .wp-block-code, which would turn the terminal ink dark on
   the (deliberately) dark box. Pin it back to light with a pillar-scoped
   selector (0,0,3,1) that outranks it. Same leaf-pin lesson as the Star
   standfirst: a fixed-dark island must own its ink on the leaf. */
.vf--light .vf--studio .wp-block-code code,
.vf--light .vf--wisdom-star .wp-block-code code,
body.vf--light .vf--studio .wp-block-code code,
body.vf--light .vf--wisdom-star .wp-block-code code {
  color: #e6edf3;
}

/* ============================================================================
   §17 · MEGA-MENU PANEL CASCADE   (P5 Phase 2, v11.7.30; Bespoke rail removed v11.7.37)
   The Services mega panel is a Blocksy mega item: the ct-mega-menu* classes sit
   on the <li>; the panel itself is the child > .sub-menu. So §11 already themes
   the panel surface (--vf-surface-alt) and base links (--vf-heading, hover
   --sa-shakti-start). §17 extends that proven cascade to the mega panel's
   higher-specificity selectors (so Blocksy per-item mega dynamic styles cannot
   override mode-awareness), themes the pillar column headings to a mode-aware
   default. All
   token-driven, so it paints correctly even when the panel is AJAX-injected
   after the pre-paint mode snippet (tokens already resolve on body). Same
   cascade family as §10 cards and §11 submenu. Mode is a lighting change only.
   ============================================================================ */

/* §17 · canonical header height. Measured live at 120px (non-sticky on the
   front end as of v11.7.30). Single source of truth for header-aware clearance;
   the §6 hero keeps its own static padding-top by design (calc breakage, see
   vf.v11_calc_breakage_diagnosis), so this token is additive, not a refactor. */
:root { --vf-header-height: 120px; }

/* §17a - mega panel surface. A full-width Blocksy mega panel sets its own
   .sub-menu transparent and paints the visible full-bleed surface on
   .sub-menu::after via var(--dropdown-background-color, --theme-palette-color-4).
   --theme-palette-color-4 is not mode-aware (dark in both modes -> dark panel on
   parchment), so re-point --dropdown-background-color to the mode-aware surface
   (the §14 footer pattern: re-point the variable Blocksy consumes, do not fight
   it with a direct background). Keep the outer panel AND the inner column
   sub-menus transparent so they all read as the one ::after surface rather than
   §11's white card-surface boxes in light mode. */
[class*="ct-mega-menu"] > .sub-menu {
  --dropdown-background-color: var(--vf-surface-alt);
  background-color: transparent !important;
}
[class*="ct-mega-menu"] .sub-menu .sub-menu {
  background-color: transparent !important;
}

/* §17b - mega panel links (mirrors §11 link + hover at mega specificity) */
[class*="ct-mega-menu"] .sub-menu .ct-menu-link {
  color: var(--vf-heading);
}
[class*="ct-mega-menu"] .sub-menu .ct-menu-link:hover {
  color: var(--sa-shakti-start);
}

/* §17c - pillar column headings: mode-aware default ink. Per-pillar accent
   colours (Create / Build & Host / Grow / Automate & Scale) are layered on the
   per-heading items in Phase 3; this is the safe default so a heading is never
   left unstyled. */
[class*="ct-mega-menu"] .sub-menu .ct-column-heading,
[class*="ct-mega-menu"] .sub-menu .ct-column-heading .ct-menu-link {
  color: var(--vf-heading);
}

/* §17e - pillar-anchor clearance on /services. The Phase 1 anchors
   (#create / #build / #grow / #automate on the .sv-card summary cards, #bespoke
   on section.sv-browse) land clear of the header when reached from the mega
   panel. Sized to the measured header-height token, no second magic number. */
.sv-card#create, .sv-card#build, .sv-card#grow, .sv-card#automate,
.sv-browse#bespoke {
  scroll-margin-top: var(--vf-header-height);
}


/* §17c-accent (P5 Phase 3) - per-pillar column-heading colours. The four heading
   items carry vf-mm-<pillar> on their <li>; the heading link is the direct-child
   a.ct-menu-link.ct-column-heading. Each takes its --vf-pillar-* semantic token
   (style.css), which §M.4 flips in light, all five pillar-scoped (Create ->
   Shakti Deep, Build -> Spirit Deep, Grow -> Anahata Deep, Automate -> Ajna
   Deep, Support -> Manipura Deep). Direct child only,
   so the leaf links keep the section 17b ink. No !important: since section 4
   stopped declaring link colour !important (R3 A2-P1, the menu-var re-point),
   these accent selectors win on their own specificity (0,5,0) over section 17b
   and Blocksy's bundled link rule. */
[class*="ct-mega-menu"] .sub-menu .vf-mm-create   > .ct-menu-link.ct-column-heading { color: var(--vf-pillar-create); }
[class*="ct-mega-menu"] .sub-menu .vf-mm-build     > .ct-menu-link.ct-column-heading { color: var(--vf-pillar-build); }
[class*="ct-mega-menu"] .sub-menu .vf-mm-grow      > .ct-menu-link.ct-column-heading { color: var(--vf-pillar-grow); }
[class*="ct-mega-menu"] .sub-menu .vf-mm-automate  > .ct-menu-link.ct-column-heading { color: var(--vf-pillar-automate); }
[class*="ct-mega-menu"] .sub-menu .vf-mm-support   > .ct-menu-link.ct-column-heading { color: var(--vf-pillar-support); }

/* Section 17f - header container width unification. Lifted verbatim from the
   gspb_global_settings.custom_css DB rule (A3-06, "HEADER WIDTH UNIFICATION
   10 May 2026") into the theme so it travels in the export. Matches the Project
   CPT full-width header across all pages. The DB copy is deleted once this is
   verified serving. */
.ct-header .ct-container,
.ct-header .ct-container-wide,
.ct-header [data-row="middle"] > div {
  max-width: 100% !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* End vf-overrides.css v11.7.55 */
