/* =============================================================================
   BridgeERP — Design Tokens + Component Kit
   File:    bridge-theme.css
   Owner:   BridgeERP Limited
   Target:  BridgeERP website (Odoo 18 frontend, Bootstrap 5, FontAwesome 6)
   Pairs with: calculator.html + bridge-calculator.js (same folder)
   Fonts:   NO external fonts, NO CDN, NO @import. Uses the face the site
            already loads (Source Sans Pro) with a full system fallback stack.

   ---------------------------------------------------------------------------
   ARCHITECTURE — three layers, everything prefixed --be-
   ---------------------------------------------------------------------------
     1. RAW SCALE      --be-brand-50..950 · --be-accent-50..950 · --be-grey-50..950
                       Literal hexes. Only this layer contains hex values.
     2. SEMANTIC       --be-bg, --be-surface, --be-text, --be-brand, --be-shadow-*, …
                       Maps raw stops to meaning. Dark mode re-maps ONLY this
                       layer; sub-brand accents re-map only the brand raw scale.
     3. COMPONENTS     .be-card, .be-appcard, .be-panel, .be-fab, …
                       Consume ONLY semantic tokens. Never a raw stop, never a hex.

   ---------------------------------------------------------------------------
   !!! SCOPING RULE — READ BEFORE EDITING !!!
   ---------------------------------------------------------------------------
   The legacy BridgeERP site has ~241 pages full of hardcoded hex colours. A
   global dark-mode flip would wreck them. Therefore:

     * TOKEN DEFINITIONS live on :root / [data-theme] / [data-accent].
       They are inert — declaring a custom property paints nothing.
     * EVERY VISUAL COMPONENT RULE is nested under `.be-scope`.
       Legacy pages are untouched until a container opts in.

   Usage:
     <html data-theme="light" data-accent="eduprime">   <- stamped by boot script
       …legacy markup, unaffected…
       <div class="be-scope"> …new pricing surfaces… </div>
       <div class="be-scope be-fab-layer"> …fixed FABs… </div>
     </html>

   `.be-scope` paints its own background/colour, so dark mode is visually
   confined to opted-in regions. Wrap a whole new page body in `.be-scope`.

   ---------------------------------------------------------------------------
   NO `!important` IS USED ANYWHERE IN THIS FILE.
   Component selectors are `.be-scope .be-x` (specificity 0,2,0), which already
   outranks Bootstrap/Odoo's single-class frontend rules. If a future conflict
   forces an `!important`, add a comment on the same line naming the upstream
   rule it defeats.
   ---------------------------------------------------------------------------

   SECTION INDEX
     1  Raw scale — brand (BridgeERP navy)
     2  Raw scale — accent (BridgeERP orange)
     3  Raw scale — grey (navy-tinted neutrals)
     4  Semantic layer — light (default)
     5  Dark mode — [data-theme="dark"] + prefers-color-scheme
     6  Sub-brand accents — [data-accent="eduprime|mfi|hms|courier"]
     7  Scope base + typography
     8  .be-card · .be-eyebrow · .be-badge
     9  Calculator shell — .be-calc / .be-grid / .be-rail / .be-main / .be-panel
    10  .be-pill (left rail)
    11  .be-appcard (app picker)
    12  .be-panel internals (receipt, total, base row)
    13  .be-stepper · .be-toggle · .be-select · .be-savings
    14  .be-btn-primary · .be-btn-ghost
    15  .be-toast · .be-noscript · .be-skeleton
    16  FAB kit — appearance / assistant / panel / swatches
    17  Decor — aurora, grid-bg
    18  Responsive — <=991.98px single column + .be-bar / .be-panel.is-mobile-bar
    19  Accessibility — focus, reduced motion, forced colours, print
   ========================================================================== */


/* =============================================================================
   1. RAW SCALE — BRAND
   -----------------------------------------------------------------------------
   11 stops generated around the existing BridgeERP navy #114966.
   #114966 = hsl(200.5 71.4pct 23.3pct) and sits EXACTLY at brand-700 — the
   shipped brand colour is preserved byte-for-byte, never "approximated".
   brand-600 (#1c5c7d) is its lighter sibling; the 600/700 pair is the brand
   couple used by the gradient and by hover states.
   ========================================================================== */
:root {
  --be-brand-50:  #eff6fa;
  --be-brand-100: #dcecf4;
  --be-brand-200: #bbdaea;
  --be-brand-300: #8fbed6;
  --be-brand-400: #599dc0;
  --be-brand-500: #2e789e;
  --be-brand-600: #1c5c7d;
  --be-brand-700: #114966; /* the shipped BridgeERP navy. Do not change. */
  --be-brand-800: #0d384f;
  --be-brand-900: #0a2938;
  --be-brand-950: #071922;
}

/* =============================================================================
   2. RAW SCALE — ACCENT
   -----------------------------------------------------------------------------
   11 stops around the existing BridgeERP orange #f89d14 = hsl(36 94pct 52.5pct),
   placed exactly at accent-500.
   accent-700 (#a06103) is the "accent as TEXT" stop: #f89d14 only reaches
   2.14:1 on white and must never carry text on a light surface.
   ========================================================================== */
:root {
  --be-accent-50:  #fef8ee;
  --be-accent-100: #feedd5;
  --be-accent-200: #fddcaa;
  --be-accent-300: #fbc574;
  --be-accent-400: #fab142;
  --be-accent-500: #f89d14; /* the shipped BridgeERP orange. Do not change. */
  --be-accent-600: #dc8604;
  --be-accent-700: #a06103; /* text-safe on white: 4.99:1 */
  --be-accent-800: #7f4f05;
  --be-accent-900: #5d3b06;
  --be-accent-950: #392405;
}

/* =============================================================================
   3. RAW SCALE — GREY (navy-tinted neutrals, hue 208)
   -----------------------------------------------------------------------------
   Deliberately tinted toward the brand hue so greys never read "dead web grey"
   beside the navy — the same trick the reference properties use (purple-tinted
   ink on aminitechsolutions.com, green-tinted grey on e-Reta / PesaBridge).

   Two half-stops exist purely for WCAG 1.4.11 (non-text contrast) on the
   RESTING border of interactive controls:
     --be-grey-450  3.28:1 on white            (light-mode control borders)
     --be-grey-550  3.25:1 on --be-grey-900    (dark-mode control borders)
   ========================================================================== */
:root {
  --be-grey-50:  #f7f9fb;
  --be-grey-100: #f0f3f6;
  --be-grey-200: #e2e7ec;
  --be-grey-300: #cdd4db;
  --be-grey-400: #9da9b4;
  --be-grey-450: #80909d; /* a11y half-stop — control borders (light) */
  --be-grey-500: #71808e;
  --be-grey-550: #5f6e7b; /* a11y half-stop — control borders (dark)  */
  --be-grey-600: #576470;
  --be-grey-700: #3e4b56;
  --be-grey-800: #232c34;
  --be-grey-900: #151d23;
  --be-grey-950: #0b1014;
}

/* =============================================================================
   4. SEMANTIC LAYER — LIGHT (default)
   -----------------------------------------------------------------------------
   Measured contrast (light):
     text  grey-900 on #fff .............. 17.05:1  AAA
     muted grey-600 on #fff ..............  6.07:1  AA / AAA large
     muted grey-600 on surface-2 .........  5.45:1  AA
     brand brand-700 on #fff .............  9.68:1  AAA
     brand-fg #fff on brand-700 ..........  9.68:1  AAA
     accent-fg grey-950 on accent-500 ....  8.94:1  AAA
     accent-ink accent-700 on #fff .......  4.99:1  AA
     border-strong grey-450 on #fff ......  3.28:1  AA (non-text 1.4.11)
   ========================================================================== */
:root {
  /* --- surfaces ---------------------------------------------------------- */
  --be-bg:          #ffffff;             /* page background                  */
  --be-surface:     #ffffff;             /* cards, panels — raised           */
  --be-surface-2:   var(--be-grey-50);   /* bands, inset wells — recessed    */

  /* --- ink --------------------------------------------------------------- */
  --be-text:        var(--be-grey-900);
  --be-muted:       var(--be-grey-600);

  /* --- lines ------------------------------------------------------------- */
  --be-border:        var(--be-grey-200); /* static hairlines / separators   */
  --be-border-strong: var(--be-grey-450); /* resting border of CONTROLS      */

  /* --- brand ------------------------------------------------------------- */
  --be-brand:       var(--be-brand-700);
  --be-brand-fg:    #ffffff;
  --be-brand-hover: var(--be-brand-800);
  --be-brand-tint:  var(--be-brand-50);   /* selected / checked fill         */
  --be-brand-ink:   var(--be-brand-700);  /* brand used as TEXT              */

  /* --- accent ------------------------------------------------------------ */
  --be-accent:      var(--be-accent-500);
  --be-accent-fg:   var(--be-grey-950);   /* orange needs a DARK foreground  */
  --be-accent-tint: var(--be-accent-50);
  --be-accent-ink:  var(--be-accent-700); /* accent used as TEXT             */

  /* --- gradients (brand couple 600 -> 800, the house 135deg) ------------- */
  --be-gradient-brand: linear-gradient(135deg, var(--be-brand-600), var(--be-brand-800));
  --be-gradient-hair:  linear-gradient(90deg, var(--be-brand-500), var(--be-accent-500));
  /* Foreground for anything painted ON the brand gradient. The gradient is a
     dark navy couple in light mode and a mid navy couple in dark mode, so pure
     white clears 7:1 in both — this token stays white on purpose. */
  --be-on-gradient: #ffffff;

  /* --- elevation (navy-tinted, the e-Reta e1..e4 ladder) ----------------- */
  --be-shadow-1: 0 1px 2px rgba(7, 25, 34, .05), 0 1px 1px rgba(7, 25, 34, .04);
  --be-shadow-2: 0 6px 18px -8px rgba(7, 25, 34, .16);
  --be-shadow-3: 0 14px 34px -14px rgba(7, 25, 34, .22);
  --be-shadow-4: 0 40px 80px -32px rgba(7, 25, 34, .34);

  /* --- radii ------------------------------------------------------------- */
  --be-radius-sm:   8px;
  --be-radius-md:  12px;
  --be-radius-lg:  14px;
  --be-radius-xl:  18px;   /* the .m-card radius */
  --be-radius-pill: 999px;

  /* --- type -------------------------------------------------------------- */
  --be-font-body: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI",
                  Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
                  "Apple Color Emoji", "Segoe UI Emoji";
  --be-font-display: var(--be-font-body);

  /* --- metrics ----------------------------------------------------------- */
  --be-container: 1200px;
  --be-gutter: 24px;
  --be-sticky-top: 88px;      /* clearance under the site header             */
  --be-tap: 44px;             /* minimum touch target                        */
  --be-ease: cubic-bezier(.22, 1, .36, 1);
  --be-dur: .22s;

  /* --- FAB geometry ------------------------------------------------------ */
  --be-fab-inset: 20px;
  --be-fab-bottom: 20px;      /* raised to 92px when the mobile bar is up    */

  /* --- stacking (kept BELOW Bootstrap offcanvas 1045 / modal 1055) ------- */
  --be-z-sticky: 5;
  --be-z-bar:  1030;
  --be-z-fab:  1035;
  --be-z-toast: 1050;
}

/* =============================================================================
   5. DARK MODE
   -----------------------------------------------------------------------------
   Re-maps ONLY the semantic layer. The raw scales are untouched, so a sub-brand
   accent (section 6) composes with dark mode for free — 2 themes x 5 brands
   = 10 skins from one component set.

   Key inversions:
     brand LIGHTENS to brand-300 (a dark navy on a near-black page is invisible)
     brand-fg flips to brand-950 (dark ink on the now-light brand fill)
     the checked / selected tint flips from brand-50 to brand-950
     shadows deepen to near-opaque black

   Measured contrast (dark, bg #0b1014 / surface #151d23):
     text  grey-50  on surface ......... 16.15:1  AAA
     muted grey-400 on surface .........  7.12:1  AAA
     brand brand-300 on surface ........  8.53:1  AAA
     brand-fg brand-950 on brand-300 ...  8.97:1  AAA
     accent accent-400 on bg ........... 11.32:1  AAA
     accent-fg grey-950 on accent-400 .. 10.41:1  AAA
     border-strong grey-550 on surface ..  3.25:1  AA (non-text 1.4.11)

   NB: the block below is DUPLICATED into the prefers-color-scheme query that
   follows, so "no explicit attribute" still follows the OS.
   ==> KEEP THE TWO BLOCKS IN SYNC. <==
   ========================================================================== */
[data-theme="dark"] {
  --be-bg:        var(--be-grey-950);
  --be-surface:   var(--be-grey-900);
  --be-surface-2: var(--be-grey-950);   /* recessed wells go DARKER in dark  */

  --be-text:  var(--be-grey-50);
  --be-muted: var(--be-grey-400);

  --be-border:        var(--be-grey-800);
  --be-border-strong: var(--be-grey-550);

  --be-brand:       var(--be-brand-300);
  --be-brand-fg:    var(--be-brand-950);
  --be-brand-hover: var(--be-brand-200);
  --be-brand-tint:  var(--be-brand-950);
  --be-brand-ink:   var(--be-brand-300);

  --be-accent:      var(--be-accent-400);
  --be-accent-fg:   var(--be-grey-950);
  --be-accent-tint: var(--be-accent-950);
  --be-accent-ink:  var(--be-accent-300);

  /* the gradient shifts up one couple so the FAB stays legible on near-black */
  --be-gradient-brand: linear-gradient(135deg, var(--be-brand-500), var(--be-brand-700));

  --be-shadow-1: 0 1px 2px rgba(0, 0, 0, .40), 0 1px 1px rgba(0, 0, 0, .32);
  --be-shadow-2: 0 6px 18px -8px rgba(0, 0, 0, .58);
  --be-shadow-3: 0 14px 34px -14px rgba(0, 0, 0, .66);
  --be-shadow-4: 0 40px 80px -32px rgba(0, 0, 0, .76);

  /* NB: `color-scheme: dark` is deliberately NOT set here. On :root it would
     repaint the UA canvas and every native form control across all 241 legacy
     pages, whose text colours are hardcoded dark hex — an instantly unreadable
     site. It is applied to `.be-scope` only, in section 7. */
}

/* --- OS preference, only when no explicit attribute has been stamped ------- */
@media (prefers-color-scheme: dark) {
  /* :root:not([data-theme="light"]) — an explicit light choice always wins. */
  :root:not([data-theme="light"]) {
    --be-bg:        var(--be-grey-950);
    --be-surface:   var(--be-grey-900);
    --be-surface-2: var(--be-grey-950);

    --be-text:  var(--be-grey-50);
    --be-muted: var(--be-grey-400);

    --be-border:        var(--be-grey-800);
    --be-border-strong: var(--be-grey-550);

    --be-brand:       var(--be-brand-300);
    --be-brand-fg:    var(--be-brand-950);
    --be-brand-hover: var(--be-brand-200);
    --be-brand-tint:  var(--be-brand-950);
    --be-brand-ink:   var(--be-brand-300);

    --be-accent:      var(--be-accent-400);
    --be-accent-fg:   var(--be-grey-950);
    --be-accent-tint: var(--be-accent-950);
    --be-accent-ink:  var(--be-accent-300);

    --be-gradient-brand: linear-gradient(135deg, var(--be-brand-500), var(--be-brand-700));

    --be-shadow-1: 0 1px 2px rgba(0, 0, 0, .40), 0 1px 1px rgba(0, 0, 0, .32);
    --be-shadow-2: 0 6px 18px -8px rgba(0, 0, 0, .58);
    --be-shadow-3: 0 14px 34px -14px rgba(0, 0, 0, .66);
    --be-shadow-4: 0 40px 80px -32px rgba(0, 0, 0, .76);
  }
}

/* =============================================================================
   6. SUB-BRAND ACCENTS
   -----------------------------------------------------------------------------
   Set data-accent on <html> (boot script) or on any wrapper — custom properties
   inherit, so a single section can carry its own identity.

   Each suite gets the SAME lightness/saturation ladder as the navy parent; only
   the hue moves. That is what lets four distinct products still read as one
   family: identical value structure, identical component behaviour, different
   hue. Every scale keeps brand-700 above 6.5:1 on white and brand-300 above
   7:1 on the dark surface, so no accent silently degrades accessibility.

     eduprime  hue 264  violet-indigo  #3b1f65   scholarly; echoes the AminiTech
                                                 house purple (#51347B family)
     mfi       hue 164  jade / teal    #126a53   money and growth; same family
                                                 as the PesaBridge green
     hms       hue 344  garnet rose    #691e32   clinical care, without reusing
                                                 the error red (hue ~5)
     courier   hue  30  burnt amber    #794818   motion / parcels (UPS-coded)

   ONLY courier also re-maps --be-accent-*: an amber brand beside the amber
   BridgeERP accent would collapse into one colour, so courier swaps the accent
   to a cool cyan. The other three keep the shipped orange accent — violet, jade
   and garnet all pair cleanly with it.
   ========================================================================== */

/* --- EduPrime — violet-indigo -------------------------------------------- */
[data-accent="eduprime"] {
  --be-brand-50:  #f4f0fa;
  --be-brand-100: #e6dcf4;
  --be-brand-200: #cebce9;
  --be-brand-300: #b399d8;
  --be-brand-400: #8b6fb7;
  --be-brand-500: #644098;
  --be-brand-600: #4b2c7a;
  --be-brand-700: #3b1f65;
  --be-brand-800: #2f1850;
  --be-brand-900: #23133c;
  --be-brand-950: #180e28;
}

/* --- Bridge MFI Suite — jade / teal --------------------------------------- */
[data-accent="mfi"] {
  --be-brand-50:  #effaf7;
  --be-brand-100: #dcf4ee;
  --be-brand-200: #bbeadd;
  --be-brand-300: #93d7c5;
  --be-brand-400: #5cc1a6;
  --be-brand-500: #2fa283;
  --be-brand-600: #1c8267;
  --be-brand-700: #126a53;
  --be-brand-800: #0e5341;
  --be-brand-900: #0b3d2f;
  --be-brand-950: #08261e;
}

/* --- Bridge HMS Suite — garnet rose --------------------------------------- */
[data-accent="hms"] {
  --be-brand-50:  #faf0f2;
  --be-brand-100: #f4dce2;
  --be-brand-200: #e9bcc8;
  --be-brand-300: #d99bac;
  --be-brand-400: #b96e82;
  --be-brand-500: #9d3f58;
  --be-brand-600: #7e2a41;
  --be-brand-700: #691e32;
  --be-brand-800: #541728;
  --be-brand-900: #3f131e;
  --be-brand-950: #2a0e15;
}

/* --- Bridge Courier — burnt amber (+ cyan accent, to avoid a warm collision) */
[data-accent="courier"] {
  --be-brand-50:  #faf5f0;
  --be-brand-100: #f4e8dc;
  --be-brand-200: #e9d2bc;
  --be-brand-300: #dcbfa3;
  --be-brand-400: #c4996e;
  --be-brand-500: #ae7337;
  --be-brand-600: #8f5924;
  --be-brand-700: #794818;
  --be-brand-800: #623b13;
  --be-brand-900: #4c2e10;
  --be-brand-950: #36210d;

  --be-accent-50:  #eefbfe;
  --be-accent-100: #d5f6fe;
  --be-accent-200: #aaeefd;
  --be-accent-300: #74e3fb;
  --be-accent-400: #42d8fa;
  --be-accent-500: #35c8e9;
  --be-accent-600: #10b5da;
  --be-accent-700: #097790;  /* text-safe on white: 5.18:1 */
  --be-accent-800: #095f72;
  --be-accent-900: #074654;
  --be-accent-950: #052b33;
}


/* ##########################################################################
   ##  EVERYTHING BELOW THIS LINE IS SCOPED TO .be-scope                    ##
   ##  Nothing here can touch a legacy page that has not opted in.          ##
   ########################################################################## */


/* =============================================================================
   7. SCOPE BASE + TYPOGRAPHY
   ========================================================================== */
.be-scope {
  background-color: var(--be-bg);
  color: var(--be-text);
  font-family: var(--be-font-body);
  font-size: 16px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* A scope that only hosts fixed overlays must not paint a background band. */
.be-scope.be-fab-layer { background-color: transparent; color: inherit; }

/* `color-scheme` is applied HERE, not on :root — see the note in section 5.
   Scoped like this it darkens native scrollbars, number spinners and date
   pickers inside our surfaces only, and leaves the legacy pages alone. */
[data-theme="dark"]  .be-scope { color-scheme: dark; }
[data-theme="light"] .be-scope { color-scheme: light; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .be-scope { color-scheme: dark; }
}

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

.be-scope a { color: var(--be-brand-ink); text-decoration: none; }
.be-scope a:hover { text-decoration: underline; }

.be-scope h1, .be-scope h2, .be-scope h3, .be-scope h4 {
  font-family: var(--be-font-display);
  color: var(--be-text);
  letter-spacing: -.015em;
  line-height: 1.12;
  margin: 0 0 .5em;
}
.be-scope h1 { font-size: clamp(2.1rem, 1.4rem + 2.6vw, 3.3rem); font-weight: 800; }
.be-scope h2 { font-size: clamp(1.6rem, 1.2rem + 1.5vw, 2.25rem); font-weight: 700; }
.be-scope h3 { font-size: clamp(1.15rem, 1rem + .6vw, 1.4rem);   font-weight: 700; }

.be-scope p  { margin: 0 0 1rem; }
.be-scope ul, .be-scope ol { margin: 0 0 1rem; padding-inline-start: 1.25rem; }

.be-scope .be-lead  { font-size: 1.075rem; color: var(--be-muted); }
.be-scope .be-muted { color: var(--be-muted); }
.be-scope .be-num,
.be-scope [data-be="total"],
.be-scope [data-be="base"] { font-variant-numeric: tabular-nums; }

/* ---------------------------------------------------------------------------
   SELF-MATCH NOTE. `.be-scope .be-x` is a DESCENDANT selector: it does not
   match an element that carries both classes (<section class="be-scope be-hero">).
   Block-level components that can plausibly sit on the scope element itself
   therefore also list a `.be-scope.be-x` compound. Inline components
   (buttons, pills, cards…) are always descendants and need no compound.
   --------------------------------------------------------------------------- */
.be-scope .be-container,
.be-scope.be-container {
  width: 100%;
  max-width: var(--be-container);
  margin-inline: auto;
  padding-inline: var(--be-gutter);
}
.be-scope .be-section,
.be-scope.be-section { padding-block: clamp(48px, 5vw, 96px); }
.be-scope .be-section.is-banded,
.be-scope.be-section.is-banded {
  background-color: var(--be-surface-2);
  border-block: 1px solid var(--be-border);
}

.be-scope .be-sr-only {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  border: 0; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  white-space: nowrap;
}

/* =============================================================================
   8. .be-card · .be-eyebrow · .be-badge
   ========================================================================== */

/* --- .be-card — the .m-card spec: surface, 1px border, radius 18, e1 shadow,
       hover lift -4px with a brand-mixed border ------------------------------ */
.be-scope .be-card {
  background-color: var(--be-surface);
  border: 1px solid var(--be-border);
  border-radius: var(--be-radius-xl);   /* 18px */
  box-shadow: var(--be-shadow-1);
  padding: 22px;
  transition: transform var(--be-dur) var(--be-ease),
              box-shadow var(--be-dur) var(--be-ease),
              border-color var(--be-dur) var(--be-ease),
              background-color .3s var(--be-ease);
}
.be-scope .be-card.is-interactive { cursor: pointer; }
.be-scope .be-card.is-interactive:hover,
.be-scope a.be-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--be-shadow-3);
  border-color: var(--be-brand-300);
}
/* Progressive enhancement: MIX the brand into the border rather than replace
   it, so the hover ring stays a hairline instead of becoming a hard rule. */
@supports (color: color-mix(in srgb, red, red)) {
  .be-scope .be-card.is-interactive:hover,
  .be-scope a.be-card:hover {
    border-color: color-mix(in srgb, var(--be-brand) 35%, var(--be-border));
  }
}
.be-scope a.be-card { display: block; color: inherit; text-decoration: none; }
.be-scope a.be-card:hover { text-decoration: none; }
.be-scope .be-card-flat  { box-shadow: none; }
.be-scope .be-card-tight { padding: 16px; }
.be-scope .be-card > :last-child { margin-bottom: 0; }

/* --- .be-eyebrow — the house kicker (12px / 700 / .16em / gradient dash) --- */
.be-scope .be-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 .6rem;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--be-brand-ink);
}
.be-scope .be-eyebrow::before {
  content: "";
  flex: 0 0 auto;
  width: 26px;
  height: 2px;
  border-radius: 2px;
  background: var(--be-gradient-hair);
}
.be-scope .be-eyebrow.is-centered { justify-content: center; }

/* --- .be-badge ------------------------------------------------------------ */
.be-scope .be-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 9px;
  border-radius: var(--be-radius-pill);
  background-color: var(--be-brand-tint);
  color: var(--be-brand-ink);
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
}

/* =============================================================================
   9. CALCULATOR SHELL
   -----------------------------------------------------------------------------
   Markup contract (as shipped in calculator.html):

     <div class="be-scope" data-suite="…">
       <section class="be-calc">
         <header class="be-calc__head"> …crumb, title, .be-toggle, .be-select… </header>
         <div class="be-grid">
           <aside class="be-rail">   ul.be-rail__list > li.be-rail__item > .be-pill
           <div   class="be-main">   .be-main__groups > .be-group > .be-group__grid
           <aside class="be-panel">  .be-card.be-panel__card
         </div>
         <div class="be-toasts"></div>
         <div class="be-bar" hidden></div>
       </section>
     </div>

   `.be-panel` is the sticky COLUMN; its chrome comes from the `.be-card` inside
   it, so the outer element must stay transparent (handled below).
   ========================================================================== */
.be-scope .be-calc,
.be-scope.be-calc { position: relative; display: block; }

/* --- header --------------------------------------------------------------- */
.be-scope .be-calc__head { margin-block-end: 28px; }
.be-scope .be-crumb { margin-block-end: 14px; }
.be-scope .be-crumb__back { min-height: 38px; padding-inline: 14px; font-size: 13.5px; }
.be-scope .be-calc__headmain {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 18px 24px;
}
.be-scope .be-calc__headtext { flex: 1 1 380px; min-width: 0; }
.be-scope .be-calc__title { margin: 0 0 .35em; }
.be-scope .be-calc__lede  { margin: 0; max-width: 62ch; color: var(--be-muted); font-size: 1.05rem; }
.be-scope .be-calc__controls {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
}
.be-scope .be-calc__currency { display: inline-flex; align-items: center; gap: 8px; }
.be-scope .be-calc__curlabel {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--be-muted);
}
.be-scope .be-calc__curnote {
  flex: 1 1 100%;
  margin: 0;
  font-size: 12.5px;
  color: var(--be-muted);
}

/* --- the three-column grid ------------------------------------------------ */
.be-scope .be-grid {
  display: grid;
  grid-template-columns: 232px minmax(0, 1fr) 340px;
  gap: 28px;
  align-items: start;
}
.be-scope .be-rail,
.be-scope .be-main,
.be-scope .be-panel { min-width: 0; }

/* --- left rail ------------------------------------------------------------ */
.be-scope .be-rail {
  position: sticky;
  top: var(--be-sticky-top);
  max-height: calc(100vh - var(--be-sticky-top) - 24px);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.be-scope .be-rail__title {
  flex: 0 0 auto;
  margin: 0 0 10px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .10em;
  text-transform: uppercase;
  color: var(--be-muted);
}
.be-scope .be-rail__list {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 0;
  padding: 0 4px 0 0;
  list-style: none;
  overflow-y: auto;
  overscroll-behavior: contain;
}
.be-scope .be-rail__item { display: block; }
.be-scope .be-rail__hint {
  flex: 0 0 auto;
  margin: 12px 0 0;
  font-size: 12.5px;
  line-height: 1.4;
  color: var(--be-muted);
}

/* --- middle column -------------------------------------------------------- */
.be-scope .be-main__status {
  margin: 0 0 16px;
  font-size: 14px;
  color: var(--be-muted);
}
.be-scope .be-main__error { border-color: var(--be-border-strong); }

.be-scope .be-group {
  margin-block-end: 32px;
  scroll-margin-top: calc(var(--be-sticky-top) + 12px);
}
.be-scope .be-group:last-child { margin-block-end: 0; }
.be-scope .be-group__title {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0 0 14px;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .10em;
  text-transform: uppercase;
  color: var(--be-muted);
}
.be-scope .be-group__title::after {
  content: "";
  flex: 1 1 auto;
  height: 1px;
  background: var(--be-border);
}
.be-scope .be-group__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(212px, 1fr));
  gap: 14px;
}

/* --- right column (sticky) ------------------------------------------------ */
.be-scope .be-panel {
  position: sticky;
  top: var(--be-sticky-top);
  z-index: var(--be-z-sticky);
  display: block;
  background-color: var(--be-surface);
  border: 1px solid var(--be-border);
  border-radius: var(--be-radius-xl);
  box-shadow: var(--be-shadow-2);
}
/* The shipped markup nests a .be-card inside .be-panel; the outer element must
   then be a bare positioning wrapper or we render a card inside a card. */
@supports selector(:has(*)) {
  .be-scope .be-panel:has(> .be-card),
  .be-scope .be-panel:has(> .be-panel__card) {
    background-color: transparent;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
}
/* Same outcome for engines without :has() — flatten the inner card instead. */
@supports not selector(:has(*)) {
  .be-scope .be-panel > .be-panel__card {
    background-color: transparent;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    padding: 18px;
  }
}
.be-scope .be-panel--bare {
  background-color: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}
.be-scope .be-panel__card { padding: 18px; }

/* =============================================================================
   10. .be-pill — left-rail selector
   -----------------------------------------------------------------------------
   Rendered as <button class="be-pill"> (app mode) or <a class="be-pill">
   (category mode). Children: .be-pill__label + optional .be-pill__meta.
   `.is-active` is toggled by the JS; `.is-locked` marks the mandatory Core.
   ========================================================================== */
.be-scope .be-pill {
  display: flex;
  align-items: center;
  gap: 9px;
  width: 100%;
  min-height: 40px;
  padding: 0 14px;
  border: 1px solid var(--be-border-strong);
  border-radius: var(--be-radius-pill);
  background-color: var(--be-surface);
  color: var(--be-text);
  font: inherit;
  font-size: 13.5px;
  font-weight: 500;
  line-height: 1.2;
  text-align: start;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  appearance: none;
  transition: background-color .18s var(--be-ease),
              border-color .18s var(--be-ease),
              color .18s var(--be-ease);
}
.be-scope a.be-pill:hover { text-decoration: none; }
.be-scope .be-pill:hover {
  border-color: var(--be-brand);
  background-color: var(--be-brand-tint);
}
.be-scope .be-pill__label {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
.be-scope .be-pill__meta {
  flex: 0 0 auto;
  font-size: 12px;
  font-variant-numeric: tabular-nums;
  color: var(--be-muted);
}
/* optional leading dot, for rails that want a status glyph */
.be-scope .be-pill__dot {
  flex: 0 0 auto;
  width: 8px; height: 8px;
  border-radius: 50%;
  background-color: var(--be-border-strong);
  transition: background-color .18s var(--be-ease);
}

.be-scope .be-pill.is-active {
  background-color: var(--be-brand);
  border-color: var(--be-brand);
  color: var(--be-brand-fg);
  font-weight: 600;
}
.be-scope .be-pill.is-active .be-pill__meta { color: var(--be-brand-fg); opacity: .8; }
.be-scope .be-pill.is-active .be-pill__dot  { background-color: var(--be-brand-fg); }

.be-scope .be-pill.is-locked,
.be-scope .be-pill:disabled {
  cursor: default;
  border-style: dashed;
  border-color: var(--be-border-strong);
  background-color: var(--be-surface-2);
  color: var(--be-muted);
  font-weight: 500;
}
.be-scope .be-pill.is-locked:hover,
.be-scope .be-pill:disabled:hover {
  background-color: var(--be-surface-2);
  border-color: var(--be-border-strong);
}

/* horizontal pill strip (the rail below 992px, and anywhere else it is handy) */
.be-scope .be-pillrow {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: none;
  padding-block: 4px;
  -webkit-overflow-scrolling: touch;
}
.be-scope .be-pillrow::-webkit-scrollbar { display: none; }
.be-scope .be-pillrow > .be-pill { width: auto; }

/* =============================================================================
   11. .be-appcard — hidden checkbox + full-card label
   -----------------------------------------------------------------------------
   Markup contract (as shipped):

     <div class="be-appcard" data-app-wrap="pos">
       <input type="checkbox" class="be-appcard__input" id="be-app-pos"
              data-app="pos" data-cost="0.35" data-app-depends="stock">
       <label class="be-appcard__label" for="be-app-pos">
         <span class="be-appcard__icon">…</span>
         <span class="be-appcard__body">
           <span class="be-appcard__name">Point of Sale</span>
           <span class="be-appcard__blurb">…</span>
         </span>
         <span class="be-appcard__price">
           <span class="be-appcard__amount">$0.35</span>
           <span class="be-appcard__unit">per user</span>
         </span>
       </label>
     </div>

   The CHECKED state is matched four ways so no single mechanism is load-bearing:
     a) .be-appcard.is-selected                   <- what the JS toggles
     b) .be-appcard.is-checked                    <- alias, same styling
     c) .be-appcard:has(.be-appcard__input:checked)
     d) .be-appcard__input:checked + .be-appcard__label
   (a) and (b) are plain class selectors, so the checked state survives on any
   engine, with or without :has().

   Checked is signalled by FOUR redundant channels, never colour alone:
   brand border + brand tint fill + a filled check badge + bolder name.

   `.be-appcard.is-bare` = the single-element variant, where the .be-appcard
   element IS the label and carries the padding itself.
   ========================================================================== */
.be-scope .be-appcard {
  position: relative;
  display: flex;
  border: 1px solid var(--be-border-strong);
  border-radius: var(--be-radius-lg);
  background-color: var(--be-surface);
  color: var(--be-text);
  transition: border-color .18s var(--be-ease),
              background-color .18s var(--be-ease),
              box-shadow .18s var(--be-ease),
              transform .18s var(--be-ease);
}
.be-scope .be-appcard:hover {
  border-color: var(--be-brand);
  box-shadow: var(--be-shadow-2);
  transform: translateY(-2px);
}

.be-scope .be-appcard__label,
.be-scope .be-appcard.is-bare {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 7px;
  min-height: 104px;
  /* logical padding — the badge lane follows the writing direction (RTL-safe) */
  padding-block: 15px 14px;
  padding-inline: 15px 44px;
  margin: 0;
  cursor: pointer;
  user-select: none;
}

/* the real control: visually hidden, still focusable and screen-reader-visible */
.be-scope .be-appcard__input {
  position: absolute;
  width: 1px; height: 1px;
  margin: 0; padding: 0; border: 0;
  opacity: 0; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  white-space: nowrap;
}

.be-scope .be-appcard__icon {
  display: inline-grid;
  place-items: center;
  width: 34px; height: 34px;
  border-radius: 10px;
  background-color: var(--be-surface-2);
  color: var(--be-brand-ink);
  font-size: 15px;
  font-weight: 700;
  line-height: 1;
  transition: background-color .18s var(--be-ease), color .18s var(--be-ease);
}
.be-scope .be-appcard__icon img { width: 22px; height: 22px; object-fit: contain; }

.be-scope .be-appcard__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.be-scope .be-appcard__name { font-size: 14.5px; font-weight: 600; line-height: 1.25; }
.be-scope .be-appcard__blurb {
  font-size: 12.5px;
  line-height: 1.35;
  color: var(--be-muted);
}
.be-scope .be-appcard__price {
  display: flex;
  align-items: baseline;
  gap: 5px;
  margin-block-start: auto;
  font-size: 13px;
  color: var(--be-muted);
  font-variant-numeric: tabular-nums;
}
.be-scope .be-appcard__amount { font-weight: 700; color: var(--be-text); }
.be-scope .be-appcard__unit,
.be-scope .be-appcard__price small { font-size: 11.5px; }
.be-scope .be-appcard__free {
  font-weight: 700;
  color: var(--be-brand-ink);
  text-transform: lowercase;
}
/* "always on" — kept in normal flow (an absolutely positioned label collides
   with the check badge and overflows the card at narrow widths). */
.be-scope .be-appcard__lock {
  align-self: flex-start;
  padding: 2px 8px;
  border-radius: var(--be-radius-pill);
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
  font-size: 10px;
  font-weight: 700;
  line-height: 1.5;
  letter-spacing: .06em;
  text-transform: uppercase;
  white-space: nowrap;
}

/* --- the check badge: ::after = disc, ::before = tick -------------------- */
.be-scope .be-appcard::after {
  content: "";
  position: absolute;
  top: 12px;
  inset-inline-end: 12px;
  width: 22px; height: 22px;
  border-radius: 50%;
  border: 1px solid var(--be-border-strong);
  background-color: var(--be-surface);
  opacity: .55;
  transform: scale(.85);
  transition: opacity .18s var(--be-ease),
              transform .18s var(--be-ease),
              background-color .18s var(--be-ease),
              border-color .18s var(--be-ease);
}
.be-scope .be-appcard::before {
  content: "";
  position: absolute;
  top: 19px;                     /* centred inside the 22px disc at top:12 */
  inset-inline-end: 18.5px;
  z-index: 1;
  width: 9px; height: 5px;
  border-inline-start: 2px solid var(--be-brand-fg);
  border-block-end: 2px solid var(--be-brand-fg);
  transform: rotate(-45deg) scale(.4);
  transform-origin: center;
  opacity: 0;
  transition: opacity .18s var(--be-ease), transform .18s var(--be-ease);
}

/* --- CHECKED (a + b): plain classes, universal support -------------------- */
.be-scope .be-appcard.is-selected,
.be-scope .be-appcard.is-checked {
  border-color: var(--be-brand);
  background-color: var(--be-brand-tint);
  box-shadow: var(--be-shadow-2);
}
.be-scope .be-appcard.is-selected .be-appcard__name,
.be-scope .be-appcard.is-checked  .be-appcard__name { font-weight: 700; }
.be-scope .be-appcard.is-selected .be-appcard__icon,
.be-scope .be-appcard.is-checked  .be-appcard__icon {
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
}
.be-scope .be-appcard.is-selected::after,
.be-scope .be-appcard.is-checked::after {
  background-color: var(--be-brand);
  border-color: var(--be-brand);
  opacity: 1;
  transform: scale(1);
}
.be-scope .be-appcard.is-selected::before,
.be-scope .be-appcard.is-checked::before {
  opacity: 1;
  transform: rotate(-45deg) scale(1);
}

/* --- CHECKED (c): :has(). Isolated so an unsupported selector cannot take
       the class-based rules above down with it. ---------------------------- */
.be-scope .be-appcard:has(.be-appcard__input:checked) {
  border-color: var(--be-brand);
  background-color: var(--be-brand-tint);
  box-shadow: var(--be-shadow-2);
}
.be-scope .be-appcard:has(.be-appcard__input:checked) .be-appcard__name { font-weight: 700; }
.be-scope .be-appcard:has(.be-appcard__input:checked) .be-appcard__icon {
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
}
.be-scope .be-appcard:has(.be-appcard__input:checked)::after {
  background-color: var(--be-brand);
  border-color: var(--be-brand);
  opacity: 1;
  transform: scale(1);
}
.be-scope .be-appcard:has(.be-appcard__input:checked)::before {
  opacity: 1;
  transform: rotate(-45deg) scale(1);
}

/* --- CHECKED (d): the label reacts even if the wrapper class is missing ---- */
.be-scope .be-appcard__input:checked + .be-appcard__label .be-appcard__name { font-weight: 700; }
.be-scope .be-appcard__input:checked + .be-appcard__label .be-appcard__icon {
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
}

/* --- auto-added by a dependency: a dashed ring flags "not your click" ----- */
.be-scope .be-appcard.is-required { border-style: dashed; }

/* --- LOCKED (Core — mandatory, always on, not clickable) ------------------ */
.be-scope .be-appcard.is-locked {
  border-style: solid;
  border-color: var(--be-brand);
  background-color: var(--be-brand-tint);
  box-shadow: none;
}
.be-scope .be-appcard.is-locked:hover { transform: none; box-shadow: none; }
.be-scope .be-appcard.is-locked .be-appcard__label,
.be-scope .be-appcard.is-locked.is-bare { cursor: not-allowed; }
.be-scope .be-appcard.is-locked .be-appcard__input { pointer-events: none; }
.be-scope .be-appcard.is-locked .be-appcard__icon {
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
}
.be-scope .be-appcard.is-locked .be-appcard__name { font-weight: 700; }
.be-scope .be-appcard.is-locked::after {
  background-color: var(--be-brand);
  border-color: var(--be-brand);
  opacity: 1;
  transform: scale(1);
}
.be-scope .be-appcard.is-locked::before {
  opacity: 1;
  transform: rotate(-45deg) scale(1);
}

/* =============================================================================
   12. .be-panel INTERNALS — receipt, base row, total
   ========================================================================== */
.be-scope .be-panel__summary {
  margin: 0 0 12px;
  font-size: 13px;
  font-weight: 600;
  color: var(--be-muted);
  font-variant-numeric: tabular-nums;
}

.be-scope .be-panel__lines {
  margin: 0 0 14px;
  padding: 0;
  list-style: none;
  max-height: min(38vh, 320px);
  overflow-y: auto;
  overscroll-behavior: contain;
}
.be-scope .be-panel__line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  padding-block: 7px;
  font-size: 14px;
}
.be-scope .be-panel__line + .be-panel__line { border-block-start: 1px dashed var(--be-border); }
.be-scope .be-panel__linename  { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.be-scope .be-panel__lineprice {
  flex: 0 0 auto;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--be-muted);
}
.be-scope .be-panel__line.is-locked .be-panel__linename { font-weight: 600; }
.be-scope .be-panel__line.is-locked .be-panel__lineprice { color: var(--be-brand-ink); }
.be-scope .be-panel__line--empty { color: var(--be-muted); font-style: italic; }

.be-scope .be-panel__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  padding-block: 10px;
  border-block-start: 1px solid var(--be-border);
  font-size: 14px;
}
.be-scope .be-panel__rowlabel { font-weight: 600; }
.be-scope .be-panel__rowvalue { font-weight: 700; font-variant-numeric: tabular-nums; }
.be-scope .be-panel__basenote {
  margin: 0 0 14px;
  font-size: 12px;
  line-height: 1.4;
  color: var(--be-muted);
}

.be-scope .be-panel__total {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 10px;
  margin-block-start: 14px;
  padding-block-start: 14px;
  border-block-start: 1px solid var(--be-border);
}
.be-scope .be-panel__totallabel {
  flex: 1 1 100%;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .10em;
  text-transform: uppercase;
  color: var(--be-muted);
}
.be-scope .be-panel__totalvalue {
  font-family: var(--be-font-display);
  font-size: clamp(1.7rem, 1.3rem + 1.2vw, 2.15rem);
  font-weight: 800;
  letter-spacing: -.02em;
  line-height: 1;
  color: var(--be-text);
  font-variant-numeric: tabular-nums;
}
.be-scope .be-panel__totalunit { font-size: 13px; font-weight: 600; color: var(--be-muted); }
.be-scope .be-panel__annual {
  margin: 6px 0 0;
  font-size: 12.5px;
  color: var(--be-muted);
}
.be-scope .be-panel__cta { display: grid; gap: 10px; margin-block-start: 16px; }
.be-scope .be-panel__ctanote {
  margin: 10px 0 0;
  font-size: 12px;
  text-align: center;
  color: var(--be-muted);
}

/* =============================================================================
   13. .be-stepper · .be-toggle · .be-select · .be-savings
   ========================================================================== */

/* --- .be-stepper — the user-count control -------------------------------- */
.be-scope .be-stepper {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin-block-start: 14px;
  padding-block-start: 14px;
  border-block-start: 1px solid var(--be-border);
}
.be-scope .be-stepper__label {
  flex: 1 1 auto;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--be-muted);
}
.be-scope .be-stepper__btn {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: var(--be-tap);
  height: var(--be-tap);
  padding: 0;
  border: 1px solid var(--be-border-strong);
  border-radius: var(--be-radius-md);
  background-color: var(--be-surface-2);
  color: var(--be-text);
  font: inherit;
  font-size: 19px;
  font-weight: 600;
  line-height: 1;
  cursor: pointer;
  transition: background-color .15s var(--be-ease),
              color .15s var(--be-ease),
              border-color .15s var(--be-ease);
}
.be-scope .be-stepper__btn:hover:not(:disabled) {
  background-color: var(--be-brand);
  border-color: var(--be-brand);
  color: var(--be-brand-fg);
}
.be-scope .be-stepper__btn:disabled { opacity: .4; cursor: not-allowed; }
.be-scope .be-stepper__input {
  flex: 0 0 auto;
  width: 5.5ch;
  min-width: 62px;
  height: var(--be-tap);
  padding: 0 8px;
  border: 1px solid var(--be-border-strong);
  border-radius: var(--be-radius-md);
  background-color: var(--be-surface);
  color: var(--be-text);
  font: inherit;
  font-size: 16px;      /* 16px stops iOS Safari zooming on focus */
  font-weight: 700;
  text-align: center;
  font-variant-numeric: tabular-nums;
  appearance: textfield;
  -moz-appearance: textfield;
}
.be-scope .be-stepper__input::-webkit-outer-spin-button,
.be-scope .be-stepper__input::-webkit-inner-spin-button { appearance: none; margin: 0; }
.be-scope .be-stepper__help {
  flex: 1 1 100%;
  margin: 0;
  font-size: 12px;
  color: var(--be-muted);
}
.be-scope .be-stepper.is-invalid .be-stepper__input { border-color: var(--be-accent-ink); }
.be-scope .be-stepper.is-invalid .be-stepper__help  { color: var(--be-accent-ink); font-weight: 600; }

/* --- .be-toggle — Monthly / Annual segmented control ---------------------- */
/*  Shipped shape: <div class="be-toggle"><button class="be-toggle__opt is-active">
    A radio-input shape (`.be-toggle__input:checked + .be-toggle__opt`) is also
    honoured, so a no-JS variant needs no CSS change.                          */
.be-scope .be-toggle {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px;
  border: 1px solid var(--be-border-strong);
  border-radius: var(--be-radius-pill);
  background-color: var(--be-surface-2);
}
.be-scope .be-toggle__input {
  position: absolute;
  width: 1px; height: 1px;
  margin: 0; padding: 0; border: 0;
  opacity: 0; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  white-space: nowrap;
}
.be-scope .be-toggle__opt {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  min-height: 36px;
  padding: 0 16px;
  border: 0;
  border-radius: var(--be-radius-pill);
  background-color: transparent;
  color: var(--be-muted);
  font: inherit;
  font-size: 13.5px;
  font-weight: 600;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  appearance: none;
  transition: background-color .18s var(--be-ease), color .18s var(--be-ease);
}
.be-scope .be-toggle__opt:hover { color: var(--be-text); }
.be-scope .be-toggle__opt.is-active,
.be-scope .be-toggle__input:checked + .be-toggle__opt {
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
  box-shadow: var(--be-shadow-1);
}
.be-scope .be-toggle__badge {
  padding: 2px 7px;
  border-radius: var(--be-radius-pill);
  background-color: var(--be-accent);
  color: var(--be-accent-fg);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .02em;
}

/* --- .be-select — currency dropdown --------------------------------------- */
.be-scope .be-select {
  min-height: 40px;
  padding: 0 34px 0 12px;
  border: 1px solid var(--be-border-strong);
  border-radius: var(--be-radius-md);
  background-color: var(--be-surface);
  color: var(--be-text);
  font: inherit;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  appearance: none;
  /* chevron drawn with gradients — no icon font, no external asset */
  background-image:
    linear-gradient(45deg,  transparent 50%, currentColor 50%, currentColor 58%, transparent 58%),
    linear-gradient(-45deg, transparent 50%, currentColor 50%, currentColor 58%, transparent 58%);
  background-position: right 17px center, right 12px center;
  background-size: 6px 6px, 6px 6px;
  background-repeat: no-repeat;
}
[dir="rtl"] .be-scope .be-select {
  padding: 0 12px 0 34px;
  background-position: left 12px center, left 17px center;
}

/* --- .be-savings — the honest, live-computed comparison ------------------- */
/*  Shipped shape: a block callout with __compare / __headline / __note, plus
    .is-positive (we are cheaper) or .is-neutral (we are not — say so plainly).
    `.be-savings.is-pill` gives the compact inline badge form.                */
.be-scope .be-savings {
  margin-block-start: 14px;
  padding: 12px 14px;
  border: 1px solid var(--be-accent-300);
  border-radius: var(--be-radius-md);
  background-color: var(--be-accent-tint);
  color: var(--be-text);
  font-size: 13px;
  line-height: 1.45;
}
.be-scope .be-savings > :last-child { margin-bottom: 0; }
.be-scope .be-savings__compare {
  margin: 0 0 4px;
  font-size: 12.5px;
  color: var(--be-muted);
}
.be-scope .be-savings__headline {
  margin: 0 0 4px;
  font-family: var(--be-font-display);
  font-size: 15px;
  font-weight: 800;
  letter-spacing: -.01em;
  color: var(--be-accent-ink);
  font-variant-numeric: tabular-nums;
}
.be-scope .be-savings__note {
  margin: 0;
  font-size: 12px;
  color: var(--be-muted);
}
/* Not cheaper at this basket / seat count — same shape, neutral colour, no
   celebration. The claim has to be able to read "we are not cheaper here". */
.be-scope .be-savings.is-neutral {
  border-color: var(--be-border-strong);
  background-color: var(--be-surface-2);
}
.be-scope .be-savings.is-neutral .be-savings__headline { color: var(--be-text); font-weight: 700; }

.be-scope .be-savings.is-pill {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-block-start: 0;
  padding: 7px 12px;
  border-radius: var(--be-radius-pill);
  font-weight: 600;
}
.be-scope .be-savings__x {
  font-family: var(--be-font-display);
  font-size: 15px;
  font-weight: 800;
  letter-spacing: -.01em;
  font-variant-numeric: tabular-nums;
  color: var(--be-accent-ink);
}
[data-theme="dark"] .be-scope .be-savings { border-color: var(--be-accent-800); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .be-scope .be-savings { border-color: var(--be-accent-800); }
}

/* =============================================================================
   14. BUTTONS
   ========================================================================== */
.be-scope .be-btn-primary,
.be-scope .be-btn-ghost {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  min-height: var(--be-tap);
  padding: 0 22px;
  border-radius: var(--be-radius-md);
  font: inherit;
  font-size: 15px;
  font-weight: 600;
  line-height: 1;
  text-align: center;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  appearance: none;
  transition: background-color .18s var(--be-ease),
              border-color .18s var(--be-ease),
              color .18s var(--be-ease),
              box-shadow .18s var(--be-ease),
              transform .18s var(--be-ease);
}
.be-scope .be-btn-primary:hover,
.be-scope .be-btn-ghost:hover { text-decoration: none; }

.be-scope .be-btn-primary {
  border: 1px solid var(--be-brand);
  background-color: var(--be-brand);
  color: var(--be-brand-fg);
  box-shadow: var(--be-shadow-2);
}
.be-scope .be-btn-primary:hover {
  background-color: var(--be-brand-hover);
  border-color: var(--be-brand-hover);
  transform: translateY(-2px);
  box-shadow: var(--be-shadow-3);
}
.be-scope .be-btn-primary:active { transform: translateY(0); box-shadow: var(--be-shadow-1); }

.be-scope .be-btn-ghost {
  border: 1px solid var(--be-border-strong);
  background-color: transparent;
  color: var(--be-text);
}
.be-scope .be-btn-ghost:hover {
  border-color: var(--be-brand);
  background-color: var(--be-brand-tint);
  color: var(--be-brand-ink);
  transform: translateY(-2px);
}
.be-scope .be-btn-ghost:active { transform: translateY(0); }

.be-scope .be-btn-primary:disabled,
.be-scope .be-btn-ghost:disabled,
.be-scope .be-btn-primary[aria-disabled="true"],
.be-scope .be-btn-ghost[aria-disabled="true"] {
  opacity: .5;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}
.be-scope .be-btn-block { width: 100%; }
.be-scope .be-btn-sm { min-height: 36px; padding: 0 14px; font-size: 13.5px; }
/* the .be-panel__cta stack: full-width buttons */
.be-scope .be-panel__cta .be-btn-primary,
.be-scope .be-panel__cta .be-btn-ghost { width: 100%; }

/* =============================================================================
   15. .be-toast · .be-noscript · .be-skeleton
   ========================================================================== */
.be-scope .be-toasts {
  position: fixed;
  inset-block-end: calc(var(--be-fab-bottom) + 4px + env(safe-area-inset-bottom, 0px));
  inset-inline: 0;
  z-index: var(--be-z-toast);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding-inline: var(--be-gutter);
  pointer-events: none;
}
.be-scope .be-toast {
  max-width: min(420px, 100%);
  padding: 10px 14px;
  border: 1px solid var(--be-border);
  border-inline-start: 3px solid var(--be-brand);
  border-radius: var(--be-radius-md);
  background-color: var(--be-surface);
  box-shadow: var(--be-shadow-3);
  color: var(--be-text);
  font-size: 13.5px;
  line-height: 1.4;
  pointer-events: auto;
  animation: be-popin .2s var(--be-ease);
}
.be-scope .be-toast--dep    { border-inline-start-color: var(--be-brand); }
.be-scope .be-toast--locked { border-inline-start-color: var(--be-accent); }
@keyframes be-popin {
  from { opacity: 0; transform: translateY(8px) scale(.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

.be-scope .be-noscript { margin-block-start: 24px; }
.be-scope .be-noscript__formula {
  padding: 12px 14px;
  border-inline-start: 3px solid var(--be-brand);
  border-radius: var(--be-radius-sm);
  background-color: var(--be-surface-2);
  font-weight: 600;
}
.be-scope .be-noscript__bands { color: var(--be-muted); font-size: 14px; }
.be-scope .be-noscript__bands li { margin-block-end: 4px; }

.be-scope .be-skeleton {
  position: relative;
  overflow: hidden;
  border-radius: 10px;
  background-color: var(--be-surface-2);
}
.be-scope .be-skeleton::after {
  content: "";
  position: absolute;
  inset: 0;
  transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, var(--be-border), transparent);
  animation: be-shimmer 1.4s infinite;
}
@keyframes be-shimmer { to { transform: translateX(100%); } }

/* =============================================================================
   16. FAB KIT
   -----------------------------------------------------------------------------
   Host them in a bare scope so they inherit tokens without painting a band:
     <div class="be-scope be-fab-layer"> … </div>

   Positions use LOGICAL properties, so bottom-left / bottom-right mirror
   correctly in RTL locales (the family already ships RTL on e-Reta).
   z-index 1035: above a sticky header (1030), below Bootstrap offcanvas (1045)
   and modal (1055), so an Odoo dialog is never covered by a FAB.
   ========================================================================== */
.be-scope .be-fab {
  position: fixed;
  z-index: var(--be-z-fab);
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--be-gradient-brand);
  color: var(--be-on-gradient);
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
  box-shadow: var(--be-shadow-4);
  transition: transform .18s var(--be-ease),
              box-shadow .18s var(--be-ease),
              filter .18s var(--be-ease);
}
.be-scope .be-fab:hover  { transform: scale(1.05); }
.be-scope .be-fab:active { transform: scale(.98); }
.be-scope .be-fab > svg  { width: 1.15em; height: 1.15em; }

/* bottom-LEFT, 48px — appearance (theme + suite accent) */
.be-scope .be-fab-appearance {
  width: 48px; height: 48px;
  inset-block-end: calc(var(--be-fab-bottom) + env(safe-area-inset-bottom, 0px));
  inset-inline-start: var(--be-fab-inset);
}
/* bottom-RIGHT, 56px — Bria assistant (deliberately the larger of the two) */
.be-scope .be-fab-assist {
  width: 56px; height: 56px;
  font-size: 20px;
  inset-block-end: calc(var(--be-fab-bottom) + 4px + env(safe-area-inset-bottom, 0px));
  inset-inline-end: var(--be-fab-inset);
}
/* optional third slot, stacked above the appearance FAB (language, a11y, …) */
.be-scope .be-fab-stacked {
  width: 48px; height: 48px;
  inset-block-end: calc(var(--be-fab-bottom) + 60px + env(safe-area-inset-bottom, 0px));
  inset-inline-start: var(--be-fab-inset);
}

/* --- .be-fab-panel — 256px card, hidden until .is-open ------------------- */
.be-scope .be-fab-panel {
  position: fixed;
  z-index: var(--be-z-fab);
  inset-block-end: calc(var(--be-fab-bottom) + 60px + env(safe-area-inset-bottom, 0px));
  inset-inline-start: var(--be-fab-inset);
  width: 256px;
  max-width: calc(100vw - (2 * var(--be-fab-inset)));
  padding: 16px;
  background-color: var(--be-surface);
  border: 1px solid var(--be-border);
  border-radius: var(--be-radius-xl);
  box-shadow: var(--be-shadow-4);
  color: var(--be-text);

  /* hidden by default — not display:none, so the open transition can run */
  visibility: hidden;
  opacity: 0;
  transform: translateY(8px) scale(.98);
  pointer-events: none;
  transition: opacity .2s var(--be-ease),
              transform .2s var(--be-ease),
              visibility 0s linear .2s;
}
.be-scope .be-fab-panel.is-open {
  visibility: visible;
  opacity: 1;
  transform: translateY(0) scale(1);
  pointer-events: auto;
  transition: opacity .2s var(--be-ease),
              transform .2s var(--be-ease),
              visibility 0s linear 0s;
}
/* anchor a panel to the right-hand FAB instead */
.be-scope .be-fab-panel.is-end {
  inset-inline-start: auto;
  inset-inline-end: var(--be-fab-inset);
  inset-block-end: calc(var(--be-fab-bottom) + 70px + env(safe-area-inset-bottom, 0px));
}
/* if the panel is nested inside a position:fixed dock, pin it to the dock */
.be-scope .be-fab-dock { position: fixed; z-index: var(--be-z-fab); }
.be-scope .be-fab-dock .be-fab-panel {
  position: absolute;
  inset-block-end: 60px;
  inset-inline-start: 0;
}

.be-scope .be-fab-panel-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-block-end: 12px;
}
.be-scope .be-fab-panel-title {
  margin: 0;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--be-muted);
}
.be-scope .be-fab-panel-close {
  display: grid;
  place-items: center;
  width: 30px; height: 30px;
  border: 0;
  border-radius: var(--be-radius-sm);
  background-color: transparent;
  color: var(--be-muted);
  font: inherit;
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
}
.be-scope .be-fab-panel-close:hover { background-color: var(--be-surface-2); color: var(--be-text); }
.be-scope .be-fab-panel-label {
  display: block;
  margin: 14px 0 8px;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--be-muted);
}
/* the Light / Dark pair inside the panel reuses .be-toggle, full width */
.be-scope .be-fab-panel .be-toggle { display: flex; width: 100%; }
.be-scope .be-fab-panel .be-toggle__opt { flex: 1 1 0; padding-inline: 8px; }

/* --- .be-swatch — accent chooser grid ------------------------------------ */
.be-scope .be-swatch-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px;
}
.be-scope .be-swatch {
  position: relative;
  display: block;
  width: 100%;
  height: 48px;                       /* >= 44px touch target */
  padding: 0;
  border: 2px solid var(--be-border);
  border-radius: var(--be-radius-md);
  background-image: linear-gradient(135deg,
                      var(--be-swatch-from, var(--be-brand-600)),
                      var(--be-swatch-to,   var(--be-brand-800)));
  cursor: pointer;
  overflow: hidden;
  transition: border-color .18s var(--be-ease), transform .18s var(--be-ease);
}
.be-scope .be-swatch:hover { transform: translateY(-2px); }
.be-scope .be-swatch.is-active { border-color: var(--be-text); }
/* white tick, drawn — no icon-font dependency */
.be-scope .be-swatch.is-active::after {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 11px; height: 6px;
  border-inline-start: 2.5px solid var(--be-on-gradient);
  border-block-end: 2.5px solid var(--be-on-gradient);
  transform: translate(-50%, -70%) rotate(-45deg);
}
.be-scope .be-swatch-name {
  display: block;
  margin-top: 5px;
  font-size: 11px;
  font-weight: 600;
  text-align: center;
  color: var(--be-muted);
}

/* =============================================================================
   17. DECOR — aurora + grid-bg hero backdrop
   ========================================================================== */
/* self-match compound included — see the SELF-MATCH NOTE in section 7. Without
   it the aurora / grid backdrop escapes and paints over the whole viewport. */
.be-scope .be-hero,
.be-scope.be-hero { position: relative; overflow: hidden; isolation: isolate; }
.be-scope .be-hero > *,
.be-scope.be-hero > * { position: relative; z-index: 1; }
.be-scope .be-hero > .be-aurora,
.be-scope .be-hero > .be-gridbg,
.be-scope.be-hero > .be-aurora,
.be-scope.be-hero > .be-gridbg { position: absolute; z-index: 0; }

.be-scope .be-aurora {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}
.be-scope .be-aurora::before,
.be-scope .be-aurora::after {
  content: "";
  position: absolute;
  border-radius: 999px;
  filter: blur(90px);
  opacity: .45;
}
.be-scope .be-aurora::before {
  width: 620px; height: 620px; top: -240px; left: -140px;
  background: radial-gradient(circle, var(--be-brand-400), transparent 70%);
}
.be-scope .be-aurora::after {
  width: 520px; height: 520px; top: -180px; right: -120px;
  background: radial-gradient(circle, var(--be-accent-400), transparent 70%);
}
@supports (color: color-mix(in srgb, red, red)) {
  .be-scope .be-aurora::before {
    background: radial-gradient(circle,
      color-mix(in srgb, var(--be-brand-500) 55%, transparent), transparent 70%);
  }
  .be-scope .be-aurora::after {
    background: radial-gradient(circle,
      color-mix(in srgb, var(--be-accent-500) 50%, transparent), transparent 70%);
  }
}
[data-theme="dark"] .be-scope .be-aurora::before,
[data-theme="dark"] .be-scope .be-aurora::after { opacity: .30; }

.be-scope .be-gridbg {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: .6;
  background-image:
    linear-gradient(to right,  var(--be-border) 1px, transparent 1px),
    linear-gradient(to bottom, var(--be-border) 1px, transparent 1px);
  background-size: 46px 46px;
  -webkit-mask-image: radial-gradient(75% 65% at 50% 0, #000 42%, transparent 100%);
          mask-image: radial-gradient(75% 65% at 50% 0, #000 42%, transparent 100%);
}

/* =============================================================================
   18. RESPONSIVE
   -----------------------------------------------------------------------------
   >= 1200px  three columns (rail / apps / sticky panel)
   992-1199   three columns, narrower
   <  992px   SINGLE column; the rail becomes a horizontal pill strip and the
              summary moves into a fixed bottom bar.

   Two bottom-bar patterns are supported:
     .be-bar                    — the separate lightweight bar in the shipped
                                  markup (JS un-hides it; CSS decides whether
                                  it may show at all)
     .be-panel.is-mobile-bar    — the single-element variant, where the whole
                                  panel reflows into the bar
   ========================================================================== */
@media (max-width: 1199.98px) {
  .be-scope .be-grid { grid-template-columns: 200px minmax(0, 1fr) 304px; gap: 20px; }
  .be-scope .be-group__grid { grid-template-columns: repeat(auto-fill, minmax(186px, 1fr)); }
}

/* the bar never exists above the breakpoint */
.be-scope .be-bar { display: none; }

@media (max-width: 991.98px) {
  :root { --be-gutter: 16px; --be-sticky-top: 68px; }

  .be-scope .be-grid { display: block; }

  /* rail -> horizontal, sticky, scrollable pill strip */
  .be-scope .be-rail {
    position: sticky;
    top: var(--be-sticky-top);
    z-index: calc(var(--be-z-sticky) + 1);
    max-height: none;
    margin-block-end: 20px;
    padding-block: 8px;
    background-color: var(--be-bg);
    border-block-end: 1px solid var(--be-border);
  }
  .be-scope .be-rail__title { margin-block-end: 8px; }
  .be-scope .be-rail__list {
    flex-direction: row;
    gap: 8px;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;
    padding: 0 0 2px;
    -webkit-overflow-scrolling: touch;
  }
  .be-scope .be-rail__list::-webkit-scrollbar { display: none; }
  .be-scope .be-rail__item { flex: 0 0 auto; }
  .be-scope .be-rail__hint { display: none; }

  /* the toast stack clears the FAB row (they share the bottom edge on phones) */
  .be-scope .be-toasts {
    inset-block-end: calc(var(--be-fab-bottom) + 76px + env(safe-area-inset-bottom, 0px));
  }

  /* panel returns to normal flow, plus room for the fixed bar */
  .be-scope .be-panel {
    position: static;
    margin-block-start: 24px;
    margin-block-end: 84px;
  }

  /* --- pattern A: the standalone .be-bar -------------------------------- */
  .be-scope .be-bar:not([hidden]) {
    position: fixed;
    inset-inline: 0;
    inset-block-end: 0;
    z-index: var(--be-z-bar);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 10px var(--be-gutter) calc(10px + env(safe-area-inset-bottom, 0px));
    background-color: var(--be-surface);
    border-block-start: 1px solid var(--be-border);
    border-radius: var(--be-radius-xl) var(--be-radius-xl) 0 0;
    box-shadow: var(--be-shadow-4);
  }
  .be-scope .be-bar__summary {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 13.5px;
    font-weight: 600;
    line-height: 1.3;
    font-variant-numeric: tabular-nums;
  }
  .be-scope .be-bar__cta { flex: 0 0 auto; }

  /* --- pattern B: .be-panel.is-mobile-bar -------------------------------- */
  .be-scope .be-panel.is-mobile-bar {
    position: fixed;
    inset-inline: 0;
    inset-block-end: 0;
    top: auto;
    z-index: var(--be-z-bar);
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 12px;
    margin: 0;
    padding: 10px var(--be-gutter) calc(10px + env(safe-area-inset-bottom, 0px));
    background-color: var(--be-surface);
    border: 0;
    border-block-start: 1px solid var(--be-border);
    border-radius: var(--be-radius-xl) var(--be-radius-xl) 0 0;
    box-shadow: var(--be-shadow-4);
  }
  .be-scope .be-panel.is-mobile-bar .be-panel__summary,
  .be-scope .be-panel.is-mobile-bar .be-panel__lines,
  .be-scope .be-panel.is-mobile-bar .be-panel__row,
  .be-scope .be-panel.is-mobile-bar .be-panel__basenote,
  .be-scope .be-panel.is-mobile-bar .be-stepper,
  .be-scope .be-panel.is-mobile-bar .be-savings,
  .be-scope .be-panel.is-mobile-bar .be-panel__ctanote { display: none; }
  .be-scope .be-panel.is-mobile-bar .be-panel__card {
    display: flex;
    flex: 1 1 auto;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 0;
    border: 0;
    background-color: transparent;
    box-shadow: none;
  }
  .be-scope .be-panel.is-mobile-bar .be-panel__total {
    flex: 1 1 auto;
    margin: 0;
    padding: 0;
    border: 0;
  }
  .be-scope .be-panel.is-mobile-bar .be-panel__totalvalue { font-size: 1.3rem; }
  .be-scope .be-panel.is-mobile-bar .be-panel__cta { display: flex; gap: 8px; margin: 0; }
  .be-scope .be-panel.is-mobile-bar .be-panel__cta .be-btn-ghost { display: none; }
  .be-scope .be-panel.is-mobile-bar .be-panel__cta .be-btn-primary { width: auto; }

  /* expanded sheet — the whole receipt, dragged up from the bar */
  .be-scope .be-panel.is-mobile-bar.is-expanded {
    flex-direction: column;
    align-items: stretch;
    max-height: 78vh;
    overflow-y: auto;
    padding-block-start: 16px;
  }
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__summary,
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__lines,
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__row,
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__basenote,
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-stepper,
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-savings,
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__ctanote { display: block; }
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-stepper { display: flex; }
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__card {
    flex-direction: column;
    align-items: stretch;
  }
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__cta { display: grid; }
  .be-scope .be-panel.is-mobile-bar.is-expanded .be-panel__cta .be-btn-ghost { display: inline-flex; }

  /* grab handle for either bar */
  .be-scope .be-bar .be-bar__grip,
  .be-scope .be-panel.is-mobile-bar .be-panel__grip {
    position: absolute;
    top: 5px; left: 50%;
    transform: translateX(-50%);
    width: 38px; height: 4px;
    border-radius: 999px;
    background-color: var(--be-border-strong);
  }

  /* Lift the FABs and the toast stack clear of the bar.
     Automatic wherever :has() exists — no JS hook required. `--be-fab-bottom`
     is a TOKEN, so overriding it on <body> is inert until a FAB reads it. */
  body:has(.be-bar:not([hidden])),
  body:has(.be-panel.is-mobile-bar) { --be-fab-bottom: 96px; }
  /* Explicit fallback for engines without :has(): add `.be-has-mobile-bar`
     to <html> or <body> when the bar is mounted. */
  .be-has-mobile-bar { --be-fab-bottom: 96px; }
}

@media (max-width: 575.98px) {
  .be-scope .be-group__grid { grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 10px; }
  .be-scope .be-appcard__label,
  .be-scope .be-appcard.is-bare {
    min-height: 96px;
    padding-block: 13px 12px;
    padding-inline: 13px 40px;
  }
  .be-scope .be-appcard__blurb { display: none; }
  .be-scope .be-fab-panel { width: min(288px, calc(100vw - 32px)); }
  .be-scope .be-btn-primary,
  .be-scope .be-btn-ghost { padding: 0 16px; font-size: 14.5px; }
  .be-scope .be-calc__controls { width: 100%; }
}

/* Every interactive surface reaches the 44px target on touch. Applied on BOTH
   triggers because neither alone is sufficient: `pointer: coarse` misses
   touch-capable laptops, and the width query misses large tablets. */
@media (pointer: coarse), (max-width: 991.98px) {
  .be-scope .be-pill          { min-height: var(--be-tap); }
  .be-scope .be-toggle__opt   { min-height: var(--be-tap); padding-inline: 18px; }
  .be-scope .be-select        { min-height: var(--be-tap); }
  .be-scope .be-crumb__back   { min-height: var(--be-tap); }
  .be-scope .be-fab-panel-close { width: var(--be-tap); height: var(--be-tap); }
  .be-scope .be-swatch        { height: 52px; }
}

/* =============================================================================
   19. ACCESSIBILITY
   ========================================================================== */

/* --- focus: always visible, always a brand ring --------------------------- */
.be-scope :focus-visible {
  outline: 2px solid var(--be-brand);
  outline-offset: 2px;
  border-radius: var(--be-radius-sm);
}
/* the real checkbox is visually hidden, so the ring must land on the card */
.be-scope .be-appcard:has(.be-appcard__input:focus-visible),
.be-scope .be-appcard__input:focus-visible + .be-appcard__label {
  outline: 2px solid var(--be-brand);
  outline-offset: 2px;
  border-radius: var(--be-radius-lg);
}
.be-scope .be-toggle__input:focus-visible + .be-toggle__opt {
  outline: 2px solid var(--be-brand);
  outline-offset: 2px;
}
/* on a brand-filled control the ring needs a gap in the page colour to read */
.be-scope .be-btn-primary:focus-visible,
.be-scope .be-pill.is-active:focus-visible,
.be-scope .be-toggle__opt.is-active:focus-visible,
.be-scope .be-fab:focus-visible {
  outline: 2px solid var(--be-brand);
  outline-offset: 3px;
  box-shadow: 0 0 0 3px var(--be-bg), var(--be-shadow-2);
}

/* --- reduced motion: keep the state change, drop the movement ------------- */
@media (prefers-reduced-motion: reduce) {
  .be-scope *,
  .be-scope *::before,
  .be-scope *::after {
    animation-duration: .001ms;
    animation-iteration-count: 1;
    transition-duration: .001ms;
    scroll-behavior: auto;
  }
  .be-scope .be-card.is-interactive:hover,
  .be-scope a.be-card:hover,
  .be-scope .be-appcard:hover,
  .be-scope .be-btn-primary:hover,
  .be-scope .be-btn-ghost:hover,
  .be-scope .be-swatch:hover { transform: none; }
  .be-scope .be-fab:hover { transform: none; filter: brightness(1.12); }
  .be-scope .be-skeleton::after { animation: none; }
  .be-scope .be-fab-panel,
  .be-scope .be-fab-panel.is-open { transform: none; }
}

/* --- Windows / forced-colours: hand back to the system palette ------------ */
@media (forced-colors: active) {
  .be-scope .be-card,
  .be-scope .be-appcard,
  .be-scope .be-panel,
  .be-scope .be-pill,
  .be-scope .be-toggle,
  .be-scope .be-select,
  .be-scope .be-stepper__btn,
  .be-scope .be-stepper__input { border-color: CanvasText; }
  .be-scope .be-appcard.is-selected,
  .be-scope .be-appcard.is-checked,
  .be-scope .be-appcard.is-locked { border-width: 3px; }
  .be-scope .be-pill.is-active,
  .be-scope .be-toggle__opt.is-active,
  .be-scope .be-fab { forced-color-adjust: none; }
}

/* --- print: drop the furniture, keep the receipt -------------------------- */
@media print {
  .be-scope .be-fab,
  .be-scope .be-fab-panel,
  .be-scope .be-fab-layer,
  .be-scope .be-toasts,
  .be-scope .be-bar,
  .be-scope .be-rail { display: none; }
  .be-scope .be-grid { display: block; }
  .be-scope .be-panel,
  .be-scope .be-panel.is-mobile-bar {
    position: static;
    margin: 0;
    box-shadow: none;
  }
  .be-scope .be-card { box-shadow: none; break-inside: avoid; }
  .be-scope { background-color: #ffffff; color: #000000; }  /* ink on paper */
}

/* ============================ end bridge-theme.css ======================== */

/* ============================================================================
   ODOO-PARITY LAYER  (added 2026-08-09 on Dennis's design note)
   The picker was built with tall, description-heavy cards. The reference we
   are matching — Odoo's "Choose your Apps" — is far airier: a compact pill
   (small icon + bold name, nothing else), three across, generous gutters, and
   plain LARGE category headings instead of decorated ones. This section
   overrides the earlier component rules rather than editing them in place, so
   it is easy to lift out if the denser layout is preferred.
   ========================================================================= */

/* --- the pill itself: one row, ~72px tall, quiet border, soft lift -------- */
.be-scope .be-appcard__label,
.be-scope .be-appcard.is-bare {
  flex-direction: row;          /* was column */
  align-items: center;
  gap: 14px;
  min-height: 0;                /* was 104px */
  padding-block: 14px;
  padding-inline: 16px 40px;
}
.be-scope .be-appcard {
  border-color: var(--be-border);
  border-radius: 12px;
  box-shadow: 0 1px 2px rgba(11, 16, 20, .06);
}
.be-scope .be-appcard:hover {
  transform: none;              /* Odoo's cards do not jump */
  box-shadow: 0 4px 14px -4px rgba(11, 16, 20, .18);
  border-color: var(--be-border-strong);
}

/* Odoo shows icon + name only. The blurb is kept in the DOM for screen
   readers and for the selected-list in the panel, but hidden on the card. */
.be-scope .be-appcard__blurb { display: none; }

/* bigger, brand-tinted icon tile, closer to Odoo's 32px app icons */
.be-scope .be-appcard__icon {
  width: 40px; height: 40px;
  border-radius: 10px;
  flex: 0 0 40px;
}
.be-scope .be-appcard__icon img { width: 26px; height: 26px; }

.be-scope .be-appcard__body { flex: 1 1 auto; gap: 2px; }
.be-scope .be-appcard__name { font-size: 15px; font-weight: 700; }

/* price sits quietly under the name instead of competing with it */
.be-scope .be-appcard__price {
  position: static;
  font-size: 12px;
  font-weight: 500;
  opacity: .75;
}

/* --- category headings: large and plain, like Odoo's display-5 ----------- */
.be-scope .be-group__title {
  font-size: clamp(1.5rem, 1.15rem + 1.1vw, 2rem);
  font-weight: 700;
  letter-spacing: -0.01em;
  text-transform: none;
  color: var(--be-text);
  opacity: 1;
}
.be-scope .be-group__title::after { display: none; }   /* drop the rule/dash */
.be-scope .be-group { margin-block-end: 44px; }

/* --- more air between pills --------------------------------------------- */
.be-scope .be-group__grid { gap: 16px; }
@media (min-width: 1200px) {
  .be-scope .be-group__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* --- row-layout containment fix ------------------------------------------
   Making the label a row put four children (icon, body, lock badge, price)
   on one line; the label grew to 325px inside a 227px card and the badge and
   price spilled over the name. Constrain the label, let the body shrink, and
   push the price to the end. The "ALWAYS ON" badge is redundant next to the
   check mark and the "included" price, so it is dropped on the card. */
.be-scope .be-appcard__label,
.be-scope .be-appcard.is-bare {
  width: 100%;
  box-sizing: border-box;
  padding-inline: 16px 38px;   /* right lane kept clear for the check mark */
  overflow: hidden;
}
.be-scope .be-appcard__body { flex: 1 1 auto; min-width: 0; }
.be-scope .be-appcard__name { white-space: normal; overflow-wrap: anywhere; }
.be-scope .be-appcard__lock { display: none; }
.be-scope .be-appcard__price {
  margin-inline-start: auto;
  flex: 0 0 auto;
  white-space: nowrap;
  align-self: center;
}

/* --- name wrapping + responsive columns ----------------------------------
   `overflow-wrap: anywhere` split "BridgeERP" as "BridgeE / RP". Names must
   only wrap at spaces. The real cause was three columns on a ~700px viewport
   leaving 227px cards, so set explicit breakpoints: 1 column on phones,
   2 on tablets, 3 only when there is genuinely room. */
.be-scope .be-appcard__name { overflow-wrap: normal; word-break: normal; hyphens: none; }
.be-scope .be-group__grid { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 680px) {
  .be-scope .be-group__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
  .be-scope .be-group__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* --- rail removed (Dennis, 2026-08-09) -----------------------------------
   Matching Odoo's picker exactly: no left category rail, just a single wide
   column of grouped pills with the price panel on the right. Gives the cards
   ~200px more width, which is what made Odoo's layout feel airy. */
.be-scope .be-rail { display: none; }
.be-scope .be-grid { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 992px) {
  .be-scope .be-grid { grid-template-columns: minmax(0, 1fr) 320px; gap: 32px; }
}
@media (min-width: 1400px) {
  .be-scope .be-grid { grid-template-columns: minmax(0, 1fr) 340px; gap: 40px; }
}

/* ============================================================================
   ODOO CARD PARITY — measured from odoo.com/trial (2026-08-09)
   Odoo card = 70px, padding 16px, radius 4px, shadow 0 2px 4px rgba(0,0,0,.075),
   border 2px solid transparent (brand on hover/select), icon 32px, name 16/600.
   ========================================================================= */
.be-scope .be-appcard {
  border: 2px solid transparent;
  border-radius: 6px;
  background-color: #fff;
  box-shadow: 0 2px 4px rgba(0, 0, 0, .075);
}
html[data-theme="dark"] .be-scope .be-appcard,
.be-scope[data-theme] .be-appcard { background-color: var(--be-surface); }
.be-scope .be-appcard:hover {
  border-color: var(--be-brand);
  box-shadow: 0 4px 10px -2px rgba(0, 0, 0, .12);
}
.be-scope .be-appcard.is-selected,
.be-scope .be-appcard:has(.be-appcard__input:checked) {
  border-color: var(--be-brand);
  background-color: var(--be-brand-050, rgba(17,73,102,.05));
}
.be-scope .be-appcard__label,
.be-scope .be-appcard.is-bare {
  gap: 12px;
  padding: 16px;
  padding-inline-end: 40px;
  min-height: 70px;
}
.be-scope .be-appcard__icon { width: 32px; height: 32px; flex: 0 0 32px; border-radius: 8px; }
.be-scope .be-appcard__icon img { width: 24px; height: 24px; }
.be-scope .be-appcard__name { font-size: 16px; font-weight: 600; }

/* ============================================================================
   ODOO COMPOSITION PARITY — measured live from odoo.com/trial (2026-08-09)
     hero  : white, CENTRED, h1 55.5px/700 + one 16px/600 line, pb 48px
     band  : full-bleed grey #f3f4f6 holding every group
     group : heading 27.6px/700 left-aligned, mb 16px, 48px between groups
     card  : icon 32px + name 16px/600 ONLY — no price, no description
   Prices are not on Odoo's cards and are not on ours either; the right-hand
   panel already itemises every selected app, so the grid stays clean.
   ========================================================================= */

/* hero ------------------------------------------------------------------- */
.be-scope .be-calc__head { text-align: center; padding-block: 8px 40px; }
.be-scope .be-calc__headmain { display: block; }
.be-scope .be-calc__headtext { max-width: 720px; margin-inline: auto; }
.be-scope .be-calc__title {
  font-size: clamp(2.25rem, 1.6rem + 2.6vw, 3.45rem);
  font-weight: 700; line-height: 1.05; letter-spacing: -0.02em;
  margin-block: 0 14px;
}
.be-scope .be-calc__lede {
  font-size: 16px; font-weight: 600; color: var(--be-muted);
  margin-block: 0; max-width: none;
}
.be-scope .be-crumb { display: none; }        /* Odoo has no breadcrumb here */
.be-scope .be-calc__controls {
  display: flex; justify-content: center; align-items: center;
  flex-wrap: wrap; gap: 14px; margin-block-start: 26px;
}

/* full-bleed grey band --------------------------------------------------- */
.be-scope .be-band {
  background: #f3f4f6;
  margin-inline: calc(50% - 50vw);
  padding-block: 44px;
  padding-inline: max(24px, calc(50vw - 50%));
}
html[data-theme="dark"] .be-scope .be-band { background: var(--be-surface-2, #162028); }

/* groups ----------------------------------------------------------------- */
.be-scope .be-group { margin-block-end: 48px; }
.be-scope .be-group__title {
  font-size: 27.6px; font-weight: 700; text-align: start;
  margin-block: 0 16px; letter-spacing: -0.01em;
}
.be-scope .be-group__grid { gap: 16px; }

/* card: icon + name only ------------------------------------------------- */
.be-scope .be-appcard__price { display: none; }
.be-scope .be-appcard__label,
.be-scope .be-appcard.is-bare { min-height: 70px; padding-inline-end: 44px; }
/* the Core card keeps its "included" note, since that is real information */
.be-scope .be-appcard.is-locked .be-appcard__price { display: inline; opacity: .7; }

/* Odoo shows no pricing small-print in the hero — keep the heading and one
   line only. The currency selector stays; its explanatory note does not. */
.be-scope .be-calc__curnote { display: none; }

/* ============================================================================
   FAMILY DISPLAY FONT + PANEL-ON-DEMAND  (2026-08-09)
   1. Self-hosted display face for headings across the BridgeERP family.
   2. The plan panel is hidden until the visitor picks an app — on load the
      cards get the full width, exactly like the reference.
   3. Panel content trimmed to essentials: what is selected, seats, total.
   ========================================================================= */
@font-face {
  font-family: "BridgeERP Display";
  src: url("/web/content/21091/bridge-display.woff2") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
}

.be-scope .be-calc__title,
.be-scope .be-group__title {
  font-family: "BridgeERP Display", "Source Sans Pro", system-ui, sans-serif;
  letter-spacing: 0;
}
.be-scope .be-calc__title { font-size: clamp(2.8rem, 2rem + 3.4vw, 4.4rem); line-height: 1; }
.be-scope .be-group__title { font-size: 34px; line-height: 1.15; }

/* --- panel appears only after the first pick ----------------------------- */
.be-scope .be-panel { display: none; }
.be-scope.has-selection .be-panel { display: block; }
.be-scope .be-grid { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 992px) {
  .be-scope .be-grid { grid-template-columns: minmax(0, 1fr); }
  .be-scope.has-selection .be-grid { grid-template-columns: minmax(0, 1fr) 340px; gap: 36px; }
}

/* --- roomier cards: the grid was cramped next to the reference ----------- */
.be-scope .be-group__grid { gap: 20px; }
.be-scope .be-appcard__label,
.be-scope .be-appcard.is-bare { min-height: 84px; padding: 20px; padding-inline-end: 48px; gap: 16px; }
.be-scope .be-appcard__icon { width: 36px; height: 36px; flex: 0 0 36px; }
.be-scope .be-group { margin-block-end: 56px; }

/* --- panel: essentials only (no per-app price column, no cap row) -------- */
.be-scope .be-panel__lineprice,
.be-scope .be-panel__row--base,
.be-scope .be-panel__basenote,
.be-scope .be-savings { display: none; }
.be-scope .be-panel__card { padding: 26px; }

/* ============================================================================
   LAYOUT CORRECTIONS (Dennis, 2026-08-09)
   1. Real page gutters — content was running edge-to-edge; the reference
      keeps ~100px of air each side on a wide screen.
   2. The panel COLUMN is reserved from the start, so revealing the panel no
      longer re-flows and squeezes the cards. Only the panel's visibility
      changes; the card column keeps its width throughout.
   3. Per-app prices restored on the cards.
   ========================================================================= */

/* 1. gutters + a sane maximum measure, applied to hero and band alike */
.be-scope .be-calc__head,
.be-scope .be-band > .be-grid {
  max-width: 1800px;
  margin-inline: auto;
  padding-inline: clamp(20px, 5vw, 100px);
}
.be-scope .be-band { padding-inline: 0; }

/* 2. the panel track always exists: cards never resize when it appears */
@media (min-width: 992px) {
  .be-scope .be-grid,
  .be-scope.has-selection .be-grid {
    grid-template-columns: minmax(0, 1fr) 340px;
    gap: 36px;
    align-items: start;
  }
}
/* below the breakpoint the panel stacks underneath, so no reserved track */
@media (max-width: 991.98px) {
  .be-scope .be-grid,
  .be-scope.has-selection .be-grid { grid-template-columns: minmax(0, 1fr); }
}

/* 3. prices back on the cards */
.be-scope .be-appcard__price { display: flex; align-items: baseline; gap: 5px; }
.be-scope .be-appcard__amount { font-weight: 700; font-size: 14px; }
.be-scope .be-appcard__unit { font-size: 12px; opacity: .7; }

/* Brand app icons: the site's own artwork, shown as-is. No tinted plate —
   these are the apps' identities and must read exactly as they do elsewhere. */
.be-scope .be-appcard__icon:has(img) { background: transparent; border-radius: 0; }
.be-scope .be-appcard__icon img { width: 34px; height: 34px; object-fit: contain; }

/* Prices belong in the cart, not on the cards (Dennis, 2026-08-09).
   The card stays a clean pill — brand icon + name — exactly like the
   reference; every selected app shows its rate in the plan panel. */
.be-scope .be-appcard__price { display: none; }
.be-scope .be-appcard.is-locked .be-appcard__price { display: inline; opacity: .7; }
.be-scope .be-panel__lineprice {
  display: inline; margin-inline-start: auto;
  font-size: 13px; font-weight: 600; white-space: nowrap; opacity: .85;
}
.be-scope .be-panel__line { display: flex; align-items: baseline; gap: 10px; }
.be-scope .be-panel__linename { flex: 1 1 auto; min-width: 0; }

/* ---- entry animation: pills rise in once everything is ready ------------
   The reference reveals the whole page at once, then the cards animate up.
   Stagger is per-position within each group (cheap, no JS bookkeeping). */
@keyframes be-rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.be-scope[data-be-ready] .be-appcard { animation: be-rise .42s cubic-bezier(.22,.7,.3,1) both; }
.be-scope[data-be-ready] .be-group__title { animation: be-rise .38s cubic-bezier(.22,.7,.3,1) both; }
.be-scope[data-be-ready] .be-appcard:nth-child(1) { animation-delay: .02s }
.be-scope[data-be-ready] .be-appcard:nth-child(2) { animation-delay: .05s }
.be-scope[data-be-ready] .be-appcard:nth-child(3) { animation-delay: .08s }
.be-scope[data-be-ready] .be-appcard:nth-child(4) { animation-delay: .11s }
.be-scope[data-be-ready] .be-appcard:nth-child(5) { animation-delay: .14s }
.be-scope[data-be-ready] .be-appcard:nth-child(6) { animation-delay: .17s }
.be-scope[data-be-ready] .be-appcard:nth-child(n+7) { animation-delay: .2s }
/* the panel slides in the same way when it first appears */
.be-scope.has-selection .be-panel { animation: be-rise .34s cubic-bezier(.22,.7,.3,1) both; }
/* never animate for people who asked not to */
@media (prefers-reduced-motion: reduce) {
  .be-scope[data-be-ready] .be-appcard,
  .be-scope[data-be-ready] .be-group__title,
  .be-scope.has-selection .be-panel { animation: none; }
}
/* the loading line contributed to the flicker; the reveal covers it now */
.be-scope .be-main__status { display: none; }

/* ============================================================================
   FINAL PASS (Dennis, 2026-08-09)
   - full width until something is picked, then a smooth glide to the split
   - currency sits inline with the billing toggle, same pill language
   - default state is Core only
   ========================================================================= */

/* --- smooth full-width -> split ------------------------------------------
   grid-template-columns is animatable, so the columns genuinely glide rather
   than snapping. The panel fades and slides in on the same curve. */
@media (min-width: 992px) {
  .be-scope .be-grid {
    grid-template-columns: minmax(0, 1fr) 0px;
    gap: 0px;
    transition: grid-template-columns .55s cubic-bezier(.22,.7,.26,1),
                gap .55s cubic-bezier(.22,.7,.26,1);
  }
  .be-scope.has-selection .be-grid {
    grid-template-columns: minmax(0, 1fr) 340px;
    gap: 36px;
  }
  /* the panel is always in the DOM so the column can animate; it is just
     invisible and non-interactive until there is something to show */
  .be-scope .be-panel {
    display: block;
    opacity: 0;
    transform: translateY(16px);
    pointer-events: none;
    overflow: hidden;
    transition: opacity .4s ease .12s, transform .45s cubic-bezier(.22,.7,.26,1) .12s;
  }
  .be-scope.has-selection .be-panel {
    opacity: 1; transform: none; pointer-events: auto; animation: none;
  }
}
/* cards reflow smoothly as the column narrows */
.be-scope .be-appcard { transition: border-color .18s, box-shadow .18s, background-color .18s; }
@media (prefers-reduced-motion: reduce) {
  .be-scope .be-grid, .be-scope .be-panel { transition: none; }
}

/* --- currency inline with the billing toggle ----------------------------- */
.be-scope .be-calc__controls { gap: 12px; }
.be-scope .be-calc__currency { display: inline-flex; align-items: center; }
.be-scope .be-calc__currency .be-select {
  appearance: none; -webkit-appearance: none;
  height: 44px; padding: 0 38px 0 16px; cursor: pointer;
  font-size: 14px; font-weight: 600; color: var(--be-text);
  background-color: var(--be-surface);
  border: 1px solid var(--be-border-strong); border-radius: 999px;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
                    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: calc(100% - 20px) 19px, calc(100% - 14px) 19px;
  background-size: 6px 6px, 6px 6px;
  background-repeat: no-repeat;
}
.be-scope .be-calc__currency .be-select:hover { border-color: var(--be-brand); }
.be-scope .be-calc__currency .be-select:focus-visible { outline: 3px solid var(--be-brand); outline-offset: 2px; }
.be-scope .be-sr {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
/* the Core icon is the BridgeERP mark - let it breathe, no plate */
.be-scope .be-appcard.is-locked .be-appcard__icon { background: transparent; }
