/* =========================================================================
   VACEI LIQUID GLASS — shared theme overlay
   -------------------------------------------------------------------------
   KEEP THIS FILE BYTE-IDENTICAL IN ALL THREE REPOSITORIES:
     vacei-client-portal    src/styles/vacei-liquid-glass.css
     vacei-portal-frontend  src/styles/vacei-liquid-glass.css
     w1-books-app           src/styles/vacei-liquid-glass.css
   Commit it to all three in the SAME change. A divergent copy is worse than
   no shared file at all. Store with LF endings (.gitattributes: eol=lf).

   WHAT THIS SUPERSEDES
   - The 2026-09-13 / 2026-09-16 unified presentation (portal-unified.css) in
     Client and Books, and the canvas era (vacei-canvas.css) in Partner.
   - BRAND-SPEC 1.6 "MUST NOT redefine" on the warm-neutral glass/neutral
     ramp: the card surface itself changes, so that ruling is overridden here.
   - The FROZEN TYPEFACE ruling: the UI face is Google Sans Flex, the Vacei
     Network face shared with vacei.com (owner ruling 2026-09-24; it was
     Urbanist from 2026-09-17).
   - BRAND ALIGNMENT 2026-09-24 (owner: "make sure all our branding in our
     portals match" the brand kit, the new vacei.com and the new videos
     exactly). The glass SHELL (layout, radii, sidebar behaviour, hero,
     cards) is unchanged; its BRAND LAYER now uses vacei.com's own values:
     Google Sans Flex, ink #173B40, the 112deg teal cover gradient, deep
     teal #2A545E/#0F2226, sage #EDF2ED, off-white #FAFBF9, lime #E9F16D
     as a tint under ink (and as the signed-out call to action, with ink
     text), amber #F2B84B. Source of truth: the site sheets
     minimal-design.css / network.css / signature-motion.css in
     vacei-marketing-site and Dropbox Claude/marketing/vacei/brand/.

   WHY IT IS LOADED LAST AND UNLAYERED
   - Unlayered rules outrank anything inside @layer (Tailwind v4 theme/base/
     components/utilities), whatever their specificity. Do NOT wrap any of
     this in @layer, and do not move the import.
   - Tokens are declared at :root:root:root (0,3,0). That beats plain :root
     (0,1,0) and the :root:root (0,2,0) armour used by portal-unified.css,
     from ANY position -- including sheets that load after this one and
     token blocks that sit after the hoisted @import window. Specificity,
     not source order, is what makes this file safe.

   UNITS ARE PX ON PURPOSE
   - Desktop runs at html{font-size:75%} above 1024px. Every rem renders at
     0.75x. Radii, control heights and gaps are px so they survive.

   THIS FILE IS THE UNION OF ALL THREE VOCABULARIES
   - A custom property nothing references is inert, so every portal can carry
     every family. Do not "clean up" names that look unused in one repo.
   ========================================================================= */

/* -------------------------------------------------------------------------
   1. BRAND PRIMITIVES — the only literal colours in the estate.
      Everything below points at these. Change a brand colour HERE only.
   ---------------------------------------------------------------------- */
:root:root:root {
  /* Every value here is a vacei.com value (2026-09-24). Comments give the
     site token or the contrast that justifies it; "was" is the Glass value. */
  --lg-accent:        #346A76;              /* site --brand: interactive / brand mark */
  --lg-accent-read:   #346A76;              /* accent as TEXT on white: 6.05:1 */
  --lg-accent-deep:   #2A545E;              /* brand deep teal: pressed / deep chrome
                                               (was #2A535C) */
  --lg-accent-bg:     rgba(52, 106, 118, 0.10);
  --lg-accent-soft:   rgba(52, 106, 118, 0.22);
  /* The two brand fills for big teal surfaces, exactly as the site paints
     them: the cover (hero, header) and the deep panel. White text clears
     5.46:1 at the light end of the cover and 8.3:1 on the deep panel, so
     neither needs a wash on top. */
  --lg-cover:         linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%);
  --lg-deep:          linear-gradient(120deg, #2A545E 0%, #173B40 100%);
  --lg-ground:        #EDF2ED;              /* brand sage: the calm canvas behind all
                                               (was #E5E8EA; before that the
                                               deep-teal render #00516B) */

  --lg-ink:           #173B40;              /* brand ink: primary text AND the dark
                                               primary pill, as on vacei.com
                                               (was var(--lg-ink)). 12.1:1 on white. */
  --lg-ink-deep:      #0F2226;              /* ink pressed / hover: the site's
                                               button hover (was var(--lg-ink-deep)) */
  --lg-ink-2:         #465D60;              /* site --body: secondary text
                                               (was #4E5557). 7.0:1 on white. */
  --lg-ink-3:         #607174;              /* site --muted: muted text, icons at
                                               rest (was #5E6565). 5.11:1 on white,
                                               4.92 on #FAFBF9, 4.51 on the #EDF2ED
                                               ground -- AA everywhere it sits. */

  --lg-page:          #FAFBF9;              /* brand off-white: opaque page/well fill
                                               (was #F8F9F9) */
  --lg-inset:         #EDF2ED;              /* brand sage: inset panel on a card,
                                               secondary pill, inactive filter chip
                                               (was #F3F4F5). Named so call sites
                                               reference it instead of a hex. */
  --lg-inset-head:    #FAFBF9;              /* table header row (was #F6F7F8) */
  --lg-white:         #FFFFFF;              /* solid card, popovers, menus   */
  --lg-glass:         rgba(255, 255, 255, 0.94);  /* THE one card surface: reads as solid
       white, with just enough give for the ground to warm it from beneath */
  --lg-glass-soft:    rgba(255, 255, 255, 0.78);
  /* The second and last tier: THIN glass. Chrome that floats on the ground --
     inactive tabs, status chips, the ring around the menu and the "Up next"
     card. 10% white, a bright hairline, the blur. Text on it is white. */
  --lg-thin:          rgba(255, 255, 255, 0.10);
  --lg-thin-border:   rgba(255, 255, 255, 0.75);
  --lg-thin-blur:     blur(30px) saturate(1.35);
  /* THIN glass that CARRIES A LABEL (pills, chips) is smoked: a deep-teal tint
     (brand #0F2226) under the white text, so the label reads wherever the
     pill lands. Rings that carry no text (menu, "Up next") stay clear. */
  --lg-thin-smoke:    rgba(15, 34, 38, 0.40);
  --lg-hairline:      #DCE3DE;              /* site --line: dividers, table rules,
                                               inputs (was #E2E2E2) */
  --lg-hairline-strong: #607174;            /* input outlines (was #676F70) */

  /* Lime is the brand's one accent and it is ALWAYS a fill or a tint with ink
     on it -- never text on a light surface (1.22:1 on white). Ink on lime is
     9.95:1. --lg-highlight is the page's one highlight card (the Glass
     guide's "yellow card"), now the brand lime tinted over white. */
  --lg-lime:          #E9F16D;
  --lg-highlight:     linear-gradient(170deg, rgba(233, 241, 109, 0.55) 0%, rgba(233, 241, 109, 0.22) 100%), #FFFFFF;

  --lg-positive:      #246733;              /* semantic status inks: unchanged,  */
  --lg-negative:      #A82F31;              /* they carry meaning, not brand     */
  --lg-amber:         #F2B84B;              /* brand amber "needs your input":
                                               dot / fill only (was #FF9500) */
  --lg-amber-read:    #854F02;              /* amber as TEXT, AA on white    */

  --lg-r-card:        24px;
  --lg-r-glass:       30px;
  --lg-r-pill:        999px;
  --lg-control-h:     40px;
  --lg-gap:           12px;

  /* The brand face, as vacei.com sets it: Google Sans Flex with an Arial
     fallback. var() first: next/font registers a hashed family name that a
     literal would never match; 'Google Sans Flex Variable' is the name
     @fontsource-variable/google-sans-flex registers, wherever an app loads
     it that way. Either loader resolves through this one stack. */
  --lg-font: var(--font-google-sans-flex, 'Google Sans Flex Variable'), 'Google Sans Flex', Arial, sans-serif;
  --lg-blur: blur(30px) saturate(1.4);
}

/* -------------------------------------------------------------------------
   2. TYPEFACE
      Declared on ":root:root:root, body" because portal-unified.css declares
      --portal-font on ":root:root, body"; a root-only override loses on
      body-descendant resolution. --a4-font-ui is the chain root in Partner.
      var() first, literal second: next/font registers a HASHED family name,
      so the literal alone would match nothing self-hosted.
   ---------------------------------------------------------------------- */
:root:root:root,
body {
  --portal-font:       var(--lg-font);
  --a4-font-ui:        var(--lg-font);
  --a4-font-display:   var(--lg-font);
  --a4-suite-font-sans: var(--lg-font);
  --bk-font-body:      var(--lg-font);
  --bk-font-display:   var(--lg-font);
  --v-font:            var(--lg-font);
  --vacei-font-sans:   var(--lg-font);
  --font-body:         var(--lg-font);
  --font-display:      var(--lg-font);
}

/* -------------------------------------------------------------------------
   3. --portal-* — canonical in Client and Books. Inert in Partner.
      CANVAS STAYS OPAQUE. --portal-canvas / --a4-canvas / --vc-canvas /
      --bk-canvas are used as INNER fills (modal header bars, search inputs,
      sticky table headers, VAT dialog wells). Transparent there would show
      the ground image through table headers. Shell transparency is done by
      selector in section 9, never by blanking the canvas token.
   ---------------------------------------------------------------------- */
:root:root:root {
  --portal-canvas:        var(--lg-page);
  --portal-card:          var(--lg-glass);
  --portal-soft:          var(--lg-glass-soft);
  --portal-border:        var(--lg-hairline);
  --portal-border-strong: var(--lg-hairline-strong);

  --portal-ink:           var(--lg-ink);
  --portal-ink-hover:     var(--lg-ink-2);
  --portal-muted:         var(--lg-ink-3);

  --portal-accent:        var(--lg-accent);
  --portal-accent-text:   var(--lg-accent-read);
  --portal-accent-deep:   var(--lg-accent-deep);
  --portal-accent-bg:     var(--lg-accent-bg);
  --portal-accent-soft:   var(--lg-accent-soft);
  --portal-accent-glow:   var(--lg-accent);

  /* Sidebar / nav = white glass, matching the one card surface.
     TO SWITCH TO A DEEP-TEAL RAIL: set --portal-nav to var(--lg-ground),
     --portal-nav-ink and --portal-nav-active to #FFFFFF, --portal-nav-muted
     to rgba(255,255,255,.72), --portal-nav-active-ink to var(--lg-ground)
     and --portal-nav-line to rgba(255,255,255,.20). Change it in all three
     repos at once. See CONFLICTS. */
  --portal-nav:            var(--lg-glass);
  --portal-nav-ink:        var(--lg-ink);
  --portal-nav-muted:      var(--lg-ink-3);
  --portal-nav-hover:      var(--lg-accent-bg);
  --portal-nav-active:     var(--lg-accent-bg);
  --portal-nav-active-ink: var(--lg-accent-deep);
  --portal-nav-line:       transparent;

  --portal-radius:         var(--lg-r-card);
  --portal-radius-pill:    var(--lg-r-pill);

  --portal-stat-bg:        var(--lg-glass-soft);
  --portal-stat-bg-hover:  var(--lg-glass);
  --portal-shadow:         none;
  --portal-header-shadow:  none;
  --portal-header-surface: var(--lg-glass);
  --portal-hero-surface:   var(--lg-glass);
  --portal-section-surface: var(--lg-glass);
}

/* -------------------------------------------------------------------------
   4. --a4-* — present in all three.
      In Client/Books the COLOUR half already aliases --portal-*; restating
      it is harmless and makes Partner (which has no --portal-*) work from
      the same file.
   ---------------------------------------------------------------------- */
:root:root:root {
  --a4-canvas:         var(--lg-page);
  --a4-surface-page:   var(--lg-page);
  --a4-card:           var(--lg-white);      /* opaque: popovers/menus sit on it */
  --a4-surface:        var(--lg-glass);
  --a4-surface-subtle: var(--lg-glass-soft);
  --a4-surface-quiet:  var(--lg-page);
  --a4-inverse:        var(--lg-ink);        /* NOT the ground: that is a pale canvas now */
  --a4-inverse-2:      var(--lg-accent-deep);

  --a4-ink:            var(--lg-ink);
  --a4-ink-2:          var(--lg-ink-2);
  --a4-ink-3:          var(--lg-ink-3);
  --a4-ink-muted:      var(--lg-ink-3);
  --a4-mute:           var(--lg-ink-3);
  --a4-body:           var(--lg-ink-2);
  --a4-stone:          var(--lg-ink-3);
  --a4-charcoal:       var(--lg-ink-2);

  --a4-hairline:        var(--lg-hairline);
  --a4-hairline-2:      var(--lg-hairline);
  --a4-hairline-strong: var(--lg-hairline-strong);

  /* READABLE cyan, not the display cyan. --a4-accent is the primary ACTION
     colour: `bg-[var(--a4-accent)] text-white` appears 31 times across 18
     files in Client alone, including components/ui/button.tsx, and a4-ui.css
     line 44 explicitly flags this family as "used as TEXT ... must be AA".
     --lg-accent (#346A76) gives white text only 3.23:1. This gives 4.60.
     The display cyan is still available as --a4-accent-glow for decoration. */
  --a4-accent:         var(--lg-accent-read);
  --a4-accent-deep:    var(--lg-accent-deep);
  --a4-accent-bg:      var(--lg-accent-bg);
  --a4-accent-soft:    var(--lg-accent-soft);
  --a4-accent-glow:    var(--lg-accent);
  --a4-focus:          var(--lg-accent);
  --a4-primary:        var(--lg-accent-deep);
  --a4-primary-bright: var(--lg-accent);
  --a4-teal:           var(--lg-accent);
  --a4-on-primary:     var(--lg-white);
  --a4-suite-primary:  var(--lg-accent-deep);
  --a4-suite-accent:   var(--lg-accent);
  --a4-suite-accent-hover: var(--lg-accent-read);

  /* Semantics. Independent of the brand ramp by long-standing ruling --
     re-verify contrast if you touch these. */
  --a4-positive:       var(--lg-positive);
  --a4-positive-bg:    rgba(36, 103, 51, 0.10);
  --a4-positive-dot:   var(--lg-positive);
  --a4-danger:         var(--lg-negative);
  --a4-danger-bg:      rgba(168, 47, 49, 0.10);
  --a4-danger-dot:     var(--lg-negative);
  --a4-warn:           var(--lg-amber-read);
  --a4-warn-bg:        rgba(242, 184, 75, 0.15);
  /* NOT --lg-amber (#FF9500). That is annotated "dot / fill only" and is 2.20
     on white -- it fails even the 3:1 graphical threshold. Pre-existing code
     in Client and Partner already uses --a4-warn-dot as TEXT and as an icon
     colour (AlertTriangle, ShieldCheck, trial-balance figures), so this token
     has to be readable, not just visible. orange-700 is 4.72 on white and
     3.94 on its own chip. */
  --a4-warn-dot:       #A86301;
  --a4-info:           var(--lg-accent-read);  /* used as TEXT on --a4-info-bg: --lg-accent was 2.91:1 there */
  --a4-info-bg:        var(--lg-accent-bg);
  --a4-info-dot:       var(--lg-accent);
  --a4-neutral:        var(--lg-ink-3);
  --a4-neutral-bg:     var(--lg-page);
  --a4-auto:           var(--lg-accent);
  --a4-auto-bg:        var(--lg-accent-bg);
  --a4-auto-fg:        var(--lg-accent-read);

  /* Geometry. px, never rem. */
  --a4-r-nav:    var(--lg-r-pill);
  --a4-r-input:  var(--lg-r-card);
  --a4-r-core:   var(--lg-r-card);
  --a4-r-shell:  var(--lg-r-glass);
  --a4-r-lg:     var(--lg-r-card);
  --a4-r-xl:     var(--lg-r-glass);
  --a4-r-pill:   var(--lg-r-pill);
  --a4-control-h:    var(--lg-control-h);
  --a4-control-h-lg: var(--lg-control-h);
  --a4-gap:          var(--lg-gap);
  --a4-shell-gap:    var(--lg-gap);

  --a4-shadow-card:    none;
  --a4-shadow-lift:    none;
  --a4-shadow-float:   none;
  --a4-shadow-modal:   none;
  --a4-shadow-accent:  none;
  --a4-shadow-sidebar: none;
  --a4-shadow-seg:     none;
  /* THE RAIL IS WHITE GLASS, so the whole --a4-sidebar-* family has to move
     together. --a4-sidebar-text was #ffffff, which was right for the old dark
     rail and is INVISIBLE on a light one -- re-pointing the ground without the
     ink is a silent failure. Verified live consumers: var(--a4-sidebar) x2 in
     Client and x3 in Partner, plus -text/-hover/-fill/-line. */
  --a4-sidebar:        var(--lg-glass);
  --a4-sidebar-text:   var(--lg-ink);
  --a4-sidebar-muted:  var(--lg-ink-3);
  --a4-sidebar-hover:  var(--lg-accent-bg);
  --a4-sidebar-active: var(--lg-accent-bg);
  --a4-sidebar-line:   var(--lg-hairline);
  --a4-sidebar-faint:  var(--lg-ink-3);
  --a4-sidebar-fill:   rgba(255, 255, 255, 0.55);
  --a4-hero-cover-base:   var(--lg-accent-deep);
  --a4-hero-cover-shadow: none;
  --a4-hero-assist-shadow: none;
}

/* -------------------------------------------------------------------------
   5. --brand* / --v-* / --vc-* / --vacei-* / --bk-*
      --brand-hsl is a bare "H S% L%" triple consumed as hsl(var(--x)).
      A custom property cannot compose a hex var() into an HSL triple, so it
      is computed by hand. Working for #346A76:
        R=43 G=155 B=186 -> r=.168627 g=.607843 b=.729412
        max=b min=r  d=.560784
        L=(max+min)/2=.449020 -> 45%
        L<.5 so S=d/(max+min)=.560784/.898039=.624454 -> 62%
        max is b so H=4+(r-g)/d=4-.783218=3.216782 x60=193.007 -> 193
        check C=(1-|2L-1|)*S=.898039x.624454=.560783=d  OK
      => 193 62% 45%
   ---------------------------------------------------------------------- */
:root:root:root {
  --brand:             var(--lg-accent);
  --brand-primary:     var(--lg-accent);
  --brand-hover:       var(--lg-accent-read);
  --brand-glow:        var(--lg-accent);
  --brand-soft:        var(--lg-accent-bg);
  --brand-soft-border: var(--lg-accent-soft);
  --brand-tint:        var(--lg-accent-bg);
  --brand-focus:       var(--lg-accent);
  --on-brand:          var(--lg-white);
  --shadow-brand:      none;
  --link:              var(--lg-accent-read);
  --link-hover:        var(--lg-accent-deep);
  --ink-teal-900:      var(--lg-accent-deep);
  --ink-teal-800:      var(--lg-accent-read);
  --ink-teal-700:      var(--lg-accent);

  --brand-hsl: 191 39% 33%;
  --brand-h: 191;
  --brand-s: 39%;
  --brand-l: 33%;
  --vacei-accent-hsl: 191 39% 33%;
  --vacei-primary-hsl: 191 39% 33%;
  --vacei-hover-hsl: 192 38% 27%;

  /* --v-* : the white-glass sidebar skin. In Partner --v-primary is a
     literal in the vendored sheet, so it MUST be restated here. */
  --v-canvas:       var(--lg-page);
  --v-card:         var(--lg-white);
  --v-card-soft:    var(--lg-glass-soft);
  --v-glass:        var(--lg-glass);
  --v-glass-border: transparent;
  --v-glass-hover:  var(--lg-white);
  --v-glass-blur:   var(--lg-blur);
  --v-hairline:     var(--lg-hairline);
  --v-ink:          var(--lg-ink);
  --v-body:         var(--lg-ink-2);
  --v-mute:         var(--lg-ink-3);
  --v-stone:        var(--lg-ink-3);
  /* -read, not the bright accent: --v-primary is sidebar TEXT and a fill
     under white (3.23:1 at --lg-accent, 6.30:1 here). */
  --v-primary:            var(--lg-accent-read);
  --v-primary-hover:      var(--lg-accent-deep);
  --v-primary-soft:       var(--lg-accent-bg);
  --v-primary-soft-border: var(--lg-accent-soft);
  --v-primary-tint:       var(--lg-accent-bg);
  --v-focus:              var(--lg-accent);
  --v-teal-1: var(--lg-accent-deep);
  --v-teal-2: var(--lg-accent-read);
  --v-teal-3: var(--lg-accent);
  --v-teal-4: var(--lg-accent-soft);
  --v-r-shell: var(--lg-r-glass);
  --v-r-card:  var(--lg-r-card);
  --v-r-item:  var(--lg-r-card);
  --v-r-pill:  var(--lg-r-pill);
  --v-shadow-card:  none;
  --v-shadow-glass: none;

  /* --vc-* : company chrome + sidebar internals. */
  --vc-canvas:      var(--lg-page);
  /* Partner's collapsed-rail count dot: its ONLY consumer hard-codes
     `color:#fff` on this (#d9a514) = 2.25:1 at 9px. The readable amber
     carries white at 6.9:1 and still reads as a warning. */
  --vc-amber:       var(--lg-amber-read);
  --vc-canvas-alt:  var(--lg-page);
  --vc-paper:       var(--lg-white);
  --vc-card:        var(--lg-glass);
  --vc-fill:        var(--lg-page);
  --vc-hairline:    var(--lg-hairline);
  --vc-heading:     var(--lg-ink);
  --vc-ink:         var(--lg-ink);
  --vc-ink-text:    var(--lg-ink-2);
  /* Real names are --vc-ink-muted / --vc-ink-faint (vacei-canvas.css). This
     block said --vc-muted / --vc-faint, which nothing reads. */
  --vc-ink-muted:   var(--lg-ink-3);
  --vc-ink-faint:   var(--lg-ink-3);
  --vc-danger:      var(--lg-negative);      /* was #C43C2B: 4.44:1 on its own tint */
  --vc-teal:        var(--lg-accent-read);  /* used as TEXT; --lg-accent is 2.7:1 on a card */
  --vc-teal-dark:   var(--lg-accent-read);
  --vc-teal-deep:   var(--lg-accent-deep);
  --vc-btn-ink:     var(--lg-accent-deep);
  --vc-btn-ink-hover: var(--lg-accent-read);
  --vc-btn-ink-fg:  var(--lg-white);
  --vc-surface-dark: var(--lg-ink);
  /* -dark-2 / -dark-fg are the real names (vacei-canvas.css:87-88). This block
     used to say --vc-surface-2 / --vc-surface-fg: that left the real pair on
     charcoal AND defined a name LiveVisitorsPanel reads as an optional LIGHT
     strip (`var(--vc-surface-2, transparent)`), painting it deep teal under
     dark text - 2.07:1 on Support Inbox. */
  --vc-surface-dark-2:  var(--lg-accent-deep);
  --vc-surface-dark-fg: var(--lg-white);
  /* NOT transparent. This token is also a TEXT colour (ComplianceCalendar's
     "registry changes" stat, MasterOrchestrator's "stages", a4-exact.css:7389)
     - blanking it to hide the 6px strip made those numbers invisible. The
     strip itself is cleared by selector in section 9. */
  --vc-mint-strip:   var(--lg-accent-read);
  --vc-texture-image: none;
  --vc-texture-fill:  transparent;
  --vc-r-card:  var(--lg-r-card);
  --vc-r-panel: var(--lg-r-card);
  --vc-r-chip:  var(--lg-r-pill);
  --vc-shadow-card:    none;
  --vc-shadow-hover:   none;
  --vc-shadow-waiting: none;
  --vc-sb-bg-open:     var(--lg-glass);
  --vc-sb-text:        var(--lg-ink);
  --vc-sb-muted:       var(--lg-ink-3);
  --vc-sb-hover-bg:    var(--lg-accent-bg);
  --vc-sb-active-bg:   var(--lg-accent-bg);
  --vc-sb-active-fg:   var(--lg-accent-deep);
  --vc-sb-card-bg:     var(--lg-glass);
  --vc-sb-card-border: transparent;
  --vc-sb-divider:     var(--lg-hairline);
  --vc-sb-shadow-open:   none;
  --vc-sb-active-shadow: none;

  /* --vacei-* : legacy bridge + the glass recipe. */
  /* Partner: --vacei-primary -> --primary-color -> --color-primary, i.e. every
     `bg-primary text-white` (~490 sites). Must clear AA under white. */
  --vacei-primary:       var(--lg-accent-read);
  --vacei-primary-hover: var(--lg-accent-deep);
  --vacei-accent:        var(--lg-accent);
  --vacei-glass-bg:      var(--lg-glass);
  --vacei-glass-border:  transparent;
  --vacei-glass-shadow:  none;
  --vacei-glass-blur:    var(--lg-blur);
  --vacei-teal-1: var(--lg-accent-deep);
  --vacei-teal-2: var(--lg-accent-read);
  --vacei-teal-3: var(--lg-accent);
  --vacei-teal-4: var(--lg-accent-soft);
  --vacei-radius-sm: 12px;
  --vacei-radius-md: var(--lg-r-card);
  --vacei-radius-lg: var(--lg-r-card);
  --vacei-radius-xl: var(--lg-r-glass);

  /* --bk-* : Books palette + the VEE dock skin. */
  --bk-canvas:      var(--lg-page);
  --bk-canvas-grad: var(--lg-page);
  --bk-card:        var(--lg-glass);
  --bk-card-soft:   var(--lg-glass-soft);
  --bk-glass:       var(--lg-glass);
  --bk-glass-border: transparent;
  --bk-hairline:      var(--lg-hairline);
  --bk-hairline-soft: var(--lg-hairline);
  --bk-ink:   var(--lg-ink);
  --bk-body:  var(--lg-ink-2);
  --bk-mute:  var(--lg-ink-3);
  --bk-primary:       var(--lg-accent-deep);
  --bk-primary-hover: var(--lg-accent-read);
  --bk-primary-tint:  var(--lg-accent-bg);
  --bk-primary-glow:  var(--lg-accent);
  --bk-primary-focus: var(--lg-accent);
  --bk-ai-dark:       var(--lg-ink);        /* 19 solid buttons with white labels */
  --bk-ai-dark-hover: var(--lg-ink-deep);          /* black lifts to charcoal, never to teal */
  --bk-dc-teal:       var(--lg-accent);
  --bk-dc-teal-deep:  var(--lg-accent-deep);
  --bk-dc-mint:       var(--lg-accent-soft);
  --bk-dc-hero-light: var(--lg-accent-read);
  --bk-cover-base:    var(--lg-accent-deep);
  /* The Books login/cover ramp, dark -> light like the original. unified froze
     it to charcoal (#121214...#43434F), so Books' login disagreed with Client's
     (whose twin ramp --vacei-teal-* is re-pointed above).
     -4 is the LIGHT end and is also TEXT ON DARK: the eyebrows in
     AccountingHeroCard / EngagementA4Hero sit on bg-black, and
     --bk-scene-badge-on-dark aliases it. So it is the bright accent (6.5:1 on
     black, 5.3:1 on #0F2226) — not -read (3.1:1 there) and not the 22%-alpha
     -soft that Client's ramp ends on, which is unreadable as text. */
  --bk-teal-1: var(--lg-accent-deep);
  --bk-teal-2: var(--lg-accent-deep);
  --bk-teal-3: var(--lg-accent-read);
  --bk-teal-4: var(--lg-accent);
  /* portal-unified.css re-points --bk-cover-grad to the CARD colour. Heroes in
     its hero-list are forced to a card with dark ink, so that is harmless
     there — but the `.bk-on-dark` covers outside that list (landing Hero,
     global-dashboard greeting) paint this as an overlay under WHITE text: it
     was white-on-white before this sheet and white-on-90%-white with it.
     Keep the overlay on the ground. White clears 5.2:1 at its lightest point
     under the bloom, 6.3:1+ elsewhere. */
  --bk-cover-grad:    linear-gradient(112deg, var(--lg-accent-deep) 0%, var(--lg-accent-deep) 60%, var(--lg-accent-read) 100%);
  --bk-radius-card: var(--lg-r-card);   /* was --bk-r-card: no such token */
  --bk-shadow-card:  none;
  --bk-shadow-glass: none;
  --bk-shadow-topbar: none;
  --bk-shadow-primary: none;
  --bk-shadow-askbar:  none;
  --bk-shadow-popover: none;
  --bk-shadow-dial:    none;
  --bk-shadow-stack:   none;

  /* --vf-* / --c-* : flow surfaces and the short glass aliases. */
  /* --vf-teal is TEXT in ~47 places and the .vf-primary-btn hover fill under
     white, so it takes the readable accent (6.30:1), not the bright one. */
  --vf-teal:      var(--lg-accent-read);
  /* vacei-flow.css hard-codes these three as grey-green literals (#16211f,
     #2f5d59…#5c8b84) — the last off-palette surfaces on signup/register and
     the company picker. White text sits on all of them: 6.3:1 worst case. */
  --vf-fill:      var(--lg-accent-deep);
  --vf-sweep:     var(--lg-cover);
  --vf-hero:      var(--lg-cover);
  --vf-teal-deep: var(--lg-accent-deep);
  --vf-mint:      var(--lg-accent-soft);
  --vf-canvas:    var(--lg-page);
  --vf-card:      var(--lg-glass);
  --vf-field-bg:  var(--lg-page);
  --vf-arrow-bg:  var(--lg-accent-bg);
  --vf-surface-hover: var(--lg-glass);
  --vf-ink:       var(--lg-ink);
  --vf-ok-ink:    var(--lg-positive);
  --vf-ok-bg:     rgba(36, 103, 51, 0.10);
  --vf-warn-ink:  var(--lg-amber-read);
  --vf-warn-bg:   rgba(242, 184, 75, 0.15);
  --vf-alert:     var(--lg-negative);
  --vf-alert-bg:  rgba(168, 47, 49, 0.10);
  --vf-shadow-card: none;
  --vf-shadow-quote: none;
  --vf-shadow-soft: none;
  --vf-shadow-row:  none;
  --vf-shadow-row-hover: none;
  --c-glass:        var(--lg-glass);
  --c-glass-border: transparent;
  --c-glass-shadow: none;
  --c-ink:   var(--lg-ink);
  --c-body:  var(--lg-ink-2);
  --c-mute:  var(--lg-ink-3);
  --c-teal:  var(--lg-accent);
}

/* -------------------------------------------------------------------------
   6. shadcn / Radix bridge — bare "H S% L%" triples consumed as hsl(var(--x)).
      Pre-computed; a var() holding a hex cannot be composed into a triple.
      Present in all three; inert names are harmless.
   ---------------------------------------------------------------------- */
:root:root:root {
  --background:        90 20% 98%;   /* #FAFBF9 */
  --foreground:        187 47% 17%;  /* #173B40 */
  --card:              0 0% 100%;
  --card-foreground:   187 47% 17%;
  --popover:           0 0% 100%;
  --popover-foreground: 187 47% 17%;
  /* Every token below that carries a WHITE foreground uses --lg-accent-read
     (#346A76 = 191 39% 33%, 6.30:1), never --lg-accent (#346A76 = 3.23:1).
     `bg-primary text-primary-foreground` is ~900 call sites across the three
     apps; at 45% lightness every one of them failed AA. Same correction, for
     the same reason, as --a4-accent in section 3. --ring/--info keep the
     bright accent: they are graphical (3:1), not text carriers.
     Hover = --lg-accent-deep #2A545E = 192 38% 27%. */
  --primary:           191 39% 33%;
  --primary-foreground: 0 0% 100%;
  --primary-hover:     192 38% 27%;
  --secondary:         187 16% 33%;  /* #465D60 */
  --secondary-foreground: 0 0% 100%;
  --muted:             120 16% 94%;  /* #EDF2ED */
  --muted-foreground:  189 9% 41%; /* #5F6F72 ~ --lg-ink-3 #607174, one step darker so the rounded triple stays AA (4.6:1) on --muted #EDF2ED */
  --accent:            191 39% 33%;
  --accent-foreground: 0 0% 100%;
  --success:           133 48% 27%;
  --warning:           39 87% 62%;   /* #F2B84B */
  --warning-foreground: 187 47% 17%;
  --destructive:       359 56% 42%;
  --destructive-foreground: 0 0% 100%;
  --info:              191 39% 33%;
  --border:            137 11% 88%;  /* #DCE3DE */
  --input:             137 11% 88%;
  --ring:              191 39% 33%;
  --radius:            20px;

  --sidebar-background:       0 0% 100%;
  --sidebar-foreground:       187 47% 17%;
  --sidebar-primary:          191 39% 33%;
  --sidebar-primary-foreground: 0 0% 100%;
  --sidebar-accent:           191 39% 33%;
  --sidebar-accent-foreground: 0 0% 100%;
  --sidebar-border:           137 11% 88%;
  --sidebar-ring:             191 39% 33%;
  --sidebar-hover:            191 39% 33%;
  --sidebar-active:           191 39% 33%;
  --sidebar-logo-bg:          187 47% 17%;

  /* Flattens the named shadow utilities in any repo that redefines
     .shadow-* as box-shadow:var(--shadow-<size>). "0 0 #0000", never
     "none": Tailwind composes these into a comma list with the ring
     channels, and "none" inside that list invalidates the whole
     declaration -- which would take the focus ring with it. */
  --shadow-xs: 0 0 #0000;
  --shadow-sm: 0 0 #0000;
  --shadow-md: 0 0 #0000;
  --shadow-lg: 0 0 #0000;
  --shadow-xl: 0 0 #0000;
  --shadow:    0 0 #0000;
}

/* -------------------------------------------------------------------------
   7. THE ONE CARD SURFACE
      Borders are removed BY SELECTOR, never by blanking --portal-border /
      --a4-hairline -- those tokens are also every table rule, input outline
      and divider in all three portals.
      !important is required: portal-unified.css forces border and box-shadow
      with !important on this same class list at equal specificity.
      Class names absent from a given repo are inert.
   ---------------------------------------------------------------------- */
:is(.vacei-card, .vacei-section-card, .vacei-feature-card,
    .a4-glass-tile, .a4-solid-card, .a4-core,
    .vc-card, .bk-card, .bk-glass-card,
    .cdv2-card, .cdv2-panel, .vp-svc-card, .vp-band,
    .portal-card, .vfw-card, .vgd-svccard, .vacei-glass) {
  /* SOLID (owner, 2026-09-20). The guide's table reads "Card | #fff
     (solid)" and section 6 says glass lives only on the hero and the
     sidebar. At 94% these cards picked up whatever was behind them,
     which is how a card on the old glass pane ended up invisible. */
  background: var(--lg-white) !important;
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  box-shadow: none !important;
  /* !important, like every other line here. Without it portal-unified.css's
     `.vc-card.vc-card { backdrop-filter: none }` (0,2,0) beat this (0,1,0) and
     NOTHING in any portal blurred: translucent without blur reads as washed
     out, not as glass. */
  backdrop-filter: var(--lg-blur) !important;
}

/* Shell and rail geometry. The 24px radius and the blur on .vc-sb are
   literals inside the vendored sidebar sheet, so they can only be reached
   by an override at equal specificity and later source order. */
.a4-shell {
  background: transparent !important;
  box-shadow: none !important;
  border-radius: var(--lg-r-glass);
}

.vc-sb {
  background: var(--lg-glass) !important;
  border: 0 !important;
  border-radius: var(--lg-r-glass) !important;
  box-shadow: none !important;
  /* !important, like every other line here. Without it portal-unified.css's
     `.vc-card.vc-card { backdrop-filter: none }` (0,2,0) beat this (0,1,0) and
     NOTHING in any portal blurred: translucent without blur reads as washed
     out, not as glass. */
  backdrop-filter: var(--lg-blur) !important;
}

/* Kills a dead-era shadow that is a literal inside the guarded a4 sheet. */
.a4-nav-item--active,
.a4-nav-item--active:hover {
  box-shadow: none !important;
}

/* Ring-safe flattening for the utilities no repo redefines. Sets only the
   shadow channel, leaving var(--tw-ring-shadow) intact so focus survives. */
.shadow-2xl,
.shadow-inner,
.shadow-2xs {
  --tw-shadow: 0 0 #0000;
}

/* -------------------------------------------------------------------------
   8. THE GROUND
      A fixed pseudo-element, NOT background-attachment:fixed -- iOS Safari
      ignores fixed attachment and Client ships Capacitor iOS/Android.
      z-index:-1 sits behind content wherever body establishes a containing
      block. body is transparent so the layer shows through.
   ---------------------------------------------------------------------- */
body {
  background: transparent !important;
  color: var(--lg-ink);
}

/* THE GROUND IS A CALM CANVAS (owner, 2026-09-18: Payrix's layout in
   Santorini's colouring). The render no longer covers the page; it fills the
   hero panel of a composed page (section 11b, .lg-hero / .lg-cover) and the
   page itself is a quiet neutral grey, so every piece of wording outside the
   hero is dark ink on light -- readable by construction.
   The full-bleed grounds (public/brand/ground-*.jpg, vacei-books-app/tools/glass/render_ground.py)
   are still generated and still used by the auth screens' own cover panels. */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  background: var(--lg-ground);
}

/* -------------------------------------------------------------------------
   9. SHELL TRANSPARENCY
      Author !important beats an inline style attribute, so the shells that
      paint via style={{...}} are reachable here as long as they carry a
      class. The ones that do not carry a class need a TSX edit -- see the
      per-portal notes.
   ---------------------------------------------------------------------- */
.vc-shell,
.bk-mint-strip,
.bk-admin,
.m-shell,
.a4-global-dashboard {
  background: transparent !important;
}

.vc-shell {
  gap: var(--lg-gap);
}

/* -------------------------------------------------------------------------
   9c. THE PAGE PANE
       Partner's scroll pane (.portal-page) and Client's company hub painted an
       OPAQUE canvas over the whole viewport, so the ground never showed on any
       signed-in screen. Simply clearing them is not safe: most pages are
       authored as content-on-a-canvas, not cards-on-a-render. A live trial with
       the pane transparent left page titles, sub-tabs, table heads and "+ Add"
       tiles as dark ink on the bare render at 1.3-2.2:1.

       So by default the pane IS the one card surface: 90% white, radius 20. A
       list page reads as one big glass card, the way the artboard frames its
       tables. A page that has been composed for the ground -- white title on
       the render, everything else in cards -- opts out by carrying `.lg-bare`
       anywhere inside the pane, and the pane clears.
       Client's wrapper carries no class of its own: CompanyShell.tsx adds
       `lg-shell` (the one TSX edit section 9 said these shells would need). */
.lg-shell {
  background: transparent !important;
}

/* The strip --vc-mint-strip used to draw (see the token's note in section 5). */
.vc-mint-strip {
  border-top-color: transparent !important;
}

/* Heroes that were DARK pass `color:'#fff'` inline for their neutral stat;
   portal-unified.css has since made every hero a white card, so that number
   is white on white (MBR compliance "companies", calendar "upcoming").
   Author !important outranks the inline style.
   Scoped to the stat values: a white ICON on a coloured chip inside a hero
   must stay white. */
[class*="hero__stat-value"][style*="color: rgb(255, 255, 255)"],
[class*="hero__stat-value"][style*="#fff"] {
  color: var(--lg-ink) !important;
}

.portal-page,
.lg-shell .vfc-main-scroll {
  /* Partner and Client KEEP the pane as a card surface for now. Their
     pages really are authored as content-on-a-canvas (62 page files / 10
     with a card class in Partner; 207 / 41 in Client), so clearing this
     would leave most of their content loose on the ground. Books, which
     cards everything through BooksTopbar + SectionCard/TableCard, is
     cleared in section 12. The other two follow once each has had the
     same route-by-route audit. */
  background: var(--lg-glass) !important;
  /* NO blur on the pane, deliberately. `backdrop-filter` makes an element the
     containing block of every position:fixed descendant, so an inline (not
     portalled) modal, toast or dock inside a blurred pane is positioned against
     the pane instead of the viewport. The pane wraps whole pages; at 90% white
     the blur is barely perceptible anyway. Small cards on the ground keep it. */
  backdrop-filter: none !important;
  border-radius: var(--lg-r-card);
}

.lg-pane--padded {
  padding: 22px 24px 28px;
}

@media (max-width: 640px) {
  .lg-pane--padded {
    padding: 14px 12px 20px;
  }
}

.lg-pane--padded:has(.lg-bare) {
  padding: 0;
}

:is(.portal-page, .lg-shell .vfc-main-scroll, .lg-pane):has(.lg-bare) {
  background: transparent !important;
  backdrop-filter: none !important;
}


/* A card ON the pane must not blur again: the pane already did, a second
   pass changes nothing visible, and a list page has 90+ cards. Cards on the
   bare ground (composed dashboards, Books admin, auth screens) keep theirs. */
:is(.portal-page, .lg-shell .vfc-main-scroll, .lg-pane):not(:has(.lg-bare)) :is(.vacei-card, .vacei-section-card, .vacei-feature-card,
    .a4-glass-tile, .a4-solid-card, .a4-core, .vc-card, .bk-card, .bk-glass-card,
    .cdv2-card, .cdv2-panel, .vp-svc-card, .vp-band, .portal-card, .vfw-card,
    .vgd-svccard, .vacei-glass) {
  backdrop-filter: none !important;
}

/* -------------------------------------------------------------------------
   9b. TEXT ON THE GROUND
       White text placed directly on the render is the single most common way
       to fail contrast in this system, because the ground is a gradient, not
       a flat colour. Measured across the four shipped backgrounds, white
       clears 3:1 on only about half the canvas and 4.5:1 on 11-25% of it.

       A text-shadow is NOT a contrast mechanism -- WCAG measures the text
       against its background, and a shadow does not change that background.
       Anything smaller than 24px on the ground therefore needs a real scrim.

       .lg-on-render  wraps a small block of text in its own local scrim.
       .lg-ground-scrim  is a full-width band, for a header row.

       Display type of 24px+ (the page H1) may sit on the ground unscrimmed:
       at that size WCAG's large-text threshold is 3:1, which the calm areas
       of every background clear.
   ---------------------------------------------------------------------- */
/* An <a> drawn as a solid primary button. Client and Books colour every anchor
   from an UNLAYERED `a { color: var(--portal-accent-text) }` in globals.css,
   which outranks Tailwind's layered `text-white` / `text-primary-foreground`.
   Under this sheet the link colour and the primary fill are the same teal, so
   those labels vanish (offline "Retry", ServiceEngagement, OrganizationCard).
   `~=` matches the bare token only — not `bg-primary/5` or `hover:bg-primary`,
   which are tints that keep dark text. */
:root a[class~="bg-primary"],
:root a[class~="bg-primary"]:hover {
  color: var(--lg-white);
}

/* A solid STATUS fill keeps its white label even inside a header. Reds only:
   unified also repaints a header's `bg-primary` buttons to soft glass, so
   forcing white there makes the label vanish (seen on Partner's Back button).
   portal-unified.css forces every `.text-white` under its hero/header list to
   `--portal-ink !important` (its covers became white cards). That also caught
   the notification count in Partner's top bar: dark ink on the red
   `bg-a4-danger` badge = 2.80:1. White there is 5.7:1. */
:root:root :is([class~="bg-a4-danger"], [class~="bg-destructive"], [class~="bg-red-500"], [class~="bg-red-600"]):is(.text-white, .text-destructive-foreground) {
  color: var(--lg-white) !important;
}

.lg-on-render {
  position: relative;
  isolation: isolate;
  color: #FFFFFF;
}

.lg-on-render::before {
  content: "";
  position: absolute;
  inset: -6px -12px;
  z-index: -1;
  border-radius: 12px;
  background: rgba(15, 34, 38, 0.58);
}

.lg-ground-scrim {
  position: relative;
  isolation: isolate;
  color: #FFFFFF;
}

.lg-ground-scrim::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(180deg, rgba(15, 34, 38, 0.62) 0%, rgba(15, 34, 38, 0) 100%);
  pointer-events: none;
}

/* -------------------------------------------------------------------------
   11. THE PORTAL CHROME  (artboard: "Portal Dashboard Clean")
       No sidebar and no header bar. The chrome floats on the ground:

         [=] VACEI                       ( Tab )( Tab )( Active )  (AV)

       Two tiers only. CARD = --lg-glass (the hamburger tile, the active tab,
       the menu's inner card). THIN = --lg-thin + bright hairline + blur
       (inactive tabs, chips, the ring round the menu and the "Up next" card).
       Text on THIN is white and relies on the wash in section 8.

       The top bars deliberately do NOT carry .vacei-header-bar / .vc-header /
       .vacei-topbar any more: portal-unified.css repaints every button inside
       those to a white-card skin at (0,7,0) !important.
   ---------------------------------------------------------------------- */
/* Every app ships a border-box reset; stated here so the chrome does not
   depend on it (the brand-kit preview has none). */
:is(.lg-frame, .lg-topbar, .lg-menu, .lg-hero, .lg-upnext, .lg-grid, .lg-stat, .lg-panel, .lg-pane),
:is(.lg-frame, .lg-topbar, .lg-menu, .lg-hero, .lg-upnext, .lg-grid, .lg-stat, .lg-panel, .lg-pane) * {
  box-sizing: border-box;
}

.lg-thin {
  background: var(--lg-thin);
  border: 1px solid var(--lg-thin-border);
  backdrop-filter: var(--lg-thin-blur);
  color: var(--lg-white);
}

/* --- the frame ---------------------------------------------------------- */
/* The artboard's page padding. The custom properties are read by the fixed
   hamburger so it lands exactly on the frame's top-left corner. */
.lg-frame {
  --lg-shell-pad-y: 30px;
  --lg-shell-pad-x: 32px;
  padding: var(--lg-shell-pad-y) var(--lg-shell-pad-x) 0 !important;
  gap: 0 !important;
  background: transparent !important;
}

@media (max-width: 1023px) {
  .lg-frame {
    --lg-shell-pad-y: 14px;
    --lg-shell-pad-x: 14px;
  }
}

/* Window-scrolling shells (Client, Books) end the page with the same air. */
.lg-frame--page,
.lg-shell.lg-frame {
  padding-bottom: var(--lg-shell-pad-y) !important;
}

/* A scroll pane that runs to the bottom edge of the viewport keeps square
   bottom corners; rounding them would show as two notches of bare render. */
.lg-frame .portal-page {
  border-radius: var(--lg-r-card) var(--lg-r-card) 0 0;
}

.lg-frame .portal-page:has(.lg-bare) {
  padding: 0 0 44px;
}

/* The pane scrolls; its scrollbar is not part of the design (the reference has
   none). Still scrolls by wheel, touch, keyboard and drag-select. */
.lg-frame .portal-page {
  scrollbar-width: none;
}

.lg-frame .portal-page::-webkit-scrollbar {
  display: none;
}

/* --- top bar ------------------------------------------------------------ */
.lg-topbar {
  margin-bottom: 18px;
  position: relative;
  /* 60 = the layer the three old bars held (Books APP_BAR_Z, Client's sticky
     bar): the account / notification / search popovers hang off this stacking
     context and must clear a page's own sticky sub-headers. The menu is 65. */
  z-index: 60;
  display: flex;
  align-items: center;
  gap: 14px;
  width: 100%;
  min-height: 46px;
  flex-shrink: 0;
  color: var(--lg-white);
  font-family: var(--lg-font);
}

/* Desktop: the hamburger is position:fixed at the shell's top-left corner
   (see .lg-menu--fixed), so the bar starts one tile + one gap further in. */
@media (min-width: 1024px) {
  .lg-topbar--with-menu {
    padding-left: 60px;
  }
}

/* No frame around it (Client /companies): the bar pads itself. */
.lg-topbar--standalone {
  width: auto;
  margin: 0;
  padding: 30px 32px 0;
}

@media (max-width: 1023px) {
  .lg-topbar--standalone {
    padding: 14px 14px 0;
  }
}

.lg-topbar__spacer {
  flex: 1 1 auto;
  min-width: 0;
}

.lg-topbar__group {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}

.lg-lockup {
  display: block;
  height: 34px;
  width: auto;
  flex-shrink: 0;
}

/* --- pills -------------------------------------------------------------- */
:root .lg-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 40px;
  min-width: 0;
  padding: 0 22px;
  border-radius: 20px;
  border: 1px solid var(--lg-thin-border);
  background: var(--lg-thin-smoke);
  backdrop-filter: var(--lg-thin-blur);
  color: var(--lg-white);
  font: 500 14px/1 var(--lg-font);
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  /* Never squeeze a label out of its pill; a pill that must truncate sets its
     own max-width and wraps its text in a `truncate` span. */
  flex-shrink: 0;
  transition: background 0.18s ease, color 0.18s ease;
}

:root .lg-pill:hover {
  background: rgba(15, 34, 38, 0.58);
  color: var(--lg-white);
}

:root .lg-pill :is(svg, span) {
  color: inherit;
}

:root .lg-pill.is-active,
:root .lg-pill[aria-current="page"],
:root .lg-pill--card {
  padding: 0 24px;
  border-color: transparent;
  background: var(--lg-glass);
  backdrop-filter: none;
  color: var(--lg-ink);
  font-weight: 600;
}

:root .lg-pill--card:hover,
:root .lg-pill.is-active:hover {
  background: var(--lg-white);
  color: var(--lg-ink);
}

:root .lg-pill--solid {
  border-color: transparent;
  background: var(--lg-accent-read);
  backdrop-filter: none;
  color: var(--lg-white);
  font-weight: 600;
}

:root .lg-pill--solid:hover {
  background: var(--lg-accent-deep);
}

:root .lg-pill--icon {
  position: relative;
  width: 40px;
  padding: 0;
  flex-shrink: 0;
}

:root .lg-pill__count {
  position: absolute;
  top: -4px;
  right: -4px;
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 17px;
  height: 17px;
  padding: 0 4px;
  border-radius: 9px;
  background: var(--lg-negative);
  color: var(--lg-white);
  font: 600 9.5px/1 var(--lg-font);
}

:root .lg-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  flex-shrink: 0;
  border: 0;
  border-radius: 50%;
  background: var(--lg-accent-read);
  color: var(--lg-white);
  font: 600 13px/1 var(--lg-font);
  text-decoration: none;
}

/* A search field drawn as a CARD pill. */
:root .lg-search {
  height: 40px;
  border: 0 !important;
  border-radius: 20px !important;
  background: var(--lg-glass) !important;
  color: var(--lg-ink) !important;
  font: 500 14px/1 var(--lg-font);
}

:root .lg-search::placeholder {
  color: var(--lg-ink-3);
}

/* The ground is bright now, as the owner's reference has it, so the white
   chrome takes the same help the reference's does: a soft deep-teal shadow
   under on-ground text and icons. It is a legibility aid, not a contrast
   measure -- WCAG ignores shadows. */
:root :is(.lg-pill:not(.lg-pill--card):not(.is-active):not([aria-current="page"]), .lg-chip, .lg-title, .lg-section-title, .lg-cover__sub) {
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.45), 0 0 14px rgba(15, 34, 38, 0.30);
}

:root .lg-pill:not(.lg-pill--card):not(.is-active) svg,
.lg-lockup {
  filter: drop-shadow(0 1px 2px rgba(15, 34, 38, 0.45));
}

/* --- status chip -------------------------------------------------------- */
.lg-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 34px;
  padding: 0 15px;
  border-radius: 17px;
  border: 1px solid var(--lg-thin-border);
  background: var(--lg-thin-smoke);
  backdrop-filter: var(--lg-thin-blur);
  color: var(--lg-white);
  font: 600 12.5px/1 var(--lg-font);
  white-space: nowrap;
}

.lg-chip__dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #45C461;
}

.lg-chip__dot--amber { background: var(--lg-amber); }
.lg-chip__dot--red { background: #FF6B6B; }

/* --- the hamburger and its flyout --------------------------------------- */
.lg-menu {
  position: relative;
  /* Above the top bar (60), BELOW every overlay: Partner's scale puts scrims at
     70, dialogs at 80, popovers at 90. At 90 the hamburger floated over an open
     dialog's scrim and stayed clickable. */
  z-index: 65;
  flex-shrink: 0;
  width: 46px;
  height: 46px;
  font-family: var(--lg-font);
}

@media (min-width: 1024px) {
  .lg-menu--fixed {
    position: fixed;
    top: var(--lg-shell-pad-y, 30px);
    left: var(--lg-shell-pad-x, 32px);
  }
}

/* "Only opens when you get close": a halo round the tile while closed; while
   open, the artboard's 330x680 zone so the pointer can travel to the panel and
   drift a little without losing it. Invisible, and part of .lg-menu, so the
   host's pointerenter / pointerleave see it. */
.lg-menu::before {
  content: "";
  position: absolute;
  inset: -22px -10px -22px -22px;
}

.lg-menu.is-open::before {
  inset: -22px auto auto -22px;
  width: 330px;
  height: min(720px, 100vh);
}

:root .lg-menu__tile {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 5px;
  width: 46px;
  height: 46px;
  padding: 0 13px;
  border: 0;
  border-radius: 14px;
  background: var(--lg-glass);
  backdrop-filter: blur(24px);
  cursor: pointer;
}

.lg-menu__tile > span {
  display: block;
  width: 20px;
  height: 2px;
  border-radius: 1px;
  background: var(--lg-ink);
  transition: width 0.2s ease;
}

/* "Something in here is waiting on you" — visible with the menu closed. */
.lg-menu__dot {
  position: absolute;
  top: -3px;
  right: -3px;
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: var(--lg-amber);
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.92);
}

.lg-menu__tile > span:nth-child(2) { width: 14px; }
.lg-menu.is-open .lg-menu__tile > span:nth-child(2) { width: 20px; }

.lg-menu__ring {
  position: absolute;
  top: 66px;
  left: 0;
  width: 286px;
  padding: 14px;
  border-radius: 30px;
  border: 1px solid var(--lg-thin-border);
  background: var(--lg-thin);
  backdrop-filter: var(--lg-thin-blur);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(-10px) scale(0.97);
  transform-origin: top left;
  transition: opacity 0.26s ease, transform 0.36s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s linear 0.36s;
}

.lg-menu.is-open .lg-menu__ring {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: none;
  transition: opacity 0.26s ease, transform 0.36s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s;
}

@media (prefers-reduced-motion: reduce) {
  .lg-menu__ring,
  .lg-menu.is-open .lg-menu__ring {
    transform: none;
    transition: opacity 0.12s linear, visibility 0s;
  }
}

/* The panel is each portal's EXISTING nav element (Partner .vc-sb, Books'
   <aside>, Client's rail), re-seated inside the ring. Their geometry is
   inline-styled or !important in vendored sheets, hence the weight here. */
:root .lg-menu__panel {
  position: static !important;
  display: flex;
  flex-direction: column;
  width: auto !important;
  height: auto !important;
  max-height: calc(100vh - 66px - 28px - 2 * var(--lg-shell-pad-y, 30px)) !important;
  margin: 0 !important;
  padding: 10px 8px !important;
  overflow-x: hidden;
  overflow-y: auto;
  border: 0 !important;
  border-radius: 28px !important;
  background: var(--lg-glass) !important;
  backdrop-filter: none !important;
  box-shadow: none !important;
  color: var(--lg-ink) !important;
  transform: none !important;
  scrollbar-width: none;
}

.lg-menu__panel::-webkit-scrollbar { display: none; }

/* Client, Books and Books-admin paint their rows with INLINE styles (white
   pill, soft shadow, primary ink) and mark the current one `aria-current`.
   Author !important outranks the inline style: rows become the artboard's
   40px / radius-20 pills and the current row the artboard's accent pill. */
:root .lg-menu__panel nav a {
  min-height: 40px;
  border-radius: 20px !important;
}

:root .lg-menu__panel a[aria-current="page"] {
  background: var(--lg-accent) !important;
  box-shadow: none !important;
  color: var(--lg-white) !important;
}

:root .lg-menu__panel a[aria-current="page"] :is(svg, span) {
  color: var(--lg-white) !important;
}

.lg-menu__label {
  padding: 8px 12px;
  color: var(--lg-ink-2);
  font: 600 10.5px/1 var(--lg-font);
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

/* Rows. `.lg-menu__item` for new markup; the .vc-sb-item mapping re-skins
   Partner's rows in place. 40 high, radius 20, teal stroke icon, ink label. */
:root .lg-menu__item,
:root .lg-menu__panel .vc-sb-item {
  display: flex;
  align-items: center;
  gap: 13px;
  min-height: 40px;
  padding: 0 14px;
  border-radius: 20px;
  background: transparent;
  box-shadow: none;
  color: var(--lg-ink);
  font: 500 14px/1.2 var(--lg-font);
  text-decoration: none;
}

:root .lg-menu__item :is(svg, .lg-menu__icon),
:root .lg-menu__panel .vc-sb-item .vc-sb-icon {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  color: var(--lg-accent-read);
}

:root .lg-menu__item:hover,
:root .lg-menu__panel .vc-sb-item:hover {
  background: var(--lg-accent-bg);
}

/* The active row is the artboard's, exactly: --lg-accent, white 600 label.
   (White on --lg-accent is 3.23:1 -- under AA for a 14px label. An earlier
   build darkened it to --lg-accent-read for that reason; the owner compared the
   two and asked for the artboard. One line to change it back.) */
:root .lg-menu__item:is(.is-active, [aria-current="page"]),
:root .lg-menu__panel .vc-sb-item.is-active {
  background: var(--lg-accent);
  color: var(--lg-white);
  font-weight: 600;
}

:root .lg-menu__item:is(.is-active, [aria-current="page"]) :is(svg, .lg-menu__icon, span),
:root .lg-menu__panel .vc-sb-item.is-active :is(.vc-sb-icon, .vc-sb-item-label) {
  color: var(--lg-white);
}

:root .lg-menu__panel .vc-sb-item.is-active .vc-sb-png--brand {
  background-color: var(--lg-white);
}

.lg-menu__divider,
:root .lg-menu__panel .vc-sb-divider {
  height: 1px;
  margin: 8px 12px;
  border: 0;
  background: rgba(23, 59, 64, 0.08);
}

:root .lg-menu__panel .vc-sb-group-label {
  padding: 8px 14px 6px;
  color: var(--lg-ink-2);
  font: 600 10.5px/1 var(--lg-font);
  letter-spacing: 0.16em;
}

/* ONE MENU ANATOMY, all three portals (artboard): a "MENU" label, then rows,
   with a hairline between groups. Each portal's own group headings are kept
   (Partner has 33 rows, they are needed) but in the label's own style, so the
   three menus read as the same component. The panel's user card is gone: the
   avatar in the top bar already says who is signed in, and inside a
   height-capped flex column it rode up over the last rows. */
:root .lg-menu__panel::before {
  content: "MENU";
  flex: none;
  padding: 10px 14px 10px;
  color: var(--lg-ink-2);
  font: 600 10.5px/1 var(--lg-font);
  letter-spacing: 0.16em;
}

:root .lg-menu__panel :is(.vc-sb-footer, .vc-sb-footer-brand),
:root .lg-menu__panel .vc-sb-nav + .vc-sb-divider {
  display: none !important;
}

:root .lg-menu__panel .vc-sb-group + .vc-sb-group,
:root .lg-menu__panel nav > * + * {
  margin-top: 8px;
  padding-top: 8px;
  border-top: 1px solid rgba(23, 59, 64, 0.08);
}

:root .lg-menu__panel :is(.vc-sb-group-label, nav button[aria-expanded] > span:first-child, nav > div > div.text-\[10px\]) {
  color: var(--lg-ink-3) !important;
  font: 600 10.5px/1 var(--lg-font) !important;
  letter-spacing: 0.16em !important;
  text-transform: uppercase;
}

:root .lg-menu__panel nav a {
  font: 500 14px/1.2 var(--lg-font);
}

:root .lg-menu__panel nav a svg {
  width: 18px;
  height: 18px;
  color: var(--lg-accent-read);
}

/* The brand slot and the pin belong to a rail. The lockup is in the top bar
   now, and a pinned-open menu is the sidebar this design removes. */
:root .lg-menu__panel :is(.vc-sb-pin, [data-testid="rail-pin"]),
:root .lg-menu__panel .vc-sb-brand + .vc-sb-divider {
  display: none !important;
}

:root .lg-menu__panel .vc-sb-nav {
  /* 0 0: a shrinking nav inside the height-capped panel let its rows spill out
     under whatever followed it. The PANEL scrolls, not the nav. */
  flex: 0 0 auto;
  overflow: visible;
}

:root .lg-menu__panel .vc-sb-footer {
  padding: 0 6px 4px;
}

/* --- the composed page: title on the ground, then cards ------------------ */
.lg-bare {
  display: flex;
  flex-direction: column;
  gap: var(--lg-gap);
  font-family: var(--lg-font);
}

.lg-hero {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 28px 40px;
  padding: 34px 0 40px;
}

.lg-hero__lead {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 22px;
  min-width: 0;
  flex: 1 1 420px;
}

/* 44px+ display type: WCAG large-text, 3:1, which the section-8 wash
   guarantees on every pixel of the tile. */
:root:root .lg-title {
  margin: 0;
  color: var(--lg-white) !important;
  font-family: var(--lg-font);
  font-weight: 400 !important;
  font-size: clamp(44px, 6.6vw, 104px);
  line-height: 0.94;
  letter-spacing: -0.03em;
  text-wrap: balance;
}

/* A NAME as the title (a company, a client) can run long: a calmer clamp. */
:root:root .lg-title--name {
  font-size: clamp(34px, 4.4vw, 68px);
  line-height: 1;
  overflow-wrap: anywhere;
}

/* Books' dashboard cover, re-drawn as the hero: the same element and the same
   absolute layout (chip top-left, title, tab pills along the bottom, actions
   bottom-right), but straight on the ground instead of on a teal card.
   portal-unified.css forces `.bk-cover` to a white card and its text to ink
   with !important at (0,2,0); (0,3,0) here outranks it. */
:root:root .lg-cover {
  overflow: visible !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
}

:root:root .lg-cover :is(.lg-chip, .lg-pill:not(.lg-pill--card):not([aria-current="page"])),
:root:root .lg-cover :is(.lg-chip, .lg-pill:not(.lg-pill--card):not([aria-current="page"])) :is(svg, span) {
  color: var(--lg-white) !important;
}

:root:root .lg-cover__sub,
:root:root .lg-cover__sub :is(p, span, button) {
  color: var(--lg-white) !important;
  font: 500 15px/1.5 var(--lg-font);
}

/* Body wording on the ground: its own smoked-glass plate (see .lg-ground-text). */
:root:root .lg-cover__sub {
  align-self: flex-start;
  padding: 10px 16px;
  border-radius: 18px;
  border: 1px solid rgba(255, 255, 255, 0.35);
  background: var(--lg-thin-smoke);
  backdrop-filter: var(--lg-thin-blur);
}

/* The tab row used to float at 42% / right:24px over the card. */
:root .lg-cover .bk-cover-tabrow {
  left: 0 !important;
  right: auto !important;
}

/* The assistant card used to ride up 90px over the teal cover. There is no
   cover card to overlap any more. */
.lg-bare .bk-assist-overlap {
  margin-top: 0;
}

/* A LINE OF WORDING THAT HAS TO SIT ON THE GROUND (a hero subline, a company's
   registration line): it gets its own smoked-glass plate, like a chip, instead
   of trusting the render behind it. */
:root .lg-ground-text {
  display: inline-block;
  max-width: 100%;
  padding: 8px 16px;
  border-radius: 18px;
  border: 1px solid rgba(255, 255, 255, 0.35);
  background: var(--lg-thin-smoke);
  backdrop-filter: var(--lg-thin-blur);
  color: var(--lg-white) !important;
  font: 500 15px/1.45 var(--lg-font);
}

:root .lg-ground-text:empty {
  display: none;
}

/* A section label straight on the ground. 26px = WCAG large text (3:1), which
   even the weakest part of the wash (.44 -> 3.4:1 worst pixel) clears. */
:root:root .lg-section-title {
  margin: 38px 0 16px;
  color: var(--lg-white) !important;
  font-family: var(--lg-font);
  font-size: 26px;
  font-weight: 400 !important;
  line-height: 1.1;
  letter-spacing: -0.015em;
}

/* Client's company-switch caret, now on the ground: a THIN-glass disc. */
:root .lg-hero .vp-switch-trigger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 1px solid var(--lg-thin-border);
  background: var(--lg-thin);
  backdrop-filter: var(--lg-thin-blur);
  cursor: pointer;
  list-style: none;
}

:root .lg-hero .vp-switch-trigger:hover {
  background: rgba(255, 255, 255, 0.2);
}

.lg-upnext {
  width: min(420px, 100%);
  flex: 0 1 420px;
  padding: 14px;
  border-radius: 30px;
  border: 1px solid var(--lg-thin-border);
  background: var(--lg-thin);
  backdrop-filter: var(--lg-thin-blur);
}

.lg-upnext__card {
  padding: 22px 24px 24px;
  border-radius: 28px;
  background: var(--lg-glass);
  color: var(--lg-ink);
}

.lg-upnext__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 8px;
  font: 600 15px/1.2 var(--lg-font);
}

.lg-upnext__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 11px 0;
  border-bottom: 1px solid rgba(23, 59, 64, 0.07);
  color: var(--lg-ink);
  font: 500 14px/1.3 var(--lg-font);
  text-decoration: none;
}

.lg-upnext__row:last-of-type { border-bottom: 0; }

.lg-upnext__row > :first-child {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.lg-upnext__when {
  flex-shrink: 0;
  /* The artboard's #676F70 is 4.28:1 on the darkest card pixel; ink-3 is 4.66. */
  color: var(--lg-ink-3);
  font-weight: 600;
  font-size: 13.5px;
}

.lg-upnext__when--late { color: var(--lg-negative); }
/* The artboard's #A85E16 is 4.08:1 on the darkest card pixel; this is 5.6. */
.lg-upnext__when--soon { color: var(--lg-amber-read); }

.lg-upnext__empty {
  padding: 10px 0 2px;
  color: var(--lg-ink-2);
  font: 500 14px/1.5 var(--lg-font);
}

:root .lg-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--lg-accent-read);
  font: 600 13.5px/1 var(--lg-font);
  text-decoration: none;
}

:root .lg-link:hover { color: var(--lg-accent-deep); }

/* Stat grids: the artboard's 3.5px seam, render showing through it. */
.lg-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(214px, 1fr));
  gap: var(--lg-gap);
}

.lg-grid--wide {
  grid-template-columns: repeat(auto-fit, minmax(min(330px, 100%), 1fr));
}

.lg-stat {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 0;
  padding: 26px 26px 30px;
  border-radius: var(--lg-r-card);
  background: var(--lg-glass);
  backdrop-filter: var(--lg-blur);
  color: var(--lg-ink);
  font-family: var(--lg-font);
  text-decoration: none;
}

.lg-stat__label { font-size: 15px; font-weight: 500; }

.lg-stat__value {
  font-size: 44px;
  font-weight: 400;
  line-height: 1;
  letter-spacing: -0.02em;
}

.lg-stat__sub { color: var(--lg-ink-3); font-size: 14px; }

.lg-stat .lg-link { margin-top: auto; padding-top: 8px; font-size: 13px; }

.lg-panel {
  min-width: 0;
  padding: 30px 32px 32px;
  border-radius: var(--lg-r-card);
  background: var(--lg-glass);
  backdrop-filter: var(--lg-blur);
  color: var(--lg-ink);
  font-family: var(--lg-font);
}

.lg-panel__title {
  margin: 0 0 12px;
  font-size: 34px;
  font-weight: 500;
  line-height: 1.08;
  letter-spacing: -0.02em;
}

.lg-panel__body { color: var(--lg-ink-2); font-size: 15px; line-height: 1.6; }

/* FilingsOverview is shared verbatim by Partner and Client and paints itself
   with inline styles (white, 1px border, radius 16). On a composed page it is
   one more card on the seam. Author !important outranks the inline style. */
.lg-bare section[aria-label="Filings and deadlines"] {
  margin: 0 !important;
  padding: 30px 32px 32px !important;
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  background: var(--lg-glass) !important;
  backdrop-filter: var(--lg-blur);
  font-family: var(--lg-font);
}

/* The artboard has ONE call-to-action: a --lg-accent-read pill, white label
   (6.30:1). Client's hub still drew a charcoal "Request" pill and a white
   Accounting-band CTA that turned lime on hover -- neither is in the palette.
   Literals in portal-company.css, hence the weight. */
:root:root :is(.vp-svc-request, .vp-band-cta) {
  border-color: transparent !important;
  background: var(--lg-accent-read) !important;
  color: var(--lg-white) !important;
}

:root:root :is(.vp-svc-request, .vp-band-cta):is(:hover, :focus-visible):not(:disabled) {
  background: var(--lg-accent-deep) !important;
  color: var(--lg-white) !important;
}

/* FilingsOverview is shared verbatim by Partner and Client and styles itself
   inline: 6-8px corners, 34px controls, its own greys and link colour. The
   survey counted 324 such controls -- the largest single source of "this page
   looks like a different product". Brought onto the system's shapes here:
   pill controls (40 high, radius 20), radius-14 view tiles, the panel title
   scale, theme ink and link colours. Author !important outranks inline. */
section[aria-label="Filings and deadlines"] {
  color: var(--lg-ink) !important;
  font-family: var(--lg-font);
}

section[aria-label="Filings and deadlines"] h2 {
  color: var(--lg-ink) !important;
  font-size: 30px !important;
  font-weight: 400 !important;
  letter-spacing: -0.02em;
  line-height: 1.08;
}

section[aria-label="Filings and deadlines"] :is(button:not([aria-pressed]), input:not([type="checkbox"]), select) {
  min-height: 40px;
  padding-inline: 18px !important;
  border: 1px solid var(--lg-hairline) !important;
  border-radius: 20px !important;
  background: var(--lg-white) !important;
  color: var(--lg-ink) !important;
  font: 500 14px/1 var(--lg-font) !important;
}

section[aria-label="Filings and deadlines"] details button,
section[aria-label="Filings and deadlines"] p > button {
  min-height: 0;
  padding: 0 !important;
  border: 0 !important;
  background: transparent !important;
  color: var(--lg-accent-read) !important;
}

section[aria-label="Filings and deadlines"] button[aria-pressed] {
  border: 0 !important;
  border-radius: 14px !important;
  background: var(--lg-page) !important;
  color: var(--lg-ink) !important;
  font-family: var(--lg-font) !important;
}

section[aria-label="Filings and deadlines"] button[aria-pressed] strong {
  font-weight: 400;
  font-size: 32px !important;
  letter-spacing: -0.02em;
}

section[aria-label="Filings and deadlines"] :is(a, summary) {
  color: var(--lg-accent-read) !important;
}

section[aria-label="Filings and deadlines"] :is(p, small, th) {
  color: var(--lg-ink-2) !important;
}

section[aria-label="Filings and deadlines"] table {
  border-radius: 14px;
  background: var(--lg-page);
}

/* pressed = the accent, like every other current-state in the chrome. */
/* Guide: "black is for the active/primary action". This tile was teal. */
section[aria-label="Filings and deadlines"] button[aria-pressed="true"] {
  background: var(--lg-ink) !important;
  color: var(--lg-white) !important;
}

/* The guided tour (driver.js) brought its own system-font stack and a
   #94a3b8 progress label (2.5:1 on white). */
.driver-popover,
.driver-popover * {
  font-family: var(--lg-font) !important;
}

:root .driver-popover .driver-popover-progress-text {
  color: var(--lg-ink-3) !important;
}

:root .driver-popover .driver-popover-description {
  color: var(--lg-ink-2) !important;
}

/* INNER-PAGE OUTLIERS found by vacei-books-app/tools/glass/style-survey.inject.js across 19 Partner
   routes -- each of these made one page look like a different product:
   - every page header drew a dark 1px --lg-hairline-strong border;
   - the Library drew near-black green cards (#1E3B37) and a #0D211F canvas;
   - Clients coloured its <h1> with the tenant accent. */
:root :is(.vacei-page-header, .a4-list-hero, .a4-eng-panel-hero, .a4-orc-hero, .a4-orc-run-hero,
    .a4-ledger-hero, .a4-dc-hero, .a4-eng-tasks__hero, .a4-apf-hero, .a4-an-hero, .a4-fw-hero,
    .a4-act-hero, .a4-partner-hero, .a4-hero-cover, .vc-cover, .vacei-cover, .vfc-hero, .vff-hero,
    .cdv2-hero, .audit-plan-hero) {
  border: 0 !important;
}

/* One card radius. The list cards were the only 16px corners left. */
:root .a4-list-card {
  border-radius: var(--lg-r-card) !important;
}

:root:root :is(.a4-lib-doc-card, .a4-eng-panel-canvas) {
  border: 1px solid var(--lg-hairline) !important;
  background: var(--lg-white) !important;
  box-shadow: none !important;
  color: var(--lg-ink) !important;
}

:root:root :is(.a4-lib-doc-card, .a4-eng-panel-canvas) :is(h1, h2, h3, h4, p, span, a, button):not([class*="bg-"]) {
  color: inherit;
}

:root .portal-page h1 {
  color: var(--lg-ink);
}

/* Client's "Explore more services (n)" disclosure sat on the render as dark
   12px text. It is a control: a CARD pill. */
:root .vacei-more-services > summary {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 40px;
  margin-bottom: 12px;
  padding: 0 22px;
  border-radius: 20px;
  background: var(--lg-glass);
  color: var(--lg-ink) !important;
  font: 600 14px/1 var(--lg-font);
  cursor: pointer;
  list-style: none;
}

:root .vacei-more-services > summary::-webkit-details-marker { display: none; }
:root .vacei-more-services > summary::before { content: "+"; font-weight: 500; font-size: 17px; line-height: 1; }
:root .vacei-more-services[open] > summary::before { content: "\2212"; }

/* SUB-PAGE HEADERS. Client drew 18 sub-pages with a dark teal "cover" band
   (white title, mint eyebrow that vanished on it) while Partner's sub-pages use
   a plain header: ink title on the page surface. One treatment: the plain one.
   The cover loses its fill; its white-on-dark ink rules are turned to ink. */
:root:root .a4-cover {
  padding: 8px 4px 4px !important;
  border-radius: 0 !important;
  background: none !important;
  box-shadow: none !important;
  color: var(--lg-ink) !important;
}

:root:root .a4-cover > .pointer-events-none {
  display: none;
}

:root:root .a4-cover :is(h1, h2, .text-white) {
  color: var(--lg-ink) !important;
}

:root:root .a4-cover h1 {
  font-family: var(--lg-font);
  font-size: 34px;
  font-weight: 500 !important;
  letter-spacing: -0.02em;
}

:root:root .a4-cover :is(p, [class*="text-white/"]) {
  color: var(--lg-ink-2) !important;
}

:root:root .a4-cover .a4-cover-eyebrow {
  color: var(--lg-ink-3) !important;
}

:root:root .a4-cover .a4-cover-tile {
  border-color: var(--lg-hairline) !important;
  background: var(--lg-accent-bg) !important;
  color: var(--lg-accent-read) !important;
}

:root:root .a4-cover button.a4-cover-tile {
  background: var(--lg-white) !important;
  color: var(--lg-ink) !important;
}

/* Card grids on a composed page close up to the seam. */
.lg-bare :is(.vp-svc-grid, .lg-seam) {
  gap: var(--lg-gap) !important;
}

/* A short notice on a composed page gets its own small card. */
.lg-note {
  padding: 12px 16px;
  border-radius: 14px;
  background: var(--lg-glass);
  color: var(--lg-ink);
  font: 500 13.5px/1.45 var(--lg-font);
}

/* Tables and dense lists sit on an OPAQUE well inside the translucent card. */
.lg-well {
  border-radius: 14px;
  background: var(--lg-page);
}

@media (max-width: 640px) {
  .lg-topbar { gap: 8px; }
  .lg-topbar__group { gap: 6px; }
  :root .lg-pill--icon, :root .lg-avatar { width: 36px; height: 36px; }
  .lg-hero { padding: 22px 0 26px; }
  .lg-panel { padding: 22px 20px 24px; }
  .lg-panel__title { font-size: 26px; }
  .lg-stat { padding: 20px 20px 22px; }
  .lg-stat__value { font-size: 36px; }
  :root .lg-pill:not(.lg-pill--icon) { padding: 0 16px; }
}

/* =========================================================================
   11b. THE CANVAS EDITION  (owner, 2026-09-18)
        "Keep the first style [Payrix: glass cards, a hero with the title on the
        render, pills, tight seams] but use the second style for colouring
        [Santorini: calm grey canvas, a contained muted hero, white cards, black
        for emphasis, one soft-yellow card] ... and the sidebar menu must open
        from the side when the cursor gets close."

        This block comes LAST in section 11 and re-points the chrome for a LIGHT
        ground. What that buys, beyond the look: every piece of wording outside
        the hero is dark ink on a light surface -- readable by construction, no
        veil arithmetic. White type exists only inside the hero panel, whose
        render is ours (muted; white >= 3:1 on 100% of it, >= 4.5:1 on 91%).
   ========================================================================= */

/* --- chrome on the canvas: dark on light -------------------------------- */
.lg-topbar {
  color: var(--lg-ink);
}

/* The lockup and mark are white artwork; on the canvas they are ink. */
.lg-topbar .lg-lockup {
  filter: brightness(0) !important;
  opacity: 0.92;
}

:root .lg-pill {
  border-color: transparent;
  background: var(--lg-white);
  backdrop-filter: none;
  color: var(--lg-ink);
  text-shadow: none !important;
}

:root .lg-pill:hover {
  background: var(--lg-white);
  color: var(--lg-ink);
  box-shadow: inset 0 0 0 1px var(--lg-hairline);
}

:root .lg-pill:not(.lg-pill--card):not(.is-active) svg {
  filter: none;
}

/* Emphasis is BLACK, as in the reference: the current tab, the current menu
   row. White on --lg-ink is 18.9:1. */
:root .lg-pill.is-active,
:root .lg-pill[aria-current="page"] {
  background: var(--lg-ink);
  color: var(--lg-white);
}

:root .lg-pill.is-active:hover,
:root .lg-pill[aria-current="page"]:hover {
  background: var(--lg-ink-deep);
  color: var(--lg-white);
  box-shadow: none;
}

:root .lg-pill--card {
  background: var(--lg-white);
  color: var(--lg-ink);
}

:root .lg-pill--solid,
:root .lg-pill--solid:hover {
  background: var(--lg-ink);
  color: var(--lg-white);
  box-shadow: none;
}

:root .lg-avatar {
  background: var(--lg-ink);
}

:root .lg-search {
  background: var(--lg-white) !important;
}

:root .lg-menu__tile {
  background: var(--lg-white);
  backdrop-filter: none;
}

/* A section label is on the canvas now: ink, not white. */
:root:root .lg-section-title {
  color: var(--lg-ink) !important;
  text-shadow: none;
}

/* --- the hero: the render, CONTAINED -------------------------------------- */
:root .lg-hero,
:root:root .lg-cover {
  position: relative;
  overflow: hidden !important;
  min-height: 300px;
  margin-bottom: var(--lg-gap);
  padding: 34px 36px 38px;
  border-radius: 28px !important;
  background: #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center / cover no-repeat !important;
  color: var(--lg-white);
}

:root:root .lg-cover {
  padding: 0 36px;
}

:root .lg-hero--center {
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}

:root .lg-hero--center > * {
  margin-inline: auto;
}

/* Inside the hero the chrome is glass again (white type on the render). */
:root :is(.lg-hero, .lg-cover) .lg-pill:not(.lg-pill--card):not([aria-current="page"]):not(.is-active) {
  border-color: var(--lg-thin-border);
  background: var(--lg-thin-smoke);
  backdrop-filter: var(--lg-thin-blur);
  color: var(--lg-white);
  box-shadow: none;
}

:root :is(.lg-hero, .lg-cover) .lg-pill:is([aria-current="page"], .is-active) {
  background: var(--lg-white);
  color: var(--lg-ink);
}

:root:root .lg-title {
  font-size: clamp(38px, 4.6vw, 72px);
  line-height: 1;
}

@media (max-width: 640px) {
  :root .lg-hero,
  :root:root .lg-cover {
    min-height: 0;
    padding: 24px 20px 26px;
    border-radius: 22px !important;
  }
}

/* --- the one warm note: "Up next" is the soft-yellow card ----------------- */
:root .lg-upnext__card {
  background: linear-gradient(165deg, #FBF3B4 0%, #FDF8D2 46%, #FFFFFF 100%);
}

/* --- THE MENU SLIDES IN FROM THE SIDE ------------------------------------- */
/* Hidden at rest. It opens when the pointer reaches the LEFT EDGE of the
   window (an invisible full-height strip that belongs to the menu host, so the
   host's pointerenter sees it), on focus, or from the hamburger tile -- which
   stays, because touch and keyboard have no "close by". While open the hot
   zone grows to cover the panel, so the pointer can travel and drift. */
@media (min-width: 1024px) {
  /* PROXIMITY: the artboard opens the rail when the pointer is within 48px of
     the window's left edge. The frame's left padding is 44px and holds no
     content, so the whole of it is the hot zone: the menu opens as the cursor
     gets close, not when it touches the edge. */
  .lg-menu--fixed::before {
    position: fixed;
    inset: 0 auto 0 0;
    width: 44px;
    height: auto;
  }

  .lg-menu--fixed.is-open::before {
    inset: 0 auto 0 0;
    width: 340px;
    height: auto;
  }

  .lg-menu--fixed .lg-menu__ring {
    position: fixed;
    top: 12px;
    bottom: 12px;
    left: 12px;
    width: 292px;
    padding: 0;
    border: 0;
    border-radius: 28px;
    background: none;
    backdrop-filter: none;
    transform: translateX(calc(-100% - 24px));
    transform-origin: left center;
    transition: transform 0.42s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.2s ease, visibility 0s linear 0.42s;
  }

  .lg-menu--fixed.is-open .lg-menu__ring {
    transform: none;
    transition: transform 0.42s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.2s ease, visibility 0s;
  }

  :root .lg-menu--fixed .lg-menu__panel {
    height: 100% !important;
    max-height: none !important;
    /* room at the top for the hamburger tile, which rides above the panel */
    padding: 78px 10px 14px !important;
    border-radius: 28px !important;
    background: var(--lg-white) !important;
    box-shadow: 0 24px 60px -24px rgba(23, 59, 64, 0.35), 0 0 0 1px rgba(23, 59, 64, 0.05) !important;
  }

  /* The tile rides ABOVE the open panel (it is the panel's close button). */
  .lg-menu--fixed .lg-menu__tile {
    z-index: 2;
  }

  .lg-menu--fixed .lg-menu__ring {
    z-index: 1;
  }

  .lg-menu--fixed.is-open .lg-menu__tile {
    background: var(--lg-page);
  }
}

@media (prefers-reduced-motion: reduce) {
  .lg-menu--fixed .lg-menu__ring,
  .lg-menu--fixed.is-open .lg-menu__ring {
    transition: opacity 0.12s linear, visibility 0s;
  }
}

/* The current row: black, like every other emphasis. portal-unified.css pins
   Partner's row with `.vc-sb.vc-sb .vc-sb-item.is-active { background:
   var(--portal-nav-active) !important }`, so the TOKENS are set in the panel's
   scope (they resolve at the use site) and the selectors below carry
   !important for the label and icon it also pins. */
:root .lg-menu__panel {
  --portal-nav-active: var(--lg-ink);
  --portal-nav-active-ink: var(--lg-white);
  --vc-sb-active-bg: var(--lg-ink);
  --vc-fill-active: var(--lg-ink);
}

:root:root .lg-menu__panel .vc-sb-item.is-active,
:root:root .lg-menu__panel .vc-sb-item.is-active :is(.vc-sb-icon, .vc-sb-item-label, svg, span:not([class*="badge"])) {
  color: var(--lg-white) !important;
}

:root:root .lg-menu__panel .vc-sb-item.is-active .vc-sb-png--brand {
  background-color: var(--lg-white) !important;
}

:root .lg-menu__item:is(.is-active, [aria-current="page"]),
:root .lg-menu__panel .vc-sb-item.is-active {
  background: var(--lg-ink);
}

:root .lg-menu__panel a[aria-current="page"] {
  background: var(--lg-ink) !important;
}

/* Icons in the menu and links stay the one brand colour. */

/* =========================================================================
   11c. "PORTAL DASHBOARD GLASS"  (owner's artboard, 2026-09-18) -- the
        refinement of 11b that the owner asked to apply. Same edition (grey
        canvas, contained hero, white cards, black emphasis, soft-yellow
        "Up next", side-sliding menu); what it changes, with the artboard's own
        values:
          - the menu trigger is a small TAB on the window's left edge;
          - the panel has a header (V mark + a 44px close button that the tab
            morphs into) and keeps the user card at its foot;
          - the hero is the bright tile under a left-weighted shade, 380 tall,
            with a row of round quick-action buttons under the title;
          - cards breathe: 12px gaps, 24px corners, 40px numerals.
   ========================================================================= */

/* --- frame ---------------------------------------------------------------- */
.lg-frame {
  --lg-shell-pad-y: 20px;
  --lg-shell-pad-x: 32px;
  padding: 20px 32px 0 44px !important;
}

@media (max-width: 1023px) {
  .lg-frame {
    padding: 14px 14px 0 !important;
  }
}

.lg-frame--page,
.lg-shell.lg-frame {
  padding-bottom: 40px !important;
}

/* The tab is on the window edge now, so the bar no longer steps in for a tile. */
@media (min-width: 1024px) {
  .lg-topbar--with-menu {
    padding-left: 0;
  }
}

.lg-topbar {
  margin-bottom: 12px;
  min-height: 44px;
}

:root .lg-pill {
  font-size: 13.5px;
  border-radius: 999px;
}

/* --- the edge tab + the panel -------------------------------------------- */
@media (min-width: 1024px) {
  .lg-menu--fixed {
    top: 22px;
    left: 0;
    width: 30px;
    height: 44px;
  }

  :root .lg-menu--fixed .lg-menu__tile {
    position: fixed;
    top: 22px;
    left: 0;
    z-index: 2;
    width: 30px;
    height: 44px;
    gap: 4px;
    padding: 0 9px 0 8px;
    border-radius: 0 14px 14px 0;
    background: var(--lg-white);
    box-shadow: 0 4px 16px rgba(15, 34, 38, 0.10);
    transition: left 0.42s cubic-bezier(0.32, 1.25, 0.4, 1), top 0.42s cubic-bezier(0.32, 1.25, 0.4, 1),
      width 0.3s ease, border-radius 0.3s ease, background 0.2s ease, box-shadow 0.2s ease;
  }

  .lg-menu--fixed .lg-menu__tile > span {
    width: 100%;
    height: 1.5px;
    transition: transform 0.3s ease, opacity 0.2s ease, width 0.2s ease;
  }

  .lg-menu--fixed .lg-menu__tile > span:nth-child(2) {
    width: 60%;
  }

  /* Open: the tab becomes the panel's close button, top-right of the panel
     (panel 12 + 292 wide, 22 padding, 44 button), bars crossing into an X. */
  :root .lg-menu--fixed.is-open .lg-menu__tile {
    top: 34px;
    left: 238px;
    width: 44px;
    gap: 5px;
    padding: 0 13px;
    border-radius: 14px;
    background: var(--lg-inset);
    box-shadow: none;
  }

  .lg-menu--fixed.is-open .lg-menu__tile > span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
  .lg-menu--fixed.is-open .lg-menu__tile > span:nth-child(2) { width: 100%; opacity: 0; }
  .lg-menu--fixed.is-open .lg-menu__tile > span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

  .lg-menu--fixed .lg-menu__ring {
    border-radius: 26px;
    transition: transform 0.42s cubic-bezier(0.32, 1.25, 0.4, 1), opacity 0.22s ease, visibility 0s linear 0.42s;
  }

  .lg-menu--fixed.is-open .lg-menu__ring {
    transition: transform 0.42s cubic-bezier(0.32, 1.25, 0.4, 1), opacity 0.22s ease, visibility 0s;
  }

  /* Header of the panel: THE LOGO LIVES HERE and nowhere else at lg+ (owner,
     2026-09-18). It is each portal's own brand block -- Partner's .vc-sb-brand
     (a white-label firm's mark and name), Client's and Books' lockup -- seated
     top-left, level with the 44px close button the tab turns into. */
  :root .lg-menu--fixed .lg-menu__panel {
    padding: 22px 12px 16px !important;
    border-radius: 26px !important;
    background: var(--lg-white) !important;
    box-shadow: 0 24px 70px rgba(15, 34, 38, 0.16) !important;
  }

  :root .lg-menu--fixed .lg-menu__panel :is(.vc-sb-brand, .lg-menu__brand) {
    display: flex !important;
    flex: none;
    align-items: center;
    min-height: 44px;
    margin: 0 0 18px;
    /* clear of the close button: 44 wide + its 10px inset */
    padding: 0 60px 0 14px !important;
  }

  /* Artboard order: the logo, THEN the "MENU" label, then the rows. The label
     is a ::before (first in the DOM), so the order is set, not assumed. */
  :root .lg-menu--fixed .lg-menu__panel > * {
    order: 2;
  }

  :root .lg-menu--fixed .lg-menu__panel > :is(.vc-sb-brand, .lg-menu__brand, :has(> .vc-sb-brand)) {
    order: 0;
  }

  :root .lg-menu--fixed .lg-menu__panel::before {
    order: 1;
  }

  :root .lg-menu--fixed .lg-menu__panel > :is(.vc-sb-footer, :has(> .vc-sb-footer)) {
    order: 3;
  }

  :root .lg-menu--fixed .lg-menu__panel .vc-sb-brand span {
    color: var(--lg-ink) !important;
    font: 600 15px/1.2 var(--lg-font);
  }

  :root .lg-menu--fixed .lg-menu__panel::before {
    padding: 0 12px 10px;
    letter-spacing: 0.18em;
  }

  /* The user card is back, pinned to the foot. It used to overlap the rows
     because the nav could shrink inside a height-capped panel; the panel is
     full-height now, so the nav takes the slack and scrolls, as designed. */
  :root .lg-menu--fixed .lg-menu__panel :is(.vc-sb-footer) {
    display: block !important;
    margin-top: auto;
    padding: 12px 6px 0;
  }

  :root .lg-menu--fixed .lg-menu__panel .vc-sb-nav {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    scrollbar-width: none;
  }

  :root .lg-menu--fixed .lg-menu__panel .vc-sb-nav::-webkit-scrollbar { display: none; }

  :root .lg-menu--fixed .lg-menu__panel .vc-sb-footer > div {
    border: 0 !important;
    background: transparent !important;
  }

  :root .lg-menu--fixed .lg-menu__panel .vc-sb-footer .rounded-full:not([class*="absolute"]) {
    width: 36px;
    height: 36px;
    background: var(--lg-ink) !important;
    color: var(--lg-white) !important;
  }
}

:root .lg-menu__item:hover,
:root .lg-menu__panel .vc-sb-item:not(.is-active):hover,
:root .lg-menu__panel nav a:not([aria-current="page"]):hover {
  background: var(--lg-inset) !important;
}

/* --- the hero ------------------------------------------------------------- */
/* The bright tile, as the artboard draws it, under a LEFT-weighted shade: the
   type is on the left, the glass stays bright on the right. The artboard's
   shade is .42 -> .10 -> 0; measured on the tile that leaves the display title
   at >= 3:1 on 90% of its area, so it is a touch deeper here (.62 -> .32 -> .06)
   -- same picture, title >= 3:1 everywhere. vacei-books-app/tools/glass/wash.py gates it. */
:root .lg-hero,
:root:root .lg-cover {
  min-height: 380px;
  margin-bottom: 0;
  padding: 30px 34px 36px;
  background:
    #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center 40% / cover no-repeat !important;
}

:root:root .lg-cover {
  padding: 0 34px;
}

:root .lg-hero {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(300px, 420px);
  gap: 24px;
  align-items: end;
}

:root .lg-hero > .lg-upnext {
  align-self: start;
  width: auto;
}

:root .lg-hero--center,
:root .lg-hero:not(:has(> .lg-upnext)) {
  grid-template-columns: minmax(0, 1fr);
}

:root .lg-hero--center {
  display: flex;
  min-height: 300px;
}

:root .lg-hero__lead {
  gap: 16px;
}

:root:root .lg-title {
  font-size: clamp(44px, 5.4vw, 80px);
  line-height: 0.95;
}

:root:root .lg-title--name {
  font-size: clamp(34px, 4.2vw, 64px);
  line-height: 1;
}

.lg-chip {
  height: 32px;
  padding: 0 16px;
  border-radius: 999px;
  border-color: rgba(255, 255, 255, 0.55);
}

@media (max-width: 900px) {
  :root .lg-hero {
    grid-template-columns: minmax(0, 1fr);
    min-height: 0;
  }
}

/* Quick actions: round white buttons under the title, label beneath. */
.lg-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 26px;
  margin-top: 14px;
}

:root .lg-action {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 7px;
  padding: 0;
  border: 0;
  background: none;
  color: var(--lg-white);
  font: 500 12px/1 var(--lg-font);
  text-decoration: none;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.45);
  cursor: pointer;
}

:root .lg-action__icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--lg-white);
  color: var(--lg-ink);
  transition: transform 0.18s ease;
}

:root .lg-action:hover .lg-action__icon {
  transform: translateY(-2px);
}

:root .lg-action svg {
  width: 17px;
  height: 17px;
}

/* "Up next": the artboard's ring and yellow. */
.lg-upnext {
  padding: 10px;
  border-radius: 26px;
  border-color: rgba(255, 255, 255, 0.7);
  background: rgba(255, 255, 255, 0.14);
}

:root .lg-upnext__card {
  padding: 18px 20px 20px;
  border-radius: 18px;
  background: var(--lg-highlight);
}

.lg-upnext__row {
  font-size: 13.5px;
  border-bottom-color: rgba(23, 59, 64, 0.08);
}

/* On the yellow card "soon" is the brand teal (the artboard's); amber on
   yellow would be the one colour that disappears. */
.lg-upnext__when--soon {
  color: var(--lg-accent-read);
}

/* --- cards ---------------------------------------------------------------- */
.lg-stat {
  gap: 0;
  padding: 24px 26px;
}

.lg-stat__label { font-size: 14px; }

.lg-stat__value {
  margin-top: 18px;
  font-size: 40px;
}

.lg-stat__sub {
  margin-top: 10px;
  font-size: 13px;
}

.lg-stat .lg-link {
  margin-top: 18px;
  padding-top: 0;
}

.lg-panel {
  padding: 30px 30px 32px;
}

.lg-panel__title {
  font-size: 30px;
  font-weight: 400;
}

/* =========================================================================
   11d. ONE PAGE HEADER, ONE HEADING SCALE  (owner: "do not miss any page, same
        fonts, same style, same headers, same zoom/compact size ... and keep it
        super simple")
        The estate had three page-header components, each with its own look:
          .vacei-page-header        shared PageHeader (all three) -- a bordered card
          .a4-cover                 Client, 18 sub-pages -- a dark teal band
          [data-guide=books-topbar] Books, every page -- a glass bar, 17px title
        One spec, the simplest of them: no box at all. Eyebrow, title,
        description, straight on the page surface.
        (Zoom needs nothing: all three already share portal-unified.css's
        `html:root { font-size: 75% }` at >= 1024px, so density is identical.)
   ========================================================================= */
:root:root :is(.vacei-page-header, .a4-cover, [data-guide="books-topbar"]) {
  padding: 6px 4px 14px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  color: var(--lg-ink) !important;
}

:root:root :is(.vacei-page-header, .a4-cover) h1,
:root:root [data-guide="books-topbar"] .bk-display {
  overflow: visible;
  color: var(--lg-ink) !important;
  font-family: var(--lg-font) !important;
  font-size: 30px !important;
  font-weight: 400 !important;
  line-height: 1.1 !important;
  letter-spacing: -0.02em !important;
  white-space: normal;
}

:root:root :is(.vacei-page-header, .a4-cover) :is(p, .vacei-header-caption),
:root:root [data-guide="books-topbar"] .bk-display ~ .vacei-header-caption {
  color: var(--lg-ink-2) !important;
  font: 400 14px/1.5 var(--lg-font) !important;
  letter-spacing: 0 !important;
  white-space: normal;
}

:root:root :is(.a4-cover .a4-cover-eyebrow, [data-guide="books-topbar"] .vacei-header-caption:has(+ .bk-display), .vacei-page-header .a4-eyebrow) {
  margin-bottom: 8px;
  color: var(--lg-ink-3) !important;
  font: 600 10.5px/1 var(--lg-font) !important;
  letter-spacing: 0.16em !important;
  text-transform: uppercase;
}

/* EVERY page title, whichever component draws it (the survey still found 24px
   and 26px semibold H1s on pages that do not use a header component at all). */
:root:root :is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) h1:not([class*="lg-"]) {
  color: var(--lg-ink) !important;
  font-family: var(--lg-font) !important;
  font-size: 30px !important;
  font-weight: 400 !important;
  line-height: 1.1 !important;
  letter-spacing: -0.02em !important;
}

/* The heading scale INSIDE a page: one size per level, one weight, one face.
   (The survey found h2 at 18, 20, 22, 24 and 32px in weights 500-600.) Chrome
   headings (.lg-*) and anything in a dialog keep their own sizes. */
:is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) :is(h2, h3, h4):not([class*="lg-"]) {
  font-family: var(--lg-font);
  letter-spacing: -0.01em;
}

:is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) h2:not([class*="lg-"]) {
  font-size: 20px;
  font-weight: 500;
  line-height: 1.2;
}

:is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) h3:not([class*="lg-"]) {
  font-size: 16px;
  font-weight: 600;
  line-height: 1.3;
}

/* =========================================================================
   11e. WHAT THE CONTRAST AUDIT FOUND  (vacei-books-app/tools/glass/page-audit.inject.js, run over 19
        signed-in Partner routes after the canvas edition; every rule here is
        one finding, with the measured ratio it had)
   ========================================================================= */

/* 2.80:1 on ALL 19 pages. `.lg-pill :is(svg, span) { color: inherit }` was
   written when pills had white text; pills are ink now, so the white count on
   the red dot inherited ink. */
:root:root .lg-pill .lg-pill__count {
  color: var(--lg-white) !important;
}

/* 1.00:1 x250, Library. Section 11's fix made these cards white but only
   re-inked h/p/span/a -- the names and meta are <div>s and stayed white. */
:root:root :is(.a4-lib-doc-card, .a4-eng-panel-canvas) :is(div, li, small, strong, em, label):not([class*="bg-"]) {
  color: inherit;
}

:root:root .a4-lib-doc-card :is(.a4-lib-doc-card__name, [class*="__name"]) {
  color: var(--lg-ink) !important;
}

:root:root .a4-lib-doc-card :is(.a4-lib-doc-card__meta, [class*="__meta"]) {
  color: var(--lg-ink-3) !important;
}

/* 1.70:1 / 3.45:1, Library's category tabs: ink label on a deep-teal pill.
   Current state = black with a white label, like every other current state. */
:root:root .a4-lib-cat-tab--active {
  border-color: transparent !important;
  background: var(--lg-ink) !important;
  color: var(--lg-white) !important;
}

:root:root .a4-lib-cat-tab--active :is(span, svg) {
  color: var(--lg-white) !important;
}

:root:root .a4-lib-cat-tab--active .a4-lib-cat-tab__count {
  background: rgba(255, 255, 255, 0.18) !important;
  color: var(--lg-white) !important;
}

/* 1.23:1 / 1.16:1, Support's "How it works". It was a dark panel whose fill the
   theme removed; its white type was left standing on the canvas. */
:root:root .a4-support-how {
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  background: var(--lg-glass) !important;
  color: var(--lg-ink) !important;
}

:root:root .a4-support-how :is([class*="__title"], [class*="step-title"], h3, h4) {
  color: var(--lg-ink) !important;
}

:root:root .a4-support-how :is([class*="step-desc"], p) {
  color: var(--lg-ink-2) !important;
}

/* 1.87:1, Templates' row numbers; 3.0:1 / 2.85:1 / 2.72:1, the literal grey
   #8D969E used as small text on Settings and Notifications. */
:root:root .a4-tmpl-grid-sno {
  color: var(--lg-ink-3) !important;
}

:root:root :is([class*="#8d969e"], [class*="#8D969E"], [style*="color: rgb(141, 150, 158)"], [style*="color:#8d969e"], [style*="color: #8d969e"]) {
  color: var(--lg-ink-3) !important;
}

/* 3.0:1 / 2.85:1 / 2.72:1 -- the same grey again, this time through a TOKEN.
   Partner's index.css carries an un-prefixed legacy family (--ink, --body,
   --mute, --ash, --stone, --faint, --hairline-*) that no section of this sheet
   mapped: 220 uses, ~180 of them as text colour. --stone is #8D969E (3.0:1),
   --faint #C9C9CD (1.6:1). Inert in Client and Books, which do not have them. */
:root:root:root {
  --ink: var(--lg-ink);
  --body: var(--lg-ink);
  --charcoal: var(--lg-ink-2);
  --mute: var(--lg-ink-2);
  --ash: var(--lg-ink-2);
  --stone: var(--lg-ink-3);
  --faint: var(--lg-ink-3);
  --hairline-light: var(--lg-hairline);
  --hairline-strong: var(--lg-hairline);
  --a4-faint: var(--lg-ink-3);
}

/* 4.03:1 / 4.06:1 at 11px: service tags in a lighter green and red than the
   status tokens. */
:root:root .a4-srt-service-tag--advisory { color: var(--lg-positive) !important; }
:root:root .a4-srt-service-tag--tax { color: var(--lg-negative) !important; }

/* 3.43:1, MBR's "API connected" badge: bright accent on deep teal. */
:root:root .a4-mbr-hero__badge {
  color: var(--lg-white) !important;
}

/* =========================================================================
   11f. THE AUDIT WORKSPACE  (Partner, /engagement-view/:id/...)
        It renders outside MainLayout on purpose (chrome-less, every vertical
        pixel matters), so none of the shell rules above ever reached it: it
        painted an opaque page over the whole viewport and kept the old
        permanent rail. Same canvas, same side-sliding menu, the working area as
        the one white card -- but NO top bar, and tighter padding.
   ========================================================================= */
.lg-frame.lg-frame--workspace {
  padding: 12px 12px 0 44px !important;
}

@media (max-width: 1023px) {
  .lg-frame.lg-frame--workspace {
    padding: 8px 8px 0 !important;
  }
}

.lg-pane--workspace {
  border-radius: var(--lg-r-card) var(--lg-r-card) 0 0 !important;
}

/* THE AUDIT WORKSPACE'S OWN PALETTES. Three scoped token families that no :root
   mapping can reach, because a custom property declared on a container beats
   the one inherited from :root:
     .audit-etb-page / .audit-adj-page / .audit-content   --audit-*
     .a4-output-kit, .malta-cit                           --accent-*
   Their literals are the pre-theme status colours, each just under AA as text
   (measured in the workspace: #E23B4A 4.24:1 on negative figures, #EC7E00
   2.78:1 on "exception", #428619 4.21:1). Restated on the SAME scopes. */
:root :is(.audit-etb-page, .audit-adj-page, .audit-content, .a4-output-kit, .malta-cit) {
  --audit-charcoal: var(--lg-ink-2);
  --audit-faint: var(--lg-ink-3);
  --audit-teal: var(--lg-positive);
  --audit-warning: var(--lg-amber-read);
  --audit-danger: var(--lg-negative);
  --accent-teal: var(--lg-positive);
  --accent-light-green: var(--lg-positive);
  --accent-green-text: var(--lg-positive);
  --accent-warning: var(--lg-amber-read);
  --accent-yellow: var(--lg-amber-read);
  --accent-danger: var(--lg-negative);
  --accent-pink: var(--lg-negative);
  --accent-deep-red: var(--lg-negative);
  --accent-light-blue: var(--lg-accent-read);
  --accent-blue-link: var(--lg-accent-read);
}

/* The same literals written straight into Tailwind arbitrary text classes
   (`text-[#428619]`, ...): 26 files. Only TEXT utilities are re-pointed; fills
   and dots of the same hue are fine as graphics. */
:root:root [class*="text-[#428619]"] { color: var(--lg-positive) !important; }

/* Same rule, same reason, found by the runtime audit on the signed-in Client
   (messages: a "01:09 PM" timestamp and the "Online" label): the mint #00A87E
   is 3.04:1 as 11px text on white. As a DOT or a tick it is a graphic and
   stays; as words it takes the readable positive ink. 39 text uses. */
:root:root [class*="text-[#00a87e]"],
:root:root [class*="text-[#00A87E]"] { color: var(--lg-positive) !important; }
/* The same mint is also written INLINE -- `style={{ color: "#00a87e" }}` on
   status chips, stat values and labels, some two dozen sites in Books and
   Client -- and an inline style beats the class rule above. React serialises
   that as `color: #00a87e`, first in the attribute or after a "; ", so match
   the COLOR property only: a dot or fill that carries the same literal as a
   `background` is untouched and keeps its mint. (Code review 2026-09-19.) */
:root:root [style^="color: #00a87e"],
:root:root [style*="; color: #00a87e"],
:root:root [style^="color: #00A87E"],
:root:root [style*="; color: #00A87E"] { color: var(--lg-positive) !important; }
:root:root :is([class*="text-[#ec7e00]"], [class*="text-[#EC7E00]"]) { color: var(--lg-amber-read) !important; }
:root:root :is([class*="text-[#e23b4a]"], [class*="text-[#E23B4A]"]) { color: var(--lg-negative) !important; }

/* 2.91:1 -- "Draft" and friends: the bright accent used as TEXT on its own
   tint. Any text utility bound to the accent token reads in --lg-accent-read. */
:root:root :is([class*="text-[var(--lg-accent)]"], [class*="text-[#346a76]"], [class*="text-[#346A76]"]) {
  color: var(--lg-accent-read) !important;
}

/* 4.06:1 -- Planning's section-code badge ("PL-1"): white on a 20% white veil
   over the active accent row. A 10% veil keeps the badge and reads at 5.0:1. */
:root:root .a4-num[style*="background: rgba(255, 255, 255, 0.2)"] {
  background: rgba(255, 255, 255, 0.10) !important;
}

/* The trial-balance view's one-row slim title is deliberately compact ("the
   ETB grid needs every vertical px"); it keeps its size, in the theme's face. */
:root:root .lg-pane--workspace h1[class*="text-[15px]"] {
  font-size: 15px !important;
  font-weight: 600 !important;
  letter-spacing: -0.01em !important;
}

/* =========================================================================
   11g. WHAT THE AUDIT FOUND ON THE SIGNED-IN CLIENT  (11 routes)
   ========================================================================= */

/* 1.00:1 -- Billing's "Message your team": an <a> drawn as a solid button
   (`text-white` + an inline accent fill). Client and Books colour EVERY anchor
   from an unlayered `a { color: var(--portal-accent-text) }`, which outranks
   Tailwind's layered `text-white`, so the label took the fill's own colour and
   vanished. Section 9b fixed this for `bg-primary`; an anchor that asks for
   white text gets it, whatever paints its fill. */
:root a[class~="text-white"],
:root a[class~="text-white"]:hover {
  color: var(--lg-white);
}

/* 3.4-4.1:1 -- Client's faded inks. vacei-flow.css fades #121214 by alpha for
   secondary text (--vf-ink-45 ... -60: 154 uses); on a white card those land
   at #7C7C7E-#888889. The readable steps are the theme's muted inks. The
   hairline steps (-20 and below) are borders and stay as they are. */
:root:root:root {
  --vf-ink-75: var(--lg-ink-2);
  --vf-ink-60: var(--lg-ink-2);
  --vf-ink-55: var(--lg-ink-3);
  --vf-ink-50: var(--lg-ink-3);
  --vf-ink-45: var(--lg-ink-3);
}

/* 3.13:1 -- the literal #8A948E written inline as small text (service request
   header, needs-you rows). */
:root:root :is([style*="#8A948E"], [style*="#8a948e"], [style*="rgb(138, 148, 142)"]) {
  color: var(--lg-ink-3) !important;
}

/* =========================================================================
   11h. WHAT THE AUDIT FOUND ON THE SIGNED-IN BOOKS  (admin)
   ========================================================================= */

/* 1.55:1 -- the review-queue count in the menu. portal-unified.css gives the
   navigation its OWN status colours, chosen for a dark menu: pale amber
   #F0B849, pale green #3FD07F, pale red #FF8A8A. The menu is a white sheet in
   all three portals now, so every badge in it was pale-on-pale. */
:root:root :is(.vacei-navigation, .vc-sb, .lg-menu__panel) {
  --bk-status-review-deep: var(--lg-amber-read);
  --bk-status-posted-deep: var(--lg-positive);
  --bk-status-danger: var(--lg-negative);
  --bk-status-neutral: var(--lg-ink-3);
}

/* 4.05:1 -- Books' "ACTIVE" badge: #428619 on its own #E9F7E1 tint, 10px
   bold caps. Same green the sheet already re-points as a text utility
   (section 9); this is the TOKEN form of it. The tint stays. */
:root:root {
  --bk-badge-active-fg: var(--lg-positive);
}

/* 2.73:1 -- a chip OUTSIDE a hero ("Books admin" in the top bar). Chips were
   born on the render (white label, smoked glass); on the grey canvas the same
   recipe is white-on-grey. On the canvas a chip is a white pill with an ink
   label; inside a hero it stays smoked glass. */
:root .lg-chip {
  border-color: transparent;
  background: var(--lg-white);
  backdrop-filter: none;
  color: var(--lg-ink);
  text-shadow: none;
}

:root :is(.lg-hero, .lg-cover) .lg-chip {
  border-color: rgba(255, 255, 255, 0.55);
  background: var(--lg-thin-smoke);
  backdrop-filter: var(--lg-thin-blur);
  color: var(--lg-white);
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.45);
}

/* 3.62:1 -- Books' notification count: `text-white` on the danger fill, turned
   to ink by portal-unified's "every .text-white inside a header becomes ink"
   rule. Section 9b made the same exception for Partner's reds; this is Books'. */
:root:root :is([class*="bk-status-danger"], [class*="bg-[var(--bk-danger"]):is(.text-white, [class~="text-white"]) {
  color: var(--lg-white) !important;
}

/* =========================================================================
   11i. ALIGNMENT  (owner, 2026-09-18: "Align these" -- Books admin Companies
        table, and the dashboard hero's tab row)
   ========================================================================= */

/* CHIPS NEVER WRAP. A status chip is `inline-flex rounded-full` with
   `white-space: normal`, so in a narrow auto-layout column "2 failed" shrank to
   48px wide and wrapped to three lines -- a 60px blob that also dragged the
   row's height and every other cell's vertical centre with it. Holds for every
   table and list in all three portals. */
:is(.lg-pane, .portal-page, .lg-shell .vfc-main-scroll) :is(table, [role="table"], [role="row"]) :is(span, button, a)[class*="rounded-full"],
:is(.lg-pane, .portal-page, .lg-shell .vfc-main-scroll) :is(.bk-money, .a4-chip, .vc-chip, .a4-num)[class*="rounded"] {
  flex-shrink: 0;
  white-space: nowrap;
}

/* Column headings stay on one line too, and cells centre on the row. */
:is(.lg-pane, .portal-page, .lg-shell .vfc-main-scroll) :is(table th) {
  white-space: nowrap;
  vertical-align: middle;
}

:is(.lg-pane, .portal-page, .lg-shell .vfc-main-scroll) :is(table td) {
  vertical-align: middle;
}

/* A cell's inline-flex wrapper of chips: one row, centred, never squeezed. */
:is(.lg-pane, .portal-page, .lg-shell .vfc-main-scroll) td > :is(span, div)[class*="inline-flex"] {
  flex-wrap: nowrap;
  align-items: center;
}

/* THE HERO'S TAB ROW. It was pinned to the cover's bottom-left CORNER
   (`bottom-0 left-0`), which suited the old card; the hero has a 28px radius
   and `overflow: hidden`, so the first pill was clipped by the corner and sat
   lower than its neighbours. It lives inside the hero's padding, all pills on
   one line and one height. */
:root:root .lg-cover .bk-cover-tabrow {
  left: 34px !important;
  right: 34px !important;
  bottom: 26px !important;
  align-items: center;
  gap: 8px;
}

:root:root .lg-cover .bk-cover-tabrow .lg-pill {
  height: 40px;
  padding: 0 22px;
  line-height: 1;
}

/* ...and the corner actions share that baseline on the right. */
:root:root .lg-cover > .absolute.bottom-\[60px\] {
  right: 34px !important;
  bottom: 26px !important;
}

@media (max-width: 640px) {
  :root:root .lg-cover .bk-cover-tabrow {
    left: 20px !important;
    right: 20px !important;
    bottom: 18px !important;
  }

  :root:root .lg-cover > .absolute.bottom-\[60px\] {
    right: 20px !important;
    bottom: 70px !important;
  }
}

/* =========================================================================
   11j. SIMPLER DASHBOARDS  (owner, three times: "simplify the dashboard",
        "keep it super simple", "easily digestible")
   ========================================================================= */

/* A page with a HERO does not also need a page header saying the same thing.
   Books' dashboard drew "OVERVIEW - COMPANY / Dashboard / Your business at a
   glance" and then, right under it, the hero with the company's name and
   status. The header's TEXT goes on composed pages; its controls (back,
   badge, bell, avatar) stay, right-aligned. */
:root:root .lg-pane:has(.lg-bare) [data-guide="books-topbar"] .min-w-0:has(> .bk-display) {
  display: none;
}

:root:root .lg-pane:has(.lg-bare) [data-guide="books-topbar"] {
  padding: 0 0 8px !important;
}

:root:root .lg-pane:has(.lg-bare) [data-guide="books-topbar"] > div {
  justify-content: flex-end;
  padding-block: 0;
}

/* A folded card: the summary is the card's title; a chevron says it opens. */
.lg-fold > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  cursor: pointer;
  list-style: none;
}

.lg-fold > summary::-webkit-details-marker { display: none; }

.lg-fold > summary::after {
  content: "";
  width: 8px;
  height: 8px;
  border-right: 1.5px solid var(--lg-ink-2);
  border-bottom: 1.5px solid var(--lg-ink-2);
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform 0.2s ease;
}

.lg-fold[open] > summary::after {
  transform: rotate(-135deg) translate(-2px, -2px);
}

/* With quick actions in it the Books hero is a little taller; the tab row and
   the actions must not collide. */
:root:root .lg-cover .lg-actions {
  margin-top: 6px;
}

/* =========================================================================
   11k. WHAT THE AUDIT FOUND ON THE SIGNED-IN BOOKS  (company pages, 26 routes)
   ========================================================================= */

/* 1.00:1 -- the ACTIVE pill of every segmented control in Books (period
   bar, VAT quarters, report months, bank tabs, fixed-asset tabs, account
   monograms: 33 uses). Books has no "emphasis fill" token; it borrowed the
   SIDEBAR's colour (`background: var(--bk-sidebar); color: #fff`) because the
   sidebar was the darkest thing on the page. portal-unified.css points
   --bk-sidebar at --portal-nav, and the menu is a white sheet now, so every
   one of them became white on white. Nothing paints the menu from this token
   any more (the panel has its own fill), so the token goes back to meaning
   what its 33 users mean by it: the emphasis fill -- black, in this edition. */
:root:root:root {
  --bk-sidebar: var(--lg-ink);
}

/* 11k-partner. The same trap in Partner and Client.
   1.00:1 -- the document-requests (PBC) page heads each section with a band
   `bg-[var(--a4-sidebar)]` + `text-white`: the old rail's near-black, borrowed
   as an emphasis fill. The --a4-sidebar FAMILY is white glass with ink text
   now (it has to move together, see section 2), so the band is re-pointed
   rather than the token. It is the only element in either app that paints
   itself from that token. */
:root:root [class~="bg-[var(--a4-sidebar)]"] {
  background-color: var(--lg-ink) !important;
}

/* Client's legacy `--dark: var(--a4-sidebar)` is used as a TEXT colour
   (.menu li li a, .dropdown-item) and as a hover fill under `--light` text. */
:root:root:root {
  --dark: var(--lg-ink);
}

/* 4.07:1 -- the literal amber #a9670c as 11-12px text on its own #fdf1e3 tint
   (fieldwork "marked blocked" note, completion procedure labels). */
:root:root [class~="text-[#a9670c]"] {
  color: var(--lg-amber-read) !important;
}

/* 11k-toasts. 4.35:1 -- sonner's rich-colour toasts ("Please login to access
   this page": #E60000 on #FFF0F0, 13px). The library's own light-theme inks;
   the tints stay, the text takes the theme's AA status inks. All three apps. */
:root:root [data-sonner-toaster] {
  --error-text: var(--lg-negative);
  --success-text: var(--lg-positive);
  --warning-text: var(--lg-amber-read);
  --info-text: var(--lg-accent-read);
}

/* =========================================================================
   11l. THE SIGN-IN PAGES  (owner, 2026-09-18: "make the login pages match as
        well") -- Partner /login, Client /login, Books /login
   =========================================================================
   They were the previous look end to end: a full-bleed teal gradient pane, a
   radial grey ground, a frosted card with a drop shadow, a teal button. Same
   page as the dashboards now: the grey canvas as a frame, the brand pane as
   the CONTAINED hero panel (the same tile picture), a flat white card, the
   30px/400 title, a white chip, and black for the one primary action.
   The three components carry the same `lg-login__*` hooks; their inline
   styles are why everything here is !important. */
:root .lg-login {
  gap: var(--lg-gap);
  padding: var(--lg-gap);
  box-sizing: border-box;
  background: var(--lg-ground) !important;
}

/* The hero panel. The shade is UNIFORM and deeper than the dashboard hero's
   (.68 against .62 -> .06): this pane is 12.5px body copy from top to bottom,
   not one big title on the left. Measured on the tile, worst pixel: solid
   white 5.8:1, the 40px accent phrase 3.3:1. */
:root .lg-login .lg-login__hero {
  border-radius: 28px;
  background:
    #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center / cover no-repeat !important;
}

/* The old white bloom would lift the top-right corner back under 4.5:1. */
:root .lg-login .lg-login__hero > [aria-hidden="true"] {
  display: none !important;
}

/* Small copy was white at 68-80% alpha, tuned for a flat teal; on a picture it
   is solid white. The accent phrase inside the lead keeps its softer white --
   it is 40px, and clears 3:1. */
:root .lg-login .lg-login__hero :is(p, span):not(.lg-login__lead span) {
  color: var(--lg-white) !important;
}

:root .lg-login .lg-login__lead {
  font-weight: 400 !important;
  letter-spacing: -0.03em !important;
}

:root .lg-login .lg-login__form {
  border-radius: 28px;
  background: transparent !important;
}

:root .lg-login .lg-login__title {
  font-size: 30px !important;
  font-weight: 400 !important;
  letter-spacing: -0.02em !important;
  color: var(--lg-ink) !important;
}

:root .lg-login .lg-login__chip {
  border-color: transparent !important;
  background: var(--lg-white) !important;
  color: var(--lg-ink) !important;
}

:root .lg-login .lg-login__card {
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  background: var(--lg-white) !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
}

/* The one primary action: the Vacei Network lime pill with ink text, as on
   vacei.com (owner ruling 2026-09-24; it was a black pill). Signed-out pages
   only; inside the app the primary action stays black. */
:root .lg-login .lg-login__submit,
:root .lg-login .lg-login__submit:hover {
  border-radius: 999px !important;
  background: #E9F16D !important;
  color: #173B40 !important;
  box-shadow: none !important;
}

:root .lg-login .lg-login__submit svg {
  color: #173B40 !important;
}

:root .lg-login .lg-login__submit:not(:disabled):hover {
  background: #DCE661 !important;
}

/* Fields: pills on the white card, like the search field in the top bar. */
:root .lg-login .lg-login__card input:not([type="checkbox"]) {
  border-radius: 999px;
}

:root .lg-login .lg-login__card .bk-login-field {
  border-radius: 999px !important;
  background: var(--lg-ground) !important;
  border-color: transparent !important;
}

/* Links on the form side are ink/teal text, never the old bright accent. */
:root .lg-login .lg-login__form a:not(.lg-login__submit),
:root .lg-login .lg-login__form summary {
  color: var(--lg-accent-read) !important;
}

@media (max-width: 1023px) {
  :root .lg-login {
    padding: 0;
  }
}

/* =========================================================================
   11m. THE REST OF THE SIGNED-OUT PAGES  (forgot / reset password, MFA,
        Client sign-up) -- same family as 11l
   =========================================================================
   No markup hooks needed: every one of them is a full-height standalone root
   (`.banner_section.min-h-screen` in Client and Books, `.min-h-screen` on
   `bg-[var(--vc-canvas)]` in Partner, `main.vf-screen` for Client's sign-up)
   holding one card. They sat on the off-white page colour with a bordered,
   shadowed card and a teal button. */
:root :is(.banner_section.min-h-screen, .min-h-screen[class~="bg-[var(--vc-canvas)]"], main.vf-screen) {
  background: var(--lg-ground) !important;
}

:root :is(.banner_section.min-h-screen, .min-h-screen[class~="bg-[var(--vc-canvas)]"]) > :is(div, form)[class*="rounded-[16px]"],
:root main.vf-screen form {
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  background: var(--lg-white) !important;
  box-shadow: none !important;
}

:root:root :is(.banner_section.min-h-screen, .min-h-screen[class~="bg-[var(--vc-canvas)]"], main.vf-screen) h1 {
  font-size: 30px !important;
  font-weight: 400 !important;
  letter-spacing: -0.02em !important;
  color: var(--lg-ink) !important;
}

/* The one primary action is the lime pill, as on the sign-in page. */
:root:root :is(.banner_section.min-h-screen, .min-h-screen[class~="bg-[var(--vc-canvas)]"]) button[type="submit"],
:root:root main.vf-screen .vf-primary-btn {
  border-radius: 999px !important;
  background: #E9F16D !important;
  color: #173B40 !important;
  box-shadow: none !important;
}

:root:root :is(.banner_section.min-h-screen, .min-h-screen[class~="bg-[var(--vc-canvas)]"]) button[type="submit"]:not(:disabled):hover,
:root:root main.vf-screen .vf-primary-btn:not(:disabled):hover {
  background: #DCE661 !important;
}

/* 11m-logo. Books' forgot/reset card drew the lockup at full card width (286px
   of logo over a 12px sentence). A lockup is 40px tall everywhere else. */
:root .banner_section.min-h-screen [class*="rounded-[16px]"] img {
  width: auto !important;
  max-height: 40px;
  margin-inline: auto;
}

/* =========================================================================
   11n. THE MENU, AS THE ARTBOARD DRAWS IT  (owner, 2026-09-18: "make the
        sidebar menu like this in the design ... simplify the portal")
   =========================================================================
   The artboard's menu is a short list of equal rows: 40px, 14px/500, a 17px
   teal icon, a black pill for the current page, a hairline between blocks.
   Ours had the rows right and the STRUCTURE wrong: group headers were 24px
   grey small-caps captions, so the panel read as a sitemap (Books 38 rows,
   Partner 33). A group header is a row now -- same height, same type, a
   chevron on the right -- and only the group you are in is open, so at rest
   the panel is about ten rows. Partner's groups were not collapsible at all;
   SideBar.tsx makes them so (`.lg-menu__group`). Books and Client already
   collapse theirs (`button[aria-expanded]`). */
:root:root .lg-menu__panel :is(.lg-menu__group, nav button[aria-expanded]) {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  width: 100%;
  min-height: 40px;
  padding: 0 12px !important;
  border: 0;
  border-radius: 20px !important;
  background: transparent;
  color: #FFFFFF !important;
  font-family: var(--lg-font);
  text-align: left;
  cursor: pointer;
}

:root:root .lg-menu__panel :is(.lg-menu__group, nav button[aria-expanded]):hover {
  background: rgba(255, 255, 255, 0.16);
}

/* The caption inside it becomes the row's label: sentence case, 14px/500. */
:root:root .lg-menu__panel :is(.lg-menu__group, nav button[aria-expanded]) :is(.vc-sb-group-label, span[class*="tracking-"]) {
  margin: 0;
  padding: 0;
  color: inherit !important;
  font-size: 14px !important;
  font-weight: 500 !important;
  letter-spacing: 0 !important;
  text-transform: none !important;
}

/* Small-caps labels were typed in capitals in places ("FINANCE"): sentence
   case without touching the strings. */
:root:root .lg-menu__panel nav button[aria-expanded] span[class*="tracking-"] {
  text-transform: lowercase !important;
}

:root:root .lg-menu__panel nav button[aria-expanded] span[class*="tracking-"]::first-letter {
  text-transform: uppercase !important;
}

/* The group you are in is marked even when another one is open. */
:root:root .lg-menu__panel .lg-menu__group.has-active .vc-sb-group-label {
  font-weight: 600 !important;
}

.lg-menu__count {
  margin-left: auto;
  color: rgba(255, 255, 255, 0.78);
  font-size: 12px;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}

/* Chevron: right = closed, down = open. */
:root .lg-menu__panel .lg-menu__group::after {
  content: "";
  flex: none;
  width: 7px;
  height: 7px;
  margin-left: 10px;
  border-right: 1.5px solid rgba(255, 255, 255, 0.85);
  border-bottom: 1.5px solid rgba(255, 255, 255, 0.85);
  transform: rotate(-45deg);
  transition: transform 0.2s ease;
}

:root .lg-menu__panel .lg-menu__group[aria-expanded="true"]::after {
  transform: rotate(45deg) translate(-2px, -2px);
}

/* An open group's rows step in, so the group reads as one block. */
:root .lg-menu__panel .lg-menu__group + ul {
  padding-left: 10px;
}

/* Every row the same: the utility rows at the foot were 38px / 13.5px / r12. */
:root:root .lg-menu__panel nav a[class*="min-h-[38px]"],
:root:root .lg-menu__panel :is(a, button)[class*="min-h-[38px]"] {
  min-height: 40px;
  border-radius: 20px !important;
  font-size: 14px !important;
}

/* =========================================================================
   11o. BOOKS' DASHBOARD, AS THE ARTBOARD DRAWS IT  (owner, 2026-09-18: "make
        sure the design is there, it's not the same" -- "the cards, the
        simplicity and large texts")
   =========================================================================
   Side by side with the artboard the Books dashboard was the furthest off:
   a 24px title, a paragraph in a glass box, no "Up next" in the hero, and four
   small bordered tiles with 11px capitals inside a white pane. The artboard:
   a LARGE light title, "Up next" ringed at the hero's top-right, and four big
   white cards straight on the canvas -- 14px label, 38px light figure. */

/* The title. Company names are longer than "Good morning", so it scales. */
:root:root .lg-cover .lg-title:not(.lg-title--name) {
  max-width: min(60%, 18ch);
  font-size: clamp(38px, 4.6vw, 72px) !important;
  font-weight: 400 !important;
  line-height: 1.02 !important;
  letter-spacing: -0.035em !important;
}

/* The status sentence is a line of type under it, not a glass box. The shade
   is deepest on the left, where it sits (gated in vacei-books-app/tools/glass/wash.py). */
:root:root .lg-cover .lg-cover__sub {
  max-width: 44ch;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: none !important;
  backdrop-filter: none !important;
  color: var(--lg-white) !important;
  font-size: 15px;
  line-height: 1.55;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.45);
}

/* "Up next", where the artboard has it. Below 1100px the hero is too narrow
   for both; the full card further down carries it there. */
.lg-cover .lg-cover__upnext {
  display: none;
}

@media (min-width: 1100px) {
  .lg-cover .lg-cover__upnext {
    position: absolute;
    top: 30px;
    right: 34px;
    z-index: 3;
    display: block;
    width: min(420px, 31%);
  }

  /* The document thumbnails shared that corner; "Up next" is what the
     artboard puts there, and Documents is one row away in the menu. */
  .lg-cover:has(.lg-cover__upnext) .bk-cover-thumbs {
    display: none !important;
  }
}

.lg-cover .lg-upnext__row {
  width: 100%;
  border: 0;
  background: none;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

/* The four figures: big white cards on the canvas. */
:root:root .lg-bare .bk-kpi-grid {
  gap: var(--lg-gap) !important;
}

:root:root .lg-bare .bk-kpi-grid > * {
  padding: 26px !important;
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  background: var(--lg-white) !important;
}

/* label: 14px sentence case, no icon chip */
:root:root .lg-bare .bk-kpi-grid > * > div:first-child > span[aria-hidden="true"] {
  display: none !important;
}

:root:root .lg-bare .bk-kpi-grid > * > div:first-child > span:not([aria-hidden]) {
  color: var(--lg-ink) !important;
  font-size: 14px !important;
  font-weight: 500 !important;
  letter-spacing: 0 !important;
  text-transform: lowercase !important;
}

:root:root .lg-bare .bk-kpi-grid > * > div:first-child > span:not([aria-hidden])::first-letter {
  text-transform: uppercase !important;
}

/* figure: 38px light */
:root:root .lg-bare .bk-kpi-grid .bk-money[class*="font-size:clamp"] {
  font-size: clamp(28px, 2.7vw, 38px) !important;
  font-weight: 400 !important;
  letter-spacing: -0.03em !important;
}

/* The dashboard's pane is the canvas itself: its cards are the surfaces. */
:root:root .lg-pane.lg-pane--padded:has(> .bk-kpi-grid),
:root:root .lg-bare > .lg-pane.lg-pane--padded {
  padding: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
}

/* 11n follow-up: the artboard's menu has ONE hairline, not one per group. */
:root:root .lg-menu__panel nav > div[class~="pt-1.5"],
:root:root .lg-menu__panel nav [class*="border-t"]:has(> button[aria-expanded]) {
  border-top: 0 !important;
}

/* =========================================================================
   11p. THE OWNER'S "GLASS THEME GUIDE", section 4: SIDEBAR AND EDGE TAB
        ("never change")  -- supersedes the white panel of 11c / 11n-tile
   =========================================================================
   The guide arrived after the white panel was built, and it is explicit:
   the sidebar and the edge tab are TEAL GLASS --
     linear-gradient(160deg, rgba(43,155,186,.55), rgba(30,104,125,.62)),
     1px rgba(255,255,255,.7) border, blur(34px) saturate(1.4),
     inset 0 1px 0 rgba(255,255,255,.7)
   -- white V mark, white 14px/500 labels and 17px icons, the ACTIVE row a
   solid WHITE pill with #111 ink, hover rgba(255,255,255,.16), dividers
   rgba(255,255,255,.35), a white avatar at the foot. Radius 30. The tab is the
   same glass with three white 1.5px bars; open, the button is a 44px glass
   circle. (The teal button the owner asked to make "the same colour" WAS this.)

   Measured honestly: white on this glass over the grey canvas is ~2.2-3.1:1
   (it is ~5:1 where the panel overlaps the hero). The guide is followed as
   written; labels carry a soft dark text-shadow, which is the one addition. */
:root:root:root .lg-menu__panel {
  --portal-nav: transparent;
  --portal-nav-ink: #FFFFFF;
  --portal-nav-muted: rgba(255, 255, 255, 0.8);
  --portal-nav-active: #FFFFFF;
  --portal-nav-active-ink: var(--lg-ink);
  --portal-nav-hover: rgba(255, 255, 255, 0.16);
  --bk-status-review-deep: #FFFFFF;
  --bk-status-posted-deep: #FFFFFF;
  --bk-status-danger: #FFFFFF;
  --bk-status-neutral: rgba(255, 255, 255, 0.8);
  padding: 22px 22px 20px !important;
  border: 1px solid rgba(255, 255, 255, 0.7) !important;
  border-radius: 30px !important;
  background: linear-gradient(160deg, rgba(23, 59, 64, 0.94), rgba(15, 34, 38, 0.96)) !important;
  backdrop-filter: blur(34px) saturate(1.4) !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), 0 24px 70px rgba(15, 34, 38, 0.22) !important;
  color: #FFFFFF !important;
}

/* Every word and icon in it is white ... */
:root:root:root .lg-menu__panel :is(a, button, span, p, div, li, small, strong, h2, h3, label, svg) {
  color: #FFFFFF !important;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.28);
}

:root:root:root .lg-menu__panel::before {
  color: rgba(255, 255, 255, 0.8) !important;
}

:root:root:root .lg-menu__panel :is(.vc-sb-user-sub, .lg-menu__count, [class*="text-[11"], [class*="text-[10"]) {
  color: rgba(255, 255, 255, 0.78) !important;
}

/* ... rows are transparent until hovered ... */
:root:root:root .lg-menu__panel :is(nav a, nav button, .vc-sb-item, .lg-menu__group) {
  background: transparent !important;
  box-shadow: none !important;
}

:root:root:root .lg-menu__panel :is(nav a, nav button, .vc-sb-item, .lg-menu__group):hover {
  background: rgba(255, 255, 255, 0.16) !important;
}

/* ... and the row you are on is the solid white pill with ink. */
:root:root:root .lg-menu__panel :is([aria-current="page"], .vc-sb-item.is-active, .vc-sb-item.is-active:hover, [aria-current="page"]:hover) {
  background: #FFFFFF !important;
  text-shadow: none;
}

:root:root:root .lg-menu__panel :is([aria-current="page"], .vc-sb-item.is-active),
:root:root:root .lg-menu__panel :is([aria-current="page"], .vc-sb-item.is-active) :is(span, p, div, svg, strong, small) {
  color: var(--lg-ink) !important;
  text-shadow: none;
}

/* White marks: SVG lockups take white fill, PNG marks are inverted. */
:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) svg :is(path, polygon, rect, circle)[fill]:not([fill="none"]) {
  fill: #FFFFFF !important;
}

:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) img {
  filter: brightness(0) invert(1);
}

/* Dividers, chevrons, the company switcher, count badges. */
:root:root:root .lg-menu__panel :is(.vc-sb-divider, hr, [class*="h-px"]) {
  border-color: rgba(255, 255, 255, 0.35) !important;
  background-color: rgba(255, 255, 255, 0.35) !important;
}

:root:root:root .lg-menu__panel [class*="border-t"],
:root:root:root .lg-menu__panel [class*="border-b"] {
  border-color: rgba(255, 255, 255, 0.35) !important;
}

:root:root:root .lg-menu__panel .lg-menu__group::after {
  border-color: rgba(255, 255, 255, 0.85);
}

:root:root:root .lg-menu__panel :is(.company-card, [class*="company-card"]) {
  border: 1px solid rgba(255, 255, 255, 0.6) !important;
  background: rgba(255, 255, 255, 0.14) !important;
}

:root:root:root .lg-menu__panel :is(span, i)[class*="rounded"][class*="min-w-"] {
  background: rgba(255, 255, 255, 0.22) !important;
  color: #FFFFFF !important;
}

/* The foot: a white avatar, a white name, a softer context line. */
:root:root:root .lg-menu__panel :is(.lg-avatar, .vc-sb-avatar, [class*="rounded-full"][class*="h-9"], [class*="rounded-full"][class*="h-8"]) {
  background: #FFFFFF !important;
  color: var(--lg-ink) !important;
  text-shadow: none;
}

/* --- the edge tab and the button it becomes ------------------------------ */
:root:root:root .lg-menu__tile,
:root:root:root .lg-menu__tile:is(:hover, :focus, :active) {
  border: 1px solid rgba(255, 255, 255, 0.7) !important;
  background: linear-gradient(160deg, rgba(23, 59, 64, 0.94), rgba(15, 34, 38, 0.96)) !important;
  backdrop-filter: blur(34px) saturate(1.4) !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), 0 4px 16px rgba(15, 34, 38, 0.14) !important;
}

@media (min-width: 1024px) {
  :root:root:root .lg-menu--fixed:not(.is-open) .lg-menu__tile {
    border-left: 0 !important;
  }
}

:root:root:root .lg-menu__tile > span {
  height: 1.5px;
  background: #FFFFFF !important;
}

:root:root:root .lg-menu.is-open .lg-menu__tile,
:root:root:root .lg-menu.is-open .lg-menu__tile:is(:hover, :focus, :active) {
  border: 1px solid rgba(255, 255, 255, 0.6) !important;
  border-radius: 22px !important;
  background: rgba(255, 255, 255, 0.14) !important;
  backdrop-filter: none !important;
  box-shadow: none !important;
}

:root:root:root .lg-menu__tile:focus-visible {
  outline: 2px solid #FFFFFF;
  outline-offset: 2px;
}

/* Proximity, per the guide: open within 48px of the edge; once open the zone
   reaches 384px, and leaving it closes the panel. */
@media (min-width: 1024px) {
  :root .lg-menu--fixed::before {
    width: 48px;
  }

  :root .lg-menu--fixed.is-open::before {
    width: 384px;
  }
}

/* =========================================================================
   11q. THE GUIDE, sections 1-3: HEADER, STAFF BANNER, HERO, CARDS, NUMBERS
   ========================================================================= */

/* Sidebar foot (guide section 4): a WHITE circle avatar. Partner's is a 28px
   accent-tinted disc inside a bordered card; the card goes, the disc is white. */
:root:root:root .lg-menu__panel .vc-sb-footer > div,
:root:root:root .lg-menu__panel :is([style*="--vc-sb-card-bg"], [style*="--bk-sidebar-card"]) {
  border: 0 !important;
  background: transparent !important;
}

:root:root:root .lg-menu__panel :is(.vc-sb-footer, footer, [class*="pb-3"]) [class*="rounded-full"]:is([class*="h-7"], [class*="h-8"], [class*="h-9"], [class*="h-10"]) {
  width: 36px;
  height: 36px;
  background: #FFFFFF !important;
  color: var(--lg-ink) !important;
}

:root:root:root .lg-menu__panel :is(.vc-sb-footer, footer, [class*="pb-3"]) [class*="rounded-full"]:is([class*="h-7"], [class*="h-8"], [class*="h-9"], [class*="h-10"]) :is(span, div) {
  color: var(--lg-ink) !important;
  text-shadow: none;
}

/* HEADER ROW: "all heights 40px". White pills, one black pill, a white circle
   bell with the red count, a black circle avatar. */
:root:root .lg-topbar :is(.lg-pill, .lg-search, .lg-chip, .lg-avatar) {
  height: 40px;
  min-height: 40px;
}

:root:root .lg-topbar :is(.lg-pill--icon, .lg-avatar) {
  width: 40px;
  min-width: 40px;
}

:root:root .lg-topbar .lg-pill__count {
  background: #D43D3F !important;
  color: #FFFFFF !important;
}

/* The client name in the header is type, not a pill: 15px / 500 / #4E5557. */
:root:root .lg-topbar .lg-pill--card {
  padding-inline: 0 !important;
  background: transparent !important;
  color: var(--lg-ink-2) !important;
  font-size: 15px;
  font-weight: 500;
}

/* STAFF BANNER: a full-width BLACK pill, 12.5px / 600, centred. Books drew a
   dark-teal square band. */
:root:root :is(.bk-staff-banner, [data-testid="staff-view-banner"], [class*="staff-banner"]) {
  border: 0 !important;
  border-radius: 999px !important;
  background: var(--lg-ink) !important;
  color: #FFFFFF !important;
  font-size: 12.5px !important;
  font-weight: 600 !important;
  text-align: center;
}

/* HERO: the guide's overlay, verbatim -- .42 -> .10 at 55% -> transparent --
   and its grid. Hero type carries a soft shadow so it holds on the bright
   right-hand side of the picture. */
:root:root .lg-hero,
:root:root:root .lg-cover {
  border-radius: 28px !important;
  background:
    #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center 40% / cover no-repeat !important;
}

:root:root .lg-hero {
  grid-template-columns: minmax(0, 1.4fr) minmax(300px, 440px);
}

:root:root :is(.lg-hero, .lg-cover) .lg-title {
  font-weight: 400 !important;
  line-height: 0.95 !important;
  letter-spacing: -0.03em !important;
  color: #FFFFFF !important;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.35), 0 0 22px rgba(15, 34, 38, 0.25);
}

:root:root :is(.lg-hero, .lg-cover) :is(.lg-hero__lead, .lg-cover__sub) {
  color: rgba(255, 255, 255, 0.88) !important;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.5), 0 0 16px rgba(15, 34, 38, 0.35);
}

/* The glass frame round the yellow card: 10px / r26 / glass; the card r18. */
:root:root .lg-upnext {
  padding: 10px;
  border: 1px solid rgba(255, 255, 255, 0.7);
  border-radius: 26px;
  background: rgba(255, 255, 255, 0.14);
  backdrop-filter: blur(30px) saturate(1.3);
}

:root:root .lg-upnext .lg-upnext__card {
  padding: 20px 22px;
  border-radius: 18px;
  background: var(--lg-highlight);
}

/* WHITE CARD: 24px 26px, r24, no border, no shadow. BIG NUMBER: 300 / 40-44. */
:root:root :is(.lg-stat, .lg-panel) {
  padding: 24px 26px;
  border: 0 !important;
  border-radius: 24px !important;
  background: #FFFFFF !important;
  box-shadow: none !important;
}

:root:root .lg-stat :is(.lg-stat__value, [class*="lg-stat__fig"]),
:root:root .lg-bare .bk-kpi-grid .bk-money[class*="font-size:clamp"] {
  font-size: clamp(32px, 2.9vw, 42px) !important;
  font-weight: 400 !important;
  letter-spacing: -0.02em !important;
}

/* "Never yellow elsewhere": Books' assistant card was lime. It is a white card. */
:root:root .lg-bare :is(.bk-assistant-card, [class*="assistant-card"], [data-tour="assistant"]) {
  background: #FFFFFF !important;
  background-image: none !important;
}

/* Section headings on the page: 400 / 30px / -0.02em, 22px of air above. */
:root:root .lg-section-title {
  margin-top: 22px;
  font-size: 30px !important;
  font-weight: 400 !important;
  letter-spacing: -0.02em !important;
}

/* 11q-assist. "One yellow card per page, always inside the glass frame in the
   hero. Never yellow elsewhere." Books' assistant card was a lime gradient
   (--bk-assist-grad) the size of two stat cards. It is a white card. */
:root:root:root {
  --bk-assist-grad: #FFFFFF;
  --bk-assist-shadow: none;
}

/* =========================================================================
   11r. EVERY BOOKS PAGE HAS THE HERO  (guide section 1: header row, hero
        panel, then white cards -- "apply to all pages, do not skip one")
   =========================================================================
   Books' 65 pages share ONE page header (BooksTopbar: eyebrow, title,
   description, then badge / bell / avatar). That component IS the hero now:
   the eyebrow is the glass pill, the title the 300-weight H1, the description
   the one-line lead, and the controls sit top-right as white pills. Done here
   rather than in 65 files so no page can be missed. The dashboard keeps its
   own composed hero (`.lg-bare`), so its copy of this header stays a slim row.

   The page's content sits on a white sheet that starts 12px under the hero:
   the sheet is the wrapper's ::before, which is why the hero has a fixed
   height on desktop. */
@media (min-width: 900px) {
  :root:root .lg-pane.lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) {
    padding: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
  }

  :root:root .lg-pane--padded:not(:has(.lg-bare)) div:has(> [data-guide="books-topbar"]) {
    position: relative;
    padding: 0 24px 28px;
  }

  /* The white sheet that used to sit here (a ::before pinned under the hero
     and filled --lg-white) is deliberately gone: it put every card on one
     surface, which is what the owner saw on 2026-09-20 -- "it feels like its
     one piece". Blocks are white cards with 12px of ground between them. */

  /* NOT the PageOrbs washes: they are `position: fixed; z-index: -1` siblings of
     the topbar, and lifting them to `relative` put 520px + 560px of invisible
     block ABOVE the hero — every page opened on a blank screen with its content
     ~1,100px down (live 2026-09-19, Sales → Debtors). */
  :root:root .lg-pane--padded:not(:has(.lg-bare)) div:has(> [data-guide="books-topbar"]) > :not(.bk-orb-drift, .bk-orb-drift2) {
    position: relative;
    z-index: 1;
  }


  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] {
    z-index: 2 !important;
    box-sizing: border-box;
    height: 300px;
    margin: 0 -24px 34px !important;
    padding: 30px 34px 36px !important;
    border: 0 !important;
    border-radius: 28px !important;
    background:
      #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center 40% / cover no-repeat !important;
    backdrop-filter: none !important;
    box-shadow: none !important;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div {
    height: 100%;
    flex-wrap: nowrap;
    align-items: stretch !important;
    padding: 0 !important;
  }

  /* left: back pill on top, then eyebrow / H1 / lead at the foot of the panel */
  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:first-child {
    flex-direction: column;
    align-items: flex-start !important;
    justify-content: flex-end;
    gap: 14px;
    min-width: 0;
    flex: 1 1 auto;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:first-child > button {
    margin-bottom: auto;
    height: 40px;
    padding: 0 18px !important;
    background: var(--lg-white) !important;
    color: var(--lg-ink) !important;
    font-size: 13.5px !important;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .min-w-0:has(> .bk-display) {
    display: flex !important;
    flex-direction: column;
    align-items: flex-start;
    gap: 12px;
    max-width: 100%;
  }

  /* right: the controls stay at the top */
  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:last-child {
    align-self: flex-start;
  }
}

/* eyebrow -> the glass pill */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .vacei-header-caption:first-child:not(:last-child) {
  display: inline-flex;
  align-items: center;
  height: 30px;
  padding: 0 14px;
  border: 1px solid rgba(255, 255, 255, 0.7);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.14);
  backdrop-filter: blur(30px) saturate(1.3);
  color: #FFFFFF !important;
  font-size: 10.5px !important;
  font-weight: 600 !important;
  letter-spacing: 0.14em !important;
  text-transform: uppercase;
}

/* title -> the H1 */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .bk-display {
  overflow: visible;
  white-space: normal;
  color: #FFFFFF !important;
  font-size: clamp(40px, 4.8vw, 72px) !important;
  font-weight: 400 !important;
  line-height: 0.98 !important;
  letter-spacing: -0.03em !important;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.35), 0 0 22px rgba(15, 34, 38, 0.25);
}

/* description -> the one-line lead */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .bk-display ~ .vacei-header-caption {
  overflow: visible;
  max-width: 60ch;
  white-space: normal;
  color: rgba(255, 255, 255, 0.88) !important;
  font-size: 15px !important;
  font-weight: 400 !important;
  line-height: 1.5;
  text-shadow: 0 1px 2px rgba(15, 34, 38, 0.5), 0 0 16px rgba(15, 34, 38, 0.35);
}

/* "Merge duplicates: header title + page H1 -> keep the H1 only." The hero
   carries the page's name, so the 30px line under it is the first heading of
   the content, not a second page title. */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) div:has(> [data-guide="books-topbar"]) h1:not(.bk-display) {
  font-size: 22px !important;
  font-weight: 500 !important;
  letter-spacing: -0.01em !important;
}

/* 11r-narrow. BUG FIX (owner: "what happened to the review page?"). The hero's
   PICTURE was inside the 900px media query while its WHITE type was not, so in
   a narrow window the page title was white on a white bar. Below 900px the
   hero is the same panel, sized by its content, sitting inside the page's
   white sheet (no fixed height, so no ::before sheet trick needed). */
@media (max-width: 899px) {
  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] {
    box-sizing: border-box;
    min-height: 170px;
    margin: 0 0 14px !important;
    padding: 18px 18px 20px !important;
    border: 0 !important;
    border-radius: 22px !important;
    background:
      #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center 40% / cover no-repeat !important;
    backdrop-filter: none !important;
    box-shadow: none !important;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div {
    flex-direction: column-reverse;
    align-items: stretch !important;
    gap: 14px;
    padding: 0 !important;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:first-child {
    flex-direction: column;
    align-items: flex-start !important;
    gap: 12px;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:first-child > button {
    height: 36px;
    padding: 0 16px !important;
    background: var(--lg-white) !important;
    color: var(--lg-ink) !important;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .min-w-0:has(> .bk-display) {
    display: flex !important;
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
  }

  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .bk-display {
    font-size: clamp(34px, 9vw, 48px) !important;
  }

  /* Anything else written on the panel (the "reply-only" note) is white too. */
  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:last-child :is(span, p, div):not([class*="rounded-full"]):not(button *) {
    color: rgba(255, 255, 255, 0.88) !important;
  }
}

/* Same for the desktop hero: loose text in the controls row is on the picture. */
@media (min-width: 900px) {
  :root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:last-child :is(span, p, div):not([class*="rounded-full"]):not(button *) {
    color: rgba(255, 255, 255, 0.88) !important;
    text-shadow: 0 1px 2px rgba(15, 34, 38, 0.5);
  }
}

/* 11r-yellow. The page's ONE yellow card, in the hero's glass frame. On the
   Review page the guide names it: "Connected reviews". Books renders that as a
   bordered <section> ABOVE the page (a direct child of the pane, from the
   route's layout), which put a stray block of text over the hero. On desktop
   it is lifted into the hero's right-hand side -- the ring is a box-shadow
   because there is no wrapper element to be the frame. Narrower, it is a plain
   white card above the hero. */
:root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) {
  max-width: none !important;
  margin: 0 0 12px !important;
  padding: 20px 22px !important;
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  background: var(--lg-white) !important;
}

:root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) h2 {
  margin: 0;
  font-size: 15px !important;
  font-weight: 600 !important;
}

:root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) :is(p, li) {
  font-size: 13px;
  line-height: 1.5;
}

@media (min-width: 1100px) {
  :root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) {
    position: relative;
  }

  :root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) {
    position: absolute;
    top: 104px;
    right: 44px;
    z-index: 4;
    box-sizing: border-box;
    width: min(420px, 30%);
    max-height: 152px;
    margin: 0 !important;
    overflow: auto;
    border-radius: 18px !important;
    background: var(--lg-highlight) !important;
    box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.18), 0 0 0 11px rgba(255, 255, 255, 0.7);
  }

  :root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) > * + * {
    margin-top: 6px !important;
  }
}

/* =========================================================================
   11s. EVERY PARTNER PAGE HAS THE HERO  (guide section 1)
   =========================================================================
   Rendered once, by TopHeader, under the header row: the firm as the glass
   eyebrow, the section's name as the H1. Shorter than a dashboard hero (these
   are working pages: tables must start above the fold), same picture, same
   overlay, same type. */
:root .lg-pagehero {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-end;
  gap: 12px;
  flex: none;
  box-sizing: border-box;
  min-height: 190px;
  margin-bottom: var(--lg-gap);
  padding: 26px 34px 30px;
  border-radius: 28px;
  background:
    #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center 40% / cover no-repeat;
}

:root .lg-pagehero__eyebrow {
  display: inline-flex;
  align-items: center;
  height: 30px;
  padding: 0 14px;
  border: 1px solid rgba(255, 255, 255, 0.7);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.14);
  backdrop-filter: blur(30px) saturate(1.3);
  color: #FFFFFF;
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

:root:root:root .lg-pagehero .lg-pagehero__title {
  margin: 0;
  font-size: clamp(36px, 4.2vw, 64px) !important;
}

@media (max-width: 767px) {
  :root .lg-pagehero {
    min-height: 140px;
    padding: 20px 20px 22px;
    border-radius: 22px;
  }
}

/* The page under it keeps its own 30px heading for the content ("Clients",
   "All engagements"): with the hero naming the page, that line is a section
   heading -- 22px / 500 -- not a second page title (guide section 7). */
:root:root:root .lg-pagehero ~ * .portal-page h1:not([class*="lg-"]) {
  font-size: 22px !important;
  font-weight: 500 !important;
  letter-spacing: -0.01em !important;
}

/* =========================================================================
   11t. THE SIDEBAR MUST READ ON ANYTHING  (owner, 2026-09-18, with a
        screenshot: the panel see-through over the page, rows unreadable;
        "also change the black text on similar menus")
   =========================================================================
   Two faults. (1) Books' panel computed `backdrop-filter: none` -- an older
   rule for .vacei-navigation outranked 11p -- so the guide's 55-62% glass sat
   unblurred over the page and its text fought the text behind it. (2) Even
   where the blur applies, the panel fades in through an opacity animation on
   its wrapper, and an ancestor below opacity 1 is a backdrop root: no blur for
   the length of the fade. A menu cannot depend on the blur to be legible. The
   glass keeps the guide's hue, border, blur, highlight and radius; its fill is
   deep enough (88-92%) to read with no blur at all: white is 4.6:1 at the top
   and 7:1 at the foot. */
:root:root:root:root :is(.lg-menu__panel, aside.vacei-navigation.lg-menu__panel, .vc-sb.lg-menu__panel) {
  background: linear-gradient(160deg, rgba(23, 59, 64, 0.94), rgba(15, 34, 38, 0.96)) !important;
  backdrop-filter: blur(34px) saturate(1.4) !important;
}

/* The same glass for the same menu wherever else it is mounted: the drawers
   below 1024px (Partner .vc-sb.is-drawer, Books/Client mobile navigation) had
   stayed white with ink text. */
:root:root:root :is(.vc-sb.is-drawer, .vacei-navigation:not(.lg-menu__panel)) {
  --portal-nav-ink: #FFFFFF;
  --portal-nav-muted: rgba(255, 255, 255, 0.8);
  --portal-nav-active: #FFFFFF;
  --portal-nav-active-ink: var(--lg-ink);
  --portal-nav-hover: rgba(255, 255, 255, 0.16);
  border: 1px solid rgba(255, 255, 255, 0.7) !important;
  background: linear-gradient(160deg, rgba(23, 59, 64, 0.96), rgba(15, 34, 38, 0.98)) !important;
  color: #FFFFFF !important;
}

:root:root:root :is(.vc-sb.is-drawer, .vacei-navigation:not(.lg-menu__panel)) :is(a, button, span, p, div, li, small, strong, h2, h3, label, svg) {
  color: #FFFFFF !important;
}

:root:root:root :is(.vc-sb.is-drawer, .vacei-navigation:not(.lg-menu__panel)) :is(nav a, nav button, .vc-sb-item) {
  background: transparent !important;
}

:root:root:root :is(.vc-sb.is-drawer, .vacei-navigation:not(.lg-menu__panel)) :is([aria-current="page"], .vc-sb-item.is-active) {
  background: #FFFFFF !important;
}

:root:root:root :is(.vc-sb.is-drawer, .vacei-navigation:not(.lg-menu__panel)) :is([aria-current="page"], .vc-sb-item.is-active),
:root:root:root :is(.vc-sb.is-drawer, .vacei-navigation:not(.lg-menu__panel)) :is([aria-current="page"], .vc-sb-item.is-active) :is(span, p, div, svg, strong, small) {
  color: var(--lg-ink) !important;
}

/* No ink left anywhere in the panel except on the white active pill. */
:root:root:root:root .lg-menu__panel :is(nav button[aria-expanded], .lg-menu__group),
:root:root:root:root .lg-menu__panel :is(nav button[aria-expanded], .lg-menu__group) :is(span, p, svg) {
  color: #FFFFFF !important;
}

:root:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) :is(span, p, div, strong) {
  color: #FFFFFF !important;
}

:root:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) svg :is(path, polygon, rect, circle, text):not([fill="none"]) {
  fill: #FFFFFF !important;
}

/* "MENU" was a dark band in Books (a background on the label). */
:root:root:root:root .lg-menu__panel::before {
  background: none !important;
  color: rgba(255, 255, 255, 0.8) !important;
}

/* =========================================================================
   11u. SIMPLER PAGES  (guide section 7: "the source app over-explains. Each
        page is cut to what the user acts on")
   =========================================================================
   `.lg-explain` marks copy that explains how the engine works rather than
   giving the user data or an action. The mark is put on in the component, so
   the text and its tests stay; the theme does not draw it. */
.lg-explain {
  display: none !important;
}

/* "No explanatory cards. A card must contain data or an action." Every Books
   sub-page opens with a cover card that is a title plus a paragraph -- and the
   hero above it already names the page ("merge duplicates: keep the H1 only").
   A cover with nothing to press in it is not drawn; one that carries a control
   stays, without its paragraph. */
:root:root .lg-pane--padded:not(:has(.lg-bare)) div:has(> [data-guide="books-topbar"]) > .bk-cover.vacei-page-header:not(:has(button, a, input, select, [role="tab"])) {
  display: none !important;
}

:root:root .lg-pane--padded:not(:has(.lg-bare)) div:has(> [data-guide="books-topbar"]) > .bk-cover.vacei-page-header > div > p {
  display: none !important;
}

/* "Filters as a chip row, not a card ... chips sit directly on the grey page
   (white pills)". Active = black, the rest white; 36px. */
:root:root .lg-pane--padded:not(:has(.lg-bare)) button[class*="rounded-full"][class*="whitespace-nowrap"][class*="py-[7px]"] {
  height: 36px;
  border: 0 !important;
  font-size: 13px !important;
}

/* A control card is one row of controls: title left, buttons right, 24px card. */
:root:root .lg-pane--padded .vacei-section-card {
  border: 0 !important;
  border-radius: var(--lg-r-card) !important;
  box-shadow: none !important;
}

/* =========================================================================
   11v. THE SIDEBAR: THE DESIGN'S OWN COLOUR AND ITS OWN ANIMATION
        (owner, 2026-09-18, with the artboard's open menu: "keep it same color
        and same animation style")
   =========================================================================
   COLOUR. 11t deepened the glass to 90-94% because nothing was blurring. That
   fault is fixed (unprefixed backdrop-filter; and the fade moved off the
   wrapper, below), so the fill is the guide's, exactly:
     linear-gradient(160deg, rgba(43,155,186,.55), rgba(30,104,125,.62))
     + blur(34px) saturate(1.4) + 1px rgba(255,255,255,.7) + inset highlight.

   ANIMATION, from the artboard's logic class:
     panel   translateX(calc(-100% - 16px)) scaleX(.92) -> none,
             .42s cubic-bezier(.32,1.25,.4,1); opacity .22s ease
     inside  translateX(-28px) -> 0, .5s cubic-bezier(.22,1,.36,1) .05s;
             opacity .3s ease .05s
     tab     slides out: translateX(-34px), opacity 0, .32s cubic-bezier(.22,1,.36,1)
     bars    top/bottom cross into an X, .3s; the middle one fades, .2s
   The opacity fade is on the PANEL, not its wrapper: an ancestor below
   opacity 1 is a backdrop root, which is why the glass had no blur while it
   faded in. */
:root:root:root:root :is(.lg-menu__panel, aside.vacei-navigation.lg-menu__panel, .vc-sb.lg-menu__panel) {
  background: linear-gradient(160deg, rgba(23, 59, 64, 0.94), rgba(15, 34, 38, 0.96)) !important;
  backdrop-filter: blur(34px) saturate(1.4) !important;
  border: 1px solid rgba(255, 255, 255, 0.7) !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), 0 24px 70px rgba(15, 34, 38, 0.22) !important;
}

@media (min-width: 1024px) {
  :root:root .lg-menu--fixed .lg-menu__ring {
    opacity: 1 !important;
    transform: translateX(calc(-100% - 16px)) scaleX(0.92) !important;
    transform-origin: left center;
    transition: transform 0.42s cubic-bezier(0.32, 1.25, 0.4, 1), visibility 0s linear 0.42s !important;
  }

  :root:root .lg-menu--fixed.is-open .lg-menu__ring {
    transform: translateX(0) scaleX(1) !important;
    transition: transform 0.42s cubic-bezier(0.32, 1.25, 0.4, 1), visibility 0s !important;
  }

  :root:root .lg-menu--fixed .lg-menu__panel {
    opacity: 0;
    transition: opacity 0.22s ease;
  }

  :root:root .lg-menu--fixed.is-open .lg-menu__panel {
    opacity: 1;
  }

  /* the inside follows the panel in */
  :root:root .lg-menu--fixed .lg-menu__panel > * {
    opacity: 0;
    transform: translateX(-28px);
    transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1) 0.05s, opacity 0.3s ease 0.05s;
  }

  :root:root .lg-menu--fixed.is-open .lg-menu__panel > * {
    opacity: 1;
    transform: translateX(0);
  }

  /* The tab does not fly across to become the close button: it slides out at
     the edge, and the close button arrives with the panel's contents. One
     element plays both parts, so each state has its own entrance. */
  :root:root:root .lg-menu--fixed .lg-menu__tile {
    transition: background 0.2s ease !important;
    animation: lg-tab-in 0.32s cubic-bezier(0.22, 1, 0.36, 1) both;
  }

  :root:root:root .lg-menu--fixed.is-open .lg-menu__tile {
    animation: lg-close-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) 0.05s both;
  }

  :root:root .lg-menu--fixed .lg-menu__tile > span {
    transition: transform 0.3s ease, opacity 0.2s ease, width 0.2s ease;
  }
}

@keyframes lg-tab-in {
  from { opacity: 0; transform: translateX(-34px); }
  to { opacity: 1; transform: translateX(0); }
}

@keyframes lg-close-in {
  from { opacity: 0; transform: translateX(-28px); }
  to { opacity: 1; transform: translateX(0); }
}

@media (prefers-reduced-motion: reduce) {
  :root:root .lg-menu--fixed :is(.lg-menu__ring, .lg-menu__panel, .lg-menu__panel > *, .lg-menu__tile) {
    transition: none !important;
    animation: none !important;
  }
}

/* =========================================================================
   11w. BOOKS PAGES, AS "Documents Review Glass" DRAWS THEM  (owner: "look at
        the reviews page ... how it was and how it became. We need to apply
        the same")
   =========================================================================
   Rendered side by side with the artboard, ours differed in four ways:
   (1) the page's controls were INSIDE the hero -- the artboard puts them in
       the header row (back pill + client name | Reply-only, a BLACK Refresh,
       bell, avatar). BooksTopbar portals them into BooksAppBar's slots now.
   (2) the hero carries only the label, the title and one line.
   (3) the content stood on a white sheet; the artboard has white CARDS on the
       grey page, 12px apart. The sheet (11r's ::before) goes.
   (4) chips: black when active, white otherwise, straight on the page. */

/* (1) the header row */
.lg-header-slot {
  display: contents;
}

:root:root .lg-topbar #lg-header-left button {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 40px;
  padding: 0 18px !important;
  border: 0;
  border-radius: 999px;
  background: var(--lg-white) !important;
  color: var(--lg-ink) !important;
  font-size: 13.5px !important;
  font-weight: 500;
}

:root:root .lg-topbar .lg-header-controls {
  gap: 8px !important;
  flex-wrap: nowrap;
}

/* every loose note in it ("Client access is reply-only ...") is a white pill */
:root:root .lg-topbar .lg-header-controls > :is(span, div, p):not(:has(button, a, input)):not(:empty) {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  max-width: 22ch;
  height: 40px;
  padding: 0 16px;
  overflow: hidden;
  border-radius: 999px;
  background: var(--lg-white);
  color: var(--lg-ink-2) !important;
  font-size: 13px !important;
  font-weight: 500 !important;
  letter-spacing: 0 !important;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* the page's own action in the header is THE black pill */
:root:root .lg-topbar .lg-header-controls :is(button, a):not([aria-label]):not(.lg-avatar) {
  height: 40px;
  padding: 0 20px !important;
  border: 0 !important;
  border-radius: 999px !important;
  background: var(--lg-ink) !important;
  color: var(--lg-white) !important;
  font-size: 13.5px !important;
  font-weight: 600 !important;
}

/* the bell is a white circle; the bar already has the account avatar */
:root:root .lg-topbar .lg-header-controls :is(button, a)[aria-label]:not([title]) {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 999px;
  background: var(--lg-white);
  color: var(--lg-ink) !important;
}

:root:root .lg-topbar .lg-header-controls button[title]:has(> span[class*="rounded-full"]) {
  display: none !important;
}

/* with a page's controls in the bar, its search gives way (the artboard's
   header is "back pill + client name" OR "client name + search", never both) */
:root:root .lg-topbar:has(#lg-header-left > *) .lg-search,
:root:root .lg-topbar:has(#lg-header-left > *) div:has(> .lg-search) {
  display: none !important;
}

/* (2) the hero: nothing but the words. Its emptied right-hand side collapses. */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div > div:last-child:empty {
  display: none;
}

/* the label is sentence case, 13px / 600, as drawn */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .vacei-header-caption:first-child:not(:last-child) {
  height: 32px;
  padding: 0 16px;
  font-size: 13px !important;
  font-weight: 600 !important;
  letter-spacing: 0 !important;
  text-transform: lowercase;
}

:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .vacei-header-caption:first-child:not(:last-child)::first-letter {
  text-transform: uppercase;
}

/* (3) white cards on the grey page -- no sheet. At EVERY width: a phone got
   the sheet too, and the guide's layouts reflow rather than switch. */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) div:has(> [data-guide="books-topbar"]) {
  padding: 0 0 28px;
}

:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] {
  margin: 0 0 var(--lg-gap) !important;
}

:root:root .lg-pane--padded:not(:has(.lg-bare)) .vacei-section-card {
  margin-bottom: var(--lg-gap);
  padding: 4px;
  background: var(--lg-white) !important;
}

/* nested cards inside a card are inset panels, not cards */
:root:root .lg-pane--padded:not(:has(.lg-bare)) .vacei-section-card .vacei-section-card {
  margin-bottom: 0;
  border-radius: 16px !important;
  background: var(--lg-inset) !important;
}

/* (4) the chip row sits on the page */
:root:root .lg-filter {
  height: 36px;
  padding: 0 16px !important;
  font-size: 13px !important;
  font-weight: 500 !important;
}

:root:root .lg-filter[aria-pressed="true"] {
  font-weight: 600 !important;
}

/* 11w-polish. ::first-letter needs a block box, so the label is inline-block
   (its height comes from line-height). And the yellow card is "one message +
   one link": of the two paragraphs Books writes, the first explains what a
   connected review IS; the second is the message. */
:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .vacei-header-caption:first-child:not(:last-child) {
  display: inline-block;
  height: auto;
  line-height: 30px;
}

@media (min-width: 1100px) {
  :root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) > p:first-of-type:not(:last-of-type) {
    display: none;
  }

  :root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) {
    top: 96px;
    max-height: 176px;
  }
}

/* 11s-client. The same "merge duplicates" rule wherever a page hero is drawn
   (Partner AND Client): the hero names the page, so the page's own 30px title
   under it is the first heading of the content -- 22px / 500 -- and its
   one-line description is the only helper text that survives (guide 7:
   "helper lines <= 12 words"). */
:root:root:root .lg-pagehero ~ * h1:not([class*="lg-"]) {
  font-size: 22px !important;
  font-weight: 500 !important;
  letter-spacing: -0.01em !important;
}

/* 11t-mark. A logo drawn as a MASKED box (Client's VaceiLogo: a span whose
   background shows through a mask-image) is neither an <svg> nor an <img>, so
   the "white mark" rules above missed it and the Client's V stayed teal on the
   teal glass. Whatever the technique, the mark in the menu is white. */
:root:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) [style*="mask"] {
  background: #FFFFFF !important;
}

:root:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) [style*="width: 1px"],
:root:root:root:root .lg-menu__panel :is(.lg-menu__brand, .vc-sb-brand) [class*="w-px"] {
  background: rgba(255, 255, 255, 0.35) !important;
}

/* 11t-partner. Seen on the signed-in Partner menu, 2026-09-18:
   - its row icons are MASKED boxes (.vc-sb-png), painted white -- right on the
     glass, invisible on the white active pill. Ink there.
   - the old rail's 3px active indicator bar still drew beside the pill. The
     white pill IS the indicator.
   - count badges were a pale-yellow chip with white digits (blank). On the
     glass a badge is frosted white with white digits; on the pill, ink. */
:root:root:root:root .lg-menu__panel .vc-sb-item .vc-sb-png {
  background-color: #FFFFFF !important;
}

:root:root:root:root .lg-menu__panel .vc-sb-item.is-active .vc-sb-png {
  background-color: var(--lg-ink) !important;
}

:root:root:root:root .lg-menu__panel .vc-sb-item::before,
:root:root:root:root .lg-menu__panel .vc-sb-item.is-active::before {
  display: none !important;
}

:root:root:root:root .lg-menu__panel .vc-sb-badge {
  border: 0 !important;
  background: rgba(255, 255, 255, 0.24) !important;
  color: #FFFFFF !important;
  text-shadow: none;
}

:root:root:root:root .lg-menu__panel .vc-sb-item.is-active .vc-sb-badge {
  background: rgba(23, 59, 64, 0.08) !important;
  color: var(--lg-ink) !important;
}

/* =========================================================================
   11x. A SLIGHTLY MORE COMPACT MENU  (owner, 2026-09-18: "make the sidebar
        menus slightly more compact")
   =========================================================================
   One step down from the artboard's 40px / 14px rows: 36px rows, 13.5px type,
   tighter blocks -- about 10% more rows in the same panel. Same glass, same
   pill, same order; all three portals and the audit workspace. */
:root:root:root:root .lg-menu__panel :is(nav a, nav button, .vc-sb-item, .lg-menu__group, a[class*="min-h-[38px]"], button[class*="min-h-[38px]"]) {
  min-height: 36px !important;
  height: auto;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  border-radius: 18px !important;
  font-size: 13.5px !important;
}

:root:root:root:root .lg-menu__panel :is(.lg-menu__group, nav button[aria-expanded]) :is(.vc-sb-group-label, span[class*="tracking-"]) {
  font-size: 13.5px !important;
}

:root:root:root:root .lg-menu__panel :is(.vc-sb-item-label, nav a span, nav button span) {
  font-size: 13.5px;
}

/* blocks sit closer together */
:root:root:root:root .lg-menu__panel nav ul.space-y-3 > li + li,
:root:root:root:root .lg-menu__panel nav > div[class~="pt-1.5"] {
  margin-top: 4px !important;
  padding-top: 0 !important;
}

:root:root:root:root .lg-menu__panel nav :is(ul.space-y-0\.5, ul.space-y-1) > li + li {
  margin-top: 1px !important;
}

:root:root:root:root .lg-menu__panel {
  padding: 18px 18px 16px !important;
}

:root:root:root:root .lg-menu__panel :is(.vc-sb-brand, .lg-menu__brand) {
  margin-bottom: 12px !important;
}

:root:root:root:root .lg-menu__panel::before {
  margin: 0 0 6px 2px;
}

/* the company switcher is one compact row too */
:root:root:root:root .lg-menu__panel .company-card {
  margin: 0 0 10px !important;
  padding: 7px 12px !important;
}

/* the close button keeps its place against the tighter padding */
@media (min-width: 1024px) {
  :root:root:root .lg-menu--fixed.is-open .lg-menu__tile {
    top: 30px;
    left: 246px;
    width: 40px;
    height: 40px;
    padding: 0 12px;
  }
}

/* 11x-admin. Books admin's menu rows were two lines each -- the label and a
   sentence describing the page ("What AI extraction costs, per c...") -- 16
   rows of reading. The artboard's rows are a label; the sentence stays as the
   link's tooltip, which it already is. */
:root:root:root:root .lg-menu__panel nav a span.block.truncate[class*="text-[11px]"] {
  display: none !important;
}

:root:root:root:root .lg-menu__panel nav a span.block.truncate[class*="text-[13.5px]"] {
  font-weight: 500 !important;
}

/* its review-queue count: frosted white, white digits (it was a pale chip). */
:root:root:root:root .lg-menu__panel nav a span[class*="rounded-full"][class*="text-[1"] {
  background: rgba(255, 255, 255, 0.24) !important;
  color: #FFFFFF !important;
}

:root:root:root:root .lg-menu__panel nav a[aria-current="page"] span.block.truncate {
  font-weight: 600 !important;
}

/* 11e-partner-chips. Two more from walking all 29 Partner routes after the
   guide: the bright accent as 11px chip text on its own tint (2.88:1), and
   the literal #007BC2 on #EBF4FA as 11-12px text (4.10:1). */
:root:root .a4-chip.a4-chip--auto {
  color: var(--lg-accent-read) !important;
}

:root:root :is(.a4-srt-status-pill--draft, .a4-srt-service-tag--accounting) {
  color: #005F96 !important;
}

/* =========================================================================
   11y. FILTER CHIPS, EVERYWHERE  (guide section 3: "height 36px, 999px; active
        = black with white text, others #F3F4F5; counts in #6B7075")
   =========================================================================
   Every portal marks its filter chips the same way -- a pill-shaped <button>
   carrying `aria-pressed` -- and each drew the active one in its own tinted
   teal. One rule, keyed on the semantics rather than on any portal's classes.
   (Switches use aria-checked, the Filings tiles are not pills: neither is
   touched.) */
:root:root :is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) button[aria-pressed][class*="rounded-full"]:not(.lg-menu__tile) {
  min-height: 36px;
  border-color: transparent !important;
  background: var(--lg-inset) !important;
  color: var(--lg-ink) !important;
  box-shadow: none !important;
}

:root:root :is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) button[aria-pressed="true"][class*="rounded-full"]:not(.lg-menu__tile) {
  background: var(--lg-ink) !important;
  color: var(--lg-white) !important;
}

:root:root :is(.portal-page, .lg-pane, .lg-shell .vfc-main-scroll) button[aria-pressed="true"][class*="rounded-full"]:not(.lg-menu__tile) :is(span, svg) {
  color: var(--lg-white) !important;
}

/* On the bare grey page (Books' chip rows) the resting chip is a WHITE pill. */
:root:root .lg-filter[aria-pressed="false"] {
  background: var(--lg-white) !important;
}

/* =========================================================================
   11z. A DENSER MENU  (owner, 2026-09-18, with a screenshot of a ~540px-tall
        window: "it's only opening up part of the window ... make the sidebar
        more compact so that more menu buttons show at the same time")
   =========================================================================
   Measured in that window: of a 516px panel only 335px was the list -- 101px
   went on the logo block and the "MENU" label, 79px on the foot -- and 36px
   rows with 4-12px between blocks showed 9 of 23 rows. Now: 32px rows, 13px
   type, no air between rows, a 36px logo row, a 46px foot. Same window: 12-13
   rows; a 900px window shows the whole menu. The list fades out at the bottom
   edge while there is more below, so "part of the list" reads as scrollable,
   not as cut off. */
:root:root:root:root:root .lg-menu__panel {
  padding: 12px 12px 10px !important;
}

:root:root:root:root:root .lg-menu__panel :is(.vc-sb-brand, .lg-menu__brand) {
  min-height: 36px !important;
  margin: 0 0 4px !important;
  padding: 0 44px 0 8px !important;
}

:root:root:root:root:root .lg-menu__panel::before {
  margin: 0 0 2px 8px !important;
  font-size: 9.5px !important;
  line-height: 16px !important;
}

:root:root:root:root:root .lg-menu__panel :is(nav a, nav button, .vc-sb-item, .lg-menu__group, a[class*="min-h-[38px]"], button[class*="min-h-[38px]"]) {
  min-height: 32px !important;
  padding-left: 10px !important;
  padding-right: 10px !important;
  gap: 10px;
  border-radius: 16px !important;
  font-size: 13px !important;
  line-height: 1.2;
}

:root:root:root:root:root .lg-menu__panel :is(.lg-menu__group, nav button[aria-expanded]) :is(.vc-sb-group-label, span[class*="tracking-"]),
:root:root:root:root:root .lg-menu__panel :is(.vc-sb-item-label, nav a span, nav button span) {
  font-size: 13px !important;
}

:root:root:root:root:root .lg-menu__panel :is(nav svg, .vc-sb-png) {
  width: 16px;
  height: 16px;
}

/* no air between rows or between blocks; the hairline alone separates groups */
:root:root:root:root:root .lg-menu__panel nav :is(ul, div) > :is(li, div, a) + :is(li, div, a) {
  margin-top: 0 !important;
}

:root:root:root:root:root .lg-menu__panel nav ul.space-y-3 > li + li,
:root:root:root:root:root .lg-menu__panel nav > div[class~="pt-1.5"] {
  margin-top: 2px !important;
  padding-top: 2px !important;
}

:root:root:root:root:root .lg-menu__panel .vc-sb-group {
  padding-top: 0 !important;
}

:root:root:root:root:root .lg-menu__panel .vc-sb-divider {
  margin: 2px 8px !important;
}

:root:root:root:root:root .lg-menu__panel .company-card {
  margin: 0 0 4px !important;
  padding: 5px 10px !important;
}

/* the foot: one 46px row */
:root:root:root:root:root .lg-menu__panel :is(.vc-sb-footer, footer) {
  padding-top: 6px !important;
}

:root:root:root:root:root .lg-menu__panel :is(.vc-sb-footer, footer) > div {
  padding: 0 !important;
}

:root:root:root:root:root .lg-menu__panel :is(.vc-sb-footer, footer, [class*="pb-3"]) [class*="rounded-full"]:is([class*="h-7"], [class*="h-8"], [class*="h-9"], [class*="h-10"]) {
  width: 30px;
  height: 30px;
}

/* more below? the list fades at its lower edge instead of ending in a hard cut */
:root:root:root .lg-menu__panel nav {
  -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent 100%);
  mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent 100%);
  padding-bottom: 14px;
  scrollbar-width: none;
}

/* the close button, against the tighter frame */
@media (min-width: 1024px) {
  :root:root:root:root .lg-menu--fixed.is-open .lg-menu__tile {
    top: 26px;
    left: 258px;
    width: 32px;
    height: 32px;
    gap: 4px;
    padding: 0 9px;
    border-radius: 16px !important;
  }

  :root:root:root:root .lg-menu--fixed.is-open .lg-menu__tile > span:nth-child(1) { transform: translateY(5.5px) rotate(45deg); }
  :root:root:root:root .lg-menu--fixed.is-open .lg-menu__tile > span:nth-child(3) { transform: translateY(-5.5px) rotate(-45deg); }
}

/* 11z-groups. The last of the air: a group's header and its list are one block
   (Tailwind's space-y-1 put 4px between them), and groups butt against each
   other with only the hairline between. */
:root:root:root:root:root .lg-menu__panel nav .vc-sb-group > * + *,
:root:root:root:root:root .lg-menu__panel nav [class*="space-y-"] > * + * {
  margin-top: 0 !important;
}

:root:root:root:root:root .lg-menu__panel nav ul.space-y-3 > li + li,
:root:root:root:root:root .lg-menu__panel nav > div[class~="pt-1.5"] {
  margin-top: 0 !important;
  padding-top: 0 !important;
}

/* =========================================================================
   11zz. CODE REVIEW 2026-09-18 -- three cascade accidents, each verified in
         Chromium by the reviewer and reproduced on 2026-09-19. In each case a
         later, heavier rule silently undid an earlier fix. These come LAST
         and outweigh everything above; do not add rules for the same
         properties below them.
   ========================================================================= */

/* 1. The phone hero. `@media (max-width: 900px) { :root .lg-hero { ...1fr } }`
   (0,2,0) lost to the later unconditional `:root:root .lg-hero { 1.4fr / 440px }`
   (0,3,0): media queries add no weight. Measured at 375px: the title track was
   0px wide, the "Up next" track held its 300px floor, and the page scrolled
   sideways. One column below 900px, at a weight nothing above can beat. */
@media (max-width: 900px) {
  :root:root:root:root:root .lg-hero {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* 2. The menu panel's fill. 11v restored the guide's 55%/62% glass over 11t's
   90%/94%, and white type on it measured 1.85-3.14:1 against the grey canvas
   and white cards that sit behind a full-height panel; WCAG does not count
   the blur. 11t's fill again: the same hue, deep enough to read with no blur
   at all (white 4.6:1 at the top, 7:1 at the foot). */
:root:root:root:root:root :is(.lg-menu__panel, aside.vacei-navigation.lg-menu__panel, .vc-sb.lg-menu__panel) {
  background: linear-gradient(160deg, rgba(23, 59, 64, 0.94), rgba(15, 34, 38, 0.96)) !important;
}

/* 3. The hero's shade. 11q restored the guide's .42 -> .10 -> 0 over 11c's
   .62 -> .32 -> .06, and against the real tile the H1's worst pixel measured
   2.24:1 (the 15px lead 1.70:1). 11c's shade again over the same picture:
   title >= 3:1 on every pixel of the type area. `background` is re-stated in
   full because the tile and the shade are one shorthand. */
:root:root:root:root:root .lg-hero {
  background:
    #346A76 linear-gradient(112deg, #346A76 0%, #376C79 50%, #3B717E 100%) center 40% / cover no-repeat !important;
}

/* 4. The phone top bar. `.lg-header-controls { flex-wrap: nowrap }` and the
   bar's own single line re-created the horizontal scroll: at 375px the avatar
   sat at x=418 on a 375px screen. Below 640px the bar and the page controls
   may wrap onto a second row; nothing is lost, it just stacks. */
@media (max-width: 640px) {
  :root:root:root:root:root .lg-topbar {
    flex-wrap: wrap;
    row-gap: 8px;
  }
  :root:root:root:root:root .lg-topbar .lg-header-controls,
  :root:root:root:root:root .lg-topbar__group {
    flex-wrap: wrap;
    min-width: 0;
  }
}

/* 5. The summoned search. On a page with a back pill the bar's global search
   is hidden (above: "back pill + name OR name + search, never both"), which
   left the ⌘K / "/" shortcut focusing a display:none input. The shortcut now
   marks the field `is-summoned` before focusing; while it is, the field shows
   again, and the mark clears on blur. */
:root:root:root:root:root .lg-topbar:has(#lg-header-left > *) div:has(> .lg-search.is-summoned),
:root:root:root:root:root .lg-topbar:has(#lg-header-left > *) .lg-search.is-summoned {
  display: flex !important;
}

/* 6. Keyboard focus you can see. The tile's ring was 2px WHITE (1.23:1 on the
   canvas) and the general ring the accent teal (under 3:1 on the canvas).
   Every focusable control on a light surface gets a 2px ink ring, offset so
   it never sits on the control's own edge; on the teal menu panel and inside
   the hero the ring is white. Mouse clicks do not show it (:focus-visible). */
:root:root:root:root:root :is(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--lg-ink) !important;
  outline-offset: 2px !important;
  box-shadow: none !important;
}

:root:root:root:root:root :is(.lg-menu__panel, .lg-hero, .lg-cover) :is(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline-color: #FFFFFF !important;
}

/* 7. The open menu's invisible hot zone. It reached 384px while the panel is
   292px wide at left 12, so an 80px band of page content beside the open
   panel was unclickable (elementFromPoint returned the menu host). The zone
   now ends 12px past the panel's edge: enough to drift, not enough to cover
   anything. */
@media (min-width: 1024px) {
  :root:root:root:root:root .lg-menu--fixed.is-open::before {
    width: 316px;
  }
}

/* 8. No backdrop-filter, no glass. The sheet authors `backdrop-filter`
   unprefixed only (Next/Lightning CSS keeps just the -webkit- form when both
   are written), so a browser without unprefixed support gets no blur at all:
   the 10%-white thin glass under white type is then white on the render, and
   the 94% card lets the render through. Solid fallbacks for those browsers. */
@supports not (backdrop-filter: blur(1px)) {
  :root:root:root:root:root {
    --lg-thin: rgba(15, 34, 38, 0.62);
    --lg-thin-smoke: rgba(15, 34, 38, 0.72);
    --lg-glass: rgba(255, 255, 255, 0.98);
  }
}

/* 9. Type on the theme's dark emphasis fills. The sheet maps --a4-inverse
   and --vc-surface-dark to --lg-ink (black) (NOT --vc-fill-active: that one is
   the pale tint everywhere but inside the menu panel), but chips and
   panels painted with them kept their light-surface type: the AA teal
   (whole-token match, ~=, so a hover:bg-[...] variant on a light row is
   left alone: a substring match turned 260 light-row labels white)
   (1.5-1.8:1) and the stone ink (3.2:1), measured on the Partner audit
   workspace (fixed-assets dashboard "live" chips, "Other sections"). Anything
   on those fills reads in white. */
:root:root:root:root:root :is([class~="bg-[var(--a4-inverse)]"], [class~="bg-[var(--vc-surface-dark)]"]) {
  color: #FFFFFF !important;
}
:root:root:root:root:root :is([class~="bg-[var(--a4-inverse)]"], [class~="bg-[var(--vc-surface-dark)]"], .a4-sec-dash-sidebar, .a4-sec-analytics-canvas) :is([class*="text-a4-stone"], [class*="text-a4-mute"], [class*="var(--vc-teal)"], [class*="text-[#8"], [class*="text-[#5"], [class*="text-[#6"], [class*="text-[#7"]):not([class*="bg-white"]):not([class*="bg-a4-surface"]) {
  color: rgba(255, 255, 255, 0.85) !important;
}

/* 10. a4-exact.css (the audit workspace's own era) keeps white type on
   surfaces the theme turned white, the bright accent on pale green and a
   faint table head. Measured on the orchestrator and outstanding-actions
   pages: 1.00:1, 2.85:1, 2.70:1. */
:root:root:root:root:root .a4-orc-run-metric__value,
:root:root:root:root:root .a4-act-hero__stat-value,
:root:root:root:root:root .a4-act-hero__title,
:root:root:root:root:root .a4-act-hero h1 {
  color: var(--lg-ink) !important;
}
:root:root:root:root:root .a4-act-hero__stat-label,
:root:root:root:root:root .a4-orc-run-metric__label,
:root:root:root:root:root .a4-act-table__head-cell {
  color: var(--lg-ink-3) !important;
}
:root:root:root:root:root .a4-orc-run-status--done {
  color: var(--lg-positive) !important;
}
:root:root:root:root:root .a4-orc-flow__output {
  color: var(--lg-accent-read) !important;
}

/* 11. Books landing: 9.5px captions in #8E8E8E on the white card (3.14:1,
   15 per page). Same treatment as the other hard-coded greys. */
:root:root:root:root:root :is([class*="text-[#8e8e8e]"], [class*="text-[#8E8E8E]"], [class*="text-[#a8a8a8]"], [class*="text-[#A8A8A8]"], [class*="text-[#b0b0b0]"], [class*="text-[#B0B0B0]"]) {
  color: var(--lg-ink-3) !important;
}

/* =========================================================================
   12. THE CARD SPLIT  (guide section 2: "Page background #E5E8EA … Card #fff
       (solid)"; section 6: "Cards below the hero are solid white, not glass.
       Glass lives only on the hero and sidebar.")
   =========================================================================
   Owner, 2026-09-20, with a screenshot of the Books Banks page: "There should
   be a clear card split - not the same color it feels like its one piece."

   Two causes, both measured against this sheet in
   payrix-brand/preview/card-split-harness.html (open it and call __measure()):

   (a) section 9c painted the content PANE itself `var(--lg-glass)`. Over the
       ground that computes to #FDFEFE, so a white card on it reads 1.0104:1 --
       no edge at all. With the pane cleared the same card reads 1.2308:1.
       Sections 11w and 11zz had already cut holes in the slab for the
       dashboard and for sub-pages at >=900px, but each hole is keyed on
       markup (`:has(> .bk-kpi-grid)`, `:has([data-guide="books-topbar"])`), so
       any page whose wrapper did not match kept the slab. The hole is now the
       rule for the whole Books pane, at a weight nothing above can beat.
       Partner and Client keep theirs until each has had the same audit --
       their pages are authored on the canvas, not in cards (see 9c).

   (b) the same sub-page rule drew ONE solid white sheet behind ALL of the
       content (`::before`, `inset: 312px 0 0 0`), and 11w hid it above 900px
       only, so a phone still got the sheet. That rule is deleted outright in
       11w rather than overridden here: the 12px of ground between blocks IS
       the split.

   Nothing here adds a surface. Blocks that were already white cards keep
   their fill and simply gain an edge; the ground does the rest. */
:root:root:root:root:root .lg-pane {
  background: transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  box-shadow: none !important;
}

/* The card surface is SOLID -- done in section 8's card rule (`background:
   var(--lg-white)`), NOT by re-pointing --lg-glass. The token is also
   --vc-sb-card-bg, whose vendored sheet pairs it with a `:hover { #fff }`;
   flattening the token would make that hover a no-op. Cards are white, the
   token stays glass for the surfaces that are still glass. */

/* A HERO WITH NO YELLOW CARD IS ONE COLUMN.
   Found 2026-09-20 in payrix-brand/preview/hero-harness.html. Section 11b
   already collapsed a hero that has no .lg-upnext child, but `:has()` inside
   `:not()` contributes only a class's worth of weight, so that selector is
   (0,3,0) — exactly the same as the later two-column `:root:root .lg-hero`.
   A tie goes to source order, the two-column rule comes second, and the
   collapse never applied. Measured in Chromium at 1440: a hero with no
   .lg-upnext child computed `801px 440px`, an empty 440px track down its
   right-hand side.

   It hit a MANUAL company's dashboard (no assistant, so no yellow card),
   /companies, /companies/new, and any hero in any of the three portals that
   does not carry a right-hand card. */
:root:root:root:root:root .lg-hero:not(:has(> .lg-upnext)),
:root:root:root:root:root .lg-hero--center {
  grid-template-columns: minmax(0, 1fr);
}
/* -------------------------------------------------------------------------
   10. FOCUS IS NOT DECORATION
       Nothing above may remove it. Restated so a later sweep cannot.
   ---------------------------------------------------------------------- */
:is(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--lg-accent);
  outline-offset: 2px;
}
/* Vacei brand alignment, 2026-09-22: original green teal across all portals.
   The neutral canvas, white cards and semantic status colours are unchanged. */

/* Compact portal layout, 2026-09-22. Content determines height; controls
   share a baseline and wrap instead of pushing the page outside the viewport. */
:root:root:root:root:root .lg-frame {
  width: 100%; max-width: 1600px; margin-inline: auto; box-sizing: border-box;
}
:root:root:root:root:root .lg-topbar {
  flex-wrap: wrap !important; align-items: center; gap: 8px 12px;
  min-height: 44px; margin-bottom: 16px;
}
:root:root:root:root:root .lg-topbar :is(.lg-header-controls, .lg-topbar__group) {
  flex-wrap: wrap !important; min-width: 0; gap: 8px;
}
:root:root:root:root:root .lg-topbar :is(.lg-pill,.lg-search,.lg-chip,.lg-avatar) {
  font-size: 13px; text-shadow: none !important;
}
:root:root:root:root:root .lg-pill {
  align-items: center; justify-content: center; gap: 8px; text-align: center;
  font-weight: 600; text-shadow: none !important;
}
:root:root:root:root:root :is(.lg-hero,.lg-cover,.lg-pagehero) {
  height: auto !important; min-height: 0 !important; border-radius: 22px !important;
  padding: 24px 28px !important; align-items: center; gap: 20px;
}
:root:root:root:root:root :is(.lg-hero,.lg-cover,.lg-pagehero) .lg-title,
:root:root:root:root:root .lg-pagehero__title {
  font-size: clamp(28px, 3vw, 42px) !important; font-weight: 400 !important;
  line-height: 1.12 !important; letter-spacing: -.025em !important;
  max-width: 100% !important; text-shadow: none !important;
}
:root:root:root:root:root .lg-hero__lead { gap: 12px; min-width: 0; }
:root:root:root:root:root :is(.lg-hero,.lg-cover) :is(.lg-cover__sub,.cdv2-hero-sub) {
  font-size: 14px; line-height: 1.5; text-shadow: none !important;
}
:root:root:root:root:root .lg-actions {
  display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 10px;
}
:root:root:root:root:root .lg-action {
  flex-direction: row; justify-content: center; align-items: center;
  min-height: 40px; padding: 8px 14px; gap: 8px; border-radius: 999px;
  background: #fff !important; color: #183f48 !important;
  font-size: 13px; font-weight: 600; text-shadow: none !important;
}
:root:root:root:root:root .lg-action__icon {
  width: 18px; height: 18px; min-width: 18px; background: transparent !important;
}
:root:root:root:root:root .lg-action__icon svg { width: 18px; height: 18px; }
:root:root:root:root:root :is(.cdv2-hero-tabs,.bk-cover-tabrow) {
  display: flex; flex-wrap: wrap; justify-content: center; gap: 8px;
}
:root:root:root:root:root :is(.cdv2-hero-tabs,.bk-cover-tabrow) .lg-pill {
  min-height: 40px; height: auto; padding: 10px 18px;
}
:root:root:root:root:root .lg-upnext { padding: 0; border: 0; background: none; backdrop-filter: none; }
:root:root:root:root:root .lg-upnext__card { padding: 20px; border-radius: 18px; }
/* Books page headings used a 300px fixed canvas even for a two-word title. */
:root:root:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] {
  height: auto; min-height: 0; padding: 24px 28px !important; margin-bottom: 20px !important;
}
:root:root:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] > div {
  height: auto; flex-wrap: wrap; gap: 16px; align-items: center !important;
}
:root:root:root:root:root .lg-pane--padded:not(:has(.lg-bare)) [data-guide="books-topbar"] .bk-display {
  font-size: clamp(28px,3vw,42px) !important; line-height: 1.12 !important;
  font-weight: 400 !important; text-shadow: none !important;
}
/* Connected-review cards remain in normal flow beside compact headings. */
:root:root:root:root:root .lg-pane--padded:has([data-guide="books-topbar"]):not(:has(.lg-bare)) > section:not(:has([data-guide="books-topbar"])) {
  position: relative; top: auto; right: auto; width: 100%; max-height: none;
  margin-bottom: 16px !important; box-shadow: none;
}
/* The Books overview previously absolutely positioned all hero controls. */
:root:root:root:root:root .lg-cover {
  display: grid !important; grid-template-columns: minmax(0,1fr) minmax(280px,360px);
  grid-template-areas: "status next" "lead next" "tabs tools";
}
:root:root:root:root:root .lg-cover__status { grid-area: status; position: static !important; }
:root:root:root:root:root .lg-cover__lead { grid-area: lead; padding: 0 !important; min-width: 0; gap: 12px; }
:root:root:root:root:root .lg-cover .lg-cover__upnext {
  grid-area: next; position: static; width: 100%; align-self: start;
}
:root:root:root:root:root .lg-cover__tools {
  grid-area: tools; position: static !important; justify-content: center; flex-wrap: wrap;
}
:root:root:root:root:root .lg-cover .bk-cover-tabrow {
  grid-area: tabs; position: static !important; margin-top: 0;
}
:root:root:root:root:root .lg-cover .bk-cover-thumbs { display: none !important; }
:root:root:root:root:root .lg-cover__lead > .flex { justify-content: center; }
:root:root:root:root:root [data-testid="books-app-bar"] [data-testid="firm-review-button"] {
  min-height: 40px; justify-content: center; padding: 8px 16px; font-size: 13px;
}
:root:root:root:root:root [data-testid="books-app-bar"] .lg-search { width: 190px; }
:root:root:root:root:root [data-testid="books-app-bar"] .lg-search input { min-width: 0; }
@media (max-width: 1099px) {
  :root:root:root:root:root .lg-cover {
    grid-template-columns: minmax(0,1fr); grid-template-areas: "status" "lead" "tabs" "tools";
  }
}
@media (max-width: 640px) {
  :root:root:root:root:root :is(.lg-hero,.lg-cover,.lg-pagehero) { padding: 20px !important; gap: 16px; }
  :root:root:root:root:root .lg-topbar { justify-content: center; }
  :root:root:root:root:root [data-testid="books-app-bar"] > .flex-1 { display: none; }
  :root:root:root:root:root [data-testid="books-app-bar"] [data-testid="appbar-company"] { max-width: 100%; }
  :root:root:root:root:root .lg-actions { gap: 8px; }
}

/* =========================================================================
   13. BRAND ALIGNMENT  (owner, 2026-09-24: the portals match the brand kit,
       the new vacei.com and the new videos exactly)
   =========================================================================
   Section 1 carries the colours and the face. What is left here are the
   brand rules a token cannot express.

   WEIGHT. vacei.com loads Google Sans Flex at 400-600 and nothing heavier:
   headlines are 400, labels 500, emphasis 600. The variable font itself goes
   to 1000, so a `font-bold` (700) or a bare <b>/<strong> ("bolder") would
   render heavier than anything the brand ever shows. Cap them at 600. Inline
   fontWeight styles are not reached; they are few and mostly 600 already. */
:root:root :is(.font-bold, .font-extrabold, .font-black, b, strong) {
  font-weight: 600;
}

/* The accent phrase in the sign-in pane's lead ("…from one firm workspace.")
   was white at 62% alpha. On the site's cover gradient that is under 3:1 at
   the light end; vacei.com sets the same role (its hero <em>) in solid
   #E5EEEA -- 4.6:1 at the lightest stop, 5.1:1 at the darkest. */
:root .lg-login .lg-login__lead span {
  color: #E5EEEA !important;
}

/* -------------------------------------------------------------------------
   13b. BRAND ROLES THE OLDER SHEETS STILL SET
        Tokens declared by per-portal sheets (and by portal-unified.css, which
        is shared and loads just before this file) that this sheet did not
        re-point, so they kept pre-rebrand values: charcoal "dark" surfaces,
        the retired lime #C7EF3E, a blue band ink, a charcoal document-header
        gradient. Tokens nothing references in a given repo are inert.
   ---------------------------------------------------------------------- */
:root:root:root {
  --vc-doc-header-gradient: var(--lg-cover);   /* was #121214 -> #32323C (19 Partner hero bands) */
  --vf-teal-35:             rgba(52, 106, 118, 0.35);  /* was rgba(91,145,255,.35): the dashed drop zones */
  --vf-teal-band-ink:       var(--lg-accent-deep);     /* was #2F5FC7 / #0A443D */
  --a4-suite-accent-hsl:    191 39% 33%;               /* was 220.2 100% 67.8% (blue) */
  --vacei-primary-hover-hsl: 190 43% 10%;              /* #0F2226 (was charcoal 240 4.5% 17.3%) */
  --bk-ink-teal-900:        var(--lg-ink-deep);
  --bk-ink-teal-800:        var(--lg-ink);
  --bk-ink-teal-700:        var(--lg-accent-deep);
  --a4-hero-dark:           var(--lg-ink);             /* Partner hero assistant: was #101014 */
  --bk-dark:                var(--lg-ink);             /* was #101014 */
  --v-dark:                 var(--lg-ink);             /* was #101014 */
  --vacei-foreground:       var(--lg-ink);             /* was #18191D */
  --a4-suite-foreground:    var(--lg-ink);             /* was #18191D */
  --bk-dc-ink:              var(--lg-ink);             /* was #16211F */
  --bk-dc-teal-dark:        var(--lg-accent-deep);     /* was #0A443D */
  /* Lime: the brand's one lime is #E9F16D. Its family (hover #DFE95C, border
     #C9CF3E, tint #F7FADF) is the one books-tokens' --bk-dc-lime-* already
     uses; the retired #C7EF3E / #FAFD86 / #E7EBB4 go. */
  --bk-lime:                var(--lg-lime);
  --bk-autopilot-dot:       var(--lg-lime);
  --vacei-lime:             var(--lg-lime);
  --vacei-lime-1:           #F7FADF;
  --vacei-lime-2:           var(--lg-lime);
  --vacei-lime-ink:         var(--lg-ink);

  /* Tailwind blue and indigo. The brand has no blue (the navy/blue kit was
     retired with the July rebrand), yet ~900 `*-blue-*` / `*-indigo-*`
     utilities remain across the three apps for info states, links and chart
     series. Re-pointing the theme ramp moves every one of them to the brand
     teal at once. Each stop is a colour vacei.com itself uses; 500 and up are
     AA as text on white (500 #4E7B84 = 4.68:1, 600 = 6.05:1). */
  --color-blue-50:  #EBF0F0;  --color-indigo-50:  #EBF0F0;
  --color-blue-100: #E4EEEF;  --color-indigo-100: #E4EEEF;
  --color-blue-200: #D3E3E5;  --color-indigo-200: #D3E3E5;
  --color-blue-300: #9BC4CC;  --color-indigo-300: #9BC4CC;
  --color-blue-400: #6B939B;  --color-indigo-400: #6B939B;
  --color-blue-500: #4E7B84;  --color-indigo-500: #4E7B84;
  --color-blue-600: #346A76;  --color-indigo-600: #346A76;
  --color-blue-700: #2A545E;  --color-indigo-700: #2A545E;
  --color-blue-800: #173B40;  --color-indigo-800: #173B40;
  --color-blue-900: #0F2226;  --color-indigo-900: #0F2226;
  --color-blue-950: #0A1417;  --color-indigo-950: #0A1417;

  /* The weight ceiling (see 13), for every Tailwind weight utility and its
     variants (md:font-bold, hover:font-black, ...), which the class selector
     in 13 cannot reach. */
  --font-weight-bold:      600;
  --font-weight-extrabold: 600;
  --font-weight-black:     600;
}

/* Books' client dashboard (.cdv2) and phone app (.m-shell) declare their own
   artboard palettes on their roots, so a :root token cannot reach them; this
   selector outranks both. Semantic colours (green, amber, red, gold, the
   Manager purple) keep their meaning and are not touched. */
:root:root:root .cdv2 {
  --c-teal:       var(--lg-accent);          /* was #2E6467 */
  --c-teal-dark:  var(--lg-accent-deep);     /* was #1E4A4D */
  --c-teal-deep:  var(--lg-ink);             /* was #173F42 */
  --c-teal-light: #3B717E;                   /* the cover's light stop (was #3B7A74) */
  --c-lime:       var(--lg-lime);            /* was #D3E45F */
  --c-ink:        var(--lg-ink);             /* was #17282B */
  --c-ink-dark:   var(--lg-ink-deep);        /* was #101B1D */
  --c-ink-lime:   var(--lg-ink);             /* was #1C260D */
  --c-body:       var(--lg-ink-2);           /* was #5E7175 */
  --c-mute:       var(--lg-ink-3);           /* was #8A9A9D: 2.9:1, now AA */
  --c-mute-2:     var(--lg-ink-3);           /* was #9AA9AC */
  --c-line:       var(--lg-hairline);        /* was #EDF1F2 */
}

:root:root:root .m-shell {
  --m-teal-deep:  var(--lg-ink);             /* was #173F42 */
  --m-teal-mid:   #3B717E;                   /* was #3B7A74 */
  --m-lime-1:     #F7FADF;                   /* was #F2F7C4 */
  --m-lime-2:     var(--lg-lime);            /* was #E2ED8A */
  --m-lime-3:     #DFE95C;                   /* was #D3E45F */
  --m-lime-dot:   var(--lg-lime);            /* was #C9F26E */
  --m-camera:     var(--lg-ink-deep);        /* was #0C1415 */
}

/* Hard-coded near-black and retired-blue utilities. `~=` matches a whole
   class token only, so `hover:bg-[#111]` or `bg-[#111]/50` are never caught
   and a white button with a dark hover stays white. Case-insensitive (`i`):
   the apps write both #191c1f and #191C1F. Same approach as the existing
   `text-[#428619]` / `text-[#00a87e]` re-points above. */
:root:root :is([class~="text-[#191c1f]" i], [class~="text-[#111111]" i], [class~="text-[#111]" i],
               [class~="text-[#151515]" i], [class~="text-[#101014]" i], [class~="text-[#17221e]" i],
               [class~="text-black"]) {
  color: var(--lg-ink) !important;
}

:root:root :is([class~="bg-[#191c1f]" i], [class~="bg-[#111111]" i], [class~="bg-[#111]" i],
               [class~="bg-[#151515]" i], [class~="bg-[#101014]" i], [class~="bg-[#17221e]" i],
               [class~="bg-black"]) {
  background-color: var(--lg-ink) !important;
}

:root:root :is([class~="text-[#3f4fe3]" i], [class~="text-[#494fdf]" i], [class~="text-[#4f46e5]" i],
               [class~="text-[#6366f1]" i], [class~="text-[#3b82f6]" i], [class~="text-[#2563eb]" i]) {
  color: var(--lg-accent-read) !important;
}

:root:root :is([class~="bg-[#3f4fe3]" i], [class~="bg-[#494fdf]" i], [class~="bg-[#4f46e5]" i],
               [class~="bg-[#6366f1]" i], [class~="bg-[#3b82f6]" i], [class~="bg-[#2563eb]" i],
               [class~="bg-[#00a87e]" i]) {
  background-color: var(--lg-accent) !important;
}

:root:root :is([class~="bg-[#00a87e]/10" i], [class~="bg-[#00a87e]/5" i], [class~="bg-[#00a87e]/15" i]) {
  background-color: var(--lg-accent-bg) !important;
}

:root:root :is([class~="border-[#3f4fe3]" i], [class~="border-[#494fdf]" i], [class~="border-[#4f46e5]" i],
               [class~="border-[#3b82f6]" i], [class~="border-[#00a87e]" i]) {
  border-color: var(--lg-accent) !important;
}
