/* ==========================================================================
   EpicJobs Design System
   Outfit + Inter · Bootstrap 5.3 overrides · design tokens
   See doc/modules/12-ui-ux-design-system.md
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Outfit + Inter — self-hosted

   TWO FAMILIES, ONE JOB EACH (doc s.100). Outfit sets every heading and
   display figure; Inter sets everything a reader actually reads. They are the
   pairing the reference design uses, and the split is the point: Outfit is a
   geometric display face with a wide, even colour that looks deliberate at
   48px and muddy at 14px, while Inter was drawn for UI text at exactly the
   sizes this application spends its life in.

   SELF-HOSTED, NOT LINKED. The Content-Security-Policy sets `font-src 'self'`,
   so the reference's <link> to fonts.googleapis.com would be blocked outright
   and every screen would silently fall back to the system stack. Serving the
   files ourselves is also what makes this work on an install with no internet.

   ONE FILE PER SCRIPT, NOT ONE PER WEIGHT. Both are variable fonts, so the
   whole axis arrives in a single request - Outfit 300-800, Inter 300-700 -
   and any weight between the named stops is available for free.

   LATIN-EXT IS NOT OPTIONAL HERE. The rupee sign is U+20B9, which lives in
   the latin-ext range, and this platform prices everything in rupees. Dropping
   that subset to save a request would have replaced every price on the site
   with a fallback glyph.

   THE FALLBACK METRICS ARE MEASURED, NOT COPIED. Each override below is
   derived from the font's own head/hhea tables and a weighted mean advance
   over lowercase Latin - not from OS/2.xAvgCharWidth, which in a large family
   averages every arrow and box-drawing glyph in the file and comes out ~30%
   too wide. A size-adjust built on that number shifts the layout at the swap
   instead of holding it still, which is the whole reason the override exists.
   -------------------------------------------------------------------------- */
@font-face {
  font-family: 'Outfit';
  src: url('../fonts/outfit/outfit-latin.woff2') format('woff2');
  font-weight: 300 800; font-style: normal; font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                 U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Outfit';
  src: url('../fonts/outfit/outfit-latin-ext.woff2') format('woff2');
  font-weight: 300 800; font-style: normal; font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                 U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                 U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Inter';
  src: url('../fonts/inter/inter-latin.woff2') format('woff2');
  font-weight: 300 700; font-style: normal; font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                 U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  src: url('../fonts/inter/inter-latin-ext.woff2') format('woff2');
  font-weight: 300 700; font-style: normal; font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                 U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                 U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* The metric-matched stand-ins shown during `swap`. */
@font-face {
  font-family: 'Outfit Fallback';
  src: local('Arial'), local('Helvetica'), local('Liberation Sans');
  size-adjust: 98.95%;
  ascent-override: 101.06%;
  descent-override: 26.28%;
  line-gap-override: 0%;
}
@font-face {
  font-family: 'Inter Fallback';
  src: local('Arial'), local('Helvetica'), local('Liberation Sans');
  size-adjust: 107.55%;
  ascent-override: 90.07%;
  descent-override: 22.43%;
  line-gap-override: 0%;
}

/* --------------------------------------------------------------------------
   2. Tokens
   -------------------------------------------------------------------------- */
/*
   THE INDIAN FLAG, WHICH IS ALSO THE LOGO.

   Saffron, white and India green, with the chakra's navy - sampled from the
   supplied artwork rather than from the flag's official hexes, so the site and
   the mark are the same colours: the saffron M (#F98F2E), the green D and
   wordmark (#1B790D) and the navy bridge (#081474).

   The three hues are NOT interchangeable, and the palette is built around what
   each one can actually carry:

     - NAVY is the only one that works as text on white (13.6:1). It is also
       unusable on the near-black dark theme (1.3:1).
     - SAFFRON is the reverse: brilliant on dark (8.4:1) and unusable on light
       (2.1:1), where it fails even the 3:1 needed for a border. It is used as
       a FILL with dark text over it, never as a thin line or small label on a
       pale surface.
     - GREEN is the only one that works on both, which is why it carries the
       interactive weight - links, primary buttons, focus.

   White is the third band, and it is the page: the layout's whitespace is
   doing the flag's middle stripe, which is why the surfaces stayed neutral
   rather than being tinted.

   Dark is the default theme (:root); light is opt-in via [data-theme="light"].

   ON THE `br-` PREFIX. It predates the rename and is deliberately kept. It is
   an internal namespace, invisible to users, spanning ~3,100 usages across the
   stylesheet, forty templates and the JavaScript. Renaming it would risk
   silently unstyling an element for every occurrence missed, and no test in
   this project asserts that a given element carries a given class. The cost is
   real and the benefit is nil, so it stays — read it as "brand", not as the
   old product name.
*/
:root {
  /* --- Brand ------------------------------------------------------------ */
  /* Green carries the interactive weight because it is the only one of the
     three legible on both themes. #1B790D is the logo's own green; the accent
     is a step lighter so it clears 3:1 on the near-black background, which the
     solid brand hue only barely does (3.55:1). */
  --br-primary: #2E9E1E;
  --br-primary-dark: #1B790D;     /* the logo green - hover, and light-theme links */
  --br-primary-light: rgba(46,158,30,.16);
  --br-primary-glow: rgba(46,158,30,.25);

  /* The flag, by name, for anything that has to match the mark exactly. */
  --br-brand-saffron: #F98F2E;   /* the M */
  --br-brand-green:   #1B790D;   /* the D, and the wordmark */
  --br-brand-navy:    #081474;   /* the bridge, and the chakra */
  --br-brand-white:   #FFFFFF;   /* the middle band - which is the page itself */

  /* Persona gradients. Candidates read warm (fuchsia -> pink), recruiters
     cool (cyan -> teal), so the two sides of the marketplace are instantly
     distinguishable.

     TWO SETS, deliberately. The bright reference hues are ACCENTS - links,
     borders, icons, glows - which only need 3:1. Solid buttons carry white
     labels and need 4.5:1, which the bright hues miss (white on #F98F2E is
     2.3:1). The -btn gradients are one step darker and clear 4.5:1 at both
     ends. Verified by tools/check-contrast.php. */
  /* The primary gradient IS the flag, and the logo: it runs from the M's
     saffron to the D's green, in the same direction the bridge spans them.

     DECORATIVE ONLY. It is a fill behind icons, rules and borders - never
     behind a label, because white on the saffron end is 2.33:1. Anything
     carrying text uses --br-gradient-btn. */
  --br-gradient:            linear-gradient(135deg, #F98F2E 0%, #2E9E1E 100%);

  /* A SECOND GRADIENT, FOR TEXT, and it is not the same one.

     --br-gradient is a FILL: it sits behind white labels and its job is to
     look like the mark. Clipped to letterforms it becomes ink, and ink has to
     clear contrast at BOTH ends of the ramp against the page behind it. On
     this near-black ground the bright pair does that - saffron 8.4:1, green
     3.55:1, and the text it is used on is display-sized, where 3:1 is the bar.
     The light theme cannot use the same two hues and overrides this below. */
  --br-gradient-text:       linear-gradient(135deg, #F98F2E 0%, #2E9E1E 100%);
  --br-gradient-candidate:  linear-gradient(135deg, #F98F2E 0%, #E2681A 100%);
  --br-gradient-recruiter:  linear-gradient(135deg, #2E9E1E 0%, #1B790D 100%);

  /* Solid buttons carry white labels, and WHITE ON SAFFRON IS 2.3:1 - so the
     candidate button is a deepened saffron rather than the brand hue, and the
     primary button runs green into the bridge's navy. Both ends of all three
     clear 4.5:1, verified by tools/check-contrast.php. */
  --br-gradient-btn:            linear-gradient(135deg, #14670A 0%, #0B1A8A 100%);
  --br-gradient-btn-candidate:  linear-gradient(135deg, #9A5200 0%, #8A4A00 100%);
  --br-gradient-btn-recruiter:  linear-gradient(135deg, #176B0B 0%, #14670A 100%);

  /* Candidates read saffron, recruiters green - the flag's own two bands, so
     the two sides of the marketplace stay instantly distinguishable. Admin is
     the bridge: navy. */
  --br-candidate: #F98F2E;  --br-candidate-dark: #9A5200;
  --br-recruiter: #2E9E1E;  --br-recruiter-dark: #14670A;
  --br-admin:     #7A8CC4;  --br-admin-dark:     #0B1A8A;

  /* Solid button fills - white label safe */
  --br-success-btn: #047857;
  --br-danger-btn:  #DC2626;

  /* --- Semantic --------------------------------------------------------- */
  --br-success: #10B981;  --br-success-bg: rgba(16,185,129,.15);
  --br-warning: #F59E0B;  --br-warning-bg: rgba(245,158,11,.15);
  --br-danger:  #EF4444;  --br-danger-bg:  rgba(239,68,68,.15);
  --br-info:    #3B82F6;  --br-info-bg:    rgba(59,130,246,.15);

  /* --- Neutrals (dark) -------------------------------------------------- */
  --br-ink:   #F8FAFC;  --br-ink-2: #CBD5E1;
  --br-ink-3: #94A3B8;  --br-ink-4: #64748B;
  --br-line:  rgba(255,255,255,.08);
  --br-line-2: rgba(255,255,255,.05);
  --br-bg:      #080B11;
  --br-bg-2:    #0F1626;
  --br-surface:   rgba(22,30,49,.6);
  --br-surface-2: rgba(30,41,67,.45);
  --br-surface-hover: rgba(30,41,67,.75);
  --br-blur: 12px;

  /* --- Auction semantics — meaning, never decoration -------------------- */
  --br-bid-high: #10B981;
  --br-bid-out:  #EF4444;
  --br-reserve:  #94A3B8;
  --br-locked:   #F59E0B;
  --br-gold:     #FBBF24;

  /* --- Elevation -------------------------------------------------------- */
  --br-shadow-sm: 0 1px 2px rgba(0,0,0,.3);
  --br-shadow:    0 4px 16px rgba(0,0,0,.35);
  --br-shadow-lg: 0 12px 40px rgba(0,0,0,.45);
  --br-shadow-focus: 0 0 0 3px var(--br-primary-glow);

  /* --- Geometry --------------------------------------------------------- */
  --br-radius-sm: 8px; --br-radius: 12px;
  --br-radius-lg: 16px; --br-radius-xl: 20px; --br-radius-pill: 9999px;

  /* --- Motion ----------------------------------------------------------- */
  --br-ease: cubic-bezier(.4,0,.2,1);
  --br-ease-spring: cubic-bezier(.34,1.56,.64,1);
  --br-t-fast: 150ms; --br-t: 250ms; --br-t-slow: 400ms;

  /* --- Type scale — fluid, 1.200 minor third on a 16px base ------------

     FLUID, NOT STEPPED. Each heading interpolates between a phone size and a
     desktop size with clamp(), so there is no breakpoint at which the page
     jumps - the scale is continuous across every width between them.

     A MINOR THIRD (1.200) through the heading levels, with --fs-display
     sitting deliberately outside the ratio. The reference sets its hero at
     text-3xl / text-5xl / text-6xl - 30px, 48px, 60px at three hard
     breakpoints - and 60px is the size the design is actually drawn around,
     so the display token now reaches it.

     WHAT IS NOT COPIED IS THE STEPPING. Three fixed sizes means the headline
     jumps twice as the window is dragged, and worse, a `vw`-free breakpoint
     ignores browser zoom, which fails WCAG 1.4.4. The clamp() below lands on
     the same 60px ceiling on a desktop and the same ~30px floor on a phone,
     and moves continuously in between.

     The middle term of each clamp() is in `vw` plus a `rem` floor, so the text
     still scales when a reader zooms - a pure `vw` size ignores zoom, which
     fails WCAG 1.4.4.

     Body stays at exactly 1rem. It is the one size that must honour whatever
     the reader set in their browser. */
  --fs-display: clamp(1.875rem, 1.05rem + 3.6vw, 3.75rem);
  --fs-h1:      clamp(1.75rem, 1.35rem + 1.6vw, 2.5rem);
  --fs-h2:      clamp(1.4rem, 1.2rem + 0.8vw, 1.875rem);
  --fs-h3:      clamp(1.2rem, 1.1rem + 0.4vw, 1.5rem);
  --fs-h4:      clamp(1.0625rem, 1.02rem + 0.2vw, 1.25rem);
  --fs-body:    1rem;
  --fs-sm:      .875rem;
  --fs-xs:      .8125rem;
  --fs-micro:   .75rem;

  /* --- Line height and tracking ----------------------------------------

     Long-form text wants ~1.5 for readability; headings want less, because a
     display size at 1.5 leaves a hole between the lines. Tracking tightens as
     the size grows, which is how both of these faces are designed to be set -
     Outfit in particular is drawn tight and looks slack at 0. */
  --lh-tight: 1.15;
  --lh-heading: 1.25;
  --lh-body: 1.55;
  --lh-loose: 1.7;

  --tracking-tight: -0.02em;
  --tracking-normal: 0;
  --tracking-wide: 0.02em;

  /* --- Families ---------------------------------------------------------

     Two stacks, named by the job rather than by the typeface, so a future
     swap is one line and not a search across 2,000 rules. --br-font-display
     is applied on the heading elements themselves; body text inherits the
     Bootstrap variable. */
  --br-font-display: 'Outfit', 'Outfit Fallback', system-ui, -apple-system,
                     'Segoe UI', Arial, sans-serif;

  /* --- Bootstrap bridge ------------------------------------------------- */
  --bs-body-font-family: 'Inter', 'Inter Fallback', system-ui, -apple-system,
                         'Segoe UI', Arial, sans-serif;
  --bs-body-color: var(--br-ink);
  --bs-body-bg: var(--br-bg);
  --bs-primary: var(--br-primary);
  --bs-border-color: var(--br-line);
  --bs-emphasis-color: var(--br-ink);
  --bs-secondary-color: var(--br-ink-3);
}

/* --- Light theme --------------------------------------------------------- */
[data-theme="light"] {
  --br-primary-light: rgba(99,102,241,.10);
  --br-primary-glow: rgba(99,102,241,.18);

  --br-ink:   #0F172A;  --br-ink-2: #334155;
  --br-ink-3: #475569;  --br-ink-4: #5B6B82;
  --br-line:  rgba(15,23,42,.10);
  --br-line-2: rgba(15,23,42,.05);
  --br-bg:      #EEF1F8;
  --br-bg-2:    #FFFFFF;
  /* On white, saffron is 2.1:1 and fails even the 3:1 a large heading needs,
     so the light theme clips the DARK pair instead - the same two hues the
     solid buttons use, which are already audited at 4.5:1 on this ground. */
  --br-gradient-text: linear-gradient(135deg, #14670A 0%, #0B1A8A 100%);
  --br-surface:   rgba(255,255,255,.72);
  --br-surface-2: rgba(255,255,255,.5);
  --br-surface-hover: rgba(255,255,255,.92);

  --br-success-bg: rgba(16,185,129,.12);
  --br-warning-bg: rgba(245,158,11,.12);
  --br-danger-bg:  rgba(239,68,68,.12);
  --br-info-bg:    rgba(59,130,246,.12);

  --br-shadow-sm: 0 1px 2px rgba(15,23,42,.06);
  --br-shadow:    0 4px 16px rgba(15,23,42,.08);
  --br-shadow-lg: 0 12px 40px rgba(15,23,42,.12);

  --br-gold: #D97706;
}

/*
   Light-theme accents.

   The bright hues are tuned for a dark backdrop; as link text on #EEF1F8 the
   brand saffron drops to 2.06:1, which is not legible at any size. Each
   persona gets a darker accent here so link and icon text stays at 4.5:1.
   These selectors are more specific than the persona blocks below, so they win.

   THE CANDIDATE ACCENT IS THE ONE THAT MOVES MOST. Saffron cannot be text on
   a pale background at all, so on the light theme it deepens to #9A5200 -
   still recognisably the same warm hue beside the saffron fills, but 5.19:1
   instead of 2.06:1.
*/
[data-theme="light"] { --br-primary: #14670A; }
[data-theme="light"] body[data-persona="recruiter"] { --br-primary: #14670A; }
[data-theme="light"] body[data-persona="candidate"] { --br-primary: #9A5200; }
[data-theme="light"] body[data-persona="admin"]     { --br-primary: #0B1A8A; }

/* Persona theming: one attribute on <body> re-points the accent and gradient */
body[data-persona="candidate"] {
  --br-accent: var(--br-candidate);
  --br-accent-gradient: var(--br-gradient-candidate);
}
body[data-persona="recruiter"] {
  --br-primary: var(--br-recruiter);
  --br-primary-dark: var(--br-recruiter-dark);
  --br-primary-light: rgba(46,158,30,.16);
  --br-primary-glow: rgba(46,158,30,.25);
  --br-gradient: var(--br-gradient-recruiter);
  --br-gradient-btn: var(--br-gradient-btn-recruiter);
  --br-accent: var(--br-recruiter);
  --br-accent-gradient: var(--br-gradient-recruiter);
}
/* Admin reads as the bridge itself: the chakra's navy, lifted. */
body[data-persona="admin"] {
  --br-primary: var(--br-admin);
  --br-primary-dark: var(--br-admin-dark);
  --br-primary-light: rgba(122,140,196,.16);
  --br-primary-glow: rgba(122,140,196,.25);
  --br-gradient: linear-gradient(135deg, #081474 0%, #3B4FC4 100%);
  --br-gradient-btn: linear-gradient(135deg, #081474 0%, #0B1A8A 100%);
  --br-accent: var(--br-admin);
  --br-accent-gradient: linear-gradient(135deg, #081474 0%, #3B4FC4 100%);
}

/* --------------------------------------------------------------------------
   3. Base
   -------------------------------------------------------------------------- */
* { box-sizing: border-box; }

html { background: var(--br-bg); }

body {
  font-family: var(--bs-body-font-family);
  font-size: var(--fs-body);      /* 16px — never smaller; <16px zooms on iOS */
  line-height: var(--lh-body);
  letter-spacing: var(--tracking-normal);

  /*
   * Inter ships proper typographic figures; ask for them.
   *
   * `tnum` fixes digit width, which matters on a platform where salaries,
   * countdowns and proposal bands sit in columns - proportional digits make
   * a column of money jitter as the numbers change.
   */
  font-variant-numeric: tabular-nums lining-nums;
  font-feature-settings: 'kern' 1;
  color: var(--br-ink);
  background: var(--br-bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  min-height: 100vh;
  transition: background-color var(--br-t) var(--br-ease), color var(--br-t) var(--br-ease);
}

/*
   Ambient aurora. Fixed and behind everything, so the glass surfaces have
   something to refract. Pointer-events none — it is purely decorative.
*/
body::before {
  content: '';
  position: fixed; inset: 0; z-index: -1; pointer-events: none;
  background:
    radial-gradient(60rem 40rem at 12% -10%, rgba(99,102,241,.18), transparent 60%),
    radial-gradient(50rem 35rem at 100% 0%, rgba(139,92,246,.14), transparent 55%),
    radial-gradient(45rem 35rem at 50% 110%, rgba(20,184,166,.10), transparent 60%);
}
[data-theme="light"] body::before {
  background:
    radial-gradient(60rem 40rem at 12% -10%, rgba(99,102,241,.14), transparent 60%),
    radial-gradient(50rem 35rem at 100% 0%, rgba(139,92,246,.10), transparent 55%),
    radial-gradient(45rem 35rem at 50% 110%, rgba(20,184,166,.08), transparent 60%);
}

/*
   Headings.

   TRACKING TIGHTENS AS THE SIZE GROWS. Letterforms set large look loose at the
   spacing that suits body copy, and Outfit is drawn on that assumption - the
   larger sizes want negative tracking, the small ones want none.

   Weight 500 rather than 600 for the lower levels: a variable font gives every
   weight on the axis, so the hierarchy no longer has to be carried by the four
   static cuts that happened to be downloaded.

   `text-wrap: balance` evens out the last line of a heading that wraps. It is
   ignored where unsupported, which is the correct fallback.
*/
h1,h2,h3,h4,h5,h6 {
  font-family: var(--br-font-display);
  font-weight: 600;
  line-height: var(--lh-heading);
  color: var(--br-ink);
  margin: 0 0 .5rem;
  text-wrap: balance;
}
h1 { font-size: var(--fs-h1); font-weight: 700; line-height: var(--lh-tight); letter-spacing: var(--tracking-tight); }
h2 { font-size: var(--fs-h2); font-weight: 600; letter-spacing: var(--tracking-tight); }
h3 { font-size: var(--fs-h3); font-weight: 600; letter-spacing: -.01em; }
h4 { font-size: var(--fs-h4); font-weight: 500; }
h5, h6 { font-size: var(--fs-body); font-weight: 500; }

/*
   Measure.

   Long-form prose is capped so a line does not run the width of a desktop
   monitor - past roughly 75 characters the eye loses the start of the next
   line. Applied to the legal and coaching copy that actually runs long, never
   to layout containers.
*/
.br-prose p, .br-legal-body p { max-width: 72ch; line-height: var(--lh-loose); }

/* Currency and countdowns: fixed-width digits so values don't jitter */
.br-num, .br-money, .br-countdown, td.br-num {
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum';
}

a { color: var(--br-primary); text-decoration: none; transition: color var(--br-t-fast) var(--br-ease); }
a:hover { color: var(--br-primary-dark); text-decoration: underline; }

.br-muted { color: var(--br-ink-3); }
.br-tiny  { font-size: var(--fs-xs); }
.br-label {
  font-size: var(--fs-xs); font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--br-ink-3);
}

/* Skip link — keyboard users land here first */
.br-skip {
  position: absolute; left: -9999px; top: 0; z-index: 2000;
  padding: .75rem 1.25rem; background: var(--br-primary); color: #fff;
  border-radius: 0 0 var(--br-radius) 0;
}
.br-skip:focus { left: 0; color: #fff; }

/* --------------------------------------------------------------------------
   4. Layout
   -------------------------------------------------------------------------- */
.br-shell { min-height: 100vh; display: flex; flex-direction: column; }
.br-main  { flex: 1; padding: 1.5rem 0 4rem; }

/* Frosted glass, so the aurora shows through as the page scrolls under it. */
.br-navbar {
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border-bottom: 1px solid var(--br-line);
  position: sticky; top: 0; z-index: 1030;
}

.br-brand {
  font-weight: 700; font-size: 1.25rem; letter-spacing: -.02em;
  color: var(--br-ink); display: inline-flex; align-items: center; gap: .5rem;
}
.br-brand:hover { color: var(--br-primary); text-decoration: none; }
.br-brand-mark {
  width: 32px; height: 32px; border-radius: 10px;
  /* -btn, not the decorative gradient: this tile carries a white letter and
     white on the brand saffron is 2.33:1. */
  background: var(--br-gradient-btn);
  color: #fff; display: grid; place-items: center; font-size: 1rem; font-weight: 700;
}

/* --- Logo --------------------------------------------------------------- */
/* THE FULL LOCKUP, STACKED (doc s.126): mark, wordmark, strapline.

   Everything below is sized from one custom property, --br-logo-h, which the
   component sets to the MARK's height. The two text rows derive from it, so a
   caller asking for a bigger logo gets a proportionally bigger lockup rather
   than a bigger icon with the same small words under it. */
.br-logo {
  display: inline-flex; flex-direction: column; align-items: center;
  gap: calc(var(--br-logo-h, 32px) * .12);
  text-decoration: none;

  /* THE CARD HOLDS ALL THREE ROWS NOW, where it used to hold only the tile.

     The wordmark is the brand green and the strapline the brand navy, and
     tools/check-contrast.php records why neither may sit on the dark theme:
     navy on the dark surface is 1.4:1. On this white it is 15.4:1. The card
     is what makes the artwork's own colours usable in both themes - the same
     job the tile did for the bridge at s.90. */
  background: #FFFFFF;
  border-radius: calc(var(--br-logo-h, 32px) * .22);
  padding: calc(var(--br-logo-h, 32px) * .16) calc(var(--br-logo-h, 32px) * .26);

  filter: drop-shadow(0 2px 8px var(--br-primary-glow));
  transition: transform var(--br-t) var(--br-ease-spring),
              filter var(--br-t) var(--br-ease);
}
.br-logo:hover { text-decoration: none; }

.br-logo-mark { display: grid; place-items: center; line-height: 0; }

.br-logo-mark img {
  display: block; height: var(--br-logo-h, 32px); width: auto;
}

/* The persona accent colours everything AROUND the logo, never the logo.
   favicon.svg and the generated PNGs render outside the page and can read no
   custom property, so a mark that changed colour in the navbar could never be
   the same mark in the tab (doc s.90). */

/* THE WHOLE CARD LIFTS, not the icon inside it (doc s.126). An icon rotating
   within a static white card reads as something coming loose. */
.br-logo:hover {
  transform: translateY(-2px) scale(1.02);
  filter: drop-shadow(0 6px 18px var(--br-primary-glow));
}
.br-logo:active { transform: translateY(0) scale(1.005); }
.br-logo:focus-visible {
  outline: none;
  box-shadow: var(--br-shadow-focus);
}

.br-logo-text {
  display: flex; flex-direction: column; align-items: center;
  line-height: 1.05;
}

.br-logo-name {
  font-family: var(--br-font-display);
  font-weight: 700; letter-spacing: -.01em;

  /* .46 of the mark's height, from the artwork: its wordmark band is 159px
     against a 322px mark. Not a fixed rem - the lockup has to scale as one
     thing, and a fixed wordmark under a scaled mark comes apart at both
     ends. */
  font-size: calc(var(--br-logo-h, 32px) * .46);

  /* The artwork's own green, not the ink colour. It is on white here, where
     it is 5.9:1. */
  color: var(--br-brand-green);
}

.br-logo-tagline {
  font-weight: 600; letter-spacing: .01em;
  color: var(--br-brand-navy);
  white-space: nowrap;

  /* .145 from the artwork - 45px of 322 - but with a FLOOR. That ratio puts
     the strapline at 4px in a navbar, which is the exact failure that made
     this a composed lockup instead of a flat image. Below 9px it stops
     scaling and the mark carries the shrinking instead. */
  font-size: max(9px, calc(var(--br-logo-h, 32px) * .145));
  margin-top: calc(var(--br-logo-h, 32px) * .07);

  /* The flanking rules are in the artwork. Pseudo-elements rather than
     em-dashes, so they stretch with the lockup instead of staying one glyph
     wide while everything around them grows. */
  display: flex; align-items: center; gap: .5em;
}
.br-logo-tagline::before,
.br-logo-tagline::after {
  content: ''; height: 2px; width: 1.4em;
  background: var(--br-brand-navy); border-radius: 1px;
}

/* MARK-ONLY, for a caller that passes :show-text="false" and no tagline.
   The card's padding is tuned for three rows and reads as a frame around
   one. */
.br-logo:not(:has(.br-logo-text)) {
  padding: calc(var(--br-logo-h, 32px) * .14);
}

.br-logo-lg { justify-content: center; }

@media (max-width: 575.98px) {
  /* THE WORDMARK IS NO LONGER HIDDEN HERE (doc s.126).

     This rule used to hide the text outright under 576px, which was right
     when the lockup was a mark with a wordmark beside it and the bar was
     running out of width. The lockup is stacked now, so it costs height
     rather than width - and hiding the two rows would remove exactly what
     this section was asked to add.

     It shrinks instead. The mark carries the reduction; the strapline is
     already at its 9px floor and stays legible. */
  .br-logo-nav { --br-logo-h: 30px !important; }
}

@media (max-width: 400px) {
  /* THE FLANKING RULES GO FIRST on a narrow phone. The strapline cannot
     shrink below its 9px floor and cannot wrap, so something has to give, and
     these are decoration where the words are the content. Dropping them
     reclaims about 34px of a 360px viewport. */
  .br-logo-tagline::before,
  .br-logo-tagline::after { display: none; }
}


/* --- Nav ---------------------------------------------------------------- */
.br-nav-link {
  position: relative;
  color: var(--br-ink-2); font-weight: 500; font-size: var(--fs-sm);
  padding: .5rem .875rem; border-radius: var(--br-radius-sm);
  transition: background var(--br-t-fast) var(--br-ease), color var(--br-t-fast) var(--br-ease);
}
.br-nav-link:hover { background: var(--br-line-2); color: var(--br-ink); text-decoration: none; }
.br-nav-link.active { background: var(--br-primary-light); color: var(--br-primary-dark); font-weight: 600; }

/* Underline grows from the centre on hover - a directional cue, not decoration. */
.br-nav-link::after {
  content: ''; position: absolute; left: 50%; bottom: 2px;
  width: 0; height: 2px; border-radius: 2px;
  background: var(--br-primary);
  transform: translateX(-50%);
  transition: width var(--br-t) var(--br-ease);
}
.br-nav-link:hover::after { width: 40%; }
.br-nav-link.active::after { width: 55%; }

.br-page-head { margin-bottom: 1.5rem; }
.br-page-head h1 { margin-bottom: .25rem; }

/* --------------------------------------------------------------------------
   5. Cards
   -------------------------------------------------------------------------- */
.br-card {
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius-lg);
  box-shadow: var(--br-shadow-sm);
  transition: box-shadow var(--br-t) var(--br-ease),
              transform var(--br-t) var(--br-ease),
              border-color var(--br-t) var(--br-ease),
              background-color var(--br-t) var(--br-ease);
}
.br-card:hover { border-color: rgba(46,158,30,.22); }
.br-card-body { padding: 1.25rem; }
.br-card-head {
  padding: 1rem 1.25rem; border-bottom: 1px solid var(--br-line);
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
}
.br-card-head h2, .br-card-head h3 { margin: 0; font-size: var(--fs-h4); }

.br-card-interactive { cursor: pointer; }
.br-card-interactive:hover { transform: translateY(-2px); box-shadow: var(--br-shadow); }

/* The winning bid earns visual primacy */
.br-card-winning {
  border-left: 4px solid var(--br-gold);
  box-shadow: 0 0 0 1px rgba(212,160,23,.15), var(--br-shadow);
}
.br-card-locked { border-left: 4px solid var(--br-locked); }
.br-card-danger { border-left: 4px solid var(--br-danger); }

/* A closed campaign is still readable, just visibly past. Opacity alone would
   drag the text under the AA contrast floor, so only the chrome recedes. */
.br-card-muted { background: var(--br-surface-2); border-style: dashed; }

/* Someone else's words: a candidate's note to a recruiter, or the reverse.
   Set apart so it never reads as platform copy. */
.br-quote {
  border-left: 3px solid var(--br-line-2);
  padding: .5rem 0 .5rem .75rem;
  margin: 0;
  color: var(--br-ink-2);
  font-style: italic;
}

/* --------------------------------------------------------------------------
   6. Stat tiles
   -------------------------------------------------------------------------- */
/* Flex column so a stretched tile centres its content instead of leaving a
   tall empty gap beneath the figure. */
.br-stat {
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius-lg); padding: 1.125rem 1.25rem;
  height: 100%;
  display: flex; flex-direction: column; justify-content: center;
  transition: border-color var(--br-t) var(--br-ease);
}
.br-stat-label {
  font-size: var(--fs-xs); font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--br-ink-3); margin-bottom: .375rem;
}
.br-stat-value {
  font-size: var(--fs-h2); font-weight: 700; line-height: var(--lh-tight);
  letter-spacing: var(--tracking-tight);
  color: var(--br-ink); font-variant-numeric: tabular-nums;
}
/* A bid is a range, so this tile carries two figures and a dash where the
   others carry one. Sized down and allowed to wrap rather than overflowing the
   tile — clamp() keeps it readable on a phone and generous on a desktop. */
.br-stat-value-range {
  font-size: clamp(1.05rem, 1.5vw + .5rem, 1.5rem);
  line-height: 1.25;
  overflow-wrap: anywhere;
}

.br-stat-meta { font-size: var(--fs-xs); color: var(--br-ink-3); margin-top: .25rem; }
.br-stat-meta a { color: var(--br-primary); text-decoration: none; }
.br-stat-meta a:hover { text-decoration: underline; }
.br-stat-accent .br-stat-value { color: var(--br-primary); }

/* A stat that links to the records behind it. The whole tile is the target,
   so the hit area matches what the eye reads as one object. */
a.br-stat-link { text-decoration: none; color: inherit; }
a.br-stat-link:hover { text-decoration: none; color: inherit; }
a.br-stat-link .br-stat-meta { color: var(--br-primary); }
a.br-stat-link:hover { border-color: var(--br-primary-glow); }
a.br-stat-link:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }
@media (hover: hover) and (pointer: fine) {
  a.br-stat-link:hover { transform: translateY(-2px); box-shadow: var(--br-shadow); }
}

/* --------------------------------------------------------------------------
   7. Buttons
   -------------------------------------------------------------------------- */
.br-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  font-family: inherit; font-size: var(--fs-sm); font-weight: 600;
  padding: .625rem 1.125rem; min-height: 42px;
  border-radius: var(--br-radius); border: 1px solid transparent;
  cursor: pointer; text-decoration: none; white-space: nowrap;
  transition: transform var(--br-t-fast) var(--br-ease),
              box-shadow var(--br-t-fast) var(--br-ease),
              background-color var(--br-t-fast) var(--br-ease);
}
.br-btn:hover { text-decoration: none; transform: translateY(-1px); box-shadow: var(--br-shadow); }
.br-btn:active { transform: translateY(0); box-shadow: var(--br-shadow-sm); }
.br-btn:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }
.br-btn:disabled, .br-btn.disabled { opacity: .5; cursor: not-allowed; transform: none; box-shadow: none; }

/* Gradient primary, matching the reference. The gradient re-points per
   persona, so a recruiter CTA is cyan-teal with no extra class. */
/* Uses the -btn gradient, not the accent gradient: white labels need 4.5:1. */
.br-btn-primary {
  background: var(--br-gradient-btn); color: #fff;
  box-shadow: 0 4px 14px var(--br-primary-glow);
}
.br-btn-primary:hover { color: #fff; box-shadow: 0 8px 24px var(--br-primary-glow); }

/* Explicit recruiter CTA, for use on candidate-themed pages that link to a
   recruiter action. */
.br-btn-recruiter {
  background: var(--br-gradient-btn-recruiter); color: #fff;
  box-shadow: 0 4px 14px rgba(6,182,212,.25);
}
.br-btn-recruiter:hover { color: #fff; box-shadow: 0 8px 24px rgba(6,182,212,.32); }

.br-btn-secondary {
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  color: var(--br-ink-2); border-color: var(--br-line);
}
.br-btn-secondary:hover {
  background: var(--br-surface-hover); color: var(--br-ink);
  border-color: rgba(99,102,241,.3);
}

.br-btn-ghost { background: transparent; color: var(--br-ink-3); }
.br-btn-ghost:hover { background: var(--br-line-2); color: var(--br-ink); box-shadow: none; }

.br-btn-success { background: var(--br-success-btn); color: #fff; box-shadow: 0 4px 14px rgba(16,185,129,.25); }
.br-btn-success:hover { background: #065F46; color: #fff; }
.br-btn-danger { background: var(--br-danger-btn); color: #fff; box-shadow: 0 4px 14px rgba(239,68,68,.25); }
.br-btn-danger:hover { background: #B91C1C; color: #fff; }
.br-btn-outline-danger { background: transparent; color: var(--br-danger); border-color: rgba(239,68,68,.5); }
.br-btn-outline-danger:hover { background: var(--br-danger-bg); color: #F87171; border-color: var(--br-danger); }

.br-btn-sm { min-height: 34px; padding: .375rem .75rem; font-size: var(--fs-xs); }
.br-btn-lg { min-height: 50px; padding: .875rem 1.75rem; font-size: var(--fs-body); }
.br-btn-block { width: 100%; }

/* Loading: the label is replaced but the width is held, so nothing reflows */
.br-btn.is-loading { color: transparent !important; pointer-events: none; position: relative; }
/*
 * THE SPINNER HAD NO POSITION (doc s.103).
 *
 * `position: absolute` with no offsets leaves the box at its static position -
 * the start of the content area - so a 16px ring with a translucent border sat
 * at the left edge of a button whose label had just been turned transparent.
 * The control read as an empty gradient block rather than as something
 * working, which is exactly how a stuck loading state goes unreported: it does
 * not look like a spinner that stopped, it looks like a button with no name.
 */
.br-btn.is-loading::after {
  content: ''; position: absolute;
  top: 50%; left: 50%; margin: -8px 0 0 -8px;
  width: 16px; height: 16px;
  border: 2px solid rgba(255,255,255,.4); border-top-color: #fff;
  border-radius: 50%; animation: br-spin .6s linear infinite;
}
.br-btn-secondary.is-loading::after, .br-btn-ghost.is-loading::after {
  border-color: rgba(100,116,139,.3); border-top-color: var(--br-ink-3);
}

/* --------------------------------------------------------------------------
   8. Status pills — colour is never the only signal
   -------------------------------------------------------------------------- */
.br-pill {
  display: inline-flex; align-items: center; gap: .3rem;
  padding: .25rem .625rem; border-radius: var(--br-radius-pill);
  font-size: var(--fs-micro); font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase; white-space: nowrap;
}
.br-pill-active   { background: var(--br-success-bg); color: var(--br-success); border: 1px solid rgba(16,185,129,.25); }
.br-pill-locked   { background: var(--br-warning-bg); color: var(--br-warning); border: 1px solid rgba(245,158,11,.25); }
.br-pill-hired    { background: var(--br-info-bg);    color: var(--br-info);    border: 1px solid rgba(59,130,246,.25); }
.br-pill-dormant  { background: var(--br-line-2);     color: var(--br-ink-3);   border: 1px solid var(--br-line); }
.br-pill-danger   { background: var(--br-danger-bg);  color: var(--br-danger);  border: 1px solid rgba(239,68,68,.25); }
.br-pill-neutral  { background: var(--br-line-2);     color: var(--br-ink-2);   border: 1px solid var(--br-line); }
.br-pill-gold     { background: rgba(251,191,36,.15); color: var(--br-gold);    border: 1px solid rgba(251,191,36,.3); }

/* --------------------------------------------------------------------------
   9. Forms
   -------------------------------------------------------------------------- */
.br-field { margin-bottom: 1rem; }
.br-field label, .br-form-label {
  display: block; font-size: var(--fs-sm); font-weight: 500;
  color: var(--br-ink-2); margin-bottom: .375rem;
}
.br-required { color: var(--br-danger); margin-left: .125rem; }

.br-input, .br-select, .br-textarea {
  width: 100%; min-height: 42px; padding: .5rem .75rem;
  font-family: inherit;
  font-size: var(--fs-body);        /* 16px prevents iOS zoom on focus */
  color: var(--br-ink); background: var(--br-surface-2);
  border: 1px solid var(--br-line); border-radius: var(--br-radius);
  transition: border-color var(--br-t-fast) var(--br-ease),
              box-shadow var(--br-t-fast) var(--br-ease),
              background-color var(--br-t-fast) var(--br-ease);
}
.br-input:hover, .br-select:hover, .br-textarea:hover { border-color: rgba(99,102,241,.3); }
.br-input:focus, .br-select:focus, .br-textarea:focus {
  outline: none; border-color: var(--br-primary);
  box-shadow: var(--br-shadow-focus); background: var(--br-surface-hover);
}
.br-input::placeholder, .br-textarea::placeholder { color: var(--br-ink-4); }
.br-textarea { min-height: 120px; resize: vertical; line-height: 1.6; }
.br-input[aria-invalid="true"], .br-input.is-invalid { border-color: var(--br-danger); }
.br-input:disabled, .br-select:disabled { background: var(--br-line-2); cursor: not-allowed; opacity: .6; }

/* Native pickers render white-on-white in dark mode without this. */
.br-select option { background: var(--br-bg-2); color: var(--br-ink); }
.br-input[type="date"]::-webkit-calendar-picker-indicator,
.br-input[type="datetime-local"]::-webkit-calendar-picker-indicator,
.br-input[type="time"]::-webkit-calendar-picker-indicator { filter: invert(.7); }
[data-theme="light"] .br-input[type="date"]::-webkit-calendar-picker-indicator,
[data-theme="light"] .br-input[type="datetime-local"]::-webkit-calendar-picker-indicator,
[data-theme="light"] .br-input[type="time"]::-webkit-calendar-picker-indicator { filter: none; }

.br-help { font-size: var(--fs-xs); color: var(--br-ink-3); margin-top: .25rem; }
.br-error {
  font-size: var(--fs-xs); color: var(--br-danger); margin-top: .3rem;
  display: flex; align-items: center; gap: .25rem;
  animation: br-slide-down 200ms var(--br-ease);
}

.br-input-group { display: flex; align-items: stretch; }
.br-input-prefix {
  display: inline-flex; align-items: center; padding: 0 .75rem;
  background: var(--br-line-2); border: 1px solid var(--br-line); border-right: 0;
  border-radius: var(--br-radius) 0 0 var(--br-radius);
  color: var(--br-ink-3); font-weight: 500;
}
.br-input-group .br-input { border-radius: 0 var(--br-radius) var(--br-radius) 0; }

/* Persona / segmented toggle with an animated sliding pill */
.br-segment {
  display: inline-flex; position: relative; padding: 4px;
  background: var(--br-line-2); border-radius: var(--br-radius-pill);
}
.br-segment input { position: absolute; opacity: 0; pointer-events: none; }
.br-segment label {
  position: relative; z-index: 1; margin: 0; cursor: pointer;
  padding: .5rem 1.25rem; border-radius: var(--br-radius-pill);
  font-size: var(--fs-sm); font-weight: 600; color: var(--br-ink-3);
  transition: color var(--br-t) var(--br-ease);
}
.br-segment input:checked + label { color: var(--br-primary-dark); }
.br-segment input:focus-visible + label { box-shadow: var(--br-shadow-focus); }
.br-segment-thumb {
  position: absolute; top: 4px; bottom: 4px; z-index: 0;
  background: var(--br-surface); border-radius: var(--br-radius-pill);
  box-shadow: var(--br-shadow-sm);
  transition: transform var(--br-t) var(--br-ease-spring), width var(--br-t) var(--br-ease);
}

/* Skill tag input */
.br-tags {
  display: flex; flex-wrap: wrap; gap: .375rem; align-items: center;
  min-height: 42px; padding: .35rem .5rem;
  border: 1px solid var(--br-line); border-radius: var(--br-radius);
  background: var(--br-surface);
}
.br-tags:focus-within { border-color: var(--br-primary); box-shadow: var(--br-shadow-focus); }
.br-tag {
  display: inline-flex; align-items: center; gap: .3rem;
  padding: .2rem .5rem; background: var(--br-primary-light);
  color: var(--br-primary-dark); border-radius: var(--br-radius-sm);
  font-size: var(--fs-xs); font-weight: 500;
  animation: br-pop 200ms var(--br-ease-spring);
}
.br-tag button {
  border: 0; background: none; color: inherit; cursor: pointer;
  padding: 0; line-height: 1; opacity: .6; font-size: 1rem;
}
.br-tag button:hover { opacity: 1; }
.br-tags input { border: 0; outline: none; flex: 1; min-width: 100px; font-size: var(--fs-sm); }

/* Big radio cards — interview slot choice */
.br-choice { position: relative; }
.br-choice input { position: absolute; opacity: 0; }
.br-choice label {
  display: block; margin: 0; cursor: pointer; height: 100%;
  padding: 1rem; border: 2px solid var(--br-line);
  border-radius: var(--br-radius); background: var(--br-surface);
  transition: border-color var(--br-t) var(--br-ease),
              transform var(--br-t) var(--br-ease),
              box-shadow var(--br-t) var(--br-ease);
}
.br-choice label:hover { border-color: var(--br-ink-4); }
.br-choice input:checked + label {
  border-color: var(--br-primary); background: var(--br-primary-light);
  transform: translateY(-2px); box-shadow: var(--br-shadow);
}
.br-choice input:focus-visible + label { box-shadow: var(--br-shadow-focus); }

/* --------------------------------------------------------------------------
   10. Tables — collapse to cards on mobile
   -------------------------------------------------------------------------- */
.br-table-wrap { overflow-x: auto; border-radius: var(--br-radius-lg); }
.br-table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); background: transparent; }
.br-table th {
  text-align: left; padding: .75rem 1rem; background: var(--br-surface-2);
  font-size: var(--fs-xs); font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--br-ink-3);
  border-bottom: 1px solid var(--br-line); white-space: nowrap;
}
.br-table td {
  padding: .75rem 1rem; border-bottom: 1px solid var(--br-line-2);
  vertical-align: middle; color: var(--br-ink-2);
}
.br-table tbody tr { transition: background var(--br-t-fast) var(--br-ease); }
.br-table tbody tr:hover { background: var(--br-primary-light); }
.br-table .br-num { text-align: right; }

/* --- Sortable column headers ------------------------------------------- */
/* The whole header is the target, not just the caption, so the click area
   matches what the eye reads as one control. */
.br-sort {
  display: inline-flex; align-items: center; gap: .35rem;
  color: inherit; text-decoration: none; white-space: nowrap;
}
.br-sort:hover { color: var(--br-primary); text-decoration: none; }
.br-sort.is-active { color: var(--br-ink); }

/* Reserved width, so turning the arrow on does not shift the caption and
   nudge every column beside it. */
.br-sort-arrow {
  display: inline-block; min-width: .75em;
  font-size: .75em; color: var(--br-primary);
}

/* --- Talent list -------------------------------------------------------- */
.br-table-talent td { vertical-align: top; }
.br-talent-initials { font-size: var(--fs-body); letter-spacing: .04em; }
.br-rating { color: var(--br-gold); font-weight: 600; white-space: nowrap; }
.br-lead-range { color: var(--br-bid-high); font-weight: 600; }

/* Bootstrap contextual row classes, restated for the dark palette. */
.br-table tbody tr.table-danger { background: var(--br-danger-bg); }
.br-table tbody tr.table-warning { background: var(--br-warning-bg); }

/* --------------------------------------------------------------------------
   11. Countdown ring
   -------------------------------------------------------------------------- */
.br-ring { position: relative; width: 132px; height: 132px; }
.br-ring svg { transform: rotate(-90deg); }
.br-ring circle { fill: none; stroke-width: 8; stroke-linecap: round; }
.br-ring .br-ring-track { stroke: var(--br-line); }
.br-ring .br-ring-fill { stroke: var(--br-success); transition: stroke-dashoffset var(--br-t-slow) var(--br-ease); }
.br-ring.is-soon   .br-ring-fill { stroke: var(--br-warning); }
.br-ring.is-urgent .br-ring-fill { stroke: var(--br-danger); animation: br-pulse 2s ease-in-out infinite; }
.br-ring-center {
  position: absolute; inset: 0; display: grid; place-content: center; text-align: center;
}
.br-ring-value { font-size: 1.5rem; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; }
.br-ring-unit { font-size: var(--fs-xs); color: var(--br-ink-3); text-transform: uppercase; letter-spacing: .04em; }

/* --------------------------------------------------------------------------
   12. Band slider — live ±15% validation feedback
   -------------------------------------------------------------------------- */
.br-band { height: 8px; border-radius: var(--br-radius-pill); background: var(--br-line); overflow: hidden; }
.br-band-fill {
  height: 100%; border-radius: inherit; background: var(--br-success);
  transition: width var(--br-t) var(--br-ease), background var(--br-t) var(--br-ease);
}
.br-band.is-invalid .br-band-fill { background: var(--br-danger); }

/* --------------------------------------------------------------------------
   13. Stepper
   -------------------------------------------------------------------------- */
.br-stepper { display: flex; align-items: center; gap: .5rem; margin-bottom: 1.5rem; }
.br-step { display: flex; align-items: center; gap: .5rem; font-size: var(--fs-sm); color: var(--br-ink-4); }
.br-step-dot {
  width: 28px; height: 28px; border-radius: 50%;
  display: grid; place-items: center; font-size: var(--fs-xs); font-weight: 700;
  background: var(--br-line); color: var(--br-ink-3);
  transition: background var(--br-t) var(--br-ease), color var(--br-t) var(--br-ease);
}
.br-step.is-active { color: var(--br-ink); font-weight: 600; }
.br-step.is-active .br-step-dot { background: var(--br-primary); color: #fff; }
.br-step.is-done .br-step-dot { background: var(--br-success); color: #fff; }
.br-step-line { flex: 1; height: 2px; background: var(--br-line); }
.br-step-line.is-done { background: var(--br-success); }

/* --------------------------------------------------------------------------
   14. Timeline
   -------------------------------------------------------------------------- */
.br-timeline { position: relative; padding-left: 1.75rem; }
.br-timeline::before {
  content: ''; position: absolute; left: 7px; top: 6px; bottom: 6px;
  width: 2px; background: var(--br-line);
}
.br-timeline-item { position: relative; padding-bottom: 1.25rem; }
.br-timeline-item::before {
  content: ''; position: absolute; left: -1.75rem; top: 5px;
  width: 16px; height: 16px; border-radius: 50%;
  background: var(--br-surface); border: 3px solid var(--br-line);
}
.br-timeline-item.is-done::before { border-color: var(--br-success); background: var(--br-success); }
.br-timeline-item.is-active::before { border-color: var(--br-primary); }

/* --------------------------------------------------------------------------
   15. Notifications
   -------------------------------------------------------------------------- */
.br-bell { position: relative; }
.br-bell-badge {
  position: absolute; top: -4px; right: -4px; min-width: 18px; height: 18px;
  padding: 0 5px; border-radius: var(--br-radius-pill);
  background: var(--br-danger); color: #fff;
  font-size: 10px; font-weight: 700; line-height: 18px; text-align: center;
}
.br-bell-badge.is-bumped { animation: br-badge-bump 300ms var(--br-ease-spring); }
.br-bell.is-ringing { animation: br-ring-shake 400ms var(--br-ease); }

.br-notif {
  display: flex; gap: .75rem; padding: .875rem 1rem;
  border-bottom: 1px solid var(--br-line-2);
  border-left: 3px solid transparent;
  transition: background var(--br-t) var(--br-ease), border-color var(--br-t) var(--br-ease);
}
.br-notif.is-unread { background: var(--br-primary-light); border-left-color: var(--br-primary); }
.br-notif:hover { background: var(--br-line-2); }

/* --------------------------------------------------------------------------
   16. Alerts & empty states
   -------------------------------------------------------------------------- */
.br-alert {
  padding: .875rem 1rem; border-radius: var(--br-radius);
  border: 1px solid transparent; font-size: var(--fs-sm);
  display: flex; gap: .625rem; align-items: flex-start;
}
/* Tinted background + matching border and text, so each alert reads clearly
   on both themes without a separate rule set. */
.br-alert-success { background: var(--br-success-bg); border-color: rgba(16,185,129,.35);  color: var(--br-success); }
.br-alert-warning { background: var(--br-warning-bg); border-color: rgba(245,158,11,.35);  color: var(--br-warning); }
.br-alert-danger  { background: var(--br-danger-bg);  border-color: rgba(239,68,68,.35);   color: var(--br-danger); }
.br-alert-info    { background: var(--br-info-bg);    border-color: rgba(59,130,246,.35);  color: var(--br-info); }
/* Body copy inside an alert stays neutral; only the icon and heading carry
   the semantic colour. */
.br-alert div { color: var(--br-ink-2); }
[data-theme="light"] .br-alert-success { color: #047857; }
[data-theme="light"] .br-alert-warning { color: #B45309; }
[data-theme="light"] .br-alert-danger  { color: #B91C1C; }
[data-theme="light"] .br-alert-info    { color: #1D4ED8; }

/* Autopilot outbid banner — one coloured box under the header.
   Amber rather than red: losing the lead is a prompt to act, not a failure,
   and the danger palette is spoken for by blacklists and account holds. */
.br-outbid-banner {
  display: flex; gap: .875rem; align-items: center; flex-wrap: wrap;
  padding: .875rem 1rem; border-radius: var(--br-radius);
  background: var(--br-warning-bg);
  border: 1px solid rgba(245,158,11,.35);
  border-left: 4px solid var(--br-warning);
  color: var(--br-ink-2); font-size: var(--fs-sm);
}
.br-outbid-icon { font-size: 1.5rem; line-height: 1; flex: none; }
/* Grows to absorb the free space so the actions stay hard right, and may
   shrink below its content width so a long auction title wraps instead of
   pushing the buttons onto their own row. */
.br-outbid-body { flex: 1 1 16rem; min-width: 0; }
.br-outbid-body strong { color: var(--br-warning); }
[data-theme="light"] .br-outbid-body strong { color: #B45309; }
.br-outbid-actions { display: flex; gap: .5rem; align-items: center; flex: none; }
/* The dismiss control is a one-button form; without this it introduces a
   block-level line break in the middle of the action row. */
.br-outbid-actions form { margin: 0; }

/* Landing page — the hiring-cycle table and the audience cards.
   The table reuses .br-table for its borders and spacing; only what is
   specific to this one lives here. */
.br-table-cycle th[scope="row"] { color: var(--br-ink); font-weight: 600; white-space: nowrap; }
.br-cycle-days {
  font-family: var(--br-font-mono, inherit);
  font-weight: 700; color: var(--br-primary); white-space: nowrap;
}
/* The total is a summary row, not another phase, and needs to read that way
   without relying on position alone. */
.br-table-cycle .br-cycle-total { background: var(--br-primary-light); }
.br-table-cycle .br-cycle-total th,
.br-table-cycle .br-cycle-total td { border-top: 2px solid var(--br-primary); }

/* Small caps label above a card heading — names the audience without
   spending a heading level on it, which would break the H1/H2/H3 outline. */
.br-eyebrow {
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--br-ink-3);
}

/* Legal documents — terms and privacy.
   Real bullets, not the ✓ marks of .br-feature-list: a clause is a clause, and
   ticking each one would read as a list of benefits. */
.br-legal-list {
  margin: 0 0 .5rem; padding-left: 1.15rem;
  color: var(--br-ink-2); font-size: var(--fs-sm);
}
.br-legal-list li { margin-bottom: .55rem; line-height: 1.65; }
.br-legal-list strong { color: var(--br-ink); }
/* The credit-reconciliation clause is the only nested list. It needs to read
   as subordinate to its parent, not as a continuation of it. */
.br-legal-list-nested { margin-top: .5rem; margin-bottom: 0; list-style-type: circle; }
.br-legal-intro { color: var(--br-ink-2); font-size: var(--fs-sm); margin-bottom: .5rem; }
.br-legal-rule { border: 0; border-top: 1px solid var(--br-line); margin: 1.25rem 0 .25rem; }

.br-empty { text-align: center; padding: 3rem 1.5rem; color: var(--br-ink-3); }
.br-empty-icon { font-size: 2.5rem; opacity: .35; margin-bottom: .75rem; }

/* Privacy notice — FR-2.3 */
.br-privacy {
  background: var(--br-warning-bg); border: 1px dashed #FDE68A;
  border-radius: var(--br-radius); padding: .75rem .875rem;
  font-size: var(--fs-xs); color: #92400E;
}

/* Simulation banner — unmistakable, so nobody mistakes it for production */
.br-sim-banner {
  background: repeating-linear-gradient(45deg, #FEF3C7, #FEF3C7 10px, #FDE68A 10px, #FDE68A 20px);
  border: 1px solid #F59E0B; color: #92400E;
  padding: .5rem 1rem; border-radius: var(--br-radius);
  font-size: var(--fs-xs); font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase; text-align: center;
}

/* --------------------------------------------------------------------------
   17. Skeletons
   -------------------------------------------------------------------------- */
.br-skeleton {
  background: linear-gradient(90deg, var(--br-line-2) 25%, var(--br-line) 50%, var(--br-line-2) 75%);
  background-size: 200% 100%;
  animation: br-shimmer 1.5s infinite;
  border-radius: var(--br-radius-sm);
}

/* --------------------------------------------------------------------------
   16b. Theme toggle
   -------------------------------------------------------------------------- */
.br-theme-toggle {
  display: inline-grid; place-items: center;
  width: 38px; height: 38px; padding: 0;
  border: 1px solid var(--br-line); border-radius: var(--br-radius);
  background: var(--br-surface); color: var(--br-ink-3);
  cursor: pointer; font-size: 1rem; line-height: 1;
  transition: background var(--br-t-fast) var(--br-ease),
              color var(--br-t-fast) var(--br-ease),
              border-color var(--br-t-fast) var(--br-ease),
              transform var(--br-t) var(--br-ease-spring);
}
.br-theme-toggle:hover {
  background: var(--br-surface-hover); color: var(--br-ink);
  border-color: rgba(99,102,241,.3); transform: rotate(-15deg) scale(1.06);
}
.br-theme-toggle:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }

/* One icon per theme; only the relevant one is shown. */
.br-theme-toggle .br-icon-sun  { display: none; }
.br-theme-toggle .br-icon-moon { display: block; }
[data-theme="light"] .br-theme-toggle .br-icon-sun  { display: block; }
[data-theme="light"] .br-theme-toggle .br-icon-moon { display: none; }

/* --------------------------------------------------------------------------
   17a. Bootstrap component overrides
   Bootstrap ships light-only defaults. These re-point its components at our
   tokens so they follow the active theme instead of staying white.
   -------------------------------------------------------------------------- */
.dropdown-menu {
  background: var(--br-bg-2);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);
  box-shadow: var(--br-shadow-lg);
  padding: .375rem;
}
.dropdown-item {
  color: var(--br-ink-2); border-radius: var(--br-radius-sm);
  padding: .5rem .75rem; font-size: var(--fs-sm);
  transition: background var(--br-t-fast) var(--br-ease), color var(--br-t-fast) var(--br-ease);
}
.dropdown-item:hover, .dropdown-item:focus {
  background: var(--br-primary-light); color: var(--br-ink);
}
.dropdown-header { color: var(--br-ink-4); }
.dropdown-divider { border-color: var(--br-line); }

/*
   Modals must outrank the backdrop even before BR.core.detachModals() runs.

   Our glass surfaces use backdrop-filter, which creates a stacking context and
   a containing block for fixed-position children. A modal authored inside a
   card would otherwise sit UNDER .modal-backdrop and be unclickable. The JS
   relocation is the real fix; these values make the ordering explicit and
   guard against a modal added somewhere the script has not reached.
*/
.modal { z-index: 1085; }
.modal-backdrop { z-index: 1080; }

.modal-content {
  background: var(--br-bg-2);
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius-lg);
  box-shadow: var(--br-shadow-lg);
  color: var(--br-ink);
  /* Never taller than the viewport, so the footer buttons stay reachable. */
  max-height: calc(100vh - 3.5rem);
}
.modal-backdrop.show { opacity: .7; }
.modal-header, .modal-footer { border-color: var(--br-line); flex-shrink: 0; }
.modal-title { color: var(--br-ink); }

/*
   The body scrolls, not the dialog.

   Without this a tall modal (the accept-bid confirmation, for instance) is
   simply clipped: the consequences list and the confirm button fall off the
   bottom with no way to reach them.
*/
.modal-content > .modal-body { overflow-y: auto; }
.modal-dialog-centered { min-height: calc(100% - 3.5rem); }

/*
   A MODAL WHOSE CONTENTS ARE WRAPPED IN A FORM (doc s.134).

   Bootstrap's scrollable modal works by making .modal-content a flex column
   and letting .modal-body take the remaining height with overflow-y:auto. Both
   halves of that assume .modal-body is a DIRECT child of .modal-content.

   Put a <form> in between - which any modal that submits has to - and the
   chain breaks: modal-content's only flex child is the form, the form has no
   height bound, so the body never gets one and never scrolls. modal-content's
   overflow:hidden then simply clips whatever does not fit, which is why the
   quotation modal lost its lower half and its footer buttons on a laptop.

   Making the form the flex container repairs it for every such modal rather
   than for one. `min-height: 0` is the part that is easy to miss: a flex item
   will not shrink below its content without it, so the body would still
   overflow instead of scrolling.
*/
.modal-content > form {
  display: flex;
  flex-direction: column;
  min-height: 0;
  max-height: 100%;
  /* The form must not own the scrollbar - the body inside it does. Two
     scrollbars in one dialog is the "nested scrollbars" the brief warns of. */
  overflow: hidden;
}

.modal-content > form > .modal-body {
  overflow-y: auto;
  min-height: 0;
  /* Room for the scrollbar so text does not sit under it. */
  scrollbar-gutter: stable;
}

.modal-content > form > .modal-header,
.modal-content > form > .modal-footer { flex-shrink: 0; }

/*
   On a short viewport - a laptop at 768px tall, or a phone in landscape - the
   dialog margin is what pushes the footer off screen. Halving it buys back
   enough room without making the dialog look pinned to the edges.
*/
@media (max-height: 700px) {
  .modal-dialog { margin-top: .75rem; margin-bottom: .75rem; }
}

.accordion-item {
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border-color: var(--br-line); color: var(--br-ink);
}
.accordion-button {
  background: transparent; color: var(--br-ink);
  font-weight: 600; font-family: inherit;
}
.accordion-button:not(.collapsed) {
  background: var(--br-primary-light); color: var(--br-ink);
  box-shadow: none;
}
.accordion-button:focus { box-shadow: var(--br-shadow-focus); border-color: var(--br-primary); }
/* The chevron is a baked-in dark SVG; invert it so it is visible on dark. */
.accordion-button::after { filter: invert(.75); }
[data-theme="light"] .accordion-button::after { filter: none; }

.toast {
  background: var(--br-bg-2);
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);
  color: var(--br-ink);
  box-shadow: var(--br-shadow-lg);
}
.toast-body { color: var(--br-ink); }

.btn-close { filter: invert(.8); opacity: .7; }
.btn-close:hover { opacity: 1; }
[data-theme="light"] .btn-close { filter: none; }

.form-check-input {
  background-color: var(--br-surface-2);
  border-color: var(--br-line);
}
.form-check-input:checked {
  background-color: var(--br-primary);
  border-color: var(--br-primary);
}
.form-check-input:focus { box-shadow: var(--br-shadow-focus); border-color: var(--br-primary); }
.form-check-label { color: var(--br-ink-2); }

/* Pagination */
.pagination { --bs-pagination-bg: transparent; }
.page-link {
  background: var(--br-surface); color: var(--br-ink-2);
  border-color: var(--br-line); border-radius: var(--br-radius-sm);
  margin: 0 2px; font-size: var(--fs-sm);
  transition: background var(--br-t-fast) var(--br-ease), color var(--br-t-fast) var(--br-ease);
}
.page-link:hover { background: var(--br-primary-light); color: var(--br-ink); border-color: var(--br-primary); }
/* -btn for the same reason as .br-brand-mark: the active page number is a
   white label on this fill. */
.page-item.active .page-link { background: var(--br-gradient-btn); border-color: transparent; color: #fff; }
.page-item.disabled .page-link { background: transparent; color: var(--br-ink-4); border-color: var(--br-line-2); }

/* Bootstrap utility text colours used in a few views */
.text-danger { color: var(--br-danger) !important; }
.text-warning { color: var(--br-warning) !important; }
.text-break { word-break: break-word; }
.border-bottom { border-color: var(--br-line) !important; }
.border-top { border-color: var(--br-line) !important; }
hr { border-color: var(--br-line); opacity: 1; }

/* --------------------------------------------------------------------------
   17b. Footer
   -------------------------------------------------------------------------- */
.br-footer {
  margin-top: 4rem;
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border-top: 1px solid var(--br-line);
}
.br-footer-main { padding: 3rem 0 2rem; }

.br-footer-blurb {
  margin-top: 1rem; color: var(--br-ink-3);
  font-size: var(--fs-sm); line-height: 1.7; max-width: 42ch;
}

.br-footer-badges { list-style: none; padding: 0; margin: 1rem 0 0; }
.br-footer-badges li {
  display: flex; align-items: center; gap: .5rem;
  font-size: var(--fs-xs); color: var(--br-ink-2); padding: .2rem 0;
}

.br-footer-heading {
  font-size: var(--fs-xs); font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--br-ink); margin-bottom: .875rem;
}

.br-footer-links { list-style: none; padding: 0; margin: 0; }
.br-footer-links li { margin-bottom: .5rem; }
.br-footer-links a {
  position: relative;
  font-size: var(--fs-sm); color: var(--br-ink-3); text-decoration: none;
  transition: color var(--br-t-fast) var(--br-ease), padding-left var(--br-t) var(--br-ease);
}
.br-footer-links a::before {
  content: '→'; position: absolute; left: -14px; opacity: 0;
  transition: opacity var(--br-t) var(--br-ease), transform var(--br-t) var(--br-ease);
  transform: translateX(-4px);
}
.br-footer-links a:hover {
  color: var(--br-primary); text-decoration: none; padding-left: 14px;
}
.br-footer-links a:hover::before { opacity: 1; transform: translateX(0); left: 0; }

.br-footer-bottom {
  display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
  justify-content: space-between;
  padding: 1.25rem 0; border-top: 1px solid var(--br-line-2);
  font-size: var(--fs-xs); color: var(--br-ink-3);
}
.br-footer-meta { color: var(--br-ink-4); }

.br-footer-compact {
  margin-top: 3rem; padding: 1rem 0;
  background: var(--br-surface);
  backdrop-filter: blur(var(--br-blur));
  -webkit-backdrop-filter: blur(var(--br-blur));
  border-top: 1px solid var(--br-line);
}
.br-footer-compact a { color: var(--br-ink-3); }
.br-footer-compact a:hover { color: var(--br-primary); }

@media (max-width: 767.98px) {
  .br-footer-compact { margin-bottom: 4rem; }   /* clear the tab bar */
  .br-footer { margin-bottom: 4rem; }
}

/* --------------------------------------------------------------------------
   17c. Marketing / landing page
   -------------------------------------------------------------------------- */
.br-hero {
  position: relative; isolation: isolate;
  padding: 3.5rem 0 3rem; text-align: center;
}
.br-hero-inner { position: relative; z-index: 1; }

/* A secondary page's hero.

   IT HAD NO RULE AT ALL. The class shipped with the pricing page at s.105 and
   was added to the FAQ at s.109 in the belief that it did something; both
   pages were carrying the landing page's full-height hero, which on a
   seventy-two answer manual pushes the first question below the fold. These
   pages open on a title, not on a pitch, so the space above the content is
   worth less here than the content is. */
.br-hero-compact { padding: 2.25rem 0 1.5rem; }

/* Ambient light behind the hero.

   CLIPPED BY ITS OWN WRAPPER. The orbs are deliberately wider than the column
   so the light falls off past the edge of the text; un-clipped, that overflow
   puts a horizontal scrollbar on the page at phone width, which s.82 forbids
   outright. `overflow: hidden` here contains them without touching the
   hero's own stacking.

   POINTER-EVENTS: NONE, because a 600px invisible circle sitting over the
   call-to-action buttons would swallow the click that the whole page exists
   to collect. */
.br-hero-glow,
.br-cta-glow {
  position: absolute; inset: 0; overflow: hidden; pointer-events: none;
  z-index: 0; border-radius: inherit;
}
.br-orb {
  position: absolute; display: block; border-radius: 50%;
  filter: blur(90px); opacity: .5;
}
.br-orb-1 {
  width: 380px; height: 380px; top: -120px; left: 4%;
  background: rgba(249,143,46,.22);
}
.br-orb-2 {
  width: 440px; height: 440px; top: -60px; left: 50%; margin-left: -220px;
  background: rgba(46,158,30,.18);
}
.br-orb-3 {
  width: 320px; height: 320px; top: 40px; right: 2%;
  background: rgba(11,26,138,.28);
}
/* The light theme's ground is pale, so the same opacities read as smudges. */
[data-theme="light"] .br-orb { opacity: .32; filter: blur(80px); }

/* The badge row above the headline. */
.br-hero-badge {
  display: flex; align-items: center; justify-content: center;
  gap: .5rem; flex-wrap: wrap; margin-bottom: 1rem;
}
/* The chip reuses the audited .br-pill tones rather than inventing three new
   colour pairs - saffron, green and navy already exist there as locked,
   active and hired, and they are the only versions of those hues that have
   been checked on both themes. */
.br-hero-chip { padding: .35rem .75rem; }
.br-hero-chip-dot { color: var(--br-ink-4); }
.br-hero-chip-meta {
  font-size: var(--fs-micro); color: var(--br-ink-4);
  letter-spacing: .04em; text-transform: uppercase; font-weight: 600;
}

/* The headline, and the banner lines that stand in for it on slides 2 and 3.

   ONE RULE FOR BOTH. Slide 1 is an <h1> and the others are <p>, for the
   document-outline reason in home.blade.php, and if their type were styled
   separately the carousel would visibly change weight as it rotated. */
.br-hero-title {
  font-family: var(--br-font-display);
  font-size: var(--fs-display); font-weight: 800;
  line-height: 1.15; letter-spacing: -.03em;
  color: var(--br-ink); margin: 0 0 .75rem; text-wrap: balance;
}
/* Painted ink, not a colour. The declaration order matters: ink first, so a
   browser that cannot clip a background to letterforms keeps a readable
   heading instead of rendering it transparent on transparent. */
.br-gradient-text { color: var(--br-ink); }
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .br-gradient-text {
    background: var(--br-gradient-text);
    -webkit-background-clip: text; background-clip: text;
    color: transparent;
  }
}
.br-hero-lede {
  max-width: 640px; margin: 0 auto;
  font-size: 1.0625rem; color: var(--br-ink-3); line-height: 1.7;
}

.br-hero-actions {
  display: flex; align-items: center; justify-content: center;
  gap: .75rem; flex-wrap: wrap; margin: 1.75rem 0 0;
}
.br-hero-actions .br-btn { gap: .5rem; }

/* --- The carousel ------------------------------------------------------- */
.br-carousel { position: relative; }

/* THE VIEWPORT RESERVES ITS HEIGHT. Slides differ in length by a line or two,
   and without a floor the page jumps every 4.5 seconds and drags the buttons
   under the reader's cursor with it. The min-height is the tallest slide at
   each width, which is why it steps DOWN as the viewport widens - the text
   wraps onto fewer lines. */
.br-carousel-viewport {
  position: relative;
  min-height: 300px;
  display: flex; flex-direction: column; justify-content: center;
}
@media (min-width: 576px) { .br-carousel-viewport { min-height: 290px; } }
@media (min-width: 768px) { .br-carousel-viewport { min-height: 310px; } }

.br-carousel-slide { display: none; }
.br-carousel-slide.is-active {
  display: block;
  animation: br-slide-in var(--br-t-slow) var(--br-ease) both;
}
@keyframes br-slide-in {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: none; }
}

.br-carousel-controls {
  display: flex; align-items: center; justify-content: center;
  gap: .5rem; margin-top: 1.25rem;
}
.br-carousel-arrow {
  display: grid; place-items: center;
  width: 32px; height: 32px; padding: 0;
  border: 1px solid var(--br-line); border-radius: var(--br-radius-pill);
  background: transparent; color: var(--br-ink-3);
  cursor: pointer;
  transition: color var(--br-t-fast) var(--br-ease),
              background var(--br-t-fast) var(--br-ease),
              border-color var(--br-t-fast) var(--br-ease);
}
.br-carousel-arrow:hover {
  color: var(--br-ink); background: var(--br-surface-hover);
  border-color: var(--br-primary);
}
.br-carousel-arrow:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }

.br-carousel-dots { display: inline-flex; align-items: center; gap: .375rem; }
.br-carousel-dot {
  position: relative;
  width: 8px; height: 8px; padding: 0;
  border: 0; border-radius: var(--br-radius-pill);
  background: var(--br-ink-4); opacity: .5; cursor: pointer;
  transition: width var(--br-t) var(--br-ease), opacity var(--br-t) var(--br-ease),
              background var(--br-t) var(--br-ease);
}
/* The dot itself is 8px, far under the 24x24 minimum target size, so it
   carries an invisible pad centred on it that takes the tap instead. */
.br-carousel-dot::before {
  content: ''; position: absolute; top: 50%; left: 50%;
  width: 28px; height: 28px; transform: translate(-50%, -50%);
}
.br-carousel-dot:hover { opacity: .9; }
.br-carousel-dot.is-active {
  width: 28px; opacity: 1; background: var(--br-gradient);
}
.br-carousel-dot:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }

/* --- Section furniture --------------------------------------------------- */
.br-section { padding: 3.5rem 0; }
.br-section-head { text-align: center; margin-bottom: 2rem; }
.br-section-head .br-eyebrow { margin-bottom: .35rem; }
.br-section-lede {
  max-width: 62ch; margin: .5rem auto 0;
  color: var(--br-ink-3); line-height: 1.7;
}

/* --- The cycle, as a sequence -------------------------------------------- */
.br-timeline {
  list-style: none; padding: 0; margin: 0;
  display: grid; gap: 1rem;
  grid-template-columns: 1fr;
}
@media (min-width: 768px) {
  .br-timeline { grid-template-columns: repeat(3, 1fr); }
}
.br-timeline-item { position: relative; }
.br-timeline-step {
  font-size: var(--fs-micro); font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--br-ink-4); margin-bottom: .25rem;
}
.br-timeline-days {
  font-family: var(--br-font-display);
  font-size: 1.75rem; font-weight: 700; line-height: 1.1;
  letter-spacing: -.02em; color: var(--br-ink-3);
  font-variant-numeric: tabular-nums; margin: .25rem 0 .75rem;
}
.br-timeline-days .br-gradient-text { font-size: 2.5rem; }
.br-card-total { border-color: var(--br-primary); }

/* --- Persona-tinted cards ------------------------------------------------ */
.br-card-persona { position: relative; overflow: hidden; }
.br-card-persona::after {
  content: ''; position: absolute; inset: 0 0 auto; height: 3px;
}
.br-card-candidate::after { background: var(--br-gradient-candidate); }
.br-card-recruiter::after { background: var(--br-gradient-recruiter); }

/* --- The closing call to action ------------------------------------------ */
.br-cta-card { position: relative; isolation: isolate; overflow: hidden; }

/* --- Inline icons --------------------------------------------------------- */
.br-glyph { flex: 0 0 auto; vertical-align: -.15em; }

/* --- The announcement strip ---------------------------------------------- */
.br-announce {
  background: linear-gradient(90deg,
              var(--br-bg) 0%, var(--br-bg-2) 50%, var(--br-bg) 100%);
  border-bottom: 1px solid var(--br-line);
  font-size: var(--fs-micro);
  padding: .4rem 0;
  overflow: hidden;
}
.br-announce-inner {
  display: flex; align-items: center; justify-content: center;
  gap: .625rem; flex-wrap: wrap;
}
.br-announce-tag {
  display: inline-flex; align-items: center; gap: .4rem;
  padding: .1rem .5rem; border-radius: var(--br-radius-pill);
  background: var(--br-warning-bg); color: var(--br-warning);
  border: 1px solid rgba(245,158,11,.3);
  font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  white-space: nowrap;
}
/* A slow pulse, not the reference's ping: this strip is on screen for the
   whole visit, and something flashing at 1Hz beside the navigation is the
   kind of movement that makes a page unusable for anyone sensitive to it.
   It stops entirely under prefers-reduced-motion, with the rest of section 20. */
.br-announce-ping {
  width: 6px; height: 6px; border-radius: 50%;
  background: currentColor;
  animation: br-announce-pulse 2.4s var(--br-ease) infinite;
}
@keyframes br-announce-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: .35; transform: scale(.75); }
}
.br-announce-text { color: var(--br-ink-2); font-weight: 500; letter-spacing: .01em; }
.br-announce-dot { color: var(--br-ink-4); }
.br-announce-sub { color: var(--br-ink-3); }

/* Headline figures that roll up on load */
.br-metric { text-align: center; padding: 1rem .5rem; }
.br-metric-value {
  font-family: var(--br-font-display);
  font-size: 2.25rem; font-weight: 700; line-height: 1.1;
  color: var(--br-primary); font-variant-numeric: tabular-nums;
  letter-spacing: -.02em;
}
.br-metric-label {
  font-size: var(--fs-xs); font-weight: 500; color: var(--br-ink-3);
  margin-top: .25rem;
}

/* The numbered step cards (.br-step-card, .br-step-num) were removed with the
   "How EpicJobs works" section they styled (doc s.104). Nothing else used them -
   .br-step, which the registration stepper and the interview tracker use, is a
   different class and is untouched. */

/* Feature list with animated ticks */
.br-feature-list { list-style: none; padding: 0; margin: 0; }
.br-feature-list li {
  display: flex; gap: .625rem; align-items: flex-start;
  padding: .45rem 0; color: var(--br-ink-2); font-size: var(--fs-sm);
}
.br-feature-list li::before {
  content: '✓'; flex: 0 0 20px; height: 20px; margin-top: 2px;
  display: grid; place-items: center; border-radius: 50%;
  background: var(--br-success-bg); color: var(--br-success);
  font-size: 11px; font-weight: 700;
  transition: transform var(--br-t) var(--br-ease-spring);
}
.br-feature-list li:hover::before { transform: scale(1.2); }

/* Plan cards */
.br-plan-price {
  font-family: var(--br-font-display);
  font-size: 1.5rem; font-weight: 700; line-height: 1.15;
  letter-spacing: -.02em; color: var(--br-primary);
  font-variant-numeric: tabular-nums;
}
.br-plan-card { transition: transform var(--br-t) var(--br-ease), box-shadow var(--br-t) var(--br-ease); }
.br-plan-card:hover { transform: translateY(-4px); box-shadow: var(--br-shadow-lg); }

/* FAQ */
.br-faq-item { border-bottom: 1px solid var(--br-line); }
.br-faq-item summary {
  padding: 1rem 0; cursor: pointer; font-weight: 600;
  list-style: none; display: flex; align-items: center; gap: .75rem;
  transition: color var(--br-t-fast) var(--br-ease);
}
.br-faq-item summary::-webkit-details-marker { display: none; }
.br-faq-item summary::after {
  content: '+'; margin-left: auto; font-size: 1.25rem; font-weight: 400;
  color: var(--br-primary);
  transition: transform var(--br-t) var(--br-ease);
}
.br-faq-item[open] summary::after { transform: rotate(45deg); }
.br-faq-item summary:hover { color: var(--br-primary); }
.br-faq-answer {
  padding: 0 0 1rem; color: var(--br-ink-3); font-size: var(--fs-sm); line-height: 1.7;
  animation: br-slide-down var(--br-t) var(--br-ease);
}

/* --------------------------------------------------------------------------
   17d. Hover & pointer feedback
   -------------------------------------------------------------------------- */

/* Only apply lift effects where a real pointer exists - on touch these fire
   on tap and read as lag. */
@media (hover: hover) and (pointer: fine) {
  .br-card-hover { transition: transform var(--br-t) var(--br-ease), box-shadow var(--br-t) var(--br-ease); }
  .br-card-hover:hover { transform: translateY(-3px); box-shadow: var(--br-shadow-lg); }

  .br-lift { transition: transform var(--br-t) var(--br-ease); }
  .br-lift:hover { transform: translateY(-2px); }

  .br-glow { transition: box-shadow var(--br-t) var(--br-ease); }
  .br-glow:hover { box-shadow: 0 0 0 4px var(--br-primary-light); }

  /* Sheen sweep across primary buttons */
  .br-btn-primary { position: relative; overflow: hidden; }
  .br-btn-primary::after {
    content: ''; position: absolute; top: 0; left: -120%;
    width: 60%; height: 100%;
    background: linear-gradient(90deg, transparent, rgba(255,255,255,.28), transparent);
    transform: skewX(-20deg);
    transition: left var(--br-t-slow) var(--br-ease);
  }
  .br-btn-primary:hover::after { left: 130%; }

  .br-table tbody tr { transition: background var(--br-t-fast) var(--br-ease), transform var(--br-t-fast) var(--br-ease); }
  .br-table tbody tr:hover { transform: translateX(2px); }

  .br-tag { transition: transform var(--br-t-fast) var(--br-ease), background var(--br-t-fast) var(--br-ease); }
  .br-tag:hover { transform: translateY(-1px); background: var(--br-primary); color: #fff; }

  .br-stat { transition: transform var(--br-t) var(--br-ease), box-shadow var(--br-t) var(--br-ease); }
  .br-stat:hover { transform: translateY(-2px); box-shadow: var(--br-shadow); }

  .br-pill { transition: transform var(--br-t-fast) var(--br-ease); }
  .br-pill:hover { transform: scale(1.05); }
}

/* --------------------------------------------------------------------------
   18. Animations — transform/opacity only, so they stay GPU-composited
   -------------------------------------------------------------------------- */
@keyframes br-spin { to { transform: rotate(360deg); } }
@keyframes br-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
@keyframes br-pop { from { transform: scale(.85); opacity: 0; } to { transform: scale(1); opacity: 1; } }
@keyframes br-slide-down { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
@keyframes br-fade-up { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes br-pulse { 0%,100% { opacity: 1; } 50% { opacity: .55; } }
@keyframes br-badge-bump { 0% { transform: scale(1);} 50% { transform: scale(1.3);} 100% { transform: scale(1);} }
@keyframes br-ring-shake { 0%,100% { transform: rotate(0);} 25% { transform: rotate(2deg);} 75% { transform: rotate(-2deg);} }
@keyframes br-shake { 0%,100% { transform: translateX(0);} 20%,60% { transform: translateX(-6px);} 40%,80% { transform: translateX(6px);} }
@keyframes br-flash-green { 0% { background: var(--br-success-bg);} 100% { background: transparent;} }

.br-animate-in { animation: br-fade-up var(--br-t-slow) var(--br-ease) both; }
.br-shake { animation: br-shake var(--br-t-slow) var(--br-ease); }
.br-flash { animation: br-flash-green 600ms var(--br-ease); }

/* Reveal on scroll. The hidden state is applied by JS, never in the stylesheet:
   if scripting fails the content must still be visible, not stuck at opacity 0. */
.br-reveal { opacity: 0; transform: translateY(20px); }
.br-reveal.is-visible {
  opacity: 1; transform: none;
  transition: opacity 600ms var(--br-ease), transform 600ms var(--br-ease);
}

/* Staggered list entrance — 60ms apart, capped so long lists don't crawl in */
.br-stagger > * { animation: br-fade-up 300ms var(--br-ease) both; }
.br-stagger > *:nth-child(1) { animation-delay: 0ms; }
.br-stagger > *:nth-child(2) { animation-delay: 60ms; }
.br-stagger > *:nth-child(3) { animation-delay: 120ms; }
.br-stagger > *:nth-child(4) { animation-delay: 180ms; }
.br-stagger > *:nth-child(5) { animation-delay: 240ms; }
.br-stagger > *:nth-child(6) { animation-delay: 300ms; }
.br-stagger > *:nth-child(n+7) { animation-delay: 360ms; }

/* --------------------------------------------------------------------------
   19. Responsive
   -------------------------------------------------------------------------- */
@media (max-width: 767.98px) {
  :root { --fs-display: 1.875rem; --fs-h1: 1.5rem; --fs-h2: 1.25rem; --fs-h3: 1.125rem; }

  .br-main { padding: 1rem 0 5.5rem; }   /* room for the bottom tab bar */
  .br-card-body { padding: 1rem; }

  /* Every touch target clears 44px */
  .br-btn { min-height: 44px; }

  /* Tables become stacked cards, labelled from data-label */
  .br-table-stack thead { display: none; }
  .br-table-stack tbody tr {
    display: block; margin-bottom: .75rem; padding: .75rem;
    background: var(--br-surface); border: 1px solid var(--br-line);
    border-radius: var(--br-radius);
  }
  .br-table-stack td {
    display: flex; justify-content: space-between; gap: 1rem;
    padding: .35rem 0; border: 0; text-align: right;
  }
  .br-table-stack td::before {
    content: attr(data-label); font-weight: 600; color: var(--br-ink-3);
    font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .04em;
    text-align: left;
  }

  /* Bid panel becomes a sticky bottom sheet */
  .br-sticky-panel { position: static; }

  .br-tabbar {
    position: fixed; bottom: 0; left: 0; right: 0; z-index: 1040;
    display: flex; background: var(--br-bg-2);
    backdrop-filter: blur(var(--br-blur));
    -webkit-backdrop-filter: blur(var(--br-blur));
    border-top: 1px solid var(--br-line);
    padding: .375rem .25rem calc(.375rem + env(safe-area-inset-bottom));
    box-shadow: 0 -2px 12px rgba(15,23,42,.06);
  }
  .br-tabbar a {
    flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px;
    padding: .375rem; font-size: 10px; font-weight: 600;
    color: var(--br-ink-3); text-decoration: none; min-height: 44px;
  }
  .br-tabbar a.active { color: var(--br-primary); }
  .br-tabbar-icon { font-size: 1.125rem; line-height: 1; }
}

@media (min-width: 992px) {
  .br-sticky-panel { position: sticky; top: 88px; }
}

/* --------------------------------------------------------------------------
   20. Assistant (module 09)
   -------------------------------------------------------------------------- */

/* Deliberately NOT inside .br-shell: that element carries backdrop-filter,
   which creates a containing block for position:fixed descendants and would
   pin this panel inside the page flow — the same defect that once trapped
   every modal underneath its own backdrop. */
.br-chat { position: fixed; right: 1rem; bottom: 1rem; z-index: 1050; }

.br-chat-fab {
  width: 3.25rem; height: 3.25rem; border-radius: 50%;
  border: 1px solid var(--br-line-2);
  background: var(--br-primary); color: #fff;
  font-size: 1.25rem; line-height: 1;
  box-shadow: var(--br-shadow);
  cursor: pointer;
}

.br-chat-panel {
  position: absolute; right: 0; bottom: 4rem;
  width: min(22rem, calc(100vw - 2rem));
  display: flex; flex-direction: column;
  max-height: min(30rem, calc(100vh - 8rem));
  /* Opaque, not the translucent surface token: text over a blurred dashboard
     is unreadable, and a chat panel is all text. */
  background: var(--br-bg);
  border: 1px solid var(--br-line-2);
  border-radius: var(--br-radius-lg);
  box-shadow: var(--br-shadow-lg);
  overflow: hidden;
}

.br-chat-head {
  display: flex; align-items: flex-start; gap: .5rem;
  padding: .75rem 1rem; border-bottom: 1px solid var(--br-line);
}
.br-chat-head > div:first-child { flex: 1 1 auto; }

.br-chat-log {
  flex: 1 1 auto; overflow-y: auto;
  padding: .75rem 1rem; display: flex; flex-direction: column; gap: .5rem;
}

.br-chat-msg {
  padding: .5rem .75rem; border-radius: var(--br-radius);
  font-size: var(--fs-sm); line-height: 1.5; max-width: 90%;
}
.br-chat-bot  { background: var(--br-surface-2); color: var(--br-ink); align-self: flex-start; }
.br-chat-user { background: var(--br-primary); color: #fff; align-self: flex-end; }
.br-chat-typing { opacity: .6; letter-spacing: .2em; }

.br-chat-suggestions {
  display: flex; flex-wrap: wrap; gap: .375rem;
  padding: 0 1rem .5rem;
}
.br-chat-suggestions:empty { padding: 0; }

.br-chip {
  border: 1px solid var(--br-line-2); background: transparent;
  color: var(--br-ink-2); border-radius: 999px;
  padding: .25rem .625rem; font-size: var(--fs-xs); cursor: pointer;
}
.br-chip:hover { border-color: var(--br-primary); color: var(--br-primary); }

.br-chat-form { display: flex; gap: .5rem; padding: .5rem 1rem; }
.br-chat-form .br-input { flex: 1 1 auto; }
.br-chat-foot { padding: 0 1rem .75rem; margin: 0; }

/* The bottom tab bar owns the lower edge on mobile; sit above it. */
@media (max-width: 767.98px) {
  .br-chat { bottom: 4.5rem; }
}

@media print { .br-chat { display: none !important; } }

/* --------------------------------------------------------------------------
   21. Accessibility & print
   -------------------------------------------------------------------------- */

/* Non-negotiable: honour the user's motion preference */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

:focus-visible { outline: 2px solid var(--br-primary); outline-offset: 2px; }

.br-sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}

@media print {
  .br-navbar, .br-tabbar, .br-btn, .br-sim-banner { display: none !important; }
  body { background: #fff; }
  .br-card { border: 1px solid #ccc; box-shadow: none; }
}

/* Masked cell — an inactive candidate's commercial detail.
   Deliberately not a blur filter: blurred text can be recovered from the
   markup, and the point is that the value was never sent to the browser. */
.br-masked { color: var(--br-ink-4); letter-spacing: .18em; user-select: none; }

/* Rating badge — the pill, and the score beneath it in an orb.
   Stacked and centred: the labels differ in width by a factor of two, so an
   inline score wrapped only under the long ones and sat left-aligned. */
.br-rating-stack {
  display: inline-flex; flex-direction: column; align-items: center; gap: .35rem;
}

/* The orb reuses each band's own pill pair — the same background tint and the
   same foreground — so it cannot drift out of contrast independently, and a
   band can never read green here and amber there. */
.br-rating-orb {
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.35rem; height: 2.35rem; border-radius: 50%;
  font-size: var(--fs-xs); font-weight: 700; font-variant-numeric: tabular-nums;
  border: 2px solid currentColor; line-height: 1;
}

.br-rating-orb-gold    { background: rgba(251,191,36,.15); color: var(--br-gold);
                         box-shadow: 0 0 0 3px rgba(251,191,36,.14); }
.br-rating-orb-active  { background: var(--br-success-bg); color: var(--br-success);
                         box-shadow: 0 0 0 3px rgba(16,185,129,.14); }
.br-rating-orb-locked  { background: var(--br-warning-bg); color: var(--br-warning);
                         box-shadow: 0 0 0 3px rgba(245,158,11,.14); }
.br-rating-orb-danger  { background: var(--br-danger-bg);  color: var(--br-danger);
                         box-shadow: 0 0 0 3px rgba(239,68,68,.14); }
.br-rating-orb-dormant { background: var(--br-line-2);     color: var(--br-ink-3);
                         box-shadow: 0 0 0 3px rgba(148,163,184,.14); }

/* Light theme keeps the pill's darker foregrounds, for the same reason. */
[data-theme="light"] .br-rating-orb-active { color: #047857; }
[data-theme="light"] .br-rating-orb-locked { color: #B45309; }
[data-theme="light"] .br-rating-orb-danger { color: #B91C1C; }

/* The column is narrow; keep the stack from stretching the row. */
.br-table-talent .br-rating-stack { max-width: 100%; }

/* ==========================================================================
   Date + time picker (module 07)

   Replaces datetime-local so the OK can live INSIDE the calendar, and so the
   calendar opens on the platform date rather than the browser's today.
   ========================================================================== */
.br-datepick { position: relative; }

.br-datepick-display {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .5rem;
  width: 100%;
  text-align: left;
  cursor: pointer;
}

.br-datepick-display:focus-visible {
  outline: 2px solid var(--br-primary);
  outline-offset: 2px;
}

.br-datepick-placeholder { color: var(--br-ink-3); }
.br-datepick-icon { flex: 0 0 auto; opacity: .7; }

/* Lifts the whole card while its picker is open. .br-card carries
   backdrop-filter, which creates a stacking context, so nothing INSIDE the
   card can be raised above a later sibling card - the ancestor has to move.
   Added and removed by BR.datepick. */
.br-stack-raise { position: relative; z-index: 60; }

.br-datepick-pop {
  position: absolute;
  z-index: 40;
  top: calc(100% + .35rem);
  left: 0;
  width: min(20rem, calc(100vw - 2rem));
  padding: .75rem;
  /* --br-bg-2, not --br-surface: the surface token is translucent by design
     and a see-through calendar over page text is unreadable. Modals and
     dropdowns use the solid token for the same reason. */
  background: var(--br-bg-2);
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius-lg);
  box-shadow: 0 12px 32px rgba(0, 0, 0, .18);
  animation: br-datepick-in .14s ease-out;
}

@keyframes br-datepick-in {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .br-datepick-pop { animation: none; }
}

.br-datepick-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: .5rem;
}

.br-datepick-month { font-weight: 600; font-size: .95rem; }

.br-datepick-nav {
  border: 1px solid var(--br-line);
  background: transparent;
  color: inherit;
  border-radius: var(--br-radius-sm);
  width: 1.9rem;
  height: 1.9rem;
  line-height: 1;
  cursor: pointer;
}

.br-datepick-nav:hover { background: var(--br-surface-2); }

.br-datepick-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
}

.br-datepick-dow {
  text-align: center;
  font-size: .7rem;
  color: var(--br-ink-3);
  padding: .25rem 0;
}

.br-datepick-blank { visibility: hidden; }

.br-datepick-day {
  border: 0;
  background: transparent;
  color: inherit;
  border-radius: var(--br-radius-sm);
  padding: .4rem 0;
  font-size: .85rem;
  cursor: pointer;
  transition: background .12s ease, color .12s ease;
}

.br-datepick-day:hover:not(:disabled) { background: var(--br-surface-2); }

.br-datepick-day:disabled {
  /* Out of the allowed window - and visibly so, rather than silently
     accepting a value the server would reject. */
  opacity: .3;
  cursor: not-allowed;
}

.br-datepick-day.is-chosen {
  background: var(--br-primary);
  color: #fff;
  font-weight: 600;
}

.br-datepick-foot {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: .5rem;
  margin-top: .65rem;
  padding-top: .65rem;
  border-top: 1px solid var(--br-line);
}

.br-datepick-time {
  display: flex;
  flex-direction: column;
  gap: .2rem;
  font-size: .7rem;
  color: var(--br-ink-3);
}

.br-datepick-time .br-input { padding: .3rem .45rem; font-size: .85rem; }

.br-datepick-actions { display: flex; gap: .4rem; }

/* ==========================================================================
   Market compensation benchmarks (module 09)

   Three published sources side by side. No single salary survey is
   authoritative, so the table shows the spread rather than one number.
   ========================================================================== */
.br-table-compact th,
.br-table-compact td { padding: .45rem .5rem; font-size: .85rem; }

.br-bench-source {
  font-weight: 600;
  color: var(--br-primary);
}

/* The candidate's own figure against the median. Under is a warning, not an
   error: asking below the market is a choice, and often a deliberate one. */
.br-gap-under { color: var(--br-warning); font-weight: 600; }
.br-gap-over  { color: var(--br-ink-3);   font-weight: 600; }

/* Why OK is unavailable — a disabled button with no explanation is the same
   dead end as a form that silently refuses to submit. */
.br-datepick-note {
  margin: .5rem 0 0;
  color: var(--br-warning);
}

/* ==========================================================================
   External certifications (module 17)

   A curated list of links. EpicJobs has no partnership with any of these
   certifiers and verifies nothing — the disclaimer travels with the list.
   ========================================================================== */
.br-subsection {
  padding: .9rem;
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);
  background: var(--br-surface-2);
}

.br-cert-list summary {
  cursor: pointer;
  color: var(--br-primary);
}

.br-cert-items {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: .5rem;
}

.br-cert-items li {
  padding: .5rem .65rem;
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius-sm);
}

.br-cert-items a { font-weight: 600; }


/* ===================================================================
   Fitment - the job-description score on the talent search
   =================================================================== */

/* The panel reads as a distinct step above the filters rather than as more
   filters, which is the confusion the whole section has to avoid. */
.br-jd-panel {
    background: var(--br-surface-2, rgba(127, 127, 127, .05));
}

.br-fitment {
    display: inline-block;
    min-width: 5.5rem;

    /* Bounded below, so a long breakdown cannot stretch the column. */
    max-width: 16rem;
}

/* BOUNDED, NOT FLOATED.
   .br-table-wrap is overflow-x: auto, which clips on both axes - an absolutely
   positioned panel hanging below the last row would be cut off, which is the
   date-picker fault from section 73 in a new place. So the breakdown stays in
   flow with a ceiling on its width: the column can never grow past this, and
   the row just gets taller when opened, which is what a disclosure does. */
.br-table .br-fitment-parts { max-width: 15rem; }

.br-fitment > summary {
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
    gap: .5rem;
}

.br-fitment > summary::-webkit-details-marker { display: none; }

.br-fitment > summary::after {
    content: '\203A';
    transform: rotate(90deg);
    transition: transform .2s ease;
    opacity: .5;
}

.br-fitment[open] > summary::after { transform: rotate(-90deg); }

.br-fitment-value {
    font-variant-numeric: tabular-nums;
    font-weight: 600;
}

.br-fitment-bar {
    flex: 1 1 auto;
    min-width: 2.5rem;
    height: .35rem;
    border-radius: 999px;
    background: var(--br-surface-3, rgba(127, 127, 127, .18));
    overflow: hidden;
}

.br-fitment-bar > span {
    display: block;
    height: 100%;
    border-radius: inherit;
    background: var(--br-accent, currentColor);
    transition: width .4s ease;
}

.br-fitment-parts {
    list-style: none;
    margin: .5rem 0 0;
    padding: 0;
    font-size: .75rem;
    line-height: 1.5;
}

.br-fitment-parts li {
    display: flex;
    justify-content: space-between;
    gap: .75rem;

    /* WRAPS. These lines are sentences now - section 78 replaced "1 yr short"
       with "7 yrs, in or above 4-8 years" - and a nowrap line that long makes
       the table cell as wide as its longest sentence. Opening one breakdown
       pushed the whole table sideways and squeezed every other column. */
    white-space: normal;
}

/* The label stays on one line; only the detail beside it wraps, so the two
   columns of the breakdown still read as two columns. */
.br-fitment-parts li > span:first-child {
    flex: 0 0 auto;
    white-space: nowrap;
}

.br-fitment-parts li > span:last-child { text-align: right; }

@media (prefers-reduced-motion: reduce) {
    .br-fitment > summary::after,
    .br-fitment-bar > span { transition: none; }
}

/* ===================================================================
   Verify my links - the candidate's on-demand link check
   =================================================================== */
.br-verify { margin-top: .75rem; display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.br-verify-out { flex: 1 0 100%; }

.br-verify-list { list-style: none; margin: 0; padding: 0; font-size: .8rem; line-height: 1.6; }
.br-verify-list li { display: flex; gap: .35rem; align-items: baseline; }
.br-verify-list strong { flex: 0 0 auto; }

/* Three states, three colours - and "unconfirmed" is deliberately NOT the
   danger colour. A site that blocks automated visitors has told us nothing
   about the link, and colouring that red would read as a fault the candidate
   cannot fix. */
.br-verify-ok      { color: var(--br-success); }
.br-verify-unknown { color: var(--br-warning); }
.br-verify-bad     { color: var(--br-danger); }

/* The fitment breakdown on the bid desk sits in a wider column than the
   table cell it was designed for, so it is given room rather than squeezed. */
.br-fitment-desk { min-width: 0; display: block; }
.br-fitment-desk > summary { gap: .75rem; }
.br-fitment-desk .br-fitment-bar { max-width: 12rem; }
.br-fitment-desk .br-fitment-parts li { white-space: normal; }

/* The Recruiter Performance Index panel. Distinct from the stat tiles beside
   it because it is a judgement about the recruiter, not a count of their work. */
.br-rpi-card { border-left: 3px solid var(--br-primary); }

/* --------------------------------------------------------------------------
   23. Consent & privacy controls (doc s.101)
   -------------------------------------------------------------------------- */

/* The end-of-document sentinel. Zero-height and invisible: it marks a
   position, it does not occupy one. `display:block` matters - an inline span
   with no content has no box for IntersectionObserver to observe. */
.br-consent-end { display: block; height: 1px; width: 100%; }

/* The consent card is the one thing on the page that is not the document, so
   it is allowed to look like an action rather than a clause. */
.br-consent-card { border-color: var(--br-primary); }
.br-consent-card.is-locked { border-color: var(--br-line); }

.br-consent-check { padding: .75rem 0; }
.br-consent-check .form-check-label {
  font-size: var(--fs-sm); line-height: 1.6; color: var(--br-ink-2);
}
.br-consent-card.is-locked .form-check-label { color: var(--br-ink-4); }

/* --- Privacy & Data Controls ---------------------------------------------
   Three actions of escalating consequence, and the styling says so: the
   reversible one is plain, the legal one is warned, the irreversible one is
   framed in danger. Colour is never the only signal - each card states its
   consequence in words, because meaning carried by colour alone is not
   carried at all. */
.br-control-card { border-left: 3px solid var(--br-line); }
.br-control-card-pause { border-left-color: var(--br-info); }
.br-control-card-withdraw { border-left-color: var(--br-warning); }
.br-control-card-delete { border-left-color: var(--br-danger); }

.br-control-consequence {
  font-size: var(--fs-sm); color: var(--br-ink-3); line-height: 1.65;
}
.br-control-notice {
  border-left: 3px solid var(--br-warning);
  background: var(--br-warning-bg);
  padding: .75rem 1rem; border-radius: var(--br-radius-sm);
  font-size: var(--fs-sm); color: var(--br-ink-2); line-height: 1.65;
}

/* --- The consent document modal (doc s.106) -----------------------------
   The document scrolls inside the dialog, not the page - `modal-dialog-
   scrollable` does the work; this caps the height so there is always
   something to scroll, and keeps the prose to a readable measure. */
.br-legal-modal-body { max-height: 60vh; }
.br-legal-fragment { max-width: 72ch; }
.br-legal-modal-body:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }

/* A checkbox whose document has not been opened yet. Never colour alone:
   the label still reads normally and the control is genuinely disabled, so
   the state is carried by behaviour, not by a shade. */
.br-consent-pending { color: var(--br-ink-4); }

/* --- The embedded Master Service Agreement (doc s.108) -------------------
   The contract scrolls inside its own box, not the page: the gate watches
   THIS element reach its end, and a container that grows with the document
   has no bottom to reach. */
.br-msa-card { border-color: var(--br-warning); }
.br-msa-body {
  max-height: 340px; overflow-y: auto; padding: 1rem 1.25rem;
  border-top: 1px solid var(--br-line); border-bottom: 1px solid var(--br-line);
  font-size: var(--fs-sm); line-height: 1.65;
}
.br-msa-body:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }
.br-msa-body .br-legal-fragment { max-width: none; }

/* --------------------------------------------------------------------------
   FAQ manual (doc s.109)

   The accordion itself is <details>, styled above as .br-faq-item; what
   follows is the page around it - the sticky controls, the audience tabs, and
   the staggered reveal that makes a 72-answer document feel navigable rather
   than endless.
   -------------------------------------------------------------------------- */

/* Sticky, because the search box is useless the moment it scrolls away on a
   page this long. Offset by the header height so it does not hide under it. */
.br-faq-controls {
  position: sticky; top: 88px; z-index: 20;
  display: flex; flex-wrap: wrap; gap: .75rem; align-items: center;
  justify-content: space-between;
  padding: .75rem; margin: 0 0 2rem;
  background: var(--br-bg-2); border: 1px solid var(--br-line);
  border-radius: var(--br-radius); box-shadow: var(--br-shadow);
  animation: br-fade-up var(--br-t) var(--br-ease);
}

.br-faq-search { position: relative; flex: 1 1 16rem; min-width: 0; }
.br-faq-search .br-input { padding-left: 2.25rem; width: 100%; }
.br-faq-search-icon {
  position: absolute; left: .75rem; top: 50%; transform: translateY(-50%);
  font-size: .9rem; opacity: .6; pointer-events: none;
}

.br-faq-tabs { display: flex; gap: .25rem; flex: 0 0 auto; }
.br-faq-tab {
  border: 1px solid transparent; background: transparent; cursor: pointer;
  padding: .45rem .85rem; border-radius: var(--br-radius-sm);
  font-size: var(--fs-sm); font-weight: 600; color: var(--br-ink-3);
  transition: color var(--br-t-fast) var(--br-ease),
              background var(--br-t-fast) var(--br-ease),
              border-color var(--br-t-fast) var(--br-ease);
}
.br-faq-tab:hover { color: var(--br-ink); background: var(--br-line-2); }
.br-faq-tab.is-active {
  color: var(--br-primary); background: var(--br-primary-light);
  border-color: var(--br-primary-glow);
}
.br-faq-tab:focus-visible { outline: none; box-shadow: var(--br-shadow-focus); }

.br-faq-empty { text-align: center; color: var(--br-ink-3); margin: 2rem 0; }

.br-link-button {
  border: 0; background: none; padding: 0; cursor: pointer;
  color: var(--br-primary); font: inherit; text-decoration: underline;
}

.br-faq-section { scroll-margin-top: 6rem; }
.br-faq-group { margin-bottom: 1.5rem; scroll-margin-top: 6rem; }
.br-faq-group-title {
  font-size: var(--fs-h4); margin: 0 0 .65rem; color: var(--br-ink-2);
  letter-spacing: -.01em;
}

/* The answer's own rhythm. The manual's longer answers carry lists, and a
   list with default margins inside a collapsed panel reads as a gap. */
.br-faq-answer p { margin: 0 0 .75rem; }
.br-faq-answer p:last-of-type { margin-bottom: .5rem; }
.br-faq-list { margin: 0 0 .75rem; padding-left: 1.1rem; }
.br-faq-list li { margin-bottom: .35rem; }

.br-faq-permalink {
  display: inline-block; font-size: var(--fs-xs); color: var(--br-ink-4);
  text-decoration: none; opacity: 0;
  transition: opacity var(--br-t-fast) var(--br-ease), color var(--br-t-fast) var(--br-ease);
}
.br-faq-item[open] .br-faq-permalink { opacity: 1; }
.br-faq-permalink:hover { color: var(--br-primary); }

/* A question arrived at by its own link announces itself, then settles - so a
   reader who followed a link to one answer among seventy-two can see which. */
.br-faq-item:target { animation: br-faq-target 1.6s var(--br-ease); }
@keyframes br-faq-target {
  0%, 60% { background: var(--br-primary-light); }
  100% { background: transparent; }
}

/* Filtering hides whole branches, so an empty card never sits behind a
   search that matched nothing inside it. */
[data-faq-item][hidden], [data-faq-group][hidden], [data-faq-section][hidden] { display: none; }

@media (max-width: 575.98px) {
  .br-faq-controls { top: .5rem; }
  .br-faq-tabs { width: 100%; }
  .br-faq-tab { flex: 1 1 0; text-align: center; padding: .45rem .35rem; }
}

/* Email template preview (doc s.118). The body is plain text, so the line
   breaks the operator typed are the ones the recipient sees - rendering it
   into a normal <p> collapses them and shows a preview that is not what will
   be sent. */
.br-email-preview {
  white-space: pre-wrap;
  font-size: var(--fs-sm);
  line-height: 1.7;
  color: var(--br-ink-2);
}

/* The six-digit reset code (doc s.118g). Wide tracking and a tabular face so
   a code read off an email can be checked a character at a time against what
   is in the box. */
.br-otp {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 1.35rem;
  letter-spacing: .4em;
  text-align: center;
}

/* ==========================================================================
   Subscription quotation — status, stepper and review (doc s.134)

   Built from the existing tokens only: no new colours, no new font sizes, no
   second spacing scale. The brief asked for "slightly more professional and
   polished", not a redesign, so every value here resolves to something the
   rest of the product already uses.
   ========================================================================== */

/* --- The status card's three facts -------------------------------------
   A definition list put the label and the value on one line and made the
   reference, the amount and the plan compete for the same row. Stacking each
   as label-over-value gives the amount somewhere to be read, which is what a
   finance team is looking for when they open this page. */
.br-quote-fact {
  display: flex;
  flex-direction: column;
  gap: .15rem;
  padding: .75rem .9rem;
  background: var(--br-surface-2);
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius-lg);
  height: 100%;
}

.br-quote-fact-label {
  font-size: .7rem;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--br-ink-2);
}

.br-quote-fact-value {
  font-size: 1.05rem;
  font-weight: 650;
  color: var(--br-ink);
  overflow-wrap: anywhere;   /* a long payment reference must not widen the card */
}

/* The action row reads as one bar rather than a line of loose buttons. */
.br-quote-actions { align-items: center; }

@media (max-width: 575.98px) {
  /* Full-width, stacked, primary first: on a phone a row of four buttons
     wraps into something nobody can aim at. */
  .br-quote-actions > *,
  .br-quote-actions > form,
  .br-quote-actions > form > .br-btn { width: 100%; }
  .br-quote-actions .ms-sm-auto { margin-left: 0 !important; }
  .br-quote-fact-value { font-size: 1rem; }
}

/* --- The modal stepper --------------------------------------------------
   Three numbered steps, the current one marked. Numbers come from a counter
   so the markup carries no "1." to fall out of step with the order. */
.br-steps {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem .75rem;
  list-style: none;
  counter-reset: br-step;
  margin: 0 0 1rem;
  padding: 0 0 .75rem;
  border-bottom: 1px solid var(--br-line);
}

.br-steps > li {
  counter-increment: br-step;
  display: flex;
  align-items: center;
  gap: .4rem;
  font-size: .78rem;
  color: var(--br-ink-2);
}

.br-steps > li::before {
  content: counter(br-step);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.35rem;
  height: 1.35rem;
  border-radius: 50%;
  border: 1px solid var(--br-line);
  background: var(--br-surface-2);
  font-size: .7rem;
  font-weight: 700;
}

.br-steps > li.is-current { color: var(--br-ink); font-weight: 600; }

.br-steps > li.is-current::before {
  background: var(--br-primary);
  border-color: var(--br-primary);
  color: #fff;
}

/* A step already passed. Marked, because a stepper that only highlights the
   current step cannot show progress. */
.br-steps > li.is-done::before {
  content: '✓';
  background: var(--br-primary-light);
  border-color: var(--br-primary);
  color: var(--br-primary);
}

/* --- Plan cards in the modal ------------------------------------------- */
.br-plan-option > label { cursor: pointer; }

.br-plan-option:has(input:checked) {
  border-color: var(--br-primary);
  box-shadow: 0 0 0 1px var(--br-primary-light);
}

/* :has() is widely supported but not universally; the outline below is the
   fallback that keeps a chosen plan visibly chosen either way. */
.br-plan-option input:focus-visible { outline: 2px solid var(--br-primary); }

/* --- The review step ---------------------------------------------------- */
.br-review {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: .75rem;
}

.br-review-card { margin: 0; }

.br-review-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
  padding: .3rem 0;
  font-size: .85rem;
}

.br-review-row > span:first-child { color: var(--br-ink-2); flex-shrink: 0; }
.br-review-row > :last-child { text-align: right; overflow-wrap: anywhere; }

.br-review-rule { border-color: var(--br-line); margin: .6rem 0; opacity: 1; }

/* The number their management signs off. Given a band of its own so it is not
   just one more row in a list. */
.br-review-total {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
  margin-top: .6rem;
  padding: .6rem .75rem;
  border-radius: var(--br-radius-lg);
  background: var(--br-primary-light);
  font-size: .9rem;
}

.br-review-total > strong { font-size: 1.15rem; color: var(--br-ink); }

.br-review-company { font-weight: 650; color: var(--br-ink); }

/* --------------------------------------------------------------------------
   Subscription page — the stepped purchase flow (doc s.137)

   The page asks three questions in order (action, package, payment mode) and
   then shows what it will charge. These rules exist to make that order legible
   at a glance; the controls themselves are .br-choice, which already carries
   the selected state, so nothing here restyles a radio card.
   -------------------------------------------------------------------------- */

/* The numbered step headings. Small and upper-case rather than another h2:
   they divide one task into stages, they do not start new sections. */
.br-step-title {
  font-size: var(--fs-sm);
  font-weight: 700;
  letter-spacing: .02em;
  color: var(--br-ink-2);
  margin: 0 0 .6rem;
}

/* The package price. The one number on a plan card that has to be readable
   across the grid without being read. */
.br-plan-price {
  font-size: 1.35rem;
  font-weight: 750;
  line-height: 1.2;
  color: var(--br-accent);
  margin-top: .35rem;
}

/* Current-plan facts: a definition list that has to line up as a table on a
   phone, where the two columns would otherwise wrap into each other. */
.br-plan-facts dt { font-weight: 500; padding: .3rem 0; }
.br-plan-facts dd { padding: .3rem 0; margin: 0; }

/* The order summary. Tinted so the figure the button is about to charge is
   visibly not just another card. */
.br-summary-card {
  border-color: var(--br-primary);
  background: var(--br-primary-light);
}

.br-rule { border-color: var(--br-line); margin: .7rem 0; opacity: 1; }

/* One row of history — a quotation, or an invoice. Flat against the card it
   sits in, because a card inside a card inside a card stops reading as
   hierarchy and starts reading as noise. */
.br-history-row {
  border-color: var(--br-line);
  background: var(--br-surface-2, var(--br-surface));
}

.br-history-row .br-card-body { padding: .75rem .9rem; }

/* Plan cards are centred; .br-choice does not assume an alignment. */
.br-choice label.text-center { text-align: center; }

/* A choice that cannot be taken. .br-card-locked dims a card; this stops the
   label underneath it still offering a pointer and a hover border. */
.br-choice.br-card-locked label { cursor: not-allowed; opacity: .55; }
.br-choice.br-card-locked label:hover { border-color: var(--br-line); }

@media (max-width: 575.98px) {
  /* The price stays large on a phone — it is the thing being compared. */
  .br-plan-price { font-size: 1.2rem; }
  .br-step-title { margin-top: .25rem; }
}

/* --------------------------------------------------------------------------
   Card bodies and Bootstrap's grid gutters (doc s.143)

   THE BUG THIS FIXES, reported as "no padding left and right".

   `.br-card-body` sets 1.25rem of padding. Bootstrap's `.row` then applies
   `margin-inline: calc(-.5 * var(--bs-gutter-x))` — minus 12px — so anything
   laid out in a row sits 12px OUTSIDE the padding box it was supposed to
   respect, leaving about 8px of visual gutter and reading as flush against the
   card edge.

   That negative margin exists so a row's first and last columns line up with
   content above and below it. Inside a card body there is nothing to line up
   with: the padding IS the alignment. So the gutter is cancelled on the axis
   that breaks, and left alone on the vertical one.

   SCOPED TO `dl.row`, AND NOT TO EVERY ROW. That distinction matters: a row of
   CARDS inside a card body — the plan grid, the payment modes — gets the space
   between its tiles from exactly those column paddings, so zeroing them there
   would push the tiles against each other. A definition list has no such gap
   to lose; its two columns are a label and a value that want the card's own
   padding and nothing else.

   Direct children only, so a row nested deeper still behaves normally.
   -------------------------------------------------------------------------- */
.br-card-body > dl.row,
.br-card-body > form > dl.row {
  margin-left: 0;
  margin-right: 0;
}

.br-card-body > dl.row > [class*="col"],
.br-card-body > form > dl.row > [class*="col"] {
  padding-left: 0;
  padding-right: 0;
}

/* --------------------------------------------------------------------------
   Current plan — the card a recruiter opens this page to read (doc s.143)
   -------------------------------------------------------------------------- */

/* The plan name is the headline fact, not a chip at the far right. */
.br-plan-hero {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .5rem .75rem;
  margin-bottom: .25rem;
}

.br-plan-hero .name {
  font-size: clamp(1.25rem, 1rem + 1vw, 1.6rem);
  font-weight: 750;
  letter-spacing: -.015em;
  line-height: 1.15;
  color: var(--br-ink);
}

.br-plan-term { font-size: var(--fs-sm); color: var(--br-ink-3); }

/* The three numbers that answer "can I still hire, and until when". Given
   their own band so they read as figures rather than as more list rows. */
.br-plan-stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  margin: 1.1rem 0 0;
  background: var(--br-line);
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);
  overflow: hidden;
}

.br-plan-stats > div {
  background: var(--br-surface);
  padding: .8rem .9rem;
}

.br-plan-stats .k {
  display: block;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--br-ink-3);
  margin-bottom: .15rem;
}

.br-plan-stats .v {
  font-size: 1.3rem;
  font-weight: 700;
  line-height: 1.1;
  color: var(--br-ink);
}

.br-plan-stats .v.accent { color: var(--br-accent); }
.br-plan-stats .sub { display: block; font-size: var(--fs-xs); color: var(--br-ink-3); }

/* The term, as one fact rather than two rows. */
.br-plan-window {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: .5rem 1rem;
  margin-top: 1.1rem;
  padding-top: .9rem;
  border-top: 1px solid var(--br-line);
  font-size: var(--fs-sm);
}

.br-plan-window .dates { color: var(--br-ink-2); font-weight: 600; }
.br-plan-window .arrow { color: var(--br-ink-4); margin: 0 .35rem; }

@media (max-width: 575.98px) {
  /* Three columns of figures do not fit a phone; two rows of them do. */
  .br-plan-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .br-plan-stats > div:last-child { grid-column: 1 / -1; }
  .br-plan-stats .v { font-size: 1.15rem; }
}

/* --------------------------------------------------------------------------
   Find talent — a nine-column table that was squeezing itself (doc s.143)

   THE FAULT. `.br-table` is `width: 100%`, so with nine columns and 2rem of
   padding per cell the browser had no room and did the only thing it could:
   crushed every column to its minimum and wrapped the contents. The Name cell
   — four lines of initials, title, location and notice — collapsed to about
   110px, so "Product Manager" broke across two lines, "Bangalore" across two
   more, and a single row grew to roughly 200px tall. At the other end the
   Actions column ran off the edge with nothing to say it had.

   `.br-table-wrap` was already `overflow-x: auto` and never fired, because a
   table at `width: 100%` always "fits".

   THE FIX IS A FLOOR, NOT A REDESIGN. A min-width stops the squeeze; below it
   the wrapper scrolls, which is what it was there for. Nothing is removed and
   no column loses its sort.
   -------------------------------------------------------------------------- */
/* The min-width floor, the cell padding and the identity-column width that
   used to live here were SUPERSEDED a pass later (s.143b): letting the header
   captions wrap freed enough room to drop the floor altogether, so the table
   now fits rather than scrolling. Their final values are in that block at the
   end of this file; they are not repeated here, because two places setting one
   width is how they end up disagreeing. */

/* Middle, not top. With a three-line identity cell beside one-line figures,
   top-aligning left every number stranded against the ceiling of its row. */
.br-table-talent td { vertical-align: middle; }

/* The supporting lines under the initials: tighter leading, and location and
   notice on ONE line each rather than wrapping into four. */
.br-talent-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .15rem .6rem;
  margin-top: .15rem;
  line-height: 1.3;
}

.br-talent-meta > span { white-space: nowrap; }

/* Figures should never wrap. A salary broken across two lines is unreadable
   and it is what was making rows tall. */
.br-table-talent td[data-label="Years of Experience"],
.br-table-talent td[data-label="Reserve Salary"],
.br-table-talent td[data-label="Highest Bid Range"],
.br-table-talent td[data-label="Assessment Score"],
.br-table-talent td[data-label="Status"] { white-space: nowrap; }

/* The action is a destination, not a sentence. */
.br-table-talent td[data-label="Actions"] { white-space: nowrap; }
.br-table-talent td[data-label="Actions"] .br-tiny { white-space: normal; max-width: 15ch; }

/* --- The scroll affordance -----------------------------------------------
   A table that scrolls sideways has to look like it scrolls sideways. The
   native bar is nearly invisible on a dark translucent surface, so it is given
   a visible track and thumb. Not a gradient mask: these surfaces are
   translucent (rgba), so a fade would blend with the page behind rather than
   with the card.
   ------------------------------------------------------------------------- */
.br-table-wrap { scrollbar-width: thin; scrollbar-color: var(--br-ink-4) transparent; }
.br-table-wrap::-webkit-scrollbar { height: 10px; }
.br-table-wrap::-webkit-scrollbar-track { background: transparent; }
.br-table-wrap::-webkit-scrollbar-thumb {
  background: var(--br-ink-4);
  border-radius: 999px;
  border: 3px solid transparent;
  background-clip: content-box;
}
.br-table-wrap::-webkit-scrollbar-thumb:hover { background: var(--br-ink-3); background-clip: content-box; }

/* A phone breakpoint sat here and is gone (s.143b). The 1200px query at the end
   of this file matches everything this one did and sets a smaller floor, so
   this one could never win and only looked as though it governed phones. */

/* --------------------------------------------------------------------------
   Find talent — fitting nine columns without a sideways scroll (doc s.143b)

   "Can we make it without horizontal Scroll?"

   WHAT WAS ACTUALLY SETTING THE WIDTH. Not the data — the HEADERS.
   `.br-table th` is `white-space: nowrap`, so "YEARS OF EXPERIENCE" at 11px
   uppercase with .04em tracking held its column open to about 150px to
   describe a cell reading "15 years". "HIGHEST BID RANGE" and "RESERVE SALARY"
   did the same. Three columns were sized by their captions rather than their
   contents.

   Letting the captions wrap costs two lines of header height once, and gives
   back roughly 250px across the row — without renaming a single column.

   The labels are deliberately NOT shortened. s.115 made the dropdown and the
   table headers read from ONE list precisely so a recruiter cannot sort by
   "Reserve Salary" and then read a column called "Reserve"; shortening them
   here would either reintroduce that split or make the dropdown worse to
   serve the table.

   The min-width floor from the first pass is gone with it. The table now fits
   on a normal screen, and `.br-table-wrap` is still there for the narrow ones
   where nine columns of real data genuinely cannot fit.
   -------------------------------------------------------------------------- */
.br-table-talent { min-width: 0; }

.br-table-talent th {
  white-space: normal;      /* the change that frees the width */
  line-height: 1.25;
  vertical-align: bottom;
  /* Stops a two-word caption stretching to three lines on a narrow column. */
  min-width: 4.5rem;
}

/* Tighter again now that the captions no longer need the room. 9 columns at
   1.4rem is 200px of padding, down from 288. */
.br-table-talent th,
.br-table-talent td { padding: .7rem; }

/* The identity column keeps the most room, but less of it: the meta line is
   one row now, not two. */
.br-table-talent th:first-child,
.br-table-talent td:first-child { min-width: 196px; }

/* The action is the second-widest cell. Capped so a long label can never push
   the table out again. */
.br-table-talent td[data-label="Actions"] .br-btn { white-space: nowrap; }

@media (max-width: 1199.98px) {
  /* Below this nine columns of real data do not fit honestly, so the wrapper
     scrolls — which is what it is for. Said plainly rather than squeezing the
     rows back into the state s.143 fixed. */
  .br-table-talent { min-width: 900px; }
  .br-table-talent th:first-child,
  .br-table-talent td:first-child { min-width: 170px; }
}

/* --------------------------------------------------------------------------
   Plan comparison table (doc s.146)

   A specification sheet beside the cards. It is wide by nature — one column
   per package plus a row-header — so unlike the talent table (s.143b) it is
   MEANT to scroll sideways, and says so above itself. What it must not do is
   let the row header scroll away, because a tick with no row label is noise.
   -------------------------------------------------------------------------- */

/* --- the cards / table switch ------------------------------------------- */
.br-viewswitch {
  display: inline-flex;
  padding: 3px;
  gap: 2px;
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);
  background: var(--br-surface-2);
}

.br-viewswitch-btn {
  font: inherit;
  font-size: var(--fs-xs);
  font-weight: 600;
  padding: .4rem .7rem;
  border: 0;
  border-radius: calc(var(--br-radius) - 3px);
  background: transparent;
  color: var(--br-ink-3);
  cursor: pointer;
  white-space: nowrap;
  transition: background var(--br-t-fast) var(--br-ease), color var(--br-t-fast) var(--br-ease);
}

.br-viewswitch-btn:hover { color: var(--br-ink); }
.br-viewswitch-btn.is-on { background: var(--br-primary); color: #fff; }

/* --- category tabs ------------------------------------------------------- */
.br-compare-tabs {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem;
  margin-bottom: .75rem;
}

.br-compare-tab {
  font: inherit;
  font-size: var(--fs-xs);
  font-weight: 600;
  padding: .45rem .85rem;
  border: 1px solid var(--br-line);
  border-radius: 999px;
  background: var(--br-surface-2);
  color: var(--br-ink-3);
  cursor: pointer;
  white-space: nowrap;
}

.br-compare-tab:hover { color: var(--br-ink); border-color: var(--br-ink-4); }
.br-compare-tab.is-on {
  background: var(--br-primary);
  border-color: var(--br-primary);
  color: #fff;
}

.br-compare-hint { white-space: nowrap; }

/* --- the table ----------------------------------------------------------- */
.br-compare-table {
  /* One row-header plus six packages. Below this it scrolls, which is the
     intent — the hint above the table says so. */
  min-width: 940px;
  border-collapse: separate;
  border-spacing: 0;
}

.br-compare-table th,
.br-compare-table td {
  padding: .7rem .8rem;
  text-align: center;
  vertical-align: middle;
  border-bottom: 1px solid var(--br-line-2);
  white-space: normal;
}

/*
   THE ROW HEADER STAYS PUT. A specification sheet scrolled sideways becomes a
   grid of ticks with nothing to say what they mean. This column is the one
   thing that must never leave the viewport — and unlike the talent table it
   can be sticky safely, because these cells carry no row-state colour for a
   fixed background to cut through.
*/
.br-compare-table .br-compare-rowhead {
  position: sticky;
  left: 0;
  z-index: 2;
  text-align: left;
  min-width: 190px;
  background: var(--br-bg-2);
  font-weight: 600;
  color: var(--br-ink-2);
  text-transform: none;
  letter-spacing: normal;
  font-size: var(--fs-sm);
}

.br-compare-note {
  display: block;
  font-size: var(--fs-xs);
  font-weight: 400;
  color: var(--br-ink-4);
}

/* --- the group band ------------------------------------------------------ */
.br-compare-band th {
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: .55rem .8rem;
}

.br-compare-band-a { background: var(--br-warning-bg); color: var(--br-ink-2); }
.br-compare-band-b { background: var(--br-success-bg); color: var(--br-ink-2); }

/* --- package headings ---------------------------------------------------- */
.br-compare-head { background: var(--br-surface-2); padding-top: 1rem !important; }

.br-compare-pick { display: block; cursor: pointer; margin: 0; }

.br-compare-name {
  display: block;
  font-size: 1.05rem;
  font-weight: 750;
  letter-spacing: -.01em;
  color: var(--br-ink);
  line-height: 1.2;
}

.br-compare-sub {
  display: block;
  font-size: var(--fs-xs);
  color: var(--br-ink-4);
  margin-bottom: .35rem;
}

.br-compare-price {
  display: block;
  font-size: 1.2rem;
  font-weight: 750;
  color: var(--br-accent);
  line-height: 1.2;
}

.br-compare-excl {
  display: block;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--br-ink-4);
}

.br-compare-flag {
  display: inline-block;
  font-size: var(--fs-xs);
  font-weight: 700;
  padding: .1rem .5rem;
  border-radius: 999px;
  background: var(--br-accent);
  color: #fff;
  margin-bottom: .3rem;
}

/* The recommended column, carried down the whole table so the eye can follow
   it rather than re-finding it on every row. */
.br-compare-table .is-popular { background: var(--br-primary-light); }
.br-compare-head.is-popular { box-shadow: inset 0 3px 0 var(--br-accent); }

/* A package this recruiter cannot take. Dimmed and not clickable — the same
   rule the cards follow (s.97): visibly closed beats quietly missing. */
.br-compare-head.is-locked { opacity: .6; }
.br-compare-locked { display: block; margin-top: .3rem; color: var(--br-ink-4); }

/* --- cells --------------------------------------------------------------- */
.br-compare-chip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2rem;
  height: 2rem;
  padding: 0 .5rem;
  border-radius: 999px;
  background: var(--br-surface-2);
  border: 1px solid var(--br-line);
  font-weight: 700;
}

.br-compare-mark .yes {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.55rem;
  height: 1.55rem;
  border-radius: 50%;
  background: var(--br-success-bg);
  color: var(--br-success, #10b981);
  font-weight: 700;
}

.br-compare-mark .no { color: var(--br-ink-4); }

.br-compare-section th {
  background: var(--br-surface-2);
  text-align: left;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--br-ink-3);
}

.br-compare-foot {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: .5rem 1.5rem;
  text-align: left;
  font-size: var(--fs-xs);
  color: var(--br-ink-3);
}

.br-compare-table tfoot td { background: var(--br-surface-2); }

/* A column hidden by the category tabs or the action filter. */
.br-compare-table [data-col].d-none { display: none; }

@media (max-width: 575.98px) {
  .br-compare-table { min-width: 760px; }
  .br-compare-table .br-compare-rowhead { min-width: 150px; }
  .br-compare-table th, .br-compare-table td { padding: .55rem .6rem; }
  .br-compare-hint { display: none; }
}

/* ------------------------------------------------------------------
   The plan comparison table on the public pricing page (doc s.146a)
   ------------------------------------------------------------------ */

/*
 * A PANEL, NOT `.br-compare`. The pricing hero already owns that class for
 * its agency-fee strip; the table carried the same name while it lived in the
 * recruiter console, where nothing else did. Two unrelated components under
 * one class on one page is a collision waiting for the first rule either of
 * them is given.
 */
.br-compare-panel { display: block; }

/* UNUSED SINCE doc s.146b. The "Package highlights" row these styled was
   removed on the operator's instruction. Kept because the row is one line of
   Blade away from returning and PricingController still holds its copy. */

/* The editorial bullets, as a list inside a cell: no marker, no indent -
   the cell is already narrow and a disc costs a character of width. */
.br-compare-extras {
  list-style: none;
  margin: 0;
  padding: 0;
  font-size: .78rem;
  line-height: 1.35;
  color: var(--br-ink-2);
}
.br-compare-extras li { margin: 0 0 .2rem; }
.br-compare-extras li:last-child { margin-bottom: 0; }

/* UNUSED SINCE doc s.146b, as above: the button row was removed and the
   column heading carries the link to registration on its own.

   The buy row. Sat directly above the footnotes, so it took the same
   surface as the head rather than the body banding. */
.br-compare-cta td { background: var(--br-surface-2); padding-top: .9rem !important; }
.br-compare-cta td .br-btn { width: 100%; justify-content: center; }

/* ------------------------------------------------------------------
   The floating WhatsApp button, and the contact form's honeypot
   (doc s.151)
   ------------------------------------------------------------------ */

/*
 * OFF-SCREEN, NOT display:none. A bot that skips hidden inputs would sail past
 * a display:none honeypot; one positioned off the canvas is in the layout and
 * gets filled. aria-hidden and tabindex="-1" on the field keep it away from
 * anybody using a screen reader or the keyboard.
 */
.br-honeypot {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/*
 * Sits BELOW the assistant's z-index (1050) rather than above it: when both
 * are on screen the chat panel opens upward over this corner, and a button
 * floating on top of an open panel is the collision the brief warned about.
 */
.br-whatsapp {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
  z-index: 1045;

  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3.25rem;
  height: 3.25rem;
  border-radius: 50%;

  /* WhatsApp's own green. Not a theme token: this is somebody else's brand
     mark and it must look the same in both themes. */
  background: #25D366;
  color: #fff;

  box-shadow: var(--br-shadow);
  text-decoration: none;
  transition: transform .18s ease, box-shadow .18s ease;
}

.br-whatsapp:hover,
.br-whatsapp:focus-visible {
  color: #fff;
  transform: translateY(-2px);
  box-shadow: var(--br-shadow-lg);
}

/* The keyboard ring, in the platform's own focus style rather than the
   browser's default, which disappears against the green. */
.br-whatsapp:focus-visible {
  outline: 2px solid var(--br-ink);
  outline-offset: 3px;
}

/* Stacked above the assistant when a signed-in user has both. */
.br-whatsapp.is-stacked { bottom: 5.25rem; }

@media (prefers-reduced-motion: reduce) {
  .br-whatsapp { transition: none; }
  .br-whatsapp:hover,
  .br-whatsapp:focus-visible { transform: none; }
}

/* The bottom tab bar owns the lower edge on mobile; sit above it, exactly as
   .br-chat does. */
@media (max-width: 767.98px) {
  .br-whatsapp { bottom: 4.5rem; }
  .br-whatsapp.is-stacked { bottom: 8.75rem; }
}

@media print { .br-whatsapp { display: none !important; } }

/* ------------------------------------------------------------------
   The announcement ticker (doc s.152)
   ------------------------------------------------------------------ */

/*
 * THE LABEL IS LEFT, NOT CENTRED. The strip used to centre its whole contents;
 * the label now sits at the container's left edge, which is where the logo sits
 * in the navbar directly below it, so it reads as a label above the logo. The
 * ticker takes whatever width is left.
 */
.br-announce-inner {
  justify-content: flex-start;
  flex-wrap: nowrap;
}

/*
 * THE VIEWPORT THE TRACK MOVES INSIDE.
 *
 * `overflow: hidden` is what keeps the animation inside the header instead of
 * widening the page, and `min-width: 0` is what lets a flex child actually
 * shrink - without it the track's full width becomes the item's minimum and the
 * strip pushes the layout sideways on a narrow screen.
 */
.br-ticker {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;

  /* Fade the edges so messages enter and leave rather than appearing at a
     hard boundary. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 2rem,
                      #000 calc(100% - 2rem), transparent);
          mask-image: linear-gradient(90deg, transparent, #000 2rem,
                      #000 calc(100% - 2rem), transparent);
}

.br-ticker-track {
  display: flex;
  width: max-content;
  animation: br-ticker-scroll var(--br-ticker-duration, 28s) linear infinite;
}

/*
 * PAUSE ON HOVER AND ON KEYBOARD FOCUS.
 *
 * `animation-play-state` holds the track exactly where it is rather than
 * resetting it, which is what makes the text readable at the moment somebody
 * stops to read it. `:focus-within` covers the keyboard, since the ticker
 * itself is not focusable but may contain something that is.
 */
.br-ticker:hover .br-ticker-track,
.br-ticker:focus-within .br-ticker-track {
  animation-play-state: paused;
}

.br-ticker-list {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  list-style: none;
  margin: 0;
  padding: 0;
}

.br-ticker-item {
  display: inline-flex;
  align-items: center;
  gap: 1.25rem;
  padding-right: 1.25rem;

  /* One line, always. A wrapped ticker doubles the header height. */
  white-space: nowrap;

  color: var(--br-ink-2);
  font-weight: 500;
  letter-spacing: .01em;
}

.br-ticker-dot { color: var(--br-ink-4); }

/* -50%, not -100%: the track holds two identical copies, so stopping halfway
   puts copy B exactly where copy A began and the reset cannot be seen. */
@keyframes br-ticker-scroll {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

/*
 * REDUCED MOTION: NOT ANIMATED, AND NOT TRUNCATED EITHER.
 *
 * Simply stopping the animation would leave everything past the first message
 * unreachable. The track becomes a normal wrapping line instead, so the same
 * content is all present and readable - which is what the preference asks for,
 * rather than less content.
 */
@media (prefers-reduced-motion: reduce) {
  .br-ticker { -webkit-mask-image: none; mask-image: none; }
  .br-ticker-track { animation: none; width: auto; flex-wrap: wrap; }
  /* The duplicate exists only to make the loop seamless; with no loop it is
     the same sentences printed twice. */
  .br-ticker-list[aria-hidden="true"] { display: none; }
  .br-ticker-item { white-space: normal; }
}

@media (max-width: 575.98px) {
  /* Tighter on a phone, where the label and the ticker share a narrow row. */
  .br-announce-inner { gap: .4rem; }
  .br-ticker-item { gap: .75rem; padding-right: .75rem; }
  .br-ticker {
    -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 1rem), transparent);
            mask-image: linear-gradient(90deg, #000 calc(100% - 1rem), transparent);
  }
}

@media print { .br-announce { display: none !important; } }

/* ------------------------------------------------------------------
   Market Compensation Benchmarks: the toggle and the source cards
   (doc s.153)
   ------------------------------------------------------------------ */

/*
 * A BUTTON THAT LOOKS LIKE A CONTROL. The brief was explicit that it must not
 * read as a disabled label or an ordinary heading, so it carries a border, a
 * surface, a pointer and real hover/focus/active states.
 */
.br-bench-toggle {
  display: flex;
  align-items: center;
  gap: .75rem;
  width: 100%;
  padding: .75rem 1rem;
  text-align: left;

  background: var(--br-surface-2);
  border: 1px solid var(--br-line-2);
  border-radius: var(--br-radius-lg);
  color: var(--br-ink);
  font-weight: 600;
  cursor: pointer;

  transition: border-color var(--br-t-fast) var(--br-ease),
              background var(--br-t-fast) var(--br-ease);
}

.br-bench-toggle:hover {
  background: var(--br-primary-light);
  border-color: var(--br-primary);
}

.br-bench-toggle:focus-visible {
  outline: 2px solid var(--br-primary);
  outline-offset: 2px;
}

.br-bench-toggle:active { background: var(--br-surface-2); }

.br-bench-toggle-icon { font-size: 1.1rem; line-height: 1; }

/* min-width:0 so a long label wraps instead of forcing the button wider than
   the card that holds it. */
.br-bench-toggle-label { flex: 1 1 auto; min-width: 0; }

/*
 * DOWN WHEN CLOSED, UP WHEN OPEN - rotated off the button's own
 * `aria-expanded`, which Bootstrap maintains. The arrow therefore cannot
 * disagree with the state a screen reader is announcing.
 */
.br-bench-chevron {
  flex: 0 0 auto;
  font-size: 1.25rem;
  line-height: 1;
  transition: transform var(--br-t-fast) var(--br-ease);
}

.br-bench-toggle[aria-expanded="true"] .br-bench-chevron { transform: rotate(180deg); }

.br-bench-body { padding-top: .875rem; }

/*
 * THE SOURCES, AS A GRID - and this is the fix for the sideways scrolling.
 *
 * They were rows inside `.br-table-wrap`, which is `overflow-x: auto`, so a
 * narrow viewport scrolled the percentile columns out of reach of each other.
 * `auto-fit` + `minmax` wraps instead: three across on a wide card, two on a
 * tablet, one on a phone, with no scroll container anywhere.
 *
 * The `1fr` in minmax (rather than a second fixed value) is what lets a column
 * go NARROWER than 15rem when the viewport cannot afford it - without it the
 * grid itself becomes the thing that overflows.
 */
.br-bench-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
  gap: .75rem;
}

.br-bench-card {
  min-width: 0;                 /* a grid item's default is min-content */
  max-width: 100%;
  padding: .75rem .875rem;
  background: var(--br-surface);
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);

  /* Colour and shadow only. The brief forbade horizontal movement on hover,
     which is exactly what `.br-table tbody tr:hover` does to the rows these
     cards replaced. */
  transition: border-color var(--br-t-fast) var(--br-ease),
              box-shadow var(--br-t-fast) var(--br-ease);
}

.br-bench-card:hover {
  border-color: var(--br-primary);
  box-shadow: var(--br-shadow);
}

.br-bench-card-head { display: flex; min-width: 0; }

/*
 * `anywhere`, not `break-word`: a long unbroken source name or URL must be
 * allowed to break mid-token rather than push the card wide. This is the
 * property that keeps the page free of horizontal overflow.
 */
.br-bench-source {
  font-weight: 600;
  color: var(--br-primary);
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}

a.br-bench-source { text-decoration: none; }
a.br-bench-source:hover { text-decoration: underline; }

.br-bench-ext { margin-left: .25rem; font-size: .85em; }

.br-bench-meta {
  margin: .25rem 0 .5rem;
  overflow-wrap: anywhere;
}

/*
 * Label and figure on one line each, the label shrinking and the number never
 * wrapping away from it.
 */
.br-bench-figures {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: .15rem .75rem;
  margin: 0;
  font-size: var(--fs-xs);
}

.br-bench-figures dt { color: var(--br-ink-3); font-weight: 400; min-width: 0; }
.br-bench-figures dd {
  margin: 0;
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.br-bench-figures dd.is-median { font-weight: 700; color: var(--br-ink); }

.br-bench-foot {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: baseline;
  gap: .5rem;
  margin-top: .75rem;
}

@media (prefers-reduced-motion: reduce) {
  .br-bench-toggle,
  .br-bench-card,
  .br-bench-chevron { transition: none; }
}

/* --------------------------------------------------------------------------
   Talent table: fitting the 1366 band (doc s.154)

   Removing the AI Rating column took the table from 1336px to 1294px, which
   fits the 1296px content area a 1440 or 1920 screen gives. It does NOT fit
   1366: Bootstrap's container steps down to 1140px between 1200 and 1400,
   leaving about 1116px of content, and the table still overflowed it by 75px.

   So this band gets tighter padding and a narrower identity column. It is
   scoped to 1200-1400 on purpose: above it the table already fits with room
   to spare and does not need squeezing, and below it the wrapper scrolls,
   which is what the wrapper is for.
   -------------------------------------------------------------------------- */
@media (min-width: 1200px) and (max-width: 1399.98px) {
  .br-table-talent th,
  .br-table-talent td { padding: .45rem .4rem; }

  /* The identity cell keeps the most room, but it can afford less here. The
     name is never in it - the cell shows INITIALS - so what can stretch it is
     a long job title or a long place name. */
  .br-table-talent th:first-child,
  .br-table-talent td:first-child { min-width: 160px; max-width: 220px; }

  /*
   * AND THOSE TWO MAY WRAP HERE.
   *
   * s.143 made the supporting lines `nowrap` to stop rows growing to 200px
   * tall, which was right when the column had been squeezed to ~110px. In
   * this band the opposite problem dominates: "Senior Principal Distinguished
   * Platform Reliability Engineer" in Thiruvananthapuram pushed the table 44px
   * past the viewport, and a two-line location is a smaller cost than a
   * sideways scroll across every column.
   *
   * `anywhere` so a single unbroken token breaks rather than winning.
   */
  .br-table-talent td:first-child,
  .br-table-talent td:first-child .br-talent-meta > span {
    white-space: normal;
    overflow-wrap: anywhere;
  }

  /* The action stays one line - a wrapped button is harder to hit - but its
     helper text may wrap sooner. */
  .br-table-talent td[data-label="Actions"] .br-tiny { max-width: 11ch; }
}

/* --------------------------------------------------------------------------
   One column fewer, everywhere (doc s.154)

   The floor below 1200px was set for nine columns and then eight. It is seven
   now, so the point at which the table genuinely cannot fit honestly has moved
   down with it. 900 -> 820 keeps the same promise with less sideways travel.
   -------------------------------------------------------------------------- */
@media (max-width: 1199.98px) {
  .br-table-talent { min-width: 820px; }
}

/* --------------------------------------------------------------------------
   Talent table: no sideways nudge on hover (doc s.154a)

   THE SCROLLBAR THAT APPEARED ONLY ON MOUSEOVER.

   `.br-table tbody tr:hover { transform: translateX(2px); }` is a global
   flourish that every table in the console gets. On almost all of them it is
   free, because they are narrower than the space they sit in.

   This table is not. s.154 sized it to fit its container exactly - measured at
   1294px inside 1294px, with ZERO slack - so the 2px nudge was 2px of overflow,
   `.br-table-wrap` is `overflow-x: auto`, and a horizontal scrollbar appeared
   under the pointer and vanished when it left. Everything measured at s.154 was
   measured without a pointer over a row, which is why it was missed.

   The highlight stays; only the movement goes. A row that shifts under the
   cursor is a poor affordance in a table whose last column is a button anyway.

   SCOPED, NOT GLOBAL. Every other table keeps the nudge - s.153 made the same
   call for the benchmark cards, and widening this to `.br-table` would change
   tables nobody has complained about.
   -------------------------------------------------------------------------- */
.br-table-talent tbody tr:hover { transform: none; }

/*
 * AND A LITTLE REAL SLACK, so the next 2px from anywhere - a browser zoom
 * step, a focus ring, a scrollbar gutter - has somewhere to go. Exact-fit is
 * not a fit; it is a fit waiting for one pixel.
 */
.br-table-talent { max-width: 100%; }
.br-table-talent td[data-label="Actions"] { padding-right: .4rem; }

/* --------------------------------------------------------------------------
   Talent table: where the width was actually going (doc s.154a)

   s.154 got the table to 1294px inside a 1294px container and called it a fit.
   It was not a fit, it was a draw: the table's MINIMUM width - what it needs
   when squeezed - was still 1184px, and a 1366 screen gives it 1116. Anything
   between 1200 and 1400 therefore still scrolled, which is what the operator
   was looking at.

   Measured, column by column, at minimum squeeze:

     Name 196  Experience 193  Fitment 84  Reserve 156
     Highest bid 175  Status 244  Actions 137   = 1184

   STATUS WAS THE WIDEST COLUMN IN THE TABLE, and nothing in it is a number.
   `.br-pill` is `white-space: nowrap` globally, so "INACTIVE FOR ENGAGEMENT"
   held a 244px column open on every row - including the great majority whose
   pill says "OPEN". Letting that one pill wrap takes the minimum to 1091.

   With the identity floor at 170 instead of 196 the table bottoms out at
   1065px, which fits 1366's 1116 with 51px to spare. That is slack rather
   than a draw, and it is what the s.154 band rules were compensating for.
   -------------------------------------------------------------------------- */

/* Scoped to this table: every other pill in the console stays on one line. */
.br-table-talent td[data-label="Status"] .br-pill {
  white-space: normal;
  /* Two short lines rather than one long one; the dot and the word stay put. */
  text-align: center;
}

.br-table-talent th:first-child,
.br-table-talent td:first-child { min-width: 170px; }

/* ------------------------------------------------------------------
   About us, and the CMS that writes it (doc s.156)
   ------------------------------------------------------------------ */

/*
 * Operator-supplied images, at whatever dimensions they happen to be. The
 * width is capped and the height follows, so a 4000px banner cannot widen the
 * page and a tall one cannot push the content off the screen.
 */
.br-about-banner,
.br-about-featured,
.br-cms-thumb {
  display: block;
  max-width: 100%;
  height: auto;
  border-radius: var(--br-radius-lg);
}

.br-about-banner {
  width: 100%;
  /* A banner is a band, not a portrait: whatever is uploaded is cropped to a
     wide strip rather than being allowed to dominate the page. */
  max-height: 22rem;
  object-fit: cover;
}

.br-about-featured { border: 1px solid var(--br-line); }

/* Small enough to sit inside the CMS form without pushing the fields down. */
.br-cms-thumb { max-height: 7rem; width: auto; border: 1px solid var(--br-line); }

/*
 * The rendered Markdown. `.br-prose` already sets the measure; these are the
 * elements CommonMark emits that the design system had no reason to style
 * before, because nothing else on the platform renders authored prose.
 */
.br-about-body > :first-child { margin-top: 0; }
.br-about-body h2 { font-size: 1.25rem; margin: 1.75rem 0 .5rem; color: var(--br-ink); }
.br-about-body h3 { font-size: 1.05rem; margin: 1.25rem 0 .4rem; color: var(--br-ink); }
.br-about-body ul,
.br-about-body ol { margin: 0 0 1rem; padding-left: 1.25rem; }
.br-about-body li { margin-bottom: .35rem; }
.br-about-body blockquote {
  margin: 1rem 0;
  padding: .25rem 0 .25rem 1rem;
  border-left: 3px solid var(--br-line-2);
  color: var(--br-ink-2);
}
.br-about-body code {
  background: var(--br-surface-2);
  padding: .1rem .3rem;
  border-radius: var(--br-radius-sm);
  font-size: .9em;
}
/* An operator's link could be a bare URL; it must not widen the column. */
.br-about-body a { overflow-wrap: anywhere; }

/* The Markdown editor reads as code, because it is. */
.br-mono {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: .85rem;
  line-height: 1.5;
}

/* ------------------------------------------------------------------
   College tier: the filter checkboxes and the profile guidance
   (doc s.157)
   ------------------------------------------------------------------ */

/*
 * Three checkboxes in the width one dropdown would have taken. They WRAP
 * rather than scroll - the talent filter bar sits above a table that s.154a
 * fought to keep inside the viewport, and a filter that pushes the page wide
 * would undo that.
 */
.br-tier-filter {
  display: flex;
  flex-wrap: wrap;
  gap: .25rem .75rem;
  min-width: 0;
}

.br-tier-check {
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  margin: 0;
  font-size: var(--fs-xs);
  color: var(--br-ink-2);
  white-space: nowrap;   /* "Tier 1" never breaks across two lines */
  cursor: pointer;
}

.br-tier-check input { cursor: pointer; }
.br-tier-check:hover { color: var(--br-ink); }

/* The classification guidance on the candidate profile. A <details> so six
   paragraphs of examples are available without occupying the form.

   UNUSED SINCE s.157a, AND KEPT ON PURPOSE. The examples moved onto the
   dropdown options themselves, so the profile form no longer renders this
   block - it was the same three lists twice on one screen. The rules stay
   because the pattern is sound and the markup may come back (a longer guide,
   or the same disclosure on another form); nothing else in the sheet depends
   on them, and deleting them would cost the next person the styling. */
.br-tier-guide {
  border: 1px solid var(--br-line);
  border-radius: var(--br-radius);
  padding: .6rem .75rem;
  background: var(--br-surface-2);
}

.br-tier-guide > summary {
  cursor: pointer;
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--br-ink-2);
}

.br-tier-guide[open] > summary { margin-bottom: .25rem; }
.br-tier-guide p { max-width: none; }

/*
 * The adjustment line under the Career Coach's headline figure. Deliberately
 * quiet: it explains a number, it is not one.
 */
.br-coach-tier {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: .4rem;
  margin: .35rem 0 .5rem;
  padding: .4rem .6rem;
  border-radius: var(--br-radius);
  background: var(--br-surface-2);
  font-size: var(--fs-xs);
  color: var(--br-ink-2);
}

.br-coach-tier-dot { line-height: 1; }

/* ===== Company groups (doc s.158) =====================================
 *
 * Two small blocks, and deliberately no new table: the invitation and
 * request lists are a NAME, a LINE OF DETAIL and ONE CONTROL each, which is a
 * description list in all but markup. A `.br-table` would have put them in a
 * `.br-table-wrap` - `overflow-x: auto` - and s.154a was spent removing
 * exactly that sideways scroll from the recruiter console.
 */
.br-list-plain {
  list-style: none;
  padding: 0;
  margin: 0;
}

.br-co-invite {
  display: flex;
  align-items: center;
  gap: .75rem;
  padding: .6rem 0;
  border-bottom: 1px solid var(--br-line);
}

.br-co-invite:last-child { border-bottom: 0; }

/* The name and its two muted lines take the room; the control does not. */
.br-co-invite-main { flex: 1 1 auto; min-width: 0; }

/* An address can be longer than the card. It wraps rather than widening the
   card, because a card that grows is a page that scrolls sideways. */
.br-co-invite-main .br-tiny { overflow-wrap: anywhere; }

.br-co-invite form { flex: 0 0 auto; margin: 0; }

/* ===== The audience switcher (doc s.159) ==============================
 *
 * The landing page's two-audience section: a pill that switches between
 * candidates and hiring teams, an introduction on the left and four promise
 * cards on the right.
 *
 * IT IS NOT `.br-segment`, and that was a decision rather than an oversight.
 * `.br-segment` is built on radio inputs and `input:checked + label`, which is
 * right for a FORM CONTROL - the registration page picks a persona with it and
 * submits the value. This switches which half of a section is on screen, which
 * is a tablist: role="tab" on real buttons, aria-selected, arrow keys. Forcing
 * ARIA roles onto labels wrapped round hidden radios would have given a screen
 * reader two contradictory stories about what the control does. The two look
 * alike on purpose and share no CSS on purpose.
 */
.br-audience-switch {
  display: flex; justify-content: center; align-items: center;
  gap: .5rem; margin: 0 0 2rem;
}

/* The chevrons either side. Circular, quiet, and the same size as the tab
   row is tall, so the three pieces read as one control. */
.br-audience-arrow {
  flex: 0 0 auto;
  display: grid; place-items: center;
  width: 38px; height: 38px; padding: 0;
  border: 1px solid var(--br-line); border-radius: 50%;
  background: var(--br-surface); color: var(--br-ink-2);
  cursor: pointer;
  transition: background var(--br-t) var(--br-ease),
              color var(--br-t) var(--br-ease),
              border-color var(--br-t) var(--br-ease),
              transform var(--br-t) var(--br-ease-spring);
}
.br-audience-arrow:hover {
  background: var(--br-surface-hover); color: var(--br-ink);
  border-color: rgba(99,102,241,.3);
}
.br-audience-arrow:active { transform: scale(.94); }
.br-audience-arrow:focus-visible { box-shadow: var(--br-shadow-focus); outline: none; }

/* The track. `position: relative` so the thumb can be absolute inside it. */
.br-audience-tabs {
  position: relative;
  display: inline-flex; padding: 4px;
  background: var(--br-line-2); border-radius: var(--br-radius-pill);
}

/* The pill that slides under the selected tab. Positioned in JS, because its
   width is the width of whichever label is selected and that is a text
   measurement no stylesheet can make. */
.br-audience-thumb {
  position: absolute; top: 4px; bottom: 4px; left: 0; z-index: 0;
  border-radius: var(--br-radius-pill);
  background: var(--br-surface);
  box-shadow: var(--br-shadow-sm);
  transition: transform var(--br-t) var(--br-ease-spring),
              width var(--br-t) var(--br-ease);
}

.br-audience-tab {
  position: relative; z-index: 1;
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .5rem 1.15rem; border: 0; background: none;
  border-radius: var(--br-radius-pill);
  font-size: var(--fs-sm); font-weight: 600; color: var(--br-ink-3);
  cursor: pointer; white-space: nowrap;
  transition: color var(--br-t) var(--br-ease);
}
.br-audience-tab:hover { color: var(--br-ink-2); }
.br-audience-tab[aria-selected="true"] { color: var(--br-primary-dark); }
.br-audience-tab:focus-visible { box-shadow: var(--br-shadow-focus); outline: none; }

/* The hiring-teams tab answers to the recruiter accent, like every other
   recruiter surface on this page. */
.br-audience-tab[data-audience-tab="recruiters"][aria-selected="true"] {
  color: var(--br-recruiter-dark);
}

/* --- The panel ---------------------------------------------------------- */

/* Each panel fades in rather than appearing. 160ms: long enough to read as a
   change of content, short enough that a second click never waits. */
.br-audience-panel { animation: br-audience-in 160ms var(--br-ease) both; }

@keyframes br-audience-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

/* The introduction column. Sticky on a wide screen so the headline stays
   beside the cards while they are read; static below that, where there is no
   second column to stay beside. */
.br-audience-intro { padding-top: .25rem; }

@media (min-width: 992px) {
  .br-audience-intro { position: sticky; top: 90px; }
}

.br-audience-title {
  /* IN THE SCALE, NOT BESIDE IT. The reference design sets this headline
     large, and a hand-written clamp here would have made an H3 that is
     bigger than the H2 above it - a type scale says what the document
     outline says, or it says nothing. */
  font-size: var(--fs-h3);
  font-weight: 700; line-height: var(--lh-heading);
  letter-spacing: -.02em;
  margin: 0 0 .75rem;
}

.br-audience-intro .br-muted { margin-bottom: 1.25rem; }

/* --- The promise cards -------------------------------------------------- */
.br-audience-card .br-card-body { padding: 1.15rem; }

/* The icon tile. A rounded square rather than a circle, which is what
   distinguishes a feature mark from the avatars and status dots elsewhere. */
.br-audience-icon {
  display: grid; place-items: center;
  width: 40px; height: 40px; margin-bottom: .85rem;
  border-radius: 12px;
  transition: transform var(--br-t) var(--br-ease-spring);
}

.br-audience-card:hover .br-audience-icon { transform: translateY(-2px) scale(1.05); }

/* Tinted from the two accent families this page already uses, so a card
   belongs to its audience without being labelled. */
.br-audience-icon-candidate {
  background: var(--br-primary-light); color: var(--br-primary-dark);
}
.br-audience-icon-recruiter {
  background: var(--br-info-bg); color: var(--br-info);
}

.br-audience-card-title {
  font-size: var(--fs-h4); font-weight: 650; line-height: 1.35;
  margin: 0 0 .4rem;
}

.br-audience-card .br-muted { font-size: var(--fs-sm); line-height: 1.6; }

/* On a phone the switch is the widest thing in the section, and the two
   labels plus two chevrons do not fit at 360px. The chevrons go: the tabs
   themselves are the control, and they are still both reachable. */
@media (max-width: 480px) {
  .br-audience-arrow { display: none; }
  .br-audience-tabs { width: 100%; }
  .br-audience-tab { flex: 1 1 0; justify-content: center; padding: .5rem .5rem; }
}

/* ===== The branding console (doc s.162) ==============================
 *
 * One row per asset slot: the artwork as it currently resolves, then the
 * control that replaces it. The preview is deliberately first and fixed-width
 * so the rows line up into a column a reader can scan - nine slots of
 * different aspect ratios otherwise stagger the labels.
 */
.br-brand-slot {
  display: flex; gap: 1rem; align-items: flex-start;
  padding: .9rem 0; border-bottom: 1px solid var(--br-line);
}

.br-brand-slot:last-child { border-bottom: 0; }

/* The checkerboard reads through a transparent PNG, so an operator can see
   whether what they uploaded actually has a transparent background. */
.br-brand-slot-preview {
  flex: 0 0 120px; height: 64px;
  display: grid; place-items: center;
  border: 1px solid var(--br-line); border-radius: var(--br-radius-sm);
  background-color: #fff;
  background-image:
    linear-gradient(45deg, #eceff4 25%, transparent 25%),
    linear-gradient(-45deg, #eceff4 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, #eceff4 75%),
    linear-gradient(-45deg, transparent 75%, #eceff4 75%);
  background-size: 12px 12px;
  background-position: 0 0, 0 6px, 6px -6px, -6px 0;
  overflow: hidden;
}

.br-brand-slot-preview img {
  max-width: 108px; max-height: 56px;
  width: auto; height: auto; object-fit: contain;
}

.br-brand-slot-body { flex: 1 1 auto; min-width: 0; }
.br-brand-slot-body label { display: block; margin-bottom: .35rem; font-weight: 600; }

@media (max-width: 575px) {
  .br-brand-slot { flex-direction: column; }
  .br-brand-slot-preview { flex: 0 0 auto; width: 100%; }
}
