/* ============================================================================
   bizup-kb.css — Website 2.0 skin for the HubSpot Knowledge Base
   ============================================================================

   WHAT THIS IS
   The Knowledge Base (help.bizupusa.com) is a Service Hub product, NOT CMS
   content. It cannot use bizup-theme: there is no KB templateType, no CLI
   support, no Design Manager path and no CMS React. HubSpot's own docs are
   explicit — "Knowledge base customization isn't supported in the design
   manager or with custom themes." So this file is the only route to real
   design control, and it is loaded as an override sheet, not a theme.

   HOW IT IS INSTALLED (manual, by a human — see kb/README.md)
     1. Upload this file to HubSpot File Manager.
     2. Settings > Content > Pages > select the KB domain > Override default
        settings > Site header HTML, and ADD a <link> to it.

   ⚠ EDIT THAT FIELD ADDITIVELY. It already carries the ask-astra assets and a
   UTM/cookie script. Replacing its contents breaks the Astra widget. Copy the
   existing value out before touching it.

   ⚠ PROTOTYPE ON THE SANDBOX KB FIRST (246050209 /help). Production has no
   draft/deploy pipeline and no rollback — only "Publish theme".

   DESIGN STRATEGY: prefer the ~257 CSS custom properties the KB exposes over
   structural selectors. The properties are a supported surface; the markup is
   HubSpot's and can change without notice, versioning or a build check. Every
   structural rule below is a deliberate, minimal exception and is marked.

   TOKEN VALUES ARE MEASURED, NOT COPIED. Taken from computed styles on the
   deployed sandbox site (build #592, /blog) — the theme's tokens.css is authored
   in oklch, and these are the sRGB hex equivalents the browser actually paints.
   NOTE: the live font is Plus Jakarta Sans. tokens.css still carries
   --font-sans names referencing Geist/Bricolage from an earlier iteration; the
   rendered value is what is reproduced here.
   ========================================================================= */

:root,
.theme-overrides {
  /* ⚠ BOTH SELECTORS ARE REQUIRED — this is the whole reason the first attempt
     rendered half-styled.

     The KB emits its own inline stylesheet declaring every one of these
     properties TWICE: once on `:root` and again on `.theme-overrides`, which is
     a class on the <body>. Because every visible element is a descendant of
     that body, it INHERITS the `.theme-overrides` values, and a `:root`-only
     override never reaches it. Measured 2026-08-22 on the sandbox KB with the
     sheet loading: `:root` reported our --primary-color #7331d0 while <body>
     and the wrapper both still reported the KB's #2A5F8D, so only the handful
     of rules that target elements directly (the search input) had any effect —
     body font, band colour, header button and footer were all untouched.

     Keep the two selectors in one rule. Do not "tidy" this to :root alone. */

  /* ——— Brand palette (measured from the live site) ——— */
  --bz-violet-700: #7331d0; /* primary action, selected */
  --bz-violet-600: #8343e4; /* hover */
  --bz-violet-500: #9163f0; /* accents */
  --bz-footer-text: #b7bed9; /* 2.0 footer body text, 9.24:1 on #1c1c1c */
  --bz-violet-300: #c8b8fa; /* links on dark (measured from the 2.0 theme --violet-300) */
  --bz-violet-50:  #f5f4fe; /* tinted band */
  --bz-ink:        #120430; /* headings, dark CTA */
  --bz-body:       #1b1939; /* body copy */
  --bz-muted:      #5b5a76; /* secondary text */
  --bz-border:     #e6e4ed;
  --bz-surface-muted: #f8f6ff;
  --bz-amber:      #fec600; /* primary CTA fill */

  --bz-font: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont,
    'Segoe UI', Roboto, Helvetica, Arial, sans-serif;

  /* Soft rect, NOT pills — the theme uses 12px buttons / 16px cards. */
  --bz-radius-btn: 12px;
  --bz-radius-card: 16px;

  /* ===== KB core ===== */
  /* ==========================================================================
     DISABLED 2026-09-07 — moved into the KB Theme editor UI.
     These properties duplicate what Settings > Knowledge Base > Configure >
     Theme / Header / Footer now controls. Kept (commented) so the mapping is
     recoverable if we ever move styling back into the sheet.
     WARNING: re-enabling them SHADOWS the UI. They are redeclared later in the
     cascade, so the UI panels become decorative for these keys.
     The --bz-* tokens above stay LIVE — the structural rules below use them.
     ====================================================================== */
  /* ==========================================================================
     RESTORED 2026-09-07 — colour & shape only.
     Measured on the live sandbox after moving styling to the UI: the KB theme
     editor accepted the FONT settings (Plus Jakarta Sans, #1b1939, #120430) but
     NOT the colour/shape ones — --primary-color was still the stock #2A5F8D
     blue, buttons #2a8d8a teal at a 20px pill, container 1000px. Commenting
     these out reverted the KB to its defaults.
     So: type + text colour stay in the UI (those panels work), while these
     colour/shape keys live here (the UI does not hold them).
     The block BELOW stays commented — those are the font properties the UI now
     owns; re-enabling them would shadow the panels.
     ====================================================================== */
  --primary-color: var(--bz-violet-700);
  --secondary-color: var(--bz-violet-50);
  --accent-color: var(--bz-violet-700);
  --body-bg-color: #ffffff;
  --container-width: 1248px;
  --header-max-width: 1248px;
  --footer-max-width: 1248px;
  --primary-button-background-color: var(--bz-ink);
  --primary-button-border-radius: var(--bz-radius-btn);
  --primary-button-border: 1px solid var(--bz-ink);
  --primary-button-padding: 12px 24px;
  --primary-button-hover-background-color: var(--bz-violet-700);
  --primary-button-hover-border: 1px solid var(--bz-violet-700);
  --secondary-button-background-color: #ffffff;
  --secondary-button-border-radius: var(--bz-radius-btn);
  --secondary-button-border: 1px solid var(--bz-border);
  --secondary-button-hover-background-color: var(--bz-violet-50);
  --header-top-bar-background-color: #ffffff;
  --header-bottom-bar-background-color: #ffffff;
  --header-button-background-color: var(--bz-ink);
  --header-button-border-radius: var(--bz-radius-btn); /* was a 20px pill */
  --header-button-border: 1px solid var(--bz-ink);     /* was 3px solid pink */
  --header-button-padding: 12px 24px;
  --header-button-hover-background-color: var(--bz-violet-700);
  --header-button-hover-border: 1px solid var(--bz-violet-700);
  --header-menu-submenu-bg: #ffffff;
  --header-menu-hover-submenu-bg: var(--bz-violet-50);
  --search-input-wrapper-background-color: var(--bz-surface-muted);
  --search-field-button-background-color: var(--bz-ink);
  --search-field-button-icon-color: #ffffff;
  --hs-kb-home-tiles-background-color: #ffffff;
  --hs-kb-home-tiles-border: 1px solid var(--bz-border);
  --hs-kb-home-tiles-corner-radius: var(--bz-radius-card);
  --hs-kb-card-highlight-border-color: var(--bz-violet-700);
  --footer-bg-color: var(--bz-ink);
  --social-follow-icon-color: #ffffff;
  --social-follow-icon-background-color: rgba(255, 255, 255, 0.1);
  --social-follow-icon-shape-radius: 8px;

  /* Second pass: the search band + header menu colour keys. The first regex
     missed these (they are `search-input-*` / `search-field-*-color`, not
     `search-*`), which left the hero band painting the stock #2a5f8d blue
     while everything around it was violet. Measured on the live page. */
  /* UI-owned: --search-field-label-font-color: var(--bz-ink); */
  /* UI-owned: --search-field-text-font-color: var(--bz-body); */

  /* The site grid is 1248px with 24px gutters; the KB ships 1000px. */

  /* ===== Body copy ===== */
  /* UI-owned: --primary-body-font-family: var(--bz-font); */
  /* UI-owned: --primary-body-font-color: var(--bz-body); */
  /* UI-owned: --primary-body-font-size: 16px; */
  /* UI-owned: --primary-body-line-height: 1.6; */

  /* ===== Links ===== */
  /* UI-owned: --a-primary-body-font-family: var(--bz-font); */
  /* UI-owned: --a-primary-body-font-color: var(--bz-violet-700); */
  /* UI-owned: --a-primary-body-font-weight: 600; */
  /* UI-owned: --a-primary-body-text-decoration: none; */
  /* UI-owned: --a-hover-primary-body-font-color: var(--bz-violet-600); */
  /* UI-owned: --a-hover-primary-body-font-family: var(--bz-font); */
  /* UI-owned: --a-hover-primary-body-text-decoration: underline; */

  /* ===== Headings =====
     The theme clusters section headings at 2.5–3.25rem and h1 renders 52px
     with -3% tracking; KB h1 shipped at 32px Rubik. Tracking is not an exposed
     property, so it is set structurally further down. */
  /* UI-owned: --secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --secondary-header-font-color: var(--bz-ink); */
  /* UI-owned: --secondary-header-font-weight: 700; */

  /* UI-owned: --h1-secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --h1-secondary-header-font-color: var(--bz-ink); */
  /* UI-owned: --h1-secondary-header-font-size: 44px; */
  /* UI-owned: --h1-secondary-header-font-weight: 700; */
  /* UI-owned: --h1-secondary-header-line-height: 1.08; */

  /* UI-owned: --h2-secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --h2-secondary-header-font-color: var(--bz-ink); */
  /* UI-owned: --h2-secondary-header-font-size: 32px; */
  /* UI-owned: --h2-secondary-header-font-weight: 700; */
  /* UI-owned: --h2-secondary-header-line-height: 1.15; */

  /* UI-owned: --h3-secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --h3-secondary-header-font-color: var(--bz-ink); */
  /* UI-owned: --h3-secondary-header-font-size: 22px; */
  /* UI-owned: --h3-secondary-header-font-weight: 600; */
  /* UI-owned: --h3-secondary-header-line-height: 1.25; */

  /* UI-owned: --h4-secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --h4-secondary-header-font-color: var(--bz-ink); */
  /* UI-owned: --h4-secondary-header-font-size: 18px; */
  /* UI-owned: --h4-secondary-header-font-weight: 600; */

  /* UI-owned: --h5-secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --h5-secondary-header-font-color: var(--bz-ink); */
  /* UI-owned: --h5-secondary-header-font-weight: 600; */

  /* UI-owned: --h6-secondary-header-font-family: var(--bz-font); */
  /* UI-owned: --h6-secondary-header-font-color: var(--bz-muted); */
  /* UI-owned: --h6-secondary-header-font-weight: 600; */

  /* ===== Buttons =====
     Primary = ink fill (the site's dominant CTA); amber is reserved for the
     single highest-intent action per page, which a KB does not have. */


  /* ===== Header ===== */
  /* UI-owned: --header-button-font-family: var(--bz-font); */
  /* UI-owned: --header-button-font-color: #ffffff; */
  /* UI-owned: --header-button-font-weight: 600; */
  /* UI-owned: --header-button-hover-font-color: #ffffff; */

  /* ===== Search ===== */
  /* ⚠ THESE TWO MUST CHANGE WITH THE BAND ABOVE. The KB ships a dark blue
     search band and therefore WHITE label text. Lightening the band to our tint
     without re-colouring the label left "How can we help you?" white on
     #f8f6ff — invisible. Caught by a contrast sweep on the live page, not by
     reading the sheet. If the band is ever darkened again, invert these. */
  /* UI-owned: --search-field-label-font-family: var(--bz-font); */
  /* UI-owned: --search-field-label-font-size: 36px; */
  /* UI-owned: --search-field-label-font-weight: 700; */

  /* ===== Home tiles / cards ===== */

  /* ===== Footer ===== */
  /* UI-owned: --footer-font-family: var(--bz-font); */
  /* UI-owned: --footer-font-color: rgba(255, 255, 255, 0.82); */
  /* UI-owned: --footer-menu-font-family: var(--bz-font); */
  /* UI-owned: --footer-menu-font-color: rgba(255, 255, 255, 0.82); */
  /* UI-owned: --footer-menu-hover-font-color: #ffffff; */
}

/* ============================================================================
   STRUCTURAL RULES — the deliberate exceptions
   Each one covers something with no exposed custom property. Keep this list
   SHORT: these selectors are HubSpot's and may change without notice.
   ========================================================================= */

/* 1. Heading tracking. The theme's display type is tightly tracked (h1 renders
      -1.56px at 52px, i.e. -3%); no KB property exposes letter-spacing, and
      without this the headings read noticeably looser than the site's.
      Selectors verified against the live PRODUCTION KB (listing + an article
      page) — the KB renders no <article> element, so an `article h1` rule would
      never have matched. Measured 2026-08-22. */
.hs-knowledge-listing-page h1,
.hs-knowledge-listing-page h2,
.hs-kb-content h1,
.hs-kb-content h2,
.hs-kb-content h3 {
  letter-spacing: -0.03em;
}

/* 1b. Article heading weight. Measured on PRODUCTION 2026-09-07: article h2
       computes to `font-weight: 100` — hairline, and visibly broken against
       body text at 400. No KB property exposes heading weight for the article
       body. Also lifts the h2 off 20px, which is barely larger than the 16px
       prose around it. NOTE: an <article> element DOES now exist on production
       (704px wide) — the 2026-08-22 note claiming it does not is stale. */
.hs-kb-content h1,
.hs-kb-content h2,
.hs-kb-content h3,
.hs-kb-content h4 {
  font-weight: 700;
  color: var(--bz-ink);
}

.hs-kb-content h2 {
  font-size: 1.75rem;
  line-height: 1.25;
  margin-top: 2.5rem;
}

.hs-kb-content h3 {
  font-size: 1.25rem;
  line-height: 1.3;
  margin-top: 2rem;
}

/* 2. Article prose measure. Help text with no max-width runs the full 1248px
      container, far past a comfortable reading line. `.hs-kb-content` is the
      article body wrapper on the production article template. */
.hs-kb-content .article-wrapper,
.hs-kb-content article {
  max-width: 76ch;
}

/* Prose rhythm. Measured 16px/24px (1.5) on production — tight for long help
   text. `article` is included because production now renders one. */
.hs-kb-content .article-wrapper p,
.hs-kb-content article p,
.hs-kb-content .article-wrapper li,
.hs-kb-content article li {
  line-height: 1.7;
}

/* 3. Focus visibility. The KB's default focus ring is the old teal accent.
      Keyboard focus must stay clearly visible — do not remove the outline. */
a:focus-visible,
button:focus-visible,
.hs-search-field__input:focus-visible {
  outline: 2px solid var(--bz-violet-700);
  outline-offset: 2px;
}

/* 4. Search input. The wrapper has a background property but the input itself
      does not, so it keeps a default border and radius that clash with the
      12px/soft-rect language.
      NOTE: no `width: 100%` here — a global border-box reset is NOT assumed
      (bizup-theme has none either), so width + padding would overflow. */
.hs-search-field__input {
  font-family: var(--bz-font);
  border: 1px solid var(--bz-border);
  border-radius: var(--bz-radius-btn);
  color: var(--bz-body);
  /* Measured 2026-08-22 on the sandbox listing: the input rendered 40.4px tall
     with padding-left 10px — HubSpot's stock form-control metrics, which read as
     a generic search box rather than the theme's field. `box-sizing` is set
     EXPLICITLY: there is no global border-box reset here (nor in bizup-theme),
     so height + padding would otherwise add up past the intended box.
     No `width` is set — the KB sizes the bar, and setting width here overflowed. */
  box-sizing: border-box;
  height: 56px;
  padding: 0 1rem;
  font-size: 1rem;
}

/* 4a. Seam with the submit button. Measured 2026-09-07 on the sandbox listing:
       the input computed `border-radius: 12px` on ALL FOUR corners while the
       button next to it is `0 12px 12px 0`. The two sit flush in a flex row, so
       the input's rounded RIGHT corners curved away behind the button's square
       LEFT edge — a visible notch at the join. Square off the trailing corners
       so the pair reads as one control.
       :dir()-free on purpose: the KB emits no RTL variant here. */
.hs-search-field__form .hs-search-field__input {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  border-right: none;
}

/* Keep the button's own trailing corners matched to the input's leading ones. */
.hs-search-field__form .hs-search-field__button {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--bz-radius-btn);
  border-bottom-right-radius: var(--bz-radius-btn);
}

.hs-search-field__input::placeholder {
  color: var(--bz-muted);
}

/* 5. Suggestion dropdown — rendered by KB JS, no themeable properties.
      Measured 2026-09-07: radius 16px, border #e6e4ed, NO shadow — it read as a
      flat box floating over the page with nothing lifting it off the band.
      `overflow: hidden` is what actually makes the radius visible: without it a
      hovered first/last row paints its square corner over the rounded parent. */
/* ⚠ The <ul> is ALWAYS in the DOM, even with the field empty: it then holds a
   single `li.results-for.show-for-sr` announcing "no suggestions" to screen
   readers. Measured 2026-09-07: adding padding + shadow here unconditionally
   painted that empty list as a visible 10px white sliver under the search bar.
   So the chrome is applied ONLY when the list has a real, non-SR row. Do NOT
   hide `.show-for-sr` itself — it is the accessible empty-state announcement.
   :has() is required for this; unsupported browsers simply get the old flat
   list, which degrades to "unstyled", not "broken". */
.hs-search-field__suggestions:has(li:not(.show-for-sr)) {
  border: 1px solid var(--bz-border);
  border-radius: var(--bz-radius-card);
  background: #ffffff;
  overflow: hidden;
  box-shadow: 0 12px 32px rgba(18, 4, 48, 0.12);
  margin-top: 6px;
  padding: 4px 0;
}

.hs-search-field__suggestions li:not(.show-for-sr) + li:not(.show-for-sr) {
  border-top: 1px solid var(--bz-border);
}

.hs-search-field__suggestions a {
  display: block;
  padding: 10px 16px;
  color: var(--bz-body);
  text-decoration: none;
}

.hs-search-field__suggestions a:hover {
  background: var(--bz-violet-50);
  color: var(--bz-violet-700);
}

/* The visible "no results for X" row is a plain <li>, not a link — keep it
   muted so it does not read as a clickable suggestion. Scoped with
   :not(.show-for-sr) so the screen-reader-only row keeps its own off-screen
   positioning and never takes layout padding. */
.hs-search-field__suggestions .results-for:not(.show-for-sr) {
  padding: 10px 16px;
  color: var(--bz-muted);
  font-size: 0.9375rem;
}

/* 5b. Header dropdown menus. Measured 2026-09-07: the submenu <ul> computes
       `border-radius: 0`, `border: none`, `box-shadow: none` — it reads as a
       bare white rectangle butted against the header, which is what made the
       nav look unstyled next to the 12px/16px language everywhere else.
       The KB exposes 52 menu custom properties and every one of them is
       font/colour — there is NO submenu radius, border or shadow property, so
       this has to be structural. Verified against the live listing.
       `overflow: hidden` clips the first/last row's square corner, which would
       otherwise paint over the rounded parent on hover. */
.header__menu-submenu {
  border: 1px solid var(--bz-border);
  border-radius: var(--bz-radius-card);
  box-shadow: 0 12px 32px rgba(18, 4, 48, 0.12);
  overflow: hidden;
  padding: 4px 0;
}

/* Rows sit flush to the rounded edge without this. */
.header__menu-submenu .header__menu-link {
  padding: 10px 16px;
}

.header__menu-submenu .header__menu-link:hover {
  background: var(--bz-violet-50);
  color: var(--bz-violet-700);
}

/* 6. Category cards on the listing (production uses the `cards` layout).
      The tile custom properties cover the `tiles` layout only, so the card
      layout needs its border and radius set here to match the 16px card. */
/* Applies to every home layout, not just `cards`. The sandbox KB uses
   `content_rich` and production uses `cards`; scoping this to one of them left
   the other with the KB's 0px corners. Measured 2026-08-22 on the sandbox:
   borderRadius computed 0px until the layout scope was dropped. */
.hs-kb-home-list__category {
  border: 1px solid var(--bz-border);
  border-radius: var(--bz-radius-card);
  /* Measured 2026-08-22: computed `padding: 0px` and a 301x52px box, so the
     category title sat flush against the border — a bordered rectangle, not a
     card. The KB exposes no padding property for this layout. Padding goes on
     the LINK, not here, so the whole card stays clickable; the border-box on the
     link is required for the same no-reset reason as the search input. */
  background: #ffffff;
  overflow: hidden;
}

.hs-kb-home-list__category-link {
  box-sizing: border-box;
  display: block;
  padding: 1.25rem 1.5rem;
  text-decoration: none;
}

.hs-kb-home-list__category-link:hover {
  background: var(--bz-violet-50);
}

/* The search icon ships black, which disappears on our ink-filled button.
   --search-field-button-icon-color exists but only colours an SVG `fill`; the
   KB's button renders the glyph as text on some layouts, so set both. */
.hs-search-field__button {
  color: #ffffff;
  /* Measured 2026-08-22: the button computed border-radius 0px and 38x40px, so
     it read as a square tab welded onto a 12px-rounded input. It sits INSIDE the
     bar (`--button-inline`), hence rounding only the trailing corners and
     matching the input's new 56px height rather than making it a separate pill. */
  border: 0;
  border-radius: 0 var(--bz-radius-btn) var(--bz-radius-btn) 0;
  height: 56px;
  width: 56px;
  cursor: pointer;
}

.hs-search-field__button svg,
.hs-search-field__button path {
  fill: #ffffff;
}

.hs-kb-home-list__text__category-title {
  font-family: var(--bz-font);
  color: var(--bz-ink);
  font-weight: 700;
}

.hs-kb-home-list__text__category-description {
  color: var(--bz-muted);
}

/* 7. Breadcrumbs, sidebar nav, related articles and the feedback block — all
      KB-only furniture with no exposed properties. Kept to colour and radius
      so a markup change degrades to "slightly off" rather than "broken". */
.hs-kb-breadcrumbs,
.hs-kb-breadcrumb_item {
  font-family: var(--bz-font);
  color: var(--bz-muted);
}

.hs-kb-category-accordion_link--active {
  color: var(--bz-violet-700);
  font-weight: 600;
}

.hs-kb-related-articles,
.hs-kb-feedback {
  font-family: var(--bz-font);
  border-top: 1px solid var(--bz-border);
}

.hs-kb-category-article-list__link {
  color: var(--bz-violet-700);
}

/* 8. Layout furniture the KB exposes NO properties for. Every rule below fixes
      a defect MEASURED on the live sandbox listing at 1440px on 2026-08-22 —
      none of it is preference.

      ⚠ These are the rules most likely to break when HubSpot changes the KB
      theme's markup, because they target structural classes rather than
      custom properties. Each degrades to "unstyled" rather than "broken" if its
      selector stops matching. Re-measure after any KB theme update. */

/* 8a. The search band had padding-top/bottom 0, so the field collided with the
       header above and the category list below. The band is a <section>, and its
       own background comes from the KB's own property, so only rhythm is set. */
.hs-kb-search-input-wrapper {
  padding-top: 4rem;
  padding-bottom: 4rem;
}

/* 8b. The label IS the hero title on this page — measured: the listing has NO
       <h1> at all, its only heading is the category <h3>. So the KB renders
       "How can we help you?" as a <label>, which inherits form-label sizing.
       Typeset it as the display heading it visually is. `display: block` because
       a label is inline by default and centring would not apply. */
.hs-search-field__label {
  display: block;
  margin: 0 0 1.5rem;
  font-family: var(--bz-font);
  font-size: clamp(2rem, 4vw, 2.75rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--bz-ink);
  text-align: center;
}

/* 8c. FOOTER CONTRAST BUG. Measured: footer background rgb(18,4,48) (our ink,
       set via the KB property) but color rgb(27,25,57) — body ink INHERITED from
       .theme-overrides. Dark text on a dark ground: the footer menu was very
       nearly invisible. The KB has no footer-foreground property, so the colour
       has to be forced here, on the container AND the links (which carry their
       own colour). This is the single worst defect the sheet had. */
.footer,
.footer .footer__menu-link,
.footer .footer__bottom,
.footer .footer__bottom a {
  color: #ffffff;
}

/* Re-measured on PRODUCTION 2026-09-07: `.footer__menu-link` does NOT exist
   there, and the tagline + copyright are nested rich-text <div>/<span>s that
   carry their own inherited colour, so the rules above never reached them.
   Measured contrast was 1.0 — rgb(19,19,58) on rgb(31,8,68), i.e. text that is
   mathematically invisible. Descend into the rich-text wrappers explicitly.
   Links are excluded so the violet link colour survives.

   Footer palette re-measured against the WEBSITE 2.0 theme (sandbox /blog,
   2026-09-07): ground #1c1c1c near-black (NOT the ink violet this sheet first
   assumed), body text #b7bed9 (9.24:1), column headings 12px/600 uppercase
   with 1.2px tracking, links 14px/400, hairline divider rgba(255,255,255,.14).
   Set the ground in the Footer UI panel; these rules only cover what the UI
   cannot express. */
.footer .footer__bottom,
.footer .footer__bottom div,
.footer .footer__bottom span,
.footer .footer__bottom p,
.footer .hs_cos_wrapper_type_rich_text,
.footer .hs_cos_wrapper_type_rich_text * {
  color: var(--bz-footer-text, #b7bed9);
}

.footer .footer__bottom a,
.footer .hs_cos_wrapper_type_rich_text a {
  color: var(--bz-violet-300);
}

.footer .footer__menu-link:hover,
.footer .footer__bottom a:hover {
  color: #ffffff;
  text-decoration: underline;
}

/* 8f. FOOTER LOGO. The KB has ONE logo setting (the header's) and the footer
       reuses that same file — there is no separate footer logo field. The
       brand lockup's wordmark is #141471 navy, which on the ink footer
       measures 1.26:1: effectively invisible (confirmed on the sandbox).

       The footer logo is an <img>, not inline SVG, so CSS cannot recolour its
       paths, and a filter that whitened the text would also destroy the
       pink/violet gradient on the "b" mark. Instead swap the image itself for
       a white-wordmark variant of the same file (identical geometry; only
       `.cls-1` changes #141471 -> #ffffff, the gradient class untouched).
       White measures 19.34:1 on the same ground.

       `footer img.hs-image-widget` is verified to match ONLY the footer image —
       the header logo is `.header__logo-image` and keeps the colour lockup.
       Width/height are restated because a `content:` replacement drops the
       element's intrinsic sizing in some engines. Measured after the swap:
       130x48, natural 300x110. If the white file is ever missing this rule
       degrades to a broken image, so keep the asset and the rule together. */
footer img.hs-image-widget {
  /* NOTE: absolute + sandbox-specific ON PURPOSE. A root-relative /hubfs/...
     would resolve against whatever domain serves the page, which is correct
     here but silently wrong if this sheet is ever copied to production —
     swap this host for the production one when installing there. */
  content: url("https://246050209.hs-sites-na2.com/hubfs/BUU-logo-white-horizontal.svg");
  width: 130px;
  height: 48px;
  object-fit: contain;
}

/* The social glyphs ship dark for a light footer; ours is ink-filled. */
.footer .hs-kb-social_follow__link svg,
.footer .hs-kb-social_follow__link path {
  fill: #ffffff;
}

/* 8d. Header. Its background is white by default, which is right, but it has no
       bottom edge, so it floats against the search band's tint. */
.header {
  border-bottom: 1px solid var(--bz-border);
}

.header .header__menu-link {
  font-family: var(--bz-font);
  color: var(--bz-body);
}

.header .header__menu-link:hover {
  color: var(--bz-violet-700);
}

/* The header/footer CTA reads as the theme's primary button. */
.header .header__button,
.footer .button {
  font-family: var(--bz-font);
  border-radius: var(--bz-radius-btn);
  background: var(--bz-violet-700);
  color: #ffffff;
  border: 0;
}

.header .header__button:hover,
.footer .button:hover {
  background: var(--bz-violet-600);
  color: #ffffff;
}

/* 8e. Listing rhythm. The category list had no vertical breathing room of its
       own, so cards butted against the search band. */
.hs-kb-home-list {
  padding-top: 3rem;
  padding-bottom: 5rem;
}

@media (max-width: 767px) {
  .hs-kb-search-input-wrapper {
    padding-top: 2.5rem;
    padding-bottom: 2.5rem;
  }

  .hs-kb-home-list {
    padding-top: 2rem;
    padding-bottom: 3rem;
  }

  /* 56px is a comfortable desktop field but crowds a 390px viewport once the
     inline button takes 56 of it. */
  .hs-search-field__input,
  .hs-search-field__button {
    height: 48px;
  }

  .hs-search-field__button {
    width: 48px;
  }
}
