/* ============================================================
   KeurigOnline HelpScout Docs theme (help.keurigonline.nl)
   MINTLIFY-STYLE THREE-PANE REWORK — 2026-07-21 (v3).

   CONSTRAINT: this file styles a THIRD-PARTY hosted docs product
   (help.keurigonline.nl runs on HelpScout Docs). We can inject ONE
   custom stylesheet + a <head> HTML/JS blob (head.html) — we cannot
   touch HelpScout's server-rendered HTML. head.html's JS relocates
   the fixed HelpScout DOM nodes into the three-pane shell built here
   (.hs-shell > .hs-sidebar / .hs-main[/ .hs-toc]); this file styles
   that shell plus the underlying HelpScout selectors it wraps.

   DEPLOY NOTE — FONTS: this file's @font-face rules are self-hosted on the
   keurigonline.nl main site (Pablo, where the .woff2 files already live):
     https://www.keurigonline.nl/template/KeurigOnline/local/fonts/fonnts.com-Aeonik-{Regular,Bold}.woff2   (Aeonik: FLAT in local/fonts/)
     https://www.keurigonline.nl/template/KeurigOnline/local/fonts/geist/geist-{400,500,600,700}.woff2       (Geist: in the geist/ subfolder)
   MUST use the www. host, NOT the bare domain: bare keurigonline.nl
   301-REDIRECTS to www., and browsers do NOT follow redirects for CORS font
   requests (@font-face is always CORS-checked cross-origin from
   help.keurigonline.nl). www. serves the woff2 directly — HTTP 200 +
   `Access-Control-Allow-Origin: https://help.keurigonline.nl` — so it loads
   clean (verified 2026-07-22: bare -> 301 no-CORS, www -> 200+CORS). Layout
   asymmetry too: Aeonik flat in local/fonts/, Geist nested in geist/. Each
   face is still paired with a same-shape system fallback in --font-display/
   --font-body below, so the site reads fine even if a file is missing (just
   not on-brand). The /helpscout-preview office page ADDS a local
   /assets/fonts override so the preview renders on-brand on the dev box.

   Icons: NO icon font, NO CDN (was Bootstrap Icons via jsdelivr —
   blocked on the dev box and needless prod dependency). head.html
   injects inline SVG (stroke-based, currentColor) for every icon;
   this file only sizes/colors them.
   ============================================================ */

/* ---- Fonts (self-hosted — see deploy note above) ---- */
@font-face { font-family: 'Aeonik Pro'; font-weight: 400; font-style: normal; font-display: swap;
    src: url('https://www.keurigonline.nl/template/KeurigOnline/local/fonts/fonnts.com-Aeonik-Regular.woff2') format('woff2'); }
  @font-face { font-family: 'Aeonik Pro'; font-weight: 700; font-style: normal; font-display: swap;
    src: url('https://www.keurigonline.nl/template/KeurigOnline/local/fonts/fonnts.com-Aeonik-Bold.woff2') format('woff2'); }
  @font-face { font-family: 'Geist'; font-weight: 400; font-style: normal; font-display: swap;
    src: url('https://www.keurigonline.nl/template/KeurigOnline/local/fonts/geist/geist-400.woff2') format('woff2'); }
  @font-face { font-family: 'Geist'; font-weight: 500; font-style: normal; font-display: swap;
    src: url('https://www.keurigonline.nl/template/KeurigOnline/local/fonts/geist/geist-500.woff2') format('woff2'); }
  @font-face { font-family: 'Geist'; font-weight: 600; font-style: normal; font-display: swap;
    src: url('https://www.keurigonline.nl/template/KeurigOnline/local/fonts/geist/geist-600.woff2') format('woff2'); }
  @font-face { font-family: 'Geist'; font-weight: 700; font-style: normal; font-display: swap;
    src: url('https://www.keurigonline.nl/template/KeurigOnline/local/fonts/geist/geist-700.woff2') format('woff2'); }
  
  /* ---- Design tokens (DESIGN.md Appendix, verbatim — same block as
     Layouts/base.twig) ---- */
  :root {
    --orange-50:  #FEF3ED;
    --orange-100: #FDE0D2;
    --orange-200: #FBC3A6;
    --orange-400: #F57C43;
    --orange-500: #F26522;
    --orange-600: #D9500F;
    --orange-700: #B33E0C;
  
    --ink-900: #202D39;
    --ink-700: #3A4552;
    --neutral-500: #6F6F6F;
    --neutral-400: #A1A1A1;
    --neutral-300: #D1D5DB;
    --neutral-200: #E5E7EB;
    --neutral-100: #F1F1F1;
    --surface-subtle: #F9F9F9;
    --canvas: #FDFDFC;   /* page + sidebar base (Pablo) — warm near-white */
    --white: #FFFFFF;
  
    /* ---- GRAYSCALE SCALE (Pablo, mid-build pivot 2026-07-23 — "Vercel-docs
       grade, grayscale-first") — a dedicated near-black-to-near-white ramp
       for the LANDING PAGE rework (hero/header/quick-start panel/category
       cards): --gray-1000 is the primary text color, --gray-200/100 are
       hairline borders and quiet surfaces. Distinct from --ink-900/700
       (which stay in place, unchanged, everywhere they were already used —
       article prose, nav tree, etc.) so this pass never silently recolors
       content this wave didn't touch. --orange-500 stays the ONE deliberate
       warm accent: the primary hero/header button, the active/selected
       state, and link-hover — never a default card/icon fill anymore. */
    --gray-1000: #0A0A0A;
    --gray-900:  #171717;
    --gray-700:  #404040;
    --gray-600:  #525252;
    --gray-500:  #737373;
    --gray-400:  #A3A3A3;
    --gray-300:  #D4D4D4;
    --gray-200:  #E5E5E5;
    --gray-150:  #EDEDED;
    --gray-100:  #F5F5F5;
    --gray-50:   #FAFAFA;
  
    --success: #00B67A;
    --info: #7896C2;
    --warning: #FF9F40;
    --danger: #DB6C6C;
  
    --font-display: 'Aeonik Pro', 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    --font-body: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    --font-mono: 'SFMono-Regular', 'JetBrains Mono', Consolas, monospace;
  
    --radius-sm: 6px;
    --radius-md: 10px;
    --radius-lg: 16px;
    --radius-pill: 999px;
  
    --space-1: 4px;   --space-2: 8px;   --space-3: 12px;  --space-4: 16px;
    --space-6: 24px;  --space-8: 32px;  --space-12: 48px; --space-16: 64px;
    --space-24: 96px; --space-32: 128px;
  
    --shadow-xs: 0 1px 2px rgba(32,45,57,0.06);
    --shadow-sm: 0 2px 8px rgba(32,45,57,0.08);
    --shadow-md: 0 8px 24px rgba(32,45,57,0.10);
  
    --ease-out: cubic-bezier(0.2, 0, 0, 1);
    --dur-fast: 140ms;
    --dur-base: 240ms;
  
    --sidebar-w: 300px;   /* 272→300 (Pablo): roomier nav tree (long category/
                             article names stop wrapping) + shifts the content
                             block right so the article anchors less to the left */
    --toc-w: 260px;
    --topbar-h: 56px;
    --prose-max: 820px;
    --content-max: 1264px;
  }
  
  /* ---- Base ---- */
  * { box-sizing: border-box; }
  *, *::before, *::after { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
  
  /* NO overflow-x:hidden on html/body — it silently breaks position:sticky on
     the TOC (a sticky element won't stick if ANY ancestor clips overflow).
     Horizontal overflow is prevented per-element instead (min-width:0 on flex
     items, overflow-x:auto on wide code/tables). */
  html { }
  body {
    font-family: var(--font-body) !important;
    background: var(--canvas) !important;
    color: var(--ink-900);
    padding-top: 0 !important;
    padding-left: 0;
    padding-right: 0;
    margin: 0;
    line-height: 1.6;
  }
  
  /* ONLY h1 is ever Aeonik (Pablo 2026-07-23). h2/h3/h4 are Geist — hierarchy
     comes from weight/size, not a second typeface. Previously this rule forced
     the display font onto all of h1-h4, so landing section headings (<h2>) and
     any <h3> rendered Aeonik; the article page had to carve them back per
     selector. Fix it at the source so every heading below h1 is body font. */
  h1 { font-family: var(--font-display) !important; color: var(--ink-900); font-weight: 700; }
  /* line-height: base CSS sets `h1,h2,h3{line-height:36px}` — a fixed 36px that
     looks broken on a 16px heading. Normalise to 1.3 here so EVERY heading
     (incl. bare <h3>s not scoped to #fullArticle) has sane leading. */
  h2, h3, h4 { font-family: var(--font-body) !important; color: var(--ink-900); font-weight: 700; line-height: 1.3; }
  
  /* Inputs/buttons don't inherit font-family from the UA — force ours so no
     field falls back to a system/serif face (Pablo: "Zoek in de kennisbank"
     was a default font). */
  input, textarea, select, button, .search-query { font-family: var(--font-body); }
  
  a { color: var(--orange-700); text-decoration: none; }
  a:hover { text-decoration: underline; }
  a:focus-visible { outline: 2px solid var(--orange-500); outline-offset: 2px; border-radius: 2px; }
  
  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: 0.01ms !important;
      transition-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
    }
  }
  
  /* hide HelpScout's own navbar entirely — the sidebar header now carries
     the brand mark (Mintlify never repeats a top navbar above the shell) */
  .navbar { display: none !important; }
  
  /* ============================================================
     TOP BAR — mobile-only utility strip (hamburger + brand); desktop
     hides it, the brand lives in the sidebar header instead.
     ============================================================ */
  .hs-topbar {
    display: none;
    position: sticky; top: 0; z-index: 1100;
    align-items: center; gap: var(--space-3);
    height: var(--topbar-h);
    padding: 0 var(--space-4);
    background: var(--white);
    border-bottom: 1px solid #e9ecef;
  }
  .hs-topbar-toggle {
    display: flex; align-items: center; justify-content: center;
    width: 44px; height: 44px;
    border: 0;
    background: transparent;
    border-radius: var(--radius-md);
    color: var(--ink-700);
    cursor: pointer;
    flex-shrink: 0;
  }
  .hs-topbar-toggle:hover { background: var(--surface-subtle); }
  .hs-topbar-toggle:focus-visible { outline: 2px solid var(--orange-500); outline-offset: 2px; }
  .hs-topbar-brand { display: flex; align-items: center; }
  /* search icon + hamburger grouped at the RIGHT end of the bar
     (client-portal idiom: [Helpdesk] ... [🔎][☰]) */
  .hs-topbar-actions { margin-left: auto; display: flex; align-items: center; gap: var(--space-2); }
  .hs-topbar-search {
    display: flex; align-items: center; justify-content: center;
    width: 44px; height: 44px;
    border: 0;
    background: transparent;
    border-radius: var(--radius-md);
    color: var(--ink-700);
    cursor: pointer;
    flex-shrink: 0;
  }
  .hs-topbar-search:hover { background: var(--surface-subtle); }
  .hs-topbar-search:focus-visible { outline: 2px solid var(--orange-500); outline-offset: 2px; }
  
  /* ---- Brand lockup: [Ko] / helpdesk — a white rounded badge (orange "K" +
     black "o", built from text, not an image) followed by a muted "/ helpdesk"
     label. Replaces the full KO logo image everywhere in this shell: sidebar
     header + mobile top bar. Links to the docs HOME (head.html's DOCS_HOME),
     never the marketing site. The badge's own border/background make it read
     on BOTH the sidebar's --canvas background and the mobile top bar's white
     background. ---- */
  .hs-brand-wordmark {
    display: flex; align-items: center; gap: var(--space-2);
    color: var(--ink-900) !important;
    text-decoration: none !important;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 1rem;
  }
  .hs-brand-wordmark:hover { text-decoration: none !important; }
  
  /* Matches the real KO favicon (ko_favicon.ico): a solid orange rounded
     square with white bold "KO". Not a white box with two-tone letters. */
  .hs-brand-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    height: 26px;
    min-width: 26px;
    padding: 0 5px;
    background: var(--orange-500);
    border-radius: var(--radius-sm);
    color: var(--white);
    font-family: var(--font-display);
    font-size: 0.8125rem;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.01em;
  }
  .hs-brand-slash {
    line-height: 1;
    /* body font (Geist), NOT the display face — reads as clean supporting
       text next to the KO badge (Pablo: "helpdesk suddenly a different font").
       The display font was also the least-reliable to load off the CDN. */
    font-family: var(--font-body);
    font-weight: 500;
    font-size: 0.9375rem;
    color: var(--neutral-500);
    white-space: nowrap;
  }
  
  /* Mobile category bar — horizontally touch-scrollable chips under the top
     bar (client-portal .mobile-nav-scroll idiom). Hidden on desktop; shown at
     the same breakpoint the sidebar collapses to a drawer. */
  .hs-mobile-nav { display: none; }
  .hs-mobile-nav-inner {
    display: flex; gap: var(--space-2);
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    padding: var(--space-2) var(--space-4);
    scrollbar-width: none;
  }
  .hs-mobile-nav-inner::-webkit-scrollbar { display: none; }
  /* Client-portal top-menu idiom (#da-main-nav ul li a): flat items, no pill
     border/background by default, 14px/500 near-ink text, quiet grey
     hover/active fills instead of an orange-tinted chip. */
  .hs-mobile-nav-item {
    flex: 0 0 auto;
    min-height: 44px;
    display: flex; align-items: center;
    padding: 8px 12px;
    border-radius: var(--radius-md);
    border: none;
    background: transparent;
    font-size: 14px; line-height: 20px; font-weight: 500;
    color: #222; white-space: nowrap;
    text-decoration: none;
    transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-mobile-nav-item--active { background: #F1F5F9; color: #111827; font-weight: 500; }
  .hs-mobile-nav-item:hover { background: #f3f4f6; color: #111827; text-decoration: none; }
  
  /* ============================================================
     THREE-PANE SHELL
     ============================================================ */
  .hs-shell {
    display: flex;
    align-items: flex-start;
    min-height: 100vh;
    width: 100%;
  }
  
  /* ---- LEFT SIDEBAR (persistent on every view) ----
     Matched to the client-portal #da-sidebar idiom (new.css ~164-260): thin
     .5rem/8px horizontal padding, transparent-ish background (a hairline
     right border is kept here for legibility against the docs' white content
     pane, since the portal sits on its own page canvas — the docs shell needs
     SOME separation). Sticks flush to the viewport top: the portal's own
     #da-sidebar uses top:24px only because the portal content area is padded
     24px above it; in THIS shell the sidebar starts at y=0 (the brand mark is
     the first thing at the top), so a 24px offset would leave a dead gap on
     scroll AND push the last 24px of a tall nav below the fold (max-height
     100vh + top 24px overflows the viewport). top:0 is correct here. */
  /* Flex column: header (brand+search) + scrollable nav (flex:1) + a footer
     PINNED to the bottom of the sticky rail (the two low-emphasis exit
     links) — the sidebar itself no longer scrolls as one long column; only
     .hs-sidebar-scroll does, so the footer never scrolls out of reach. */
  .hs-sidebar {
    flex: 0 0 var(--sidebar-w);
    width: var(--sidebar-w);
    height: 100vh;
    display: flex;
    flex-direction: column;
    background: var(--canvas);
    border-right: 1px solid #e9ecef;
    padding: var(--space-4) var(--space-2) 0;
    position: sticky;
    top: 0;
    align-self: flex-start;
  }
  /* Desktop: no sidebar panel-header (the sticky .hs-header owns the brand).
     Shown ONLY inside the mobile drawer (re-styled in the <1024px block). */
  .hs-sidebar-header { display: none; }
  .hs-sidebar-brand { display: flex; align-items: center; }
  .hs-sidebar-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
  .hs-sidebar-footer {
    flex-shrink: 0;
    margin: 0 calc(-1 * var(--space-2));
    padding: var(--space-3) var(--space-4);
    border-top: 1px solid var(--neutral-200);
    display: flex;
    flex-direction: column;
    gap: 2px;
  }
  .hs-sidebar-footer-link {
    display: flex; align-items: center; gap: var(--space-2);
    min-height: 44px;
    padding: var(--space-1) var(--space-2);
    border-radius: var(--radius-md);
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--neutral-500) !important;
    text-decoration: none !important;
  }
  .hs-sidebar-footer-link:hover { background: #f3f4f6; color: var(--ink-700) !important; }
  .hs-sidebar-footer-icon { display: flex; align-items: center; flex-shrink: 0; color: var(--neutral-400); }
  
  /* Portal search-TRIGGER chrome (Base/Sidebar.css .c-sidebar__search-trigger /
     new.css #da-search input): 9px radius, #e9ecef border, white background,
     8px/12px padding, 14px/400 grey text, grey focus ring — NO orange ring.
     NON-TYPEABLE (Pablo, mirrors the client portal): this is now a <button>
     that OPENS the command-palette modal, not a real text input — a <button>
     never inherits `input`-keyed rules, so the box chrome is replicated
     directly onto it (same root cause/fix as the portal's Sidebar.css note). */
  .hs-sidebar-search {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    box-sizing: border-box;
    margin-bottom: var(--space-4);
    padding: 8px 12px;
    border: 1px solid #e9ecef;
    background: var(--white);
    border-radius: 9px;
    font-size: 14px;
    font-weight: 400;
    line-height: 1.4;
    font-family: var(--font-body);
    color: #666;
    cursor: pointer;
    text-align: left;
    transition: box-shadow 0.15s ease;
  }
  .hs-sidebar-search-icon {
    position: static;
    flex-shrink: 0;
    color: #c4c9d4;
    display: flex;
  }
  .hs-sidebar-search-text {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: #c4c9d4;
  }
  .hs-sidebar-search-kbd {
    flex-shrink: 0;
    font-family: var(--font-mono);
    font-size: 11px;
    color: #9ca3af;
    background: #f1f5f9;
    border: none;
    border-radius: 5px;
    padding: 2px 6px;
  }
  .hs-sidebar-search:hover { background: var(--white); }
  .hs-sidebar-search:focus,
  .hs-sidebar-search:focus-visible {
    outline: none;
    box-shadow: 0 0 0 1px rgba(51, 51, 51, 0.1);
  }
  
  /* Sidebar LIVE FILTER (Pablo 2026-07-23) — an input, not a modal trigger.
     The .hs-sidebar-filter container reuses the box chrome above; the input
     is borderless inside it and the whole box shows a focus ring on focus-within. */
  .hs-sidebar-filter { cursor: text; }
  .hs-sidebar-filter:focus-within { box-shadow: 0 0 0 1px rgba(51,51,51,0.1); }
  /* The <input> must be FLAT — only the .hs-sidebar-filter CONTAINER shows a
     border. HelpScout's base gives input[type=search] its own border + bg +
     inset box-shadow + a :focus glow (all element-selector rules); override
     every one, incl. the focus state, so only the container's box is visible
     (Pablo 2026-07-23: "input shouldn't have a border"). */
  .hs-sidebar-filter-input,
  .hs-sidebar-filter-input:focus {
    flex: 1; min-width: 0;
    border: 0 !important;
    outline: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    border-radius: 0 !important;
    box-sizing: border-box !important;
    /* !important on height: base input[type=search]{height:18px} (0,1,1) beats
       the plain class (0,1,0) at BLUR, so unfocused = 18px while focused =
       24px → the container grew 36→42px on focus. Pin both states. */
    height: 24px !important; line-height: 24px !important;   /* center within the flex row, constant */
    min-height: 24px !important; max-height: 24px !important;
    font-family: var(--font-body) !important; font-size: 14px !important; color: var(--gray-1000);
    margin: 0 !important; padding: 0 !important;
    -webkit-appearance: none; appearance: none;
  }
  .hs-sidebar-filter-input::placeholder { color: #9ca3af; font-size: 14px; }
  /* clear the native search "x" so it matches the flat look */
  .hs-sidebar-filter-input::-webkit-search-cancel-button { -webkit-appearance: none; }
  /* Sidebar-filter show/hide — one rule hides any row the live filter marks
     out, whether it's a category row (landing) or a flat article row (drilled
     in). No auto-expand needed: the drill-in sidebar is already a single flat
     list per view, so filtering just hides non-matching rows. */
  .hs-nav-filtered-out { display: none !important; }
  
  .hs-sidebar-nav { display: flex; flex-direction: column; gap: 2px; }
  
  /* DRILL-IN back header (Pablo 2026-07-23, Vercel docs-sidebar/section-header):
     shown at the TOP of the sidebar on a category/article view — a left-arrow +
     the current category title, linking back to the landing (all categories).
     Same 36px row scale as the nav rows; arrow in a size-9 grid cell. */
  .hs-nav-back {
    display: flex; align-items: center;
    height: 36px;
    padding: 0;
    margin: 0 0 var(--space-2);
    border-radius: var(--radius-md);
    color: var(--gray-900);
    text-decoration: none !important;
    transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-nav-back:hover { background: var(--gray-100); color: var(--gray-1000); }
  /* arrow cell + right spacer are the SAME size-9 (36px) so the title is
     optically CENTERED between them (Vercel docs-sidebar/section-header). */
  .hs-nav-back-icon,
  .hs-nav-back-spacer {
    width: 36px; height: 36px; flex: none;
  }
  .hs-nav-back-icon { display: grid; place-content: center; color: inherit; }
  .hs-nav-back-title {
    min-width: 0; flex: 1;
    text-align: center;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: 14px; font-weight: 500;
  }
  
  /* Flat drilled-in article list (the current category's articles, shown alone
     under the back header) — plain 36px rows, NO left rail (that rail is only
     for the landing's nested sublist). */
  .hs-nav-tree--flat { list-style: none; margin: 0; padding: 0; }
  .hs-nav-tree--flat > li { margin: 0; }
  /* The article list is SECONDARY navigation (the body now carries the hero +
     top cards, Pablo 2026-07-23) — so these rows recede: 13px, gray-600,
     normal weight, tighter leading. min-height + symmetric padding so a
     wrapping title keeps rhythm instead of overflowing. align-items:flex-start
     so a two-line title's first line sits at the top (reads as one block, not
     vertically-centered wobble). The current article gets an orange left rail +
     ink text so "where am I" is instant without a heavy fill. */
  .hs-nav-tree--flat > li > a {
    display: block;
    min-height: 32px;
    padding: 6px 8px 6px 10px;
    border-radius: var(--radius-md);
    font-size: 13px;
    line-height: 1.35;
    font-weight: 400;
    color: var(--gray-600);
    text-decoration: none !important;
    transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-nav-tree--flat > li > a:hover { background: var(--gray-100); color: var(--gray-1000); }
  .hs-nav-tree--flat > li.hs-nav-tree-article--current > a {
    background: var(--gray-100);
    color: var(--gray-1000);
    font-weight: 500;
    box-shadow: inset 2px 0 0 var(--orange-500);
  }
  
  /* Vercel-docs section label — retained for any future grouped list; the
     drill-in IA no longer renders it (landing = flat category list, no label). */
  .hs-nav-group-label {
    display: block;
    font-family: var(--font-body);
    font-size: 13px;
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    color: var(--gray-500);
    margin: 0 0 2px;
    padding: 8px 10px 4px;
  }
  .hs-nav-list, #hs-sidebar .hs-nav-list { list-style: none; margin: 0; padding: 0; }
  .hs-nav-list li { margin: 0 0 2px; }
  /* Portal nav-item idiom (#da-main-nav ul li a): 14px/20px, weight 500,
     8px/6px padding, 10px radius, near-ink #222, no left-border accent. */
  .hs-nav-list a {
    display: block;
    padding: 8px 6px;
    border-radius: var(--radius-md);
    font-size: 14px;
    line-height: 20px;
    font-weight: 500;
    color: #222;
    line-height: 1.3;
    transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-nav-list a:hover { background: var(--gray-100); color: var(--gray-1000); text-decoration: none; }
  /* active nav item — grey fill, no orange, no left-accent bar (Vercel idiom).
     The active class is `active` on the <li> (the convention head.html/HelpScout
     use everywhere), NOT a bespoke class — key off that so it actually matches. */
  .hs-nav-list li.active > a,
  .hs-nav-list a.active {
    background: var(--gray-200);
    color: var(--gray-1000);
    font-weight: 500;
  }
  
  /* HelpScout's own #sidebar (real article nav-list) is DETACHED from the
     DOM by head.html on every view — it's now only a data source read by
     buildCategoryTree()/buildMobileContextBar(), never rendered/relocated.
     No styling needed for it here anymore (superseded by .hs-nav-tree below,
     the ONE tree markup shared across every view).
  
     ============================================================
     FULL CATEGORY TREE (Zone C) — identical on every view. Current category
     is expanded with its articles inline + active article highlighted;
     every other category renders collapsed (icon + name + chevron), still
     a real navigable link.
     ============================================================ */
  /* Vercel-docs category tree (Pablo 2026-07-23): flat 36px rows, 14px medium
     text, gray-900 → hover gray-100/gray-1000, active gray-200. NO left icon
     (Vercel category rows carry only a label + a trailing chevron); the
     .hs-nav-tree-icon is hidden. Rows are the same h-9 scale as the group
     labels, tight gap-px between them. */
  .hs-nav-tree { list-style: none; margin: 0; padding: 0; }
  .hs-nav-tree-item { margin: 0 0 2px; }
  .hs-nav-tree-row {
    display: flex; align-items: center; gap: var(--space-2);
    min-height: 36px;
    padding: 7px 8px 7px 10px;
    border-radius: var(--radius-md);
    font-size: 14px;
    line-height: 1.4;
    font-weight: 500;
    color: var(--gray-900);
    text-decoration: none !important;
    transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-nav-tree-row:hover { background: var(--gray-100); color: var(--gray-1000); }
  /* Vercel category rows have no left icon — hide it, don't render a tile. */
  .hs-nav-tree-icon { display: none; }
  .hs-nav-tree-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .hs-nav-tree-chevron { display: flex; align-items: center; flex-shrink: 0; color: var(--gray-400); }
  /* the current category's own row reads active (gray-200 fill) so it's obvious
     which branch is expanded — matches Vercel's aria-current row. */
  .hs-nav-tree-item--current > .hs-nav-tree-row { background: var(--gray-200); color: var(--gray-1000); }
  .hs-nav-tree-item--current > .hs-nav-tree-row:hover { background: var(--gray-200); }
  
  .hs-nav-tree-articles {
    list-style: none;
    margin: 1px 0 var(--space-2);
    padding: 0 0 0 var(--space-6);
    border-left: 1px solid var(--gray-200);
    margin-left: 14px;
  }
  .hs-nav-tree-articles li { margin: 0 0 1px; }
  .hs-nav-tree-articles a {
    display: flex; align-items: center;
    height: 36px;
    padding: 0 var(--space-2);
    border-radius: var(--radius-md);
    font-size: 14px;
    line-height: 1.3;
    font-weight: 500;
    color: var(--gray-600);
    text-decoration: none !important;
    transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-nav-tree-articles a:hover { background: var(--gray-100); color: var(--gray-1000); }
  /* active article — grey fill, matches the tree row idiom (portal idiom,
     no orange/left-accent-bar). Two class names: `.active` (inline category
     page list) and `.hs-nav-tree-article--current` (the article the reader is
     ON, marked when the sublist is fetched on the article view). */
  .hs-nav-tree-articles li.active > a,
  .hs-nav-tree-articles li.hs-nav-tree-article--current > a {
    background: var(--gray-200);
    color: var(--gray-1000);
    font-weight: 600;
  }
  /* loading placeholder while the sibling-article list is being fetched (async,
     article view). Muted, non-interactive; replaced in place when data lands. */
  .hs-nav-tree-loading {
    padding: 6px var(--space-2);
    font-size: 13px;
    color: var(--neutral-400);
    min-height: 32px;
    display: flex;
    align-items: center;
  }
  .hs-nav-tree-articles--loading { min-height: 32px; }
  
  /* ---- CENTER: main reading column ---- */
  /* No min-height:100vh here — it forced dead whitespace below the footer on
     short pages. The sidebar carries the full-height rail; the main pane ends
     at its content. */
  .hs-main {
    flex: 1 1 auto;
    min-width: 0;
  }
  .hs-main-content { width: 100%; }
  
  /* ---- RIGHT TOC ("Op deze pagina") — article view only ---- */
  .hs-toc {
    display: none; /* shown via .hs-article-grid below, desktop only */
  }
  
  /* ============================================================
     LANDING CONTENT (rendered inside .hs-main)
     ============================================================ */
  /* Landing hero — Vercel-grade, SINGLE-COLUMN (JOURNEY_IA "Landing layout"
     REVISED 2026-07-23): .hs-hero-row now holds just the intro column
     (headline+subhead+search+buttons+one-line gray tagline) — the two-col
     grid + the Aan-de-slag quick-start panel that used to sit beside it are
     REMOVED (see the "HERO" rule block below + docSections()). Not a
     floating search box alone. Sits in the normal #contentArea padding like
     every other content block. */
  #docsSearch {
    position: relative;
    background: transparent;
    /* SAME horizontal gutter as #contentArea (both are siblings inside .hs-main;
       only #contentArea had padding, so the hero title sat 48px left of the
       card grid). Match it so the hero aligns with the cards below. Also cap +
       center to --content-max like #contentArea so wide screens stay balanced.
       TOP padding matches where the article/category TITLE sits (97px from the
       top of .hs-main: their #main-content pad 32px + the breadcrumb strip +
       the title's top margin). The landing has no breadcrumb, so we reproduce
       that exact offset here with padding so ALL THREE page titles start at the
       same vertical position (Pablo: "all should be exactly equal"). */
    padding: 97px var(--space-12) var(--space-12);
    max-width: var(--content-max);
    margin: 0 auto;
    width: 100%;
    box-sizing: border-box;
    text-align: left;
    border-bottom: none;
  }
  /* Hero WITH INTENT (Vercel pivot): the real #searchBar form now renders
     INSIDE the hero column (was fully hidden — search used to live only in
     the sidebar ⌘K palette). The palette trigger still exists separately in
     the sidebar/header for in-context search; this hero form is the
     "landing page's own front door" search Vercel-style docs homepages use. */
  #docsSearch button { display: inline-flex; }
  
  /* #docsSearch prefix: HelpScout's base CSS has `#docsSearch h1 {font-size:32px;
     font-weight:400}` (specificity 1,0,1) and the hero title is an <h1> inside
     #docsSearch — so a plain `.hs-hero-title` (0,1,0) loses. Match the id
     specificity so OUR sizing/weight wins. */
  #docsSearch .hs-hero-title,
  .hs-hero-title {
    font-family: var(--font-display);
    /* Larger than the article/category title again (Vercel-grade "balanced
       headline" spec, Pablo's pivot) — the earlier "one title scale" rule
       (24px everywhere) is deliberately relaxed HERE ONLY; article/category
       titles are untouched at 24px. text-wrap:balance (added via the
       .hs-hero-title rule further down) keeps multi-line wraps even. */
    font-size: 2.25rem;
    line-height: 1.15;
    font-weight: 700;
    color: var(--gray-1000);
    margin: 0 0 var(--space-3);
    text-align: left;   /* base centers #docsSearch h1 */
  }
  .hs-hero-subtitle {
    font-size: 1.0625rem;
    color: var(--gray-500);
    max-width: 34rem;
    margin: 0 0 var(--space-6);
  }
  
  /* CATEGORY PAGE hero + popular cards (Pablo 2026-07-23): the category page is
     now landing-like — a scoped hero (title + description) over a "Populair in
     deze categorie" card grid, instead of a bare article list (the full list
     lives in the sidebar). Hero title sits between the 36px landing hero and
     the 24px content title. Reuses .hs-doc-section/.hs-card-grid/.hs-doc-card. */
  .hs-cat-hero {
    margin: 0 0 var(--space-8);
    padding: 0 0 var(--space-6);
    border-bottom: 1px solid var(--gray-200);
  }
  /* !important on weight/size/family: HelpScout base carries `h1{font-weight:
     400;font-size:30px}` (and id-scoped #categoryHead h1) which out-specifies a
     plain class — that made the title render Aeonik LIGHT at 30px, reading like
     a different font next to the 700-weight everything-else (Pablo 2026-07-23). */
  .hs-cat-hero-title {
    font-family: var(--font-display) !important;
    font-size: 1.75rem !important;
    line-height: 1.2 !important;
    font-weight: 700 !important;
    color: var(--gray-1000);
    margin: 0 0 var(--space-2);
    text-align: left;
  }
  .hs-cat-hero-desc {
    font-size: 1rem;
    line-height: 1.6;
    color: var(--gray-500);
    max-width: 42rem;
    margin: 0;
  }
  .hs-cat-popular { margin: 0; }
  /* the popular-in-category cards have no description line — center the title
     block vertically so a single-line title card doesn't look top-heavy. */
  .hs-cat-popular .hs-doc-card { justify-content: center; }
  .hs-cat-popular .hs-doc-card-title { margin: 0; }
  
  #searchBar { width: 100%; max-width: 480px; margin: 0; position: relative; z-index: 1; }
  #searchBar .search-query {
    z-index: 1;
    float: none;
    display: block;
    width: 100%;
    box-sizing: border-box;          /* HelpScout's base makes search inputs content-box → text sits high */
    height: 48px;
    line-height: 48px;               /* vertically center the value + placeholder */
    padding: 0 20px 0 46px;
    border: 1px solid var(--gray-200);
    background-color: var(--white);
    background-repeat: no-repeat;
    background-position: 18px center;
    background-size: 18px 18px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23737373' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E");
    border-radius: var(--radius-md);
    font-size: 1rem;                 /* 15→16px: was reading small in the 48px field */
    color: var(--gray-1000);
    transition: border-color var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out);
  }
  #searchBar .search-query:focus {
    outline: none;
    border-color: var(--orange-500);
    box-shadow: 0 0 0 4px var(--orange-100);
  }
  /* Placeholder must match the value's size/leading. HelpScout base carries
     vendor-prefixed placeholder rules (input::-webkit-input-placeholder etc.,
     color-only) — set every variant so the 16px/48px sizing always wins, not
     just the standard ::placeholder (Pablo 2026-07-23: placeholder read small +
     sat high). font-size in px (not rem) to be immune to any root-size shift. */
  #searchBar .search-query::placeholder,
  #searchBar .search-query::-webkit-input-placeholder,
  #searchBar .search-query:-ms-input-placeholder,
  #searchBar .search-query::-ms-input-placeholder,
  #searchBar .search-query:-moz-placeholder,
  #searchBar .search-query::-moz-placeholder {
    color: var(--gray-400);
    font-size: 16px;
    line-height: 48px;
    opacity: 1;                        /* Firefox dims placeholders by default */
  }
  #searchBar button {
    position: absolute;
    top: 0; left: 0;
    width: 44px; height: 46px;
    display: flex; align-items: center; justify-content: center;
    background: transparent; border: 0;
    color: var(--gray-500);
    z-index: 2;
    pointer-events: none; /* decorative — the input itself is the target */
  }
  #searchBar button span { display: none; }
  
  #searchBar .result li:hover { color: var(--white); }
  .icon-article-doc.hs-icon-inline, .sep { display: none; }
  
  /* Landing content spans the FULL main pane (Pablo: full-width, not boxed) —
     the doc-section card grids want the room. LANDING uses the DOUBLE GUTTER
     (var(--space-12) * 2 = 96px) so its content lines up with the ARTICLE/
     CATEGORY content, which sits inside TWO 48px paddings (#contentArea +
     #main-content.span9) and so starts 48px further right. Article prose still
     constrains itself to a reading width (see #fullArticle max-width). */
  #contentArea {
    display: flex;
    flex-direction: column;
    padding: var(--space-8) var(--space-12);
    width: 100%;
    box-sizing: border-box;
    /* HelpScout's base `.container-fluid { max-width:1080px; margin:0 auto }`
       caps + centers #contentArea; on the LANDING view (no #main-content, the
       content sits directly in #contentArea) that would narrow the card grid
       vs our intended full-pane layout. Override to our own content cap. */
    max-width: var(--content-max) !important;
    margin: 0 auto !important;
  }
  /* LANDING-ONLY double gutter: #contentArea directly holding a .hs-doc-section
     is the landing (category/article nest content one level deeper in
     #main-content.span9, gaining an extra 48px). Add that extra 48px here — and
     on the sibling #docsSearch hero — so the landing hero + card grids line up
     left with the article/category content (396px, not 348px). (Was keyed off
     `.category-list` before the "Landing layout" REVISED rework replaced the
     category-card grid with docSections()'s `.hs-doc-section`s — same landing-
     detection role, new selector.) */
  /* desktop only (≥1024px): the double gutter aligns landing content with the
     twice-padded article/category content. Below that the shell is full-width
     and the single mobile gutter already matches — see the mobile block. */
  @media (min-width: 1024px) {
    #contentArea:has(> .hs-doc-section) { padding-left: calc(var(--space-12) * 2); padding-right: calc(var(--space-12) * 2); }
    .hs-main:has(#contentArea > .hs-doc-section) > #docsSearch { padding-left: calc(var(--space-12) * 2); padding-right: calc(var(--space-12) * 2); }
  }
  /* landing #contentArea: no TOP padding — the hero's subtitle margin-bottom
     (24px) is the ONLY gap before the cards (Pablo: don't stack hero padding-
     bottom + content padding-top on top of it). */
  #contentArea:has(> .hs-doc-section) { padding-top: 0 !important; }
  /* No bleed: the intro lives in the padded reading column, aligned with the
     cards and everything else below it. */
  .hs-main > #docsSearch { margin: 0 auto; }   /* centered like #contentArea */
  
  /* (The earlier "Veelgestelde vragen" FAQ band — .most-pop-articles/
     .popArticles — was INVENTED: the real landing page (landing.html) has
     NO such section at all. #contentArea's real content is just
     #noResults + footer.center, plus our own injected .hs-doc-section grids —
     see docSections()/the "Landing layout" REVISED note. Those rules are
     removed, not repointed — there is nothing real to repoint them to.) */
  .hs-icon-inline.hs-icon-doc { color: var(--neutral-400); flex-shrink: 0; display: inline-flex; }
  
  /* ============================================================
     STICKY DOCS HEADER (Pablo, mid-build addition — Cloudflare/Vercel-docs
     reference). Sticky top:0, blur backdrop, thin gray-200 bottom border.
     Left: brand lockup + "Docs" pill + a short 2-item section nav. Right: a
     visual search trigger, ONE primary "Inloggen" button (the orange/dark
     accent). NEW injected chrome (hs-header-*) — header#mainNav.navbar above
     stays real HelpScout markup, still hidden by `.navbar{display:none}`.
     NO theme toggle: grepped this file + head.html for `prefers-color-scheme`/
     `data-theme` before this pivot — neither exists anywhere in the reskin,
     so this pass is LIGHT-ONLY and a toggle for a mode that doesn't exist
     would be dishonest chrome. Revisit if/when dark support is built.
     ============================================================ */
  .hs-header {
    position: sticky;
    top: 0;
    z-index: 1050;
    height: var(--topbar-h);
    background: rgba(255,255,255,0.82);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    border-bottom: 1px solid var(--gray-200);
  }
  .hs-header-inner {
    /* Full-bleed like Cloudflare/Vercel docs (Pablo 2026-07-23): the bar spans
       the whole viewport width; only its content is inset by side padding —
       NOT centered at --content-max the way #contentArea is. */
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0 var(--space-6);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
  }
  .hs-header-left { display: flex; align-items: center; gap: var(--space-3); min-width: 0; }
  .hs-header-brand { flex-shrink: 0; }
  /* (hs-header-pill + hs-header-nav removed — Pablo 2026-07-23: no Docs pill,
     no header nav; Contact is now a button next to Inloggen.) */
  
  .hs-header-right { display: flex; align-items: center; gap: var(--space-2); flex-shrink: 0; }
  .hs-header-search {
    display: flex; align-items: center; gap: var(--space-2);
    height: 34px;
    width: 260px;                 /* wider search trigger (Pablo 2026-07-23) */
    padding: 0 8px 0 10px;
    border: 1px solid var(--gray-200);
    border-radius: var(--radius-md);
    background: var(--white);
    color: var(--gray-500);
    font-family: var(--font-body);
    font-size: 0.8125rem;
    cursor: pointer;
  }
  .hs-header-search:hover { border-color: var(--gray-300); color: var(--gray-900); }
  .hs-header-search-text { white-space: nowrap; margin-right: auto; }  /* text left, kbd pushed to the far right */
  .hs-header-search-kbd {
    font-family: var(--font-mono);
    font-size: 0.6875rem;
    color: var(--gray-500);
    background: var(--gray-100);
    border-radius: 4px;
    padding: 1px 5px;
  }
  .hs-btn {
    display: inline-flex; align-items: center; justify-content: center;
    height: 34px;
    padding: 0 var(--space-4);
    border-radius: var(--radius-md);
    font-family: var(--font-body);
    font-size: 0.8125rem;
    font-weight: 600;
    text-decoration: none !important;
    white-space: nowrap;
    border: 1px solid transparent;
    transition: background var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  /* THE one deliberate warm accent (Pablo: "orange is the rare accent ONLY —
     the primary hero button, the active/selected state, the Aan-de-slag
     start-here emphasis, and link-hover"). Every other button/surface on
     this landing is grayscale. */
  .hs-btn--primary { background: var(--orange-500); color: var(--white) !important; }
  .hs-btn--primary:hover { background: var(--orange-600); text-decoration: none !important; }
  .hs-btn--secondary { background: var(--white); color: var(--gray-900) !important; border-color: var(--gray-200); }
  .hs-btn--secondary:hover { background: var(--gray-50); border-color: var(--gray-300); text-decoration: none !important; }
  .hs-header-login { flex-shrink: 0; }
  .hs-header-menu-toggle {
    display: none;
    align-items: center; justify-content: center;
    width: 34px; height: 34px;
    border: 1px solid var(--gray-200);
    border-radius: var(--radius-md);
    background: var(--white);
    color: var(--gray-700);
    cursor: pointer;
  }
  @media (max-width: 767px) {
    .hs-header-search-text, .hs-header-search-kbd { display: none; }
    .hs-header-search { width: 34px; padding: 0; justify-content: center; }
  }
  @media (max-width: 480px) {
    .hs-header-login span { display: none; }
  }
  
  /* ============================================================
     HERO (Vercel-grade pivot, REVISED 2026-07-23: single-column) — inside
     #docsSearch (real HelpScout element): a balanced headline + subhead +
     search + primary/secondary actions, plus a one-line gray tagline
     underneath (Vercel's "Connect your Git repository…" analog). The
     quick-start PANEL that used to sit beside it (2-col grid) is REMOVED —
     see docSections() below for where "Aan de slag" content now lives (a
     themed card-grid section, not a hero panel). Grayscale surfaces; orange
     only on the ONE primary button + link-hover.
     ============================================================ */
  .hs-hero-row {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-8);
    align-items: start;
  }
  .hs-hero-intro { min-width: 0; max-width: 640px; }
  #docsSearch .hs-hero-title,
  .hs-hero-title {
    color: var(--gray-1000);
    text-wrap: balance;
  }
  .hs-hero-subtitle { color: var(--gray-500); }
  
  .hs-hero-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    margin-top: var(--space-4);
  }
  
  /* one-line gray intro sentence under the hero actions (Vercel's "Connect
     your Git repository…" analog) — quiet, small, never a second headline. */
  .hs-hero-tagline {
    margin: var(--space-4) 0 0;
    color: var(--gray-500);
    font-size: 0.875rem;
  }
  
  /* ============================================================
     SECTION HEADINGS (Vercel anchored-heading idiom) — chunk the page into
     the themed doc sections (docSections()/DOC_SECTIONS below).
     ============================================================ */
  .hs-section { margin: 0 0 var(--space-12); }
  /* Landing type scale is the SAME 3 sizes the article + category pages use:
     1.5rem/24px titles · 1rem/16px body & headings · 0.875rem/14px meta.
     The card sections had drifted to 18/15/13px odd sizes reading small next
     to those pages (Pablo 2026-07-23). Section heading = the body/16px heading
     tier (matches #fullArticle h2), just bolder — not a new size. */
  .hs-section-heading {
    margin: 0 0 var(--space-2) !important;
    font-size: 1rem;                 /* 16px — same tier as #fullArticle h2 */
    font-weight: 700;
    color: var(--gray-1000);
  }
  
  /* Landing per-category section (Pablo 2026-07-23): the heading is a LINK to
     the category (drill in for the full list); the cards below are that
     category's top-N popular articles. The link inherits the heading look with
     a subtle hover, so it reads as "click the category name to see all". */
  .hs-landing-section-heading { margin-bottom: var(--space-3) !important; }
  .hs-landing-section-link {
    color: var(--gray-1000);
    text-decoration: none !important;
    display: inline-flex; align-items: center; gap: 6px;
  }
  .hs-landing-section-link:hover { color: var(--orange-700); }
  .hs-landing-section-link::after {
    content: "→";
    font-size: 0.85em; color: var(--gray-400);
    transition: transform var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
  }
  .hs-landing-section-link:hover::after { color: var(--orange-700); transform: translateX(2px); }
  
  /* ============================================================
     VERCEL-DOCS CARD-GRID SECTIONS (JOURNEY_IA "Landing layout" REVISED
     2026-07-23) — themed anchored sections, each a heading + one-line gray
     intro + a grid of small CORE-ARTICLE cards. Replaces the old quick-start
     panel + "Meest gezocht" ranked list + category-card grid entirely (all
     removed above/below, not merely unused).
     ============================================================ */
  .hs-doc-section { margin: 0 0 var(--space-12); }
  .hs-doc-section:last-child { margin-bottom: 0; }
  
  /* subtle `#` anchor affordance (Vercel idiom): hidden until the heading is
     hovered/focused, then fades in to the LEFT of the heading text. */
  .hs-section-heading--anchored { display: flex; align-items: center; gap: var(--space-2); }
  /* The `#` glyph is hidden — a persistent one is noisy, a hover-only one is
     a "sometimes shows" tease (Pablo 2026-07-23: "either show or don't"). The
     heading still carries its id, so the anchor link still works; it's just
     not a visible affordance. Keep it focusable for keyboard/deep-link use. */
  .hs-section-anchor {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0, 0, 0, 0);
    white-space: nowrap; border: 0;
  }
  
  .hs-doc-section-intro {
    margin: 0 0 var(--space-4);
    color: var(--gray-500);
    font-size: 0.875rem;             /* 14px — the meta tier */
    max-width: 640px;
  }
  
  /* CARD GRID — flat, thin gray border, NO drop-shadow, small MONOCHROME
     icon tile top-left, title + one-line description. Uniform + quiet.
     Hover = a subtle border/bg shift, never a big lift/shadow. 3-up desktop,
     2-up md, 1-up mobile (Vercel "Build with AI" / "Secure your
     applications" card-grid, translated to our tokens). */
  .hs-card-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-4);
    margin: 0;
    padding: 0;
    list-style: none;
  }
  @media (max-width: 1200px) { .hs-card-grid { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 640px)  { .hs-card-grid { grid-template-columns: 1fr; } }
  
  .hs-doc-card {
    width: auto;
    margin: 0;
    padding: var(--space-6);   /* 24px — --space-5 is UNDEFINED (scale jumps 4→6), so it collapsed to 0 */
    background: var(--white);
    display: flex;
    flex-direction: column;
    border-radius: var(--radius-lg);
    border: 1px solid var(--gray-200);
    position: relative;
    cursor: pointer;
    text-decoration: none !important;
    color: inherit;
    transition: border-color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out);
  }
  .hs-doc-card:hover { text-decoration: none !important; border-color: var(--gray-400); background: var(--gray-50); }
  
  .hs-doc-card-icon {
    display: flex; align-items: center; justify-content: center;
    width: 36px; height: 36px;
    border-radius: var(--radius-md);
    background: var(--gray-100);
    color: var(--gray-700);
    margin-bottom: var(--space-3);
  }
  .hs-doc-card-title {
    margin: 0 0 var(--space-1);
    font-family: var(--font-body);
    font-size: 1rem;                 /* 16px — the card's primary text = body tier */
    font-weight: 600;
    color: var(--gray-1000);
  }
  .hs-doc-card-desc {
    margin: 0;
    color: var(--gray-500);
    font-size: 0.875rem;             /* 14px — the meta tier */
    line-height: 1.5;
    flex: 1;
  }
  
  /* ============================================================
     ARTICLE CONTENT (rendered inside .hs-main)
     ============================================================ */
  /* THE KEY MOVE (spacious-desktop rework, 2026-07-22): cap the whole content
     pane at --content-max and CENTER it inside .hs-main via margin-inline:auto
     — otherwise ultra-wide viewports pile 100% of the freed-up space on the
     RIGHT of the (left-aligned) article+TOC grid, reading lopsided. Applies
     to BOTH the article grid AND the category listing (#main-content is real
     on BOTH the category and article pages — REAL_DOM_SPEC; the landing page
     has NO #main-content at all, it never reaches this selector), so the
     whole docs pane is one centered column at any width. Harmless below the
     breakpoint: on mobile #main-content is already full-width and narrower
     than --content-max, so the max-width never bites (also explicitly undone
     under 1024px, see the responsive section, to be unambiguous). */
  /* .row-fluid > #main-content.span9 + aside#sidebar.span3 are REAL
     Bootstrap grid classes from HelpScout's own stylesheet (launch-*.css,
     loaded live — NOT present in the office preview harness, which is why
     this needed an explicit override to be visible there too). head.html's
     JS detaches aside#sidebar entirely (superseded by .hs-sidebar) but
     #main-content — still carrying .span9's float:left/width:75% — would
     otherwise leave a dead 25%-wide gap where the sidebar used to float.
     Neutralize the whole Bootstrap grid pair explicitly rather than fight
     its specificity per-property. */
  .row-fluid, .row-fluid::before, .row-fluid::after { display: block; float: none; width: auto; margin-left: 0; }
  #main-content.span9 { float: none; width: 100%; margin-left: 0; }
  
  #main-content {
    background: none;
    padding: var(--space-8) var(--space-12) 0;
    width: 100%;
    max-width: var(--content-max);
    margin-inline: auto;
    box-sizing: border-box;
  }
  #main-content .contentWrapper { background: none; border: none; padding: 0; }
  #main-content .sort { display: none; }
  #categoryHead { display: none; }
  
  /* article + TOC — a real grid, TOC on the right via `order` (DOM order
     keeps the TOC after the article for screen readers) */
  .hs-article-grid {
    display: grid;
    /* minmax(0, 1fr), NOT bare 1fr: a bare `1fr` track is minmax(auto, 1fr),
       whose `auto` minimum lets an intrinsically-wide child (the mono <pre>
       code block) blow the track out past its container instead of
       shrinking to fit — the exact bug that pushed the whole article
       column (and its title) ~11px past the 390px viewport on mobile,
       silently clipped by body{overflow-x:hidden} rather than scrolling. */
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-16);
    align-items: start;
    max-width: none;
  }
  .hs-article-grid .hs-toc { order: 2; }
  .hs-article-grid #fullArticle { order: 1; }
  @media (min-width: 1200px) {
    .hs-article-grid { grid-template-columns: minmax(0, var(--prose-max)) var(--toc-w); }
  }
  
  /* Category listing page (ul.articleList) spans the FULL main pane — the
     article list wants the room (Pablo). The landing card grid lives in
     #contentArea directly (no #main-content there at all — see #contentArea
     rules above); article prose keeps its readable ~720px width via
     #fullArticle max-width below. (The earlier `.hs-index`/`#text` selectors
     here were invented — the mock used to wrap landing/category content in a
     fake `#main-content.hs-index > #fullArticle > #text`, none of which the
     real DOM has. `.contentWrapper` alone already spans full-width by
     default; the category listing needs no override.) */
  
  #main-content .contentWrapper #fullArticle {
    border: none;
    background: none;
    padding: 0 0 var(--space-6);
    margin-bottom: 0;
    min-height: 0;
    max-width: var(--prose-max);
  }
  
  /* Title sizing/typography only here — LAYOUT (flex sizing within the
     titlerow) is owned by `.hs-article-titlerow .title` below and must win via
     the higher-specificity `#fullArticle .hs-article-titlerow .title` rule, so
     this rule never sets flex/min-width/margin (that used to fight the
     titlerow's own flex intent — same element, two competing layout owners). */
  /* Title is the single largest step at 24px; the flat scale (body/h2/h3/h4
     all 16px) leans on weight for hierarchy. ONLY the h1 title uses the Aeonik
     display font — every in-article heading (h2/h3/h4) is Geist body font
     (Pablo). */
  #fullArticle .title { font-family: var(--font-display); font-weight: 700; font-size: 1.5rem; line-height: 1.3; }
  /* .lu / time: NO border-bottom "underline rule" and NO inline-block display
     here — those belonged to an older beside-the-title header design and are
     what pushed time.lu into a horizontal-rule middle column instead of a
     clean full-width line below the titlerow. Layout (block, full-width,
     spacing, color) now lives ONLY in `.hs-article-header time.lu` below. */
  #fullArticle .lu { font-style: normal; }
  #fullArticle time { font-style: normal; }
  
  /* ---- CONSOLIDATED TYPE SCALE (Linear/Mintlify reference, 2026-07-22) ----
     Body copy collapses to ONE size (16px/1rem) for p/li; headings step down
     to TWO close, lighter-weight sizes (h2 ~20px, h3 ~17px) instead of the
     previous 24px/700 + 20px/700 jump; captions get their own small 12px step.
     Total distinct sizes in the article body: 1rem (body/li), 1.25rem (h2),
     1.0625rem (h3), 0.75rem (captions), 0.857em (inline code, relative). The
     h2/h3 weight override must be scoped to #fullArticle (id+element beats
     plain element-list specificity) to win over the global
     `h1,h2,h3,h4{font-weight:700}` rule above (line ~127). */
  /* Headings ride at BODY size (16px) — hierarchy is carried by WEIGHT and
     the surrounding margin, not size (Pablo, ref: Linear's `<h2 class="font-[550]">`
     at body size). h2 = 16px/650 (heaviest), h3 = 16px/550, h4 = 16px/600. */
  /* body font (Geist) on in-article headings — !important overrides the global
     `h1,h2,h3,h4 { font-family: var(--font-display) !important }` so only the h1
     title stays Aeonik. */
  #fullArticle h2 { font-family: var(--font-body) !important; font-size: 1rem; font-weight: 650; margin: var(--space-12) 0 20px; scroll-margin-top: var(--space-6); }   /* 48px top / 20px bottom (Pablo) */
  /* h3 = HALF h2's top margin (24px vs 48px), same 20px bottom, body color and
     NOT bold (Pablo 2026-07-23) — a quiet subheading that reads like emphasized
     body text, not a second-tier shout, and sits closer to the section above it. */
  #fullArticle h3 { font-family: var(--font-body) !important; font-size: 1rem; font-weight: 400 !important; color: var(--ink-700) !important; margin: var(--space-6) 0 20px; scroll-margin-top: var(--space-6); }
  #fullArticle h4 { font-family: var(--font-body) !important; font-size: 1rem; font-weight: 600; margin: var(--space-4) 0 var(--space-2); scroll-margin-top: var(--space-6); }
  #fullArticle p { margin-bottom: 26px; font-size: 1rem; font-family: var(--font-body); color: var(--ink-700); }
  .contentWrapper p, .contentWrapper ul li, .contentWrapper ol li { font-size: 1rem !important; line-height: 1.65; color: var(--ink-700); }
  /* Prose bullet/number lists get the 1.4em indent. (The real article#fullArticle
     never contains .category-list/.popArticles — those only ever existed in the
     old invented mock — so no :not() exclusion is needed here anymore.) */
  #fullArticle ul,
  #fullArticle ol { margin: 0 0 var(--space-4); padding-left: 1.4em; }
  #fullArticle li { margin-bottom: var(--space-2); }
  
  /* Links — clean thin underline (reference idiom), scoped to the article body
     only so nav/sidebar/toolbar links elsewhere are unaffected. Brand orange
     text kept; the underline itself is muted so it doesn't repeat the same
     loud orange twice. */
  #fullArticle a {
    /* body-text color, distinguished ONLY by the underline (Pablo) — not
       orange. Reads as inline text with a clean underline affordance. */
    color: var(--ink-700);
    text-decoration: underline;
    text-underline-position: from-font;
    text-decoration-thickness: 0.08em;
    text-decoration-color: var(--neutral-400);
  }
  /* No color change on hover — the static underline is the only affordance. */
  #fullArticle a:hover { color: var(--ink-700); text-decoration-color: var(--neutral-400); }
  
  /* Images — framed card: hairline border all around, white background,
     generous internal padding, larger radius, subtle shadow (reference:
     rounded-xl border border-gray-400 bg-white shadow-sm). */
  #fullArticle img {
    display: block; max-width: 100%; max-height: 600px; width: auto; height: auto;
    margin: var(--space-8) 0 var(--space-12); object-fit: contain; border: 1px solid var(--neutral-200) !important;
    background: var(--white);
    border-radius: var(--radius-lg); padding: var(--space-4) !important; cursor: pointer;
    /* NOT a drop shadow (--shadow-sm floated weirdly) — the Linear/Vercel
       "shadow-border-small" idiom: a crisp hairline ring + a whisper of depth,
       reads as a clean framed edge, not a floating card (Pablo). */
    box-shadow: 0 0 0 1px rgba(32, 45, 57, 0.06), 0 1px 2px rgba(32, 45, 57, 0.05);
  }
  /* Image captions — a <p> immediately after an image: small, centered, muted
     (reference: text-xs text-gray-1000, 12px). Future-proof: no caption <p>
     exists in the current preview markup yet, this rule is harmless until one
     does. */
  #fullArticle img + p {
    font-size: 0.75rem;
    text-align: center;
    color: var(--neutral-500);
    margin-top: var(--space-2);
  }
  
  /* code blocks — LIGHT "github-light" chrome (Pablo): white background,
     hairline border, near-ink text; both the <pre> block and inline <code>.
     NOTE: no tokenized syntax highlighting yet — that needs a client-side
     highlighter vendored into head.html (CDNs banned, Rule #1) AND a per-block
     language from HelpScout's editor; scoped as a separate follow-up. Colors
     here mirror github-light (bg #fff, border --neutral-200, text #24292e). */
  #fullArticle pre, #fullArticle code { font-family: var(--font-mono); font-size: 0.875rem; }
  #fullArticle pre {
    background: var(--white);
    color: #24292E;
    border: 1px solid var(--neutral-200);
    border-radius: var(--radius-lg);
    padding: var(--space-4) var(--space-6);
    overflow-x: auto;
    margin: var(--space-8) 0 var(--space-12);   /* 32px top / 48px bottom — same widget rhythm as img/table (Pablo) */
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
  }
  #fullArticle code {
    background: var(--white);
    color: #24292E;
    border: 1px solid var(--neutral-200);
    padding: 2px 4px;
    border-radius: var(--radius-sm);
    font-size: 0.857em;
  }
  #fullArticle pre code { background: none; color: inherit; border: none; padding: 0; border-radius: 0; font-size: inherit; }
  
  #fullArticle blockquote {
    border-left: 3px solid var(--orange-200);
    margin: var(--space-8) 0 var(--space-12);   /* 32px top / 48px bottom — widget rhythm */
    padding: var(--space-1) var(--space-4);
    color: var(--neutral-500);
  }
  
  /* ---- "Op deze pagina" TOC — sticky, like a real Mintlify right rail ---- */
  .hs-toc {
    padding: 0 0 0 var(--space-2);
    position: sticky;
    top: var(--space-8);
    align-self: start;
    max-height: calc(100vh - var(--space-16));
    overflow-y: auto;
  }
  .hs-toc strong {
    display: block;
    font-family: var(--font-display);
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--neutral-400);
    margin-bottom: var(--space-3);
  }
  .hs-toc ul { list-style: none; margin: 0; padding: 0; border-left: 1px solid var(--neutral-200); }
  .hs-toc li { margin-bottom: var(--space-1); }
  .hs-toc li.h3 { padding-left: var(--space-3); }
  .hs-toc a {
    color: var(--neutral-500);
    font-size: 0.875rem;   /* 14px (Pablo) */
    line-height: 1.4;
    display: block;
    padding: var(--space-1) 0 var(--space-1) var(--space-3);
    margin-left: -1px;
    border-left: 1px solid transparent;
    transition: color var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
  }
  .hs-toc a:hover { color: var(--orange-700); text-decoration: none; }
  .hs-toc a.hs-toc-active { color: var(--orange-700); border-left-color: var(--orange-500); font-weight: 600; }
  @media (min-width: 1200px) {
    .hs-toc { display: block; position: sticky; top: var(--space-6); max-height: calc(100vh - var(--space-12)); overflow-y: auto; }
  }
  
  /* ============================================================
     SEARCH RESULTS DROPDOWN (#serp-dd)
     ============================================================ */
  #serp-dd {
    background-color: var(--white);
    box-shadow: var(--shadow-md);
    border: 1px solid var(--neutral-200);
    border-radius: var(--radius-md);
    width: 100%;
    padding: var(--space-2);
  }
  #serp-dd:after, #serp-dd:before { display: none; }
  #serp-dd .result a { color: var(--ink-900); font-size: 0.9375rem; border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); }
  #serp-dd .result .active a { color: var(--white); background-color: var(--orange-500); }
  #serp-dd .result li a:hover { color: var(--orange-700); background: var(--surface-subtle); }
  
  /* ============================================================
     CATEGORY LISTING PAGE (article list under a category)
     ============================================================ */
  /* NOTE: #categoryHead is reused by HelpScout for TWO different page types —
     it renders (hidden, .lu/.title carry the real heading instead) on the
     ARTICLE page, but is the real page title on the CATEGORY LISTING page
     (an article list under one category, marked by the presence of
     .articleList alongside it). The unscoped `#categoryHead{display:block}`
     this section used to carry unconditionally OVERRODE the article page's
     `#categoryHead{display:none}` above (same specificity, later in the
     cascade) — #categoryHead was rendering as a normal grid item on the
     ARTICLE page too, which silently ate one of .hs-article-grid's two
     columns and pushed #fullArticle into the TOC's track. Scoped to
     :has(.articleList) so it only actually applies on the listing page. */
  .contentWrapper:has(#categoryHead) { background: transparent; border: none; padding: 0; margin: 0; }
  #categoryHead h1 { font-size: 1.5rem; line-height: 1.3; font-weight: 700; color: var(--ink-900); margin-bottom: var(--space-2); }   /* 24px — same title scale as article + landing hero */
  #categoryHead .descrip { display: none; }
  .contentWrapper:has(.articleList) #categoryHead { display: block; margin-bottom: var(--space-6); }
  
  .contentWrapper:has(#categoryHead) .articleList { list-style: none; padding: 0; margin: 0; }
  .contentWrapper:has(#categoryHead) .articleList li {
    border-radius: var(--radius-md);
    border: 1px solid var(--neutral-200);
    transition: transform var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out);
    background: var(--white);
    margin: 0 0 var(--space-2);
    padding: 0;
  }
  .contentWrapper:has(#categoryHead) .articleList li a { display: flex; align-items: center; padding: var(--space-4); min-height: 44px; }
  .contentWrapper:has(#categoryHead) .articleList li a:hover,
  .contentWrapper:has(#categoryHead) .articleList li a:hover span { text-decoration: none; }
  .contentWrapper:has(#categoryHead) .articleList li:hover { transform: translateY(-2px); box-shadow: var(--shadow-xs); border-color: var(--neutral-300); }
  
  .contentWrapper:has(#categoryHead) .articleList li .hs-icon-inline {
    width: 36px; height: 36px;
    background-color: var(--orange-50);
    border-radius: var(--radius-md);
    display: flex; align-items: center; justify-content: center;
    margin-right: var(--space-3);
    color: var(--orange-600);
    flex-shrink: 0;
  }
  .contentWrapper:has(#categoryHead) .articleList li span:last-child { font-size: 0.9375rem; font-weight: 600; color: var(--ink-900); }
  
  /* ============================================================
     RATE WIDGET ("Was dit nuttig?") — REAL structure (REAL_DOM_SPEC lines
     314-337): div.articleRatings[data-article-url] > span.articleRatings-question
     + span.articleRatings-feedback (post-rating thank-you, HelpScout's own
     show/hide) + span.articleRatings-failure (error state) +
     div.articleRatings-actions > button.rateAction.rateAction--positive/
     --negative > span.sr-only + span.rating-face. NOT <a> tags — real
     buttons; NOT a <p> — a <span> for the question text.
     ============================================================ */
  /* Selectors NOT scoped under .contentWrapper — HelpScout renders these as
     siblings of it, so requiring that ancestor left them unstyled (Pablo). */
  /* NOT a card (Pablo): no background/border/padding — just a right-aligned
     row. The question text sits at the END of the row, left of the two
     thumb buttons; only the buttons carry the white bg. */
  .articleRatings {
    display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: var(--space-3);
    background: none !important;
    border: none !important;
    border-radius: 0 !important;
    color: var(--ink-700);
    margin: var(--space-8) 0 0 !important;
    padding: 0 !important;
    font-size: 0.9375rem;
    box-shadow: none !important;
  }
  .articleRatings-question { margin: 0; font-weight: 600; color: var(--ink-900); }
  /* HelpScout toggles these itself post-submit (JS we don't own/replace) —
     hidden by default so they never show as stray text before a rating. */
  .articleRatings-feedback, .articleRatings-failure { display: none; }
  .articleRatings-feedback-message { font-size: 0.875rem; color: var(--success); }
  .articleRatings-actions { display: flex; align-items: center; gap: var(--space-2); }
  .rateAction {
    transition: border-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out);
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; margin: 0 !important;
    border: 1px solid var(--neutral-200); border-radius: var(--radius-md);
    color: var(--neutral-500); background: var(--white);
    cursor: pointer; font: inherit;
  }
  .rateAction .rating-face { display: inline-flex; background: none !important; width: auto !important; height: auto !important; border-radius: 0 !important; color: inherit !important; }
  .rateAction--positive:hover { border-color: var(--success); color: var(--success); background: color-mix(in srgb, var(--success) 8%, var(--white)); }
  .rateAction--negative:hover { border-color: var(--danger); color: var(--danger); background: color-mix(in srgb, var(--danger) 8%, var(--white)); }
  /* (was margin-left:auto to split text-left / buttons-right when this was a
     card; now the whole row is right-aligned via justify-content:flex-end, so
     the buttons must NOT absorb the free space — removed.) */
  
  /* Pagination + the HelpScout "Mogelijk gemaakt door" footer are hidden
     (Pablo: pointless in this context). */
  .pagination { display: none !important; }
  footer { display: none !important; }
  
  /* ============================================================
     BREADCRUMB STRIP — article + category views only (landing has none,
     you're home). Sits at the TOP of the reading column, above the existing
     article header (eyebrow stays as-is, unchanged) — full content-width,
     not full-page-width, since it lives inside #fullArticle/.contentWrapper
     which already carries #main-content's padding + the prose max-width.
     ============================================================ */
  /* Breadcrumb now DOUBLES AS the eyebrow (the separate .hs-article-eyebrow
     that repeated the category name was removed — Pablo). So it carries the
     eyebrow's character: small, and the clickable crumbs in the brand orange
     at weight 600, like the old eyebrow label; the current (last) crumb sits
     in ink; separators are muted. */
  .hs-breadcrumb {
    display: flex; align-items: center; flex-wrap: wrap;
    gap: var(--space-1);
    margin: 0 0 var(--space-3);
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.01em;
    font-family: var(--font-body);
    color: var(--neutral-500);
  }
  /* Breadcrumb crumbs render IDENTICALLY on article + category: crumb LINKS are
     body-text color (ink) with a thin underline — NOT orange (Pablo); the
     current (last) crumb is ink, no underline. Scoped with #fullArticle too so
     the article-page breadcrumb (injected inside #fullArticle) doesn't get a
     different look from the category one. */
  .hs-breadcrumb-crumb,
  #fullArticle a.hs-breadcrumb-crumb {
    color: var(--ink-700) !important;
    text-decoration: underline !important;
    text-decoration-thickness: 0.08em;
    text-underline-position: from-font;
    text-decoration-color: var(--neutral-400) !important;
  }
  .hs-breadcrumb-crumb--current,
  #fullArticle span.hs-breadcrumb-crumb--current {
    color: var(--ink-700) !important;
    font-weight: 600;
    text-decoration: none !important;
  }
  .hs-breadcrumb-sep { display: inline-flex; align-items: center; color: var(--neutral-300); }
  
  /* ============================================================
     ARTICLE HEADER (Mintlify: eyebrow category, title + copy-page, subline)
     ============================================================ */
  /* Hairline rule below the whole header (eyebrow/title/copy/time) separating
     it from the article body — restored per Pablo; sits under the time line on
     both mobile and desktop. */
  .hs-article-header {
    margin-bottom: var(--space-8);
    padding-bottom: var(--space-6);
    border-bottom: 1px solid var(--neutral-200);
  }
  /* (.hs-article-eyebrow removed — it repeated the category name the
     breadcrumb already shows; the breadcrumb now carries that label. See the
     .hs-breadcrumb block above.) */
  .hs-article-titlerow {
    display: flex; align-items: flex-start; justify-content: space-between;
    gap: var(--space-4); width: 100%;
  }
  /* Raised specificity (id + 2 classes) so this BEATS `#fullArticle .title`
     (id + 1 class) — same <h1 class="title"> element is targeted by both;
     this is the one that must own layout (flex sizing inside the row). */
  #fullArticle .hs-article-titlerow .title { margin: 0; flex: 1 1 auto; min-width: 0; }
  /* head.html's JS (`$time.insertAfter($title)`, not editable from here) moves
     time.lu to be a DOM sibling of h1.title INSIDE .hs-article-titlerow's flex
     row — which put it beside the title as a flex item instead of below it.
     `flex-basis: 100%` on a flex child forces it onto its own new flex line
     (a standard flex-wrap trick) regardless of where it sits in the DOM, and
     `order: 1` guarantees that line renders AFTER the title+copy-button line
     even though it's not the last DOM child — so this one rule set is correct
     whether time.lu ends up inside the titlerow (the actual runtime case) or
     as a plain block sibling below it (the static-HTML case, where flex
     properties on a non-flex-item are simply ignored and display:block still
     applies). */
  .hs-article-titlerow { flex-wrap: wrap; }
  .hs-article-header time.lu {
    display: block; width: 100%; flex: 1 0 100%; order: 1;
    margin-top: var(--space-2);
    font-size: 0.875rem; color: var(--neutral-500);
  }
  /* (.hs-article-lead / .hs-cat-articles / .hs-cat-article* removed — all
     INVENTED selectors from the earlier mock. The real category page's lead
     text is p.descrip (hidden below, the breadcrumb carries that role
     instead — see #categoryHead .descrip{display:none}); its real article
     list is ul.articleList, already styled in the "CATEGORY LISTING PAGE"
     section further down via `.contentWrapper:has(#categoryHead) .articleList`.
     Nothing here needed repointing beyond what already existed.) */
  /* HelpScout's own #categoryHead is superseded by the breadcrumb-as-eyebrow
     on the ARTICLE view (where it never legitimately renders); on the
     CATEGORY view it IS the real page title and is shown again below via
     `.contentWrapper:has(.articleList) #categoryHead { display: block }`. */
  #categoryHead { display: none; }
  
  /* Copy-page split button + dropdown */
  /* margin:0 !important — HelpScout's base CSS carries generic button/div
     spacing (e.g. `button{position:absolute;...}`, `.btn{margin}`) that can leak
     a stray margin onto the copy-page control and its buttons; zero it so the
     split button sits flush in the title row (Pablo). */
  .hs-copy-page { position: relative; flex-shrink: 0; display: flex; margin: 0 !important; }
  .hs-copy-page__main, .hs-copy-page__more { margin: 0 !important; position: static !important; }
  .hs-copy-page__main, .hs-copy-page__more {
    display: inline-flex; align-items: center; gap: var(--space-2);
    height: 36px; padding: 0 var(--space-3);
    border: 1px solid var(--neutral-200); background: var(--white);
    color: var(--ink-700); font-size: 0.875rem; font-weight: 500; cursor: pointer;
    font-family: var(--font-body);
  }
  .hs-copy-page__main { border-radius: var(--radius-md) 0 0 var(--radius-md); }
  .hs-copy-page__more { border-radius: 0 var(--radius-md) var(--radius-md) 0; border-left: 0; padding: 0 var(--space-2); }
  .hs-copy-page__main:hover, .hs-copy-page__more:hover { background: var(--surface-subtle); }
  .hs-copy-page__menu {
    position: absolute; top: calc(100% + 6px); right: 0; z-index: 20;
    min-width: 300px; max-width: 340px; padding: var(--space-1);
    background: var(--white); border: 1px solid var(--neutral-200);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-md);
    display: flex; flex-direction: column; gap: 2px;
  }
  .hs-copy-page__menu[hidden] { display: none; }
  /* Mintlify-style rich menu item: icon TILE + (title + description) stack.
     The ChatGPT/Claude items are <a> inside #fullArticle, so scope with
     #fullArticle + !important to beat `#fullArticle a` (orange/underline) —
     all three items render IDENTICALLY: neutral ink, no underline. */
  #fullArticle .hs-copy-page__item {
    display: flex; align-items: flex-start; gap: var(--space-3); width: 100%;
    padding: var(--space-2) var(--space-3); border: 0; background: none;
    border-radius: var(--radius-md); color: var(--ink-700) !important;
    font-family: var(--font-body); text-align: left; cursor: pointer;
    text-decoration: none !important;
  }
  #fullArticle .hs-copy-page__item:hover {
    background: var(--surface-subtle);
    text-decoration: none !important;
    color: var(--ink-700) !important;
  }
  /* icon in a small bordered tile (the Mintlify look) */
  .hs-copy-page__item-icon {
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0; margin-top: 2px;
    width: 30px; height: 30px;
    border: 1px solid var(--neutral-200); border-radius: var(--radius-sm);
    color: var(--ink-700);
  }
  .hs-copy-page__item-icon svg { width: 16px; height: 16px; }
  .hs-copy-page__item-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
  .hs-copy-page__item-title { font-size: 0.875rem; font-weight: 600; color: var(--ink-900); line-height: 1.3; }
  .hs-copy-page__item-desc { font-size: 0.75rem; color: var(--neutral-500); line-height: 1.3; }
  @media (max-width: 640px) {
    /* Mobile header: title + a COMPACT ICON-ONLY copy button share row 1
       (title takes the room, copy is a small trailing square); the time line
       wraps to its own row below via its flex-basis:100% trick. The title
       must keep flex:1 1 auto + min-width:0 so it fills the row and wraps
       NORMALLY (word-wrap), never collapsing to one-word-per-line. Keep
       flex-wrap:wrap (the time-line wrap depends on it). (Pablo: the old
       stacked full-width "Kopieer pagina" button read awkward.) */
    .hs-article-titlerow { align-items: flex-start; gap: var(--space-3); }
    .hs-copy-page { align-self: flex-start; }
    .hs-copy-page__main span { display: none; }           /* hide "Kopieer pagina" label */
    .hs-copy-page__main { padding: 0; width: 36px; justify-content: center; gap: 0; }
    .hs-copy-page__menu { min-width: 200px; }              /* keep the dropdown usable */
  }
  
  /* ============================================================
     FOOTER — HelpScout's real footer.center (landing, REAL_DOM_SPEC lines
     145-159: p > © + a[KeurigOnline] + "2026." + span"Powered by"+a[Help
     Scout]) is fully hidden above (`footer { display: none !important }`,
     Pablo: pointless in this context, the shell's own sidebar footer exits
     already cover navigation). The dead per-child overrides that used to
     live here (targeting an invented `#text` node that never existed in
     the real footer markup) are removed — there is nothing to repoint them
     to once the whole element is hidden.
     ============================================================ */
  .articleFoot { display: none; }
  
  /* HelpScout's real print link (a.printArticle, REAL_DOM_SPEC line 246) sits
     as a bare sibling of h1.title in the article body — not part of the
     invented mock before, genuinely real markup this time. Hidden: the
     copy-page split button (injected by head.html, just above the title)
     already covers "do something with this page" duty in the Mintlify
     design, and an unstyled loose print-icon link floating in the prose
     would look broken rather than intentional. Print itself still works via
     the browser's own Ctrl/Cmd+P if ever needed — nothing is lost, only this
     redundant entry point. */
  #fullArticle > a.printArticle { display: none; }
  
  /* ============================================================
     ICONS — sizing/color only (markup is inline SVG from head.html)
     ============================================================ */
  .hs-icon-inline { display: inline-flex; align-items: center; justify-content: center; color: var(--ink-700); }
  
  /* .sr-only is normally defined by HelpScout's own Bootstrap-based
     stylesheet (launch-*.css, loaded live) — the real ratings buttons
     (button.rateAction > span.sr-only"Yes"/"No") and the mobile navbar
     toggle both use it. Defined here too, defensively: the office preview
     harness does NOT load that external stylesheet at all, so without this
     rule the "Yes"/"No" labels render as visible text next to the thumb
     icons (a preview-only discrepancy, not a live bug) — belt-and-braces
     since visually-hidden-but-accessible text is correct either way. */
  .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;
  }
  
  /* ============================================================
     COMMAND-PALETTE SEARCH MODAL (Pablo — mirrors the client portal's
     Base/Modal + Base/CommandPalette; genuinely new surface here, styled
     from the same DESIGN.md tokens as the rest of this reskin). z-index
     above EVERYTHING else on this page, including the image lightbox
     modal (1300) — the palette is the top-most overlay of the docs shell.
     ============================================================ */
  .hs-palette-overlay {
    position: fixed;
    inset: 0;
    z-index: 1400;
    display: flex;
    justify-content: center;
    align-items: flex-start;
    padding-top: 12vh;
    background: rgba(32, 45, 57, 0.4);
  }
  .hs-palette-overlay[hidden] { display: none !important; }
  
  /* body scroll-lock while the palette is open (toggled via .hs-palette-open) */
  body.hs-palette-open { overflow: hidden; }
  
  .hs-palette {
    position: relative;
    width: 100%;
    max-width: 640px;
    margin: 0 var(--space-4);
    max-height: min(600px, 80vh);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    background: var(--white);
    border: 1px solid var(--neutral-200);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-md);
    font-family: var(--font-body);
    color: var(--ink-900);
  }
  
  .hs-palette-input-row {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-4) var(--space-6);
    border-bottom: 1px solid var(--neutral-200);
    flex-shrink: 0;
  }
  .hs-palette-search-icon { color: var(--neutral-500); flex-shrink: 0; display: flex; }
  .hs-palette-input {
    flex: 1;
    min-width: 0;
    border: none;
    outline: none;
    background: transparent;
    font: inherit;
    font-family: var(--font-body);
    font-size: 1rem;
    color: var(--ink-900);
  }
  .hs-palette-input::placeholder { color: var(--neutral-400); }
  .hs-palette-input:focus,
  .hs-palette-input:focus-visible {
    outline: none !important;
    border: none !important;
    box-shadow: none !important;
  }
  .hs-palette-esc-hint {
    flex-shrink: 0;
    font-family: var(--font-mono);
    font-size: 0.7rem;
    color: var(--neutral-500);
    background: var(--neutral-100);
    border: 1px solid var(--neutral-200);
    border-radius: var(--radius-sm);
    padding: 2px 6px;
  }
  
  .hs-palette-body {
    overflow-y: auto;
    padding: var(--space-2) 0;
  }
  
  .hs-palette-group-label {
    padding: var(--space-2) var(--space-6);
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--neutral-500);
  }
  
  .hs-palette-item {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-6);
    color: var(--ink-900);
    text-decoration: none !important;
    cursor: pointer;
  }
  .hs-palette-item:hover,
  .hs-palette-item--active {
    background: var(--orange-50);
  }
  .hs-palette-item .hs-icon-inline,
  .hs-palette-item svg {
    flex-shrink: 0;
    color: var(--neutral-500);
  }
  .hs-palette-item--active svg,
  .hs-palette-item:hover svg {
    color: var(--orange-600);
  }
  .hs-palette-item-text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1;
  }
  .hs-palette-item-title {
    font-size: 0.9rem;
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .hs-palette-item-snippet {
    font-size: 0.8rem;
    color: var(--neutral-500);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .hs-palette-item-category {
    margin-left: auto;
    flex-shrink: 0;
    font-size: 0.78rem;
    color: var(--neutral-500);
  }
  
  .hs-palette-status {
    padding: var(--space-4) var(--space-6);
    font-size: 0.85rem;
    color: var(--neutral-500);
  }
  .hs-palette-status--error { color: var(--danger); }
  
  @media (max-width: 640px) {
    .hs-palette-overlay { padding-top: 4vh; }
    .hs-palette { max-height: 90vh; }
  
    /* ---- FULL-BLEED media on mobile (Pablo) ----
       Below 640px, block MEDIA (images, code blocks, blockquotes) breaks OUT
       of #main-content's 16px side padding to sit edge-to-edge; TEXT stays in
       the normal reading gutter.
       IMPORTANT — NOT `100vw`: `100vw` INCLUDES the scrollbar width, so on any
       device that shows a scrollbar the media becomes ~16px wider than the
       content area and creates a horizontal scrollbar (the exact bug Pablo
       saw). Instead break out by exactly #main-content's known side padding
       (var(--space-4) = 16px) via negative margins + width:calc(100% + 32px).
       #fullArticle's content-box width already equals the viewport minus that
       16px gutter (contentWrapper padding is 0), so +16px each side lands on
       the true content edges — never past the scrollbar. Scrollbar-safe. */
    #fullArticle img,
    #fullArticle pre,
    #fullArticle blockquote,
    #fullArticle table {
      /* !important on the margins: the base-neutralization block later in the
         file sets `#fullArticle table { margin:0 !important }`, which would
         otherwise cancel this full-bleed shift on mobile. */
      margin-left: calc(-1 * var(--space-4)) !important;
      margin-right: calc(-1 * var(--space-4)) !important;
      width: calc(100% + var(--space-4) * 2) !important;
      max-width: calc(100% + var(--space-4) * 2) !important;
      border-radius: 0 !important;
      box-sizing: border-box;
    }
    /* table on mobile: wrap it so it can go full-bleed. A bare <table> shrinks
       to content and won't honour width:calc(100%+32px); the wrapper (a block)
       does, so the negative-margin bleed lands on the WRAPPER and the table
       fills it at table-layout:fixed. head.html wraps every #fullArticle table
       in .hs-table-wrap for exactly this. Cells wrap long text (no h-scroll). */
    #fullArticle .hs-table-wrap {
      margin-left: calc(-1 * var(--space-4)) !important;
      margin-right: calc(-1 * var(--space-4)) !important;
      width: calc(100% + var(--space-4) * 2) !important;
      max-width: calc(100% + var(--space-4) * 2) !important;
    }
    #fullArticle .hs-table-wrap table {
      width: 100% !important;
      table-layout: fixed !important;
      margin: 0 !important;
      border-left: 0 !important;
      border-right: 0 !important;
      border-radius: 0 !important;
    }
    #fullArticle th, #fullArticle td { word-break: break-word !important; }
    /* image: edge-to-edge, keep only top/bottom hairline as a separator,
       drop the side border + inner side padding + the framed-card shadow */
    #fullArticle img {
      border-left: 0 !important;
      border-right: 0 !important;
      padding: 0 !important;
      box-shadow: none;
      max-width: 100vw;
    }
    /* code block: keep its own internal padding (readable gutter for the code
       text itself) but only top/bottom border, so the block spans full width */
    #fullArticle pre {
      border-left: 0;
      border-right: 0;
    }
    /* blockquote: full-width band; keep the left accent bar, add the reading
       gutter back as internal padding so its text still lines up with body text */
    #fullArticle blockquote {
      padding-left: var(--space-4);
      padding-right: var(--space-4);
    }
  }
  
  /* ============================================================
     IMAGE LIGHTBOX MODAL
     ============================================================ */
  .modal {
    display: none; position: fixed; z-index: 1300; padding-top: var(--space-16);
    left: 0; top: 0; width: 100%; height: 100%; overflow: auto;
    background-color: rgba(32, 45, 57, 0.75);
  }
  .modal-content { margin: auto; display: block; max-width: 85%; max-height: 85%; border-radius: var(--radius-md); }
  .close {
    position: absolute; top: var(--space-4); right: var(--space-6);
    color: var(--white); display: flex; cursor: pointer;
  }
  .close:hover { color: var(--neutral-300); }
  
  /* ============================================================
     DECORATIVE CONFETTI — brand-toned accent, hero band only,
     restrained opacity so it reads as a deliberate flourish.
     ============================================================ */
  .confetti-group {
    position: absolute;
    width: 50%;
    max-width: 640px;
    height: 260px;
    top: 0;
    right: -6%;
    opacity: 0.10;
    pointer-events: none;
    z-index: 0;
  }
  
  /* ============================================================
     RESPONSIVE
     ============================================================ */
  
  /* ≥1200px: TOC visible, sidebar always visible+static (desktop) */
  
  /* <1200px: TOC hides (Mintlify rule: right rail drops first) */
  @media (max-width: 1199px) {
    .hs-toc { display: none; }
  }
  
  /* <1024px: sidebar becomes an off-canvas drawer, topbar appears */
  @media (max-width: 1023px) {
    /* Below 1024px the ORIGINAL mobile chrome runs (topbar + mobile-nav). The
       new desktop sticky .hs-header is HIDDEN here (Pablo 2026-07-23: "two top
       bars below 1024px" — the new header was double-stacking on the original
       topbar). Mobile = exactly as it was before the header addition. */
    .hs-header { display: none; }
    .hs-topbar { display: flex; }
    .hs-mobile-nav { display: block; position: sticky; top: var(--topbar-h); z-index: 1090; background: var(--white); border-bottom: 1px solid var(--neutral-200); }
    .hs-shell { display: block; }
  
    /* Cloudflare-docs-style mobile drawer (Pablo 2026-07-23): full-height
       slide-in panel, white card bg, sticky panel-header (brand + close X),
       a dark overlay. Wider than the old 320px to fit the grouped nav. */
    .hs-sidebar {
      position: fixed;
      top: 0; left: 0; bottom: 0;
      z-index: 1200;
      width: 100%;                 /* FULL-WIDTH drawer (Pablo 2026-07-23) */
      max-width: 100%;
      max-height: 100vh;
      background: var(--white);
      transform: translateX(-100%);
      transition: transform var(--dur-base) var(--ease-out);
    }
    .hs-sidebar--open { transform: translateX(0); }
    /* re-enabled as the drawer's sticky panel header (brand + close) */
    .hs-sidebar-header {
      display: flex; align-items: center; justify-content: space-between;
      position: sticky; top: 0; z-index: 1;
      margin: 0; padding: var(--space-3) var(--space-4);
      background: var(--white);
      border-bottom: 1px solid var(--gray-200);
    }
    .hs-sidebar-close {
      display: flex; align-items: center; justify-content: center;
      width: 32px; height: 32px; border: 0; border-radius: var(--radius-md);
      background: transparent; color: var(--gray-700); cursor: pointer;
      transition: background var(--dur-fast, 120ms), color var(--dur-fast, 120ms);
    }
    .hs-sidebar-close:hover { background: var(--gray-100); color: var(--gray-1000); }
    .hs-sidebar-close:focus-visible { outline: 2px solid var(--orange-500); outline-offset: 2px; }
  
    .hs-sidebar-scrim {
      display: none;
      position: fixed; inset: 0; z-index: 1150;
      background: rgba(0,0,0,0.4);
    }
    .hs-sidebar-scrim--visible { display: block; }
  
    .hs-main { width: 100%; }
    #contentArea { padding-left: var(--space-4); padding-right: var(--space-4); }
    /* explicitly undo the desktop centering/cap below 1024px — #main-content
       is already full-width here, this just removes any doubt/ambiguity. */
    #main-content { max-width: none; margin-inline: 0; padding-left: var(--space-4); padding-right: var(--space-4); }
  }
  
  @media (max-width: 767px) {
    /* keep the same 16px horizontal gutter as #contentArea on mobile so the
       hero title lines up with the cards */
    /* mobile: match the article/category title position (top 81px, left 32px).
       Article title top = #main-content 16px pad + breadcrumb strip; reproduce
       that with padding-top here (landing has no breadcrumb). Left gutter 32px
       = the mobile 16px content gutter + the extra 16px the article's
       #main-content adds, so the landing hero lines up with the article title. */
    #docsSearch { padding: 81px var(--space-8) var(--space-6); max-width: none; }
    .hs-hero-title { font-size: 1.5rem; }
    .hs-card-grid { padding-top: var(--space-4); margin-bottom: var(--space-12); gap: var(--space-3); }
    #main-content { padding-top: var(--space-4); }
    .modal { left: 0; }
  }
  
  @media (max-width: 460px) {
    #searchBar .search-query { height: 46px; }
  }
  
  /* min touch target on chrome controls (not the sidebar category tree — its
     rows are a deliberate 36px h-9 on desktop, Vercel idiom). */
  .hs-sidebar-footer-link, .hs-mobile-nav-item, .hs-topbar-search,
  .contentWrapper .pagination li a, .rateAction, .hs-topbar-toggle {
    min-height: 44px;
  }
  /* The sidebar nav rows are 36px on desktop but grow to a 44px touch target
     on coarse (touch) pointers, where thumb accuracy needs it. */
  @media (pointer: coarse) {
    .hs-nav-list a, .hs-nav-tree-row, .hs-nav-tree-articles a { min-height: 44px; height: auto; }
  }
  .hs-nav-list a { display: flex; align-items: center; }
  
  /* ============================================================
     HELPSCOUT BASE NEUTRALIZATION — MUST BE LAST
     help.keurigonline.nl loads HelpScout's own base CSS (launch-*.css)
     BEFORE this file. That base sets HelpScout's defaults (body 12px,
     element colors #333/#585858/#222/#b3b3b3, centered categories, 8px
     table cells, a shadow on .rateAction, negative margins, etc.) — many
     at id/element specificity that beats our class rules. This block, LAST
     in the cascade + !important, forcibly re-asserts our design over ALL of
     them so the reskin renders identically with or without the base loaded
     (Pablo: "override all of it"). Grouped by the conflict classes the
     full computed-style diff surfaced.
     ============================================================ */
  
  /* 1. TYPE INHERITANCE — base body{font-size:12px} leaks into every
     container. Re-assert our 16px/1.6 baseline on the shell + content roots. */
  body,
  .hs-shell, .hs-sidebar, .hs-main, #contentArea, .row-fluid, #main-content,
  .hs-toc, .articleFoot, footer, .contentWrapper {
    font-size: 16px !important;
    line-height: 1.6 !important;
  }
  
  /* 2. CONTENT TYPOGRAPHY — base sets #fullArticle{font-size:14px;color:#585858}
     and per-element colors; re-assert our scale + ink colors (the design the
     typography pass established: 16px body, 24px title, 16px weighted headings,
     ink-700 body text). */
  #fullArticle, #fullArticle ul, #fullArticle ol, #fullArticle table,
  #fullArticle th, #fullArticle td {
    font-size: 16px !important;
    line-height: 1.65 !important;
    color: var(--ink-700) !important;
  }
  #fullArticle .title { color: var(--ink-900) !important; }
  #fullArticle h2, #fullArticle h3, #fullArticle h4 { color: var(--ink-900) !important; line-height: 1.3 !important; }
  #fullArticle p { color: var(--ink-700) !important; line-height: 1.65 !important; margin: 0 0 26px !important; }   /* 26px paragraph spacing (Pablo) */
  #fullArticle li { color: var(--ink-700) !important; line-height: 1.65 !important; }
  #fullArticle strong { color: var(--ink-900) !important; }
  #fullArticle a { color: var(--ink-700) !important; line-height: inherit !important; text-decoration: underline !important; text-decoration-color: var(--neutral-400) !important; }
  #fullArticle code { line-height: inherit !important; }
  
  /* 3. TABLES — styled like the code/image cards: a framed white block with a
     hairline OUTER border + rounded corners, hairline INNER cell dividers, a
     subtle header row. Full-width; scrolls horizontally if it overflows. */
  #fullArticle table {
    width: 100% !important;
    /* margin-TOP/BOTTOM as longhands (NOT the shorthand) so the mobile
       full-bleed block's negative left/right margins aren't cancelled.
       32px top / 48px bottom — same widget rhythm as img/pre/blockquote (Pablo). */
    margin-top: var(--space-8) !important;
    margin-bottom: var(--space-12) !important;
    border-collapse: separate !important;   /* separate so border-radius clips */
    border-spacing: 0 !important;
    border: 1px solid var(--neutral-200) !important;
    border-radius: var(--radius-lg) !important;
    overflow: hidden !important;
    background: var(--white) !important;
  }
  #fullArticle th, #fullArticle td {
    padding: var(--space-3) var(--space-4) !important;
    border: 0 !important;
    border-bottom: 1px solid var(--neutral-200) !important;   /* inner row dividers */
    text-align: left !important;
    width: auto !important;
    vertical-align: top !important;
  }
  /* vertical inner dividers between columns (not on the last cell) */
  #fullArticle th:not(:last-child), #fullArticle td:not(:last-child) {
    border-right: 1px solid var(--neutral-200) !important;
  }
  /* last row: no bottom border (the table's own border closes it) */
  #fullArticle tr:last-child td { border-bottom: 0 !important; }
  #fullArticle th { background: var(--surface-subtle) !important; color: var(--ink-900) !important; font-weight: 650 !important; }
  
  /* 4. (was: LANDING category cards base-neutralization — REMOVED, not just
     unused. The old `.category-list`/`.category` grid was a REAL HelpScout
     element (base launch-*.css styles it directly, hence needing this
     override). The "Landing layout" REVISED rework's `.hs-doc-card` grid is
     pure NEW hs-* markup HelpScout's base CSS never touches at all — no
     neutralization needed. See docSections()/DOC_SECTIONS.) */
  
  /* 5. CATEGORY page — base #categoryHead h1 has a 165px right margin + narrow
     width; .descrip is grey/mis-margined; .articleList a has a -24px margin. */
  #categoryHead h1 { margin: 0 0 var(--space-2) !important; width: auto !important; color: var(--ink-900) !important; }
  #categoryHead .descrip { color: var(--neutral-500) !important; margin: 0 0 var(--space-4) !important; }
  .articleList { color: var(--ink-700) !important; }
  .articleList a { margin: 0 !important; width: auto !important; }
  #main-content { margin: 0 !important; }
  
  /* 6. ARTICLE ratings — base sizes .rateAction 28px + a drop shadow, and
     restyles the row. Re-assert our 40px outline buttons, no shadow, our text. */
  .articleRatings, .articleRatings-question { color: var(--ink-700) !important; }
  .rateAction { box-shadow: none !important; }
  
  /* 7. articleFoot / footer / toc — base recolors + resizes. */
  .articleFoot, footer, .hs-toc { color: var(--ink-700) !important; }
  .hs-toc a { line-height: 1.5 !important; }
  
  /* 8. Reskin components the base STILL leaks into (em-based sizes / inherited
     font-size + margins). Pin each to its intended value. */
  .articleList { font-size: 16px !important; line-height: 1.6 !important; }
  .articleList a { line-height: 1.5 !important; }
  .hs-article-header {
    font-size: 16px !important;
    line-height: 1.65 !important;
    color: var(--ink-900) !important;
    margin: 0 0 var(--space-8) !important;
  }
  .hs-copy-page__main, .hs-copy-page__more { line-height: 1 !important; }
  .articleRatings, .articleRatings-question, .rateAction {
    font-size: 0.9375rem !important;
    line-height: 1.4 !important;
  }
  .rateAction {
    /* base .rateAction is a 28x28 grey filled button w/ its own bg/radius —
       fully re-assert our 40x40 white outline square. flex-shrink:0 + min-width
       stop the flex parent (.articleRatings-actions) from shrinking the button
       back toward its 28px content width. */
    width: 40px !important;
    min-width: 40px !important;
    height: 40px !important;
    flex: 0 0 40px !important;
    padding: 0 !important;
    background: var(--white) !important;
    border: 1px solid var(--neutral-200) !important;
    border-radius: var(--radius-md) !important;
    /* center the icon inside the button (the .rating-face span + its svg were
       sitting off-center — base gives them absolute/margin positioning) */
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
  }
  /* the icon wrapper + svg: no base positioning, centered, no size hacks */
  .rateAction .rating-face {
    position: static !important;
    display: flex !important; align-items: center !important; justify-content: center !important;
    width: auto !important; height: auto !important; margin: 0 !important; padding: 0 !important;
  }
  .rateAction .rating-face svg { display: block !important; }
  .articleFoot { margin: var(--space-8) 0 0 !important; }
  time.lu { line-height: 1.4 !important; }
  
  /* 9. #docsSearch band — base gives it text-align:center; neutralize to our
     left-aligned hero. Do NOT touch #docsSearch's own padding (our rule above
     sets the intended top/side gutter that aligns the hero with the content) —
     only neutralize the inner FORM's centering. #searchBar is VISIBLE again
     (Vercel-grade pivot: the hero is now "search-with-intent", not a bare
     headline — was hidden entirely in the earlier Mintlify-style pass, when
     search lived ONLY in the sidebar/header ⌘K palette, which still exists
     as a separate, complementary entry point). */
  #docsSearch, #docsSearch form { text-align: left !important; }
  #docsSearch form { padding: 0 !important; }
  