/* ===========================================================================
   vacei-sidebar.css — CANONICAL white-glass sidebar skin
   v1.1.1 · 2026-07-28
   ---------------------------------------------------------------------------
   v1.1.1 — two fixes found by implementers, both invisible to a build:
     · the §11 legacy bridge still tinted the ACTIVE nav row with the HOVER
       blue (#3339C4). Frozen §4.4 says the active label is --v-primary
       (#3F4FE3); hover is only ever a hover state. Affects tax + fs-review.
     · documented the Tailwind v4 layer-precedence trap on .vc-sb-rail (see
       the comment there) — unlayered CSS beats @layer utilities, so this file
       silently outranks consumer utility classes.
   Surfaces vendored against v1.1.0 need re-vendoring for the first of these.
   ---------------------------------------------------------------------------
   ⚠️ v1.1.0 SUPERSEDES v1.0.0's VALUES. v1.0.0 derived its tokens from
   books.a4.com.mt, which was the best available reference at the time. The
   owner has since delivered the finished design set
   (VACEI_UI_UNIFICATION_PROMPT.md §3, "FROZEN"), and it disagrees on three
   things that matter. The design set wins:

     brand blue   #494FDF -> #3F4FE3   (the spec says "sweep it" by name)
     brand hover  #3B41C9 -> #3339C4
     rail width      78px -> 72px
     nav radius      10px -> 12px
     nav icon        15px -> 18px, stroke 1.7
     nav height       n/a -> 38px
     label tracking .08em -> .12em

   Any surface still on v1.0.0 values is OUT OF DATE and must be re-vendored.
   STATUS (verified against the live hosts, not against merge status): all
   seven surfaces now ship #3F4FE3 and rail 72px. The four satellites that
   were briefly on the old blue — tax, fs-review, payroll, fs-studio — were
   swept and re-verified. **There is no longer a second brand blue in the
   estate.** Do not read the paragraph above as current state; it records why
   the version exists.

   TOKEN NAMING: the frozen spec names tokens `--v-*`. Those are now primary.
   The `--bk-*` names from v1.0.0 are kept as ALIASES because four shipped
   surfaces already reference them; they are deprecated, not load-bearing.
   Do not add new `--bk-*` references.
   ---------------------------------------------------------------------------
   SINGLE SOURCE OF TRUTH. This file is vendored byte-identically into every
   Vacei surface so that "the sidebars match" is guaranteed by construction
   rather than by eyeballing four codebases.

   Vendored into:
     vacei-client-portal      src/styles/vacei-sidebar.css
     vacei-portal-frontend    src/styles/vacei-sidebar.css
     a4-payroll-web           src/styles/vacei-sidebar.css
     fs-studio-web            src/styles/vacei-sidebar.css
     (vacei-audit-web)        src/styles/vacei-sidebar.css

   Canonical copy lives at  Dropbox\Claude\docs\design\vacei-sidebar.css
   EDIT THE CANONICAL COPY FIRST, then re-vendor all consumers in the same
   change. A divergent copy is worse than no shared file at all — this estate
   has already been bitten by two definitions of --a4-font-ui shipping at once
   and the winner being decided by import order.

   DERIVATION — every value below is copied, not invented. Source of truth is
   Vacei Books, which the owner ruled canonical on 2026-07-27:
     vacei-books-app/src/styles/books-tokens.css
     vacei-books-app/src/components/books/BooksSidebar.tsx
   Line references are given per value. Do not "tidy" a value without checking
   it against books first.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   1 · TOKENS
   Names kept identical to Books' --bk-* so a diff against the reference is
   trivial. These sit alongside each portal's existing --a4-* set; they do not
   collide with it and they must not be redefined anywhere else in the repo.
   --------------------------------------------------------------------------- */
:root {
  /* ---- FROZEN: prompt §3.1 brand ---- */
  --v-primary: #3f4fe3;
  --v-primary-hover: #3339c4;
  --v-primary-soft: #eef0ff;
  --v-primary-soft-border: #c9cbf5;
  --v-primary-tint: rgba(63, 79, 227, 0.08);
  --v-focus: #7b80ff;

  /* ---- FROZEN: prompt §3.1 ink ---- */
  --v-ink: #151515;
  --v-body: #3b3b3b;
  --v-stone: #6b6b6b;
  --v-mute: #8e8e8e;

  /* ---- FROZEN: prompt §3.1 surfaces ---- */
  --v-canvas: #e8e8e9;
  --v-card: #ffffff;
  --v-card-soft: #f2f2f2;
  --v-card-soft-hover: #eaeaea;
  --v-hairline: #e4e4e4;
  --v-dark: #101014;

  /* ---- FROZEN: prompt §3.1 glass — the shell surface ---- */
  --v-glass: rgba(255, 255, 255, 0.66);
  --v-glass-border: rgba(255, 255, 255, 0.85);
  --v-glass-hover: rgba(255, 255, 255, 0.78);
  --v-glass-blur: blur(20px) saturate(180%);
  --v-shadow-glass:
    0 16px 40px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8);
  --v-shadow-card: 0 4px 16px rgba(0, 0, 0, 0.05);

  /* ---- FROZEN: prompt §3.1 status ---- */
  --v-review: #a9761f;
  --v-review-bg: rgba(232, 176, 75, 0.2);
  --v-danger: #c94a4a;
  --v-danger-bg: rgba(226, 92, 92, 0.14);
  --v-notify-dot: #e8b04b;

  /* ---- FROZEN: prompt §3.3 geometry ---- */
  --v-r-shell: 24px;
  --v-r-card: 16px;
  --v-r-item: 12px;
  --v-r-pill: 9999px;
  --v-gutter: 16px;

  /* ---- FROZEN: prompt §4.2 sidebar geometry ---- */
  --vc-sb-rail: 72px;
  --vc-sb-open: 246px;
  --vc-sb-item-h: 38px;

  /* Surface literals not tokenised in the spec. Named here so consumers
     cannot drift on them. Open-state opacity stays at .94: the spec gives
     --v-glass (.66) for the rail, and translucent glass over real content is
     unreadable when expanded. */
  --vc-sb-bg-open: rgba(255, 255, 255, 0.94);
  --vc-sb-shadow-open: 0 18px 50px rgba(0, 0, 0, 0.16);
  --vc-sb-active-bg: #ffffff;
  --vc-sb-active-shadow: var(--v-shadow-card);
  --vc-sb-divider: rgba(0, 0, 0, 0.07);
  --vc-sb-rail-dot: #d6d6d6;
  --vc-sb-subpanel: rgba(255, 255, 255, 0.4);
  --vc-sb-card-bg: rgba(255, 255, 255, 0.55);
  --vc-sb-card-border: rgba(255, 255, 255, 0.9);

  /* ---- DEPRECATED ALIASES ----
     v1.0.0 names, kept only because four shipped surfaces reference them.
     They now resolve to the FROZEN values, so re-vendoring this file is what
     sweeps #494FDF off those surfaces. Do not add new references. */
  --bk-glass: var(--v-glass);
  --bk-glass-border: var(--v-glass-border);
  --bk-glass-hover: var(--v-glass-hover);
  --bk-ink: var(--v-ink);
  --bk-body: var(--v-body);
  --bk-mute: var(--v-mute);
  --bk-stone: var(--v-stone);
  --bk-hairline: var(--v-hairline);
  --bk-logo: var(--v-primary);
  --bk-primary: var(--v-primary);
  --bk-primary-hover: var(--v-primary-hover);
  --bk-primary-soft: var(--v-primary-soft);
  --bk-primary-soft-border: var(--v-primary-soft-border);
  --bk-status-review-bg: var(--v-review-bg);
  --bk-status-review-deep: var(--v-review);
  --bk-status-danger: var(--v-danger);
  --bk-status-danger-bg: var(--v-danger-bg);
  --bk-notify-dot: var(--v-notify-dot);
  --bk-shadow-glass: var(--v-shadow-glass);
}

/* ---------------------------------------------------------------------------
   2 · THE PANEL
   BooksSidebar.tsx:458-476.
   The wrapper stays at rail width and the panel OVERLAYS content when open —
   content must not reflow on hover. Consumers: put .vc-sb-rail on the layout
   reservation div and .vc-sb on the <aside> itself.
   --------------------------------------------------------------------------- */
/* ⚠️ TAILWIND v4 PRECEDENCE — this silently broke a consumer.
   Tailwind v4 emits its utilities inside `@layer utilities`, and UNLAYERED CSS
   ALWAYS BEATS LAYERED CSS regardless of specificity or source order. So every
   declaration in this file outranks any Tailwind utility on the same element.
   A consumer that set `fixed` on the panel got this file's `sticky` instead —
   and the symptom was the whole page sliding sideways on hover, which no test
   and no build reports.
   If you need to override anything here from a Tailwind app, do it in plain
   unlayered CSS or with an inline style, not with a utility class. */
.vc-sb-rail {
  position: relative;
  z-index: 60;
  flex-shrink: 0;
  width: var(--vc-sb-rail);
}

.vc-sb {
  position: sticky;
  top: 1rem;
  display: flex;
  flex-direction: column;
  width: var(--vc-sb-rail);
  height: calc(100vh - 32px);
  overflow-x: hidden;
  overflow-y: auto;
  color: var(--bk-ink);
  background: var(--bk-glass);
  border: 1px solid var(--bk-glass-border);
  border-radius: 24px;
  box-shadow: var(--bk-shadow-glass);
  -webkit-backdrop-filter: blur(20px) saturate(180%);
  backdrop-filter: blur(20px) saturate(180%);
  transition:
    width 200ms ease,
    background 200ms ease,
    box-shadow 200ms ease;
}

/* Open state. Books goes near-opaque while expanded — translucent glass
   overlaying real content is unreadable (BooksSidebar.tsx:467-468). */
.vc-sb.is-open {
  width: var(--vc-sb-open);
  background: var(--vc-sb-bg-open);
  box-shadow: var(--vc-sb-shadow-open);
}

/* Scrollbar is hidden but the panel still scrolls — BooksSidebar.tsx:462 +
   the .bk-scrollbar-none utility. */
.vc-sb {
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.vc-sb::-webkit-scrollbar {
  display: none;
}

/* ---------------------------------------------------------------------------
   3 · BRAND SLOT — BooksSidebar.tsx:477-484
   --------------------------------------------------------------------------- */
.vc-sb-brand {
  display: flex;
  align-items: center;
  padding: 20px 16px 14px;
}
.vc-sb:not(.is-open) .vc-sb-brand {
  justify-content: center;
  padding-left: 0;
  padding-right: 0;
}

/* ---------------------------------------------------------------------------
   4 · CONTEXT SWITCHER CARD — BooksSidebar.tsx:485-500
   Books uses it for the company switcher. Other surfaces may use it for the
   org/entity switcher, or omit it entirely. Only rendered when open.
   --------------------------------------------------------------------------- */
.vc-sb-card {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin: 0 16px 14px;
  padding: 10px 12px;
  text-align: left;
  cursor: pointer;
  color: var(--bk-ink);
  background: var(--vc-sb-card-bg);
  border: 1px solid var(--vc-sb-card-border);
  border-radius: 12px;
  transition: background 140ms ease-out, border-color 140ms ease-out;
}
.vc-sb-card:hover {
  background: #fff;
  border-color: var(--bk-primary-soft-border);
}
.vc-sb-card-title {
  display: block;
  overflow: hidden;
  font-size: 13px;
  font-weight: 600;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.vc-sb-card-meta {
  display: block;
  font-size: 11.5px;
  color: var(--bk-mute);
}

/* ---------------------------------------------------------------------------
   5 · NAV ROWS — BooksSidebar.tsx:294-350
   --------------------------------------------------------------------------- */
.vc-sb-nav {
  padding: 0 14px;
}

.vc-sb-item {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 10px;
  min-height: var(--vc-sb-item-h);
  padding: 0 12px;
  font-size: 13.5px;
  font-weight: 500;
  color: var(--v-body);
  background: transparent;
  border-radius: var(--v-r-item);
  transition: color 140ms ease-out, background 140ms ease-out;
}
.vc-sb:not(.is-open) .vc-sb-item {
  justify-content: center;
}

/* Hover — never on the active row, which keeps its white pill. */
.vc-sb-item:hover:not(.is-active) {
  color: var(--v-ink);
  background: var(--v-glass-hover);
}

/* Active — a WHITE PILL ON GLASS, not a tinted background. Prompt §4.4:
   "Getting this wrong is the single most visible way the portals will still
   look different from each other." */
.vc-sb-item.is-active {
  font-weight: 600;
  color: var(--v-primary);
  background: var(--vc-sb-active-bg);
  box-shadow: var(--vc-sb-active-shadow);
}
.vc-sb-item.is-active .vc-sb-icon {
  color: var(--v-primary);
}

/* Disabled — prompt §4.4. A disabled item must say why, via a tooltip. */
.vc-sb-item.is-disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

/* Attention dot — prompt §4.4: 6px, right-aligned, vertically centred. */
.vc-sb-dot {
  flex: none;
  width: 6px;
  height: 6px;
  margin-left: auto;
  background: var(--v-notify-dot);
  border-radius: 999px;
}

.vc-sb-item-label {
  flex: 1 1 0%;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Icons: 18px, stroke 1.7, currentColor, resting --v-stone. Prompt §4.4. */
.vc-sb-icon {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  color: var(--v-stone);
  stroke-width: 1.7;
}

/* ---------------------------------------------------------------------------
   6 · BADGES — BooksSidebar.tsx:331-343
   --------------------------------------------------------------------------- */
.vc-sb-badge {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 18px;
  min-width: 18px;
  padding: 0 5px;
  font-size: 11px;
  font-weight: 600;
  color: var(--bk-status-review-deep);
  background: var(--bk-status-review-bg);
  border-radius: 9px;
}

/* Collapsed rail: the count rides the icon corner instead of the row end. */
.vc-sb-badge-dot {
  position: absolute;
  top: -6px;
  right: -6px;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 15px;
  min-width: 15px;
  padding: 0 3px;
  font-size: 9px;
  font-weight: 700;
  line-height: 1;
  color: var(--bk-status-review-deep);
  background: var(--bk-status-review-bg);
  border-radius: 999px;
}
.vc-sb-icon-wrap {
  position: relative;
  flex-shrink: 0;
}

/* ---------------------------------------------------------------------------
   7 · GROUPS — BooksSidebar.tsx:562-620
   --------------------------------------------------------------------------- */
.vc-sb-group {
  padding-top: 6px;
}

.vc-sb-group-header {
  display: flex;
  width: 100%;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  text-align: left;
  color: var(--bk-mute);
  background: transparent;
  border-radius: 8px;
  transition: color 140ms ease-out, background 140ms ease-out;
}
.vc-sb-group-header:hover {
  background: var(--bk-glass-hover);
}
/* Collapsed rail, group contains the active route — books darkens the ink so
   the user can still tell where they are (BooksSidebar.tsx:571). */
.vc-sb-group-header.has-active {
  color: var(--bk-ink);
}
/* Section label — prompt §3.2: 10.5px, uppercase, .12em, --v-mute.
   §4.8 permits --v-mute ONLY here (it fails AA at small sizes elsewhere);
   the items themselves carry the accessible names. */
.vc-sb-group-label {
  flex: 1 1 0%;
  min-width: 0;
  overflow: hidden;
  font-size: 10.5px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--v-mute);
  text-overflow: ellipsis;
  white-space: nowrap;
}
.vc-sb-chevron {
  flex-shrink: 0;
  width: 12px;
  height: 12px;
  transition: transform 200ms ease;
}
.vc-sb-group-header[aria-expanded='true'] .vc-sb-chevron {
  transform: rotate(180deg);
}

/* Sub-item panel. CSS-grid row trick — animates without measuring height in
   JS (BooksSidebar.tsx:596-620). */
.vc-sb-subpanel {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 200ms ease-in-out;
}
.vc-sb-subpanel.is-expanded {
  grid-template-rows: 1fr;
}
.vc-sb-subpanel > div {
  overflow: hidden;
}
.vc-sb-subpanel-inner {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 4px;
  background: var(--vc-sb-subpanel);
  border-radius: 10px;
}

/* ---------------------------------------------------------------------------
   8 · DIVIDERS — BooksSidebar.tsx:524, :535, :630
   --------------------------------------------------------------------------- */
.vc-sb-divider {
  margin: 6px 4px;
  border-top: 1px solid var(--vc-sb-divider);
}

/* Collapsed rail uses a short dot rule between groups instead of a full line. */
.vc-sb-rail-divider {
  display: flex;
  justify-content: center;
  padding: 6px 0;
}
.vc-sb-rail-divider > span {
  width: 16px;
  height: 1.5px;
  background: var(--vc-sb-rail-dot);
  border-radius: 2px;
}

/* ---------------------------------------------------------------------------
   9 · PINNED BOTTOM UTILITY SECTION — BooksSidebar.tsx:627-676
   --------------------------------------------------------------------------- */
/* ⚠️ THIS HAS BITTEN TWO IMPLEMENTERS. READ BEFORE USING.
   `.vc-sb-spacer` is what pushes the footer to the bottom. If the <nav> ALSO
   carries a grow class (`flex-1`, `flex:1`), the two split the panel 50/50:
   the nav is truncated — silently clipping section groups off the bottom —
   and the footer strands in mid-air. A green build says nothing about it;
   both occurrences were caught only by looking at a screenshot.
   Use EITHER a growing nav OR this spacer, never both. */
.vc-sb-spacer {
  flex: 1 1 0%;
  min-height: 16px;
}
/* Belt and braces: a nav inside this skin does not grow. If a consumer needs
   the nav to scroll, give it `overflow-y:auto` — not `flex:1` alongside the
   spacer. */
.vc-sb > .vc-sb-nav {
  flex: 0 1 auto;
  min-height: 0;
  overflow-y: auto;
}
.vc-sb-footer {
  padding: 0 14px 12px;
}
.vc-sb-footer-brand {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 12px 4px;
  font-size: 11px;
  color: var(--bk-mute);
}
.vc-sb-kbd {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 18px;
  min-width: 18px;
  padding: 0 5px;
  font-family: inherit;
  font-size: 10px;
  font-style: normal;
  font-weight: 600;
  color: var(--bk-mute);
  background: rgba(255, 255, 255, 0.7);
  border: 1px solid rgba(0, 0, 0, 0.09);
  border-radius: 5px;
}

/* ---------------------------------------------------------------------------
   10 · MOBILE DRAWER
   Books has no mobile drawer (it hides the rail under lg). The portals do, and
   a drawer that stays dark while the desktop rail went white is exactly the
   mismatch we are removing — so the drawer takes the same skin, fully opaque
   because it sits over a scrim rather than over the page.
   --------------------------------------------------------------------------- */
.vc-sb.is-drawer {
  position: fixed;
  top: 10px;
  bottom: 10px;
  left: 10px;
  z-index: 70;
  width: min(280px, calc(100vw - 48px));
  height: auto;
  background: #fff;
  box-shadow: var(--vc-sb-shadow-open);
  transition: transform 200ms ease-out;
}
.vc-sb.is-drawer.is-closed {
  transform: translateX(-120%);
}

/* ---------------------------------------------------------------------------
   11 · LEGACY-SELECTOR BRIDGE — malta-tax-ai + a4-fs-review only
   ---------------------------------------------------------------------------
   Those two products are hand-written HTML + a shared `shell.js`, not React,
   and both ship the SAME dark sidebar structure:
     .app .sidebar { --sb-w: 258px; background: var(--color-sidebar, #111235);
                     color: #fff; border-radius: 22px }
     .app .sidebar.collapsed { --sb-w: 72px }
     .app .sb-logo, .app .collapsible
   Rewriting their markup to .vc-sb* would be churn for no gain, so this block
   maps the canonical values onto the selectors they already use. Same numbers,
   same file — that is what keeps them matching.

   ⚠️ This block must load AFTER the product's own app.css or it loses on
   source order (both declarations are equally specific).
   --------------------------------------------------------------------------- */
.app .sidebar {
  --sb-w: var(--vc-sb-open);
  color: var(--bk-ink);
  background: var(--vc-sb-bg-open);
  border: 1px solid var(--bk-glass-border);
  border-radius: 24px;
  box-shadow: var(--vc-sb-shadow-open);
  -webkit-backdrop-filter: blur(20px) saturate(180%);
  backdrop-filter: blur(20px) saturate(180%);
}
.app .sidebar.collapsed {
  --sb-w: var(--vc-sb-rail);
  background: var(--bk-glass);
  box-shadow: var(--bk-shadow-glass);
}

/* Their nav rows are <a class="nav-item"> / <button class="nav-item">.
   Ink comes from the skin; any inherited white is overridden here rather than
   left to be hunted through two stylesheets. */
.app .sidebar a,
.app .sidebar button,
.app .sidebar .nav-item,
.app .sidebar .collapsible,
.app .sb-logo {
  color: var(--bk-body);
}
.app .sidebar .nav-item:hover:not(.active) {
  background: var(--bk-glass-hover);
}
/* Active ink is --v-primary, NOT the hover blue. v1.0.0 had this wrong here
   because it inherited Books' habit of tinting the active row with
   --bk-primary-hover; the frozen spec §4.4 says the label is --v-primary
   (#3F4FE3) and hover (#3339C4) is only ever a hover state. This bridge rule
   is the one place the mistake survived the v1.1.0 edit. */
.app .sidebar .nav-item.active {
  font-weight: 600;
  color: var(--v-primary);
  background: var(--vc-sb-active-bg);
  box-shadow: var(--vc-sb-active-shadow);
}
/* Section labels and any muted text on the rail. */
.app .sidebar .nav-section,
.app .sidebar .muted,
.app .sidebar small {
  color: var(--bk-mute);
}
/* Dividers were white-on-dark; on white they must be dark-on-white or they
   vanish entirely. */
.app .sidebar hr,
.app .sidebar .divider {
  border-color: var(--vc-sb-divider);
}

/* ---------------------------------------------------------------------------
   12 · ACCESSIBILITY
   DESIGN.md requires prefers-reduced-motion to be respected unconditionally.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .vc-sb,
  .vc-sb-item,
  .vc-sb-card,
  .vc-sb-group-header,
  .vc-sb-chevron,
  .vc-sb-subpanel,
  .vc-sb.is-drawer {
    transition: none;
  }
}

/* Keyboard focus must be visible on a white ground — the dark sidebars relied
   on a white ring, which is invisible here. */
.vc-sb-item:focus-visible,
.vc-sb-group-header:focus-visible,
.vc-sb-card:focus-visible {
  outline: 2px solid var(--v-focus);
  outline-offset: 2px;
}

/* ---------------------------------------------------------------------------
   13 · CONTEXT HEADER — prompt §4.3
   The block directly under the logo. This is what makes ONE shell serve seven
   products: the sections change, the chrome does not.
     title      'MSM Holding Limited'  — truncates, full value in title attr
     eyebrow    ['AUDIT','FY2025'] joined with ' · ' — module THEN period
     scope-up   '‹ All engagements'
   In the hub the title is the ACCOUNT, not a company ('Adrian Sciberras' /
   'CLIENT · 9 COMPANIES'), and there is no scope-up link.
   --------------------------------------------------------------------------- */
.vc-sb-ctx {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 0 14px 12px;
}
.vc-sb-ctx-title {
  display: block;
  overflow: hidden;
  font-size: 15px;
  font-weight: 600;
  color: var(--v-ink);
  text-overflow: ellipsis;
  white-space: nowrap;
}
.vc-sb-ctx-eyebrow {
  display: block;
  margin-top: 2px;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--v-primary);
}
/* Rail toggle — a real button with aria-expanded (§4.8). */
.vc-sb-ctx-toggle {
  flex: none;
  margin-left: auto;
  color: var(--v-stone);
  background: transparent;
  border-radius: var(--v-r-item);
}
.vc-sb-ctx-toggle:hover {
  color: var(--v-ink);
  background: var(--v-glass-hover);
}

.vc-sb-scopeup {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 0 14px 10px;
  padding: 0 12px;
  min-height: 32px;
  font-size: 13px;
  color: var(--v-stone);
  border-radius: var(--v-r-item);
}
.vc-sb-scopeup:hover {
  color: var(--v-ink);
  background: var(--v-glass-hover);
}

.vc-sb:not(.is-open) .vc-sb-ctx-title,
.vc-sb:not(.is-open) .vc-sb-ctx-eyebrow,
.vc-sb:not(.is-open) .vc-sb-scopeup,
.vc-sb:not(.is-open) .vc-sb-group-label,
.vc-sb:not(.is-open) .vc-sb-item-label {
  display: none;
}
