/* ============================================================
   GOFFIN — SHARED DESIGN SYSTEM  ·  site.css
   ------------------------------------------------------------
   ONE restrained system used by every page → guarantees UNITY.
   Two priorities baked in:
     · AIR    — generous whitespace, one idea per section,
                wide gutters, comfortable measure, large gaps.
     · UNITY  — identical tokens + components everywhere; the
                header/footer are injected by site.js, never
                hand-rolled per page.
   Calm · premium · clinical · trustworthy. Orange used SPARINGLY.
   Poppins (display + body) + IBM Plex Mono (eyebrows / data labels).
   ============================================================ */

/* ---------- 1. DESIGN TOKENS ---------- */
:root{
  /* ---- TYPOGRAPHY ----
     Poppins stays the display + body face, unchanged.
     The MONO layer only (eyebrows, data labels, counters, spec tables) now
     comes from the Adobe Fonts kit — use.typekit.net/diu2sna.css, registered in
     inc/enqueue.php — and renders in its extra-light cut. Every rule that sets
     --ff-mono also sets --fw-mono, so changing the cut is a one-line edit here. */
  --ff-mono:"ibm-plex-mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --fw-mono:400;

  /* brand accent — used sparingly */
  --orange:#E98A2C;          /* brand orange (logo) — fills / CTA only */
  --orange-ink:#BE6A14;      /* accessible orange for text/links on white */
  --orange-wash:#fbf2e6;     /* faint warm tint — used minimally */

  /* neutrals — cool, calm, clinical */
  --ink:#16181d;             /* near-black headings / charcoal */
  --ink-2:#3b4047;           /* body text */
  --muted:#6a717b;           /* muted text (>=4.5:1 on white) */
  --paper:#ffffff;
  --surface:#faf9f6;         /* warm off-white */
  --grey:#f2f0ec;            /* warm light-grey panels */
  --grey-2:#ece9e3;
  --line:#e9e5df;            /* warm hairline borders */
  --line-2:#e0dcd4;
  --charcoal:#16181d;
  --error:#c0392b;           /* validation / error state — the one system red */
  --error-wash:#fdeceae0;    /* faint error tint for backgrounds */

  /* layout / shape */
  --maxw:1200px;             /* .wrap container — comfortable gutters */
  --measure:66ch;            /* comfortable reading measure (60–70ch) */
  --radius:14px; --radius-sm:10px; --radius-lg:18px; --radius-pill:100px;

  /* the AIR system — one whitespace scale, used everywhere */
  --sp-section:clamp(72px,9vw,140px);   /* vertical section rhythm  */
  --sp-gutter:clamp(20px,4vw,40px);     /* horizontal page gutters  */
  --gap:clamp(20px,2.4vw,28px);         /* default grid/flex gap    */
  --gap-lg:clamp(28px,4vw,52px);        /* generous gap             */

  /* spacing utilities scale */
  --s-1:8px; --s-2:14px; --s-3:20px; --s-4:28px; --s-5:40px;
  --s-6:56px; --s-7:80px; --s-8:120px;

  --shadow-sm:0 1px 3px rgba(22,24,29,.05), 0 1px 2px rgba(22,24,29,.04);
  --shadow:0 18px 48px -28px rgba(22,24,29,.22);
  --shadow-lg:0 30px 70px -34px rgba(22,24,29,.30);
  --ease:cubic-bezier(.4,0,.2,1);              /* general UI transitions */
  --ease-out:cubic-bezier(.16,1,.3,1);          /* refined decelerate — reveals, panels, drawers */
  --ease-spring:cubic-bezier(.34,1.4,.64,1);    /* subtle overshoot — use sparingly */

  --head-h:76px;             /* sticky header height (scroll offsets) */
}

/* ---------- 2. RESET / BASE ---------- */
*{box-sizing:border-box; margin:0; padding:0}
html{scroll-behavior:smooth; -webkit-text-size-adjust:100%; overflow-x:clip}
body{
  font-family:'Poppins',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  color:var(--ink-2); background:var(--paper); line-height:1.65;
  -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; text-rendering:optimizeLegibility;
  font-kerning:normal; font-feature-settings:"kern" 1,"liga" 1,"calt" 1; font-optical-sizing:auto;
  /* clip (not hidden): still prevents horizontal overflow, but does NOT make <body>
     a scroll container — so position:sticky pins relative to the viewport (the
     Microblot-Array walkthrough's sticky stage needs this; html already clips too). */
  overflow-x:clip;
}
img,svg,video{max-width:100%; display:block}
a{color:inherit; text-decoration:none}
button{font-family:inherit}
::selection{background:var(--orange-wash); color:var(--ink)}

/* ---------- 3. TYPOGRAPHY SCALE ----------
   CANONICAL HEADING SYSTEM — ONE weight, ONE size per role.
   ------------------------------------------------------------
   · ALL headings = font-weight 600 (no 700/800/bold anywhere).
     Body stays 400; mono eyebrows/labels keep their own style.
   · ONE fixed clamp() size per ROLE, reused on every page:
       --h-hero    big page hero / cover h1   (its own larger role)
       --h-page    standard page-title h1
       --h-section section h2
       --h-sub     card / sub h3
       --h-minor   minor h4 (and h5/h6)
   · line-height + letter-spacing are fixed per role too.
   Component rules must reuse these tokens — no ad-hoc per-component
   heading font-size / font-weight. Pick the nearest role token.
   ------------------------------------------------------------ */
:root{
  --h-hero:clamp(2.6rem,6vw,5rem);        /* hero / cover h1 */
  --h-page:clamp(2.05rem,4.4vw,3.4rem);   /* page-title h1   */
  --h-section:clamp(1.9rem,3.5vw,2.7rem); /* section h2      */
  --h-sub:clamp(1.1rem,1.6vw,1.3rem);     /* card / sub h3   */
  --h-minor:1rem;                         /* minor h4/h5/h6  */
}
/* every heading: same family, same WEIGHT (600), same colour */
h1,h2,h3,h4,h5,h6{
  font-family:'Poppins',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  font-weight:600; color:var(--ink); text-wrap:balance;
}
h1{font-size:var(--h-page);    line-height:1.1;  letter-spacing:-.03em}
h2{font-size:var(--h-section); line-height:1.12; letter-spacing:-.025em}
h3{font-size:var(--h-sub);     line-height:1.3;  letter-spacing:-.018em}
h4{font-size:var(--h-minor);   line-height:1.35; letter-spacing:-.01em}
h5,h6{font-size:var(--h-minor); line-height:1.4; letter-spacing:-.01em}

/* ROLE CLASSES — apply on the heading element to opt into a specific
   role regardless of tag (e.g. a hero h1 → .h-hero). */
.h-hero{font-size:var(--h-hero) !important;    line-height:1.04; letter-spacing:-.035em}
.h-page{font-size:var(--h-page) !important;    line-height:1.1;  letter-spacing:-.03em}
.h-section{font-size:var(--h-section) !important; line-height:1.12; letter-spacing:-.025em}
.h-sub{font-size:var(--h-sub) !important;      line-height:1.3;  letter-spacing:-.018em}
.h-minor{font-size:var(--h-minor) !important;  line-height:1.35; letter-spacing:-.01em}
/* every role keeps the one canonical weight */
.h-hero,.h-page,.h-section,.h-sub,.h-minor{font-weight:600 !important}

p{max-width:var(--measure); text-wrap:pretty}
.mono{font-family:var(--ff-mono); font-weight:var(--fw-mono)}
.hl{color:var(--orange-ink)}
.lede{font-size:clamp(1.05rem,1.4vw,1.18rem); color:var(--ink-2); line-height:1.7; max-width:54ch; text-wrap:pretty}

/* eyebrow — THE ONE canonical eyebrow, site-wide. IBM Plex Mono, a single size,
   the signature orange "/" lead. Every "/ LABEL" eyebrow on the site inherits
   this; per-section overrides of the size or the ::before are deliberately gone,
   so they all read as one family (see home.css / woo.css — no size/::before
   overrides remain on .eyebrow). */
.eyebrow{
  font-family:var(--ff-mono); font-size:.8rem; font-weight:var(--fw-mono);
  letter-spacing:.18em; text-transform:uppercase; color:var(--muted);
  display:inline-flex; align-items:center; gap:9px;
}
/* Leading accent is a slash "/" (orange). Sized to the cap-height and nudged so
   its optical centre lines up with the all-caps label (the bare glyph sits low). */
.eyebrow::before{content:"/"; background:none; width:auto; height:auto; color:var(--orange);
  font-weight:700; font-size:1.05em; line-height:1; flex-shrink:0; transform:translateY(-.05em)}
.eyebrow.center{justify-content:center}
/* multi-part eyebrows: a bold lead / lighter rest, slash-separated. main.js
   (styleEyebrows) wraps the parts; the base weight is 600, so the lead stays
   bold and the rest reads thinner, a calm "dik / dun" contrast. */
.eyebrow .eb-parts{display:inline}
/* These inherit the mono family from .eyebrow rather than setting it, so they
   need the cut stated explicitly. The lead/rest hierarchy now reads through
   opacity alone, which is what carries it at this size anyway. */
.eyebrow .eb-lead{font-weight:var(--fw-mono)}
.eyebrow .eb-rest{font-weight:var(--fw-mono); opacity:.72}
.eyebrow .eb-sep{margin:0 .5em; font-weight:var(--fw-mono); color:var(--orange); opacity:.6}
/* <b>/<strong> inside a mono label would otherwise fall back to the UA's
   "bolder", landing at 600 next to siblings at 200. */
.eyebrow b, .eyebrow strong{font-weight:var(--fw-mono)}

.link-arrow{display:inline-flex; align-items:center; gap:7px; font-weight:500; color:var(--orange-ink); font-size:.93rem}
.link-arrow svg{width:16px; height:16px; transition:transform .25s var(--ease)}
.link-arrow:hover svg{transform:translateX(4px)}

/* ---------- 4. LAYOUT — the AIR system ---------- */
.wrap{max-width:var(--maxw); margin:0 auto; padding:0 var(--sp-gutter)}
.wrap-narrow{max-width:860px; margin:0 auto; padding:0 var(--sp-gutter)}

.section{padding:var(--sp-section) 0; position:relative}
.section.tight{padding:calc(var(--sp-section) * .62) 0}
.section--surface{background:var(--surface)}
.section--grey{background:var(--grey)}
.section--dark{background:var(--ink); color:rgba(255,255,255,.66)}

.section-head{max-width:680px; margin:0 0 var(--gap-lg)}
.section-head.center{margin-left:auto; margin-right:auto; text-align:center}
.section-head h2{margin:18px 0 16px}
.section-head p{color:var(--muted); font-size:1.05rem; line-height:1.7}
/* A centred head reads as one column only if the lede is narrower than the
   heading's own wrap width. At full 680px the paragraph ran wide under a
   heading that broke at ~350px, and the two different column widths stacked up
   looked mis-aligned even though every element was centred to the pixel. */
.section-head.center p{max-width:54ch; margin-left:auto; margin-right:auto}
.section-head .eyebrow + h2{margin-top:18px}

.section-head-row{display:flex; justify-content:space-between; align-items:flex-end; gap:24px; flex-wrap:wrap; margin-bottom:var(--gap-lg)}
.section-head-row .section-head{margin-bottom:0}

/* responsive grids (use .grid with a col-modifier) */
.grid{display:grid; gap:var(--gap)}
.grid-2{grid-template-columns:repeat(2,1fr)}
.grid-3{grid-template-columns:repeat(3,1fr)}
.grid-4{grid-template-columns:repeat(4,1fr)}

/* ---------- 5. BUTTONS ---------- */
.btn{
  display:inline-flex; align-items:center; gap:9px; cursor:pointer;
  font-family:inherit; font-weight:500; font-size:.94rem; line-height:1;
  padding:14px 24px; border-radius:var(--radius-sm); border:1.5px solid transparent;
  min-height:46px; white-space:nowrap; text-align:center; justify-content:center;
  transition:transform .22s var(--ease-out), background .22s var(--ease-out), color .22s var(--ease-out), border-color .22s var(--ease-out), box-shadow .22s var(--ease-out);
}
.btn svg{width:17px; height:17px; flex-shrink:0; transition:transform .22s var(--ease-out)}
/* consistent CTA hover language: lift 2px + matching shadow; press-down on active */
.btn-primary{background:var(--orange); color:#fff}
.btn-primary:hover{background:#d97b1f; transform:translateY(-2px); box-shadow:0 12px 24px -12px rgba(233,138,44,.62)}
.btn-ghost{background:transparent; color:var(--ink); border-color:var(--line-2)}
.btn-ghost:hover{border-color:var(--ink); background:var(--surface); transform:translateY(-2px); box-shadow:var(--shadow-sm)}
.btn-dark{background:var(--ink); color:#fff}
.btn-dark:hover{background:#2a2d34; transform:translateY(-2px); box-shadow:0 14px 26px -14px rgba(22,24,29,.30)}
.btn:active{transform:translateY(0); transition-duration:.06s}
/* arrow-style icon trails the cursor consistently (only the chevron/arrow path) */
.btn.has-arrow:hover svg{transform:translateX(3px)}
.btn-sm{padding:10px 16px; font-size:.86rem; min-height:40px}
.btn-block{width:100%}
.on-dark .btn-ghost{color:#fff; border-color:rgba(255,255,255,.28)}
.on-dark .btn-ghost:hover{border-color:#fff; background:rgba(255,255,255,.08); transform:translateY(-2px); box-shadow:0 14px 26px -16px rgba(0,0,0,.5)}

/* ---------- 6. SITE HEADER (injected by site.js) ---------- */
.site-header{position:sticky; top:0; z-index:60; background:rgba(255,255,255,.9); backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line); transition:box-shadow .3s}
.site-header.scrolled{box-shadow:0 1px 0 var(--line), 0 8px 24px -18px rgba(22,24,29,.22)}
.site-nav{display:flex; align-items:center; gap:24px; height:var(--head-h); transition:height .3s var(--ease)}
.site-header.scrolled .site-nav{height:64px}
.site-logo{display:flex; align-items:center; flex-shrink:0}
.site-logo img{height:36px; width:auto; transition:height .3s var(--ease)}
.site-header.scrolled .site-logo img{height:31px}

.site-menu{display:flex; align-items:center; gap:2px; margin-left:6px; list-style:none}
.site-menu > li > a{display:flex; align-items:center; gap:6px; padding:10px 12px; border-radius:8px;
  font-size:.9rem; font-weight:500; color:var(--ink-2); transition:background .2s, color .2s}
.site-menu > li > a:hover{background:var(--grey); color:var(--ink)}
.site-menu > li > a.active{color:var(--ink)}
.site-menu > li > a.active::after{content:""; display:block; position:absolute}
.site-menu > li{position:relative}
.site-menu > li > a.active{background:var(--orange-wash); color:var(--orange-ink)}

.site-nav-right{margin-left:auto; display:flex; align-items:center; gap:8px}
.icon-btn{width:44px; height:44px; display:grid; place-items:center; border-radius:9px; background:transparent;
  border:none; cursor:pointer; color:var(--ink); transition:background .2s}
.icon-btn:hover{background:var(--grey)}
.icon-btn svg{width:20px; height:20px}
.quote-btn{position:relative}
.quote-badge{position:absolute; top:5px; right:7px; background:var(--orange); color:#fff; font-size:.58rem;
  font-weight:var(--fw-mono); min-width:16px; height:16px; padding:0 4px; border-radius:9px; display:none; place-items:center;
  font-family:var(--ff-mono); font-weight:var(--fw-mono); line-height:1}
.quote-badge.show{display:grid}

/* ---- quote-add confirmation toast (assets/js/main.js → announce()) ----
   A single shared aria-live=polite region. Off-canvas + invisible until .show
   so the empty initial state is never read or seen. On-style: paper card, warm
   hairline, brand-orange leading rule. Honours reduced-motion (no slide).
   Anchored to the TOP of the viewport (below the sticky header, using the
   existing --head-h offset) rather than the bottom: bottom-anchoring put it
   on top of page CTAs that live near the bottom of the viewport (e.g. the
   "Browse the catalog" / "Talk to a specialist" buttons on the empty
   quote-request state) and the sticky mobile .quote-bar. Top placement clears
   both on every page without needing per-page layout knowledge. */
.goffin-quote-toast{
  position:fixed; left:50%; top:calc(var(--head-h) + 16px); bottom:auto; z-index:1200;
  transform:translate(-50%,-16px); opacity:0; visibility:hidden;
  max-width:min(92vw,420px); padding:13px 18px 13px 20px;
  background:var(--paper); color:var(--ink);
  border:1px solid var(--line); border-left:3px solid var(--orange);
  border-radius:var(--radius-sm); box-shadow:var(--shadow-lg);
  font-size:.92rem; font-weight:500; line-height:1.45; text-align:left;
  transition:transform .32s var(--ease-out), opacity .32s var(--ease-out), visibility .32s var(--ease-out);
}
.goffin-quote-toast.show{transform:translate(-50%,0); opacity:1; visibility:visible}
@media (prefers-reduced-motion: reduce){
  .goffin-quote-toast{transition:opacity .2s linear, visibility .2s linear; transform:translate(-50%,0)}
  .goffin-quote-toast.show{transform:translate(-50%,0)}
}

/* mobile burger + drawer */
.burger{display:none}
.site-drawer{position:fixed; inset:0 0 0 auto; width:min(400px,90vw); background:#fff; z-index:90;
  transform:translateX(100%); transition:transform .35s var(--ease); padding:24px; overflow-y:auto;
  box-shadow:-20px 0 60px -30px rgba(0,0,0,.35)}
.site-drawer.show{transform:translateX(0)}
.site-scrim{position:fixed; inset:0; background:rgba(20,22,26,.45); z-index:80; opacity:0; visibility:hidden; transition:.3s}
.site-scrim.show{opacity:1; visibility:visible}
.drawer-head{display:flex; justify-content:space-between; align-items:center; margin-bottom:18px}
.drawer-head img{height:32px}
.drawer-menu{list-style:none}
.drawer-menu a{display:block; padding:15px 4px; color:var(--ink-2); font-size:1rem; font-weight:500;
  border-bottom:1px solid var(--line)}
.drawer-menu a.active{color:var(--orange-ink)}
.site-drawer .btn{margin-top:22px}

/* ---------- 7. SITE FOOTER (injected by site.js) ---------- */
.site-footer{background:var(--ink); color:rgba(255,255,255,.6); padding:var(--sp-section) 0 0}
.foot-grid{display:grid; grid-template-columns:1.5fr 1fr 1fr 1fr 1.3fr; gap:40px; padding-bottom:54px}
@media(max-width:980px){.foot-grid{grid-template-columns:1fr 1fr; gap:32px}}
@media(max-width:560px){.foot-grid{grid-template-columns:1fr}}
/* max-width:none defeats the global img{max-width:100%}, which would otherwise
   clamp the width and let object-fit:fill squash the lockup at larger sizes —
   the same trap the header logo hit. */
.site-footer .flogo{height:76px; width:auto; max-width:none; object-fit:contain; margin-bottom:22px}
@media(max-width:560px){ .site-footer .flogo{height:58px} }
.site-footer .foot-tag{font-size:.92rem; max-width:280px; margin-bottom:22px; line-height:1.7}
.site-footer .units{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.73rem; letter-spacing:.03em; color:rgba(255,255,255,.5); line-height:1.95}
.site-footer .units b{color:var(--orange); font-weight:600}
.site-footer h4{color:#fff; font-size:.77rem; letter-spacing:.13em; text-transform:uppercase; font-family:var(--ff-mono); font-weight:var(--fw-mono); margin-bottom:18px}
.site-footer ul{list-style:none}
.site-footer li{margin-bottom:11px}
.site-footer a:hover{color:#fff}
.site-footer .contact-line{display:flex; gap:10px; margin-bottom:13px; font-size:.89rem; align-items:flex-start}
.site-footer .contact-line svg{width:16px; height:16px; color:var(--orange); flex-shrink:0; margin-top:3px}
.foot-bottom{border-top:1px solid rgba(255,255,255,.09); padding:22px 0; display:flex; justify-content:space-between;
  align-items:center; gap:18px; font-size:.81rem; flex-wrap:wrap}
.foot-bottom .legal{display:flex; gap:14px; flex-wrap:wrap}
.foot-bottom .socials{display:flex; gap:10px}
.foot-bottom .socials a{width:36px; height:36px; border-radius:8px; border:1px solid rgba(255,255,255,.12); display:grid; place-items:center; transition:.2s}
.foot-bottom .socials a:hover{background:var(--orange); color:#fff; border-color:transparent}
.foot-bottom .socials svg{width:16px; height:16px}

/* ---------- 8. CARDS ---------- */
/* Icon-Bloom hover — the ONE shared card-hover language across the site.
   On hover a card lifts (-3px) with a soft shadow and its icon-box fills
   orange while a 2px orange ring blooms outward once (goffin-bloom). The
   keyframe is defined ONCE here and reused by every card block (site.css,
   home.css, the technique + brands page-scoped styles). Cards WITHOUT an
   icon-box get only the lift+shadow half. Reduced-motion keeps the colour
   change, drops the movement (see the reduced-motion block below). */
@keyframes goffin-bloom{0%{opacity:.55; transform:scale(1)}100%{opacity:0; transform:scale(1.7)}}

.card{background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:clamp(24px,3vw,34px);
  transition:transform .5s var(--ease-out), box-shadow .5s var(--ease-out), border-color .35s var(--ease-out)}
.card-ic{position:relative; width:50px; height:50px; border-radius:13px; background:var(--grey); color:var(--ink);
  display:grid; place-items:center; margin-bottom:20px;
  transition:background .35s var(--ease-out), color .35s var(--ease-out), transform .5s var(--ease-out)}
.card-ic::after{content:""; position:absolute; inset:0; border-radius:inherit; border:2px solid var(--orange); opacity:0; pointer-events:none}
.card.hover:hover{transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--line-2)}
.card.hover:hover .card-ic{background:var(--orange); color:#fff; transform:scale(1.1)}
.card.hover:hover .card-ic::after{animation:goffin-bloom .7s var(--ease-out)}
.card-ic svg{width:25px; height:25px}
.card h3{margin-bottom:10px}
.card p{color:var(--muted); font-size:.93rem; line-height:1.65}

/* domain card — accent rail on hover */
.card-domain{position:relative; overflow:hidden; display:flex; flex-direction:column}
.card-domain::before{content:""; position:absolute; left:0; top:0; bottom:0; width:3px; background:var(--orange);
  transform:scaleY(0); transform-origin:top; transition:transform .3s var(--ease)}
.card-domain.hover:hover::before{transform:scaleY(1)}
.card-domain .idx{font-family:var(--ff-mono); font-size:.8rem; font-weight:var(--fw-mono); color:var(--line-2); letter-spacing:.04em; transition:color .25s}
.card-domain.hover:hover .idx{color:var(--orange)}
.card-domain .dom-head{display:flex; justify-content:space-between; align-items:flex-start; margin-bottom:22px}
.card-domain ul{list-style:none; margin:0 0 22px; display:flex; flex-wrap:wrap; gap:7px}
.card-domain li{font-size:.76rem; font-weight:500; color:var(--ink-2); background:var(--grey); padding:6px 11px; border-radius:7px}
.card-domain .dom-foot{margin-top:auto; padding-top:18px; border-top:1px solid var(--line)}

/* ---------- 9. PRODUCT CARD (.pcard) — shared site-wide ---------- */
.pcard{background:#fff; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden;
  display:flex; flex-direction:column; transition:transform .5s var(--ease-out), box-shadow .5s var(--ease-out), border-color .35s var(--ease-out)}
/* no icon-box → Icon-Bloom lift+shadow half only (image scale handled below) */
.pcard:hover{transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--line-2)}
.pcard-media{position:relative; aspect-ratio:1/1; background:var(--surface); display:grid; place-items:center;
  padding:20px; overflow:hidden; border-bottom:1px solid var(--line)}
.pcard-media img{width:100%; height:100%; object-fit:contain; mix-blend-mode:multiply; transition:transform .4s var(--ease)}
.pcard:hover .pcard-media img{transform:scale(1.04)}
.pcard-media.empty svg{width:46%; height:46%; opacity:.16; color:var(--muted)}
/* Technique pill on the product photo. Kept fully opaque with a defined shadow +
   border so it stays readable over ANY product image (light boxes included), and
   deliberately static — no hover/tap colour-fill (that read as an unreadable
   stuck-orange state on touch, where there is no hover to reset it). */
/* Opaque WHITE chip with a clearly-defined edge. A white pill with only a faint
   hairline vanished against white product boxes (read as "transparent"); a solid
   white fill + a visible border + a crisp drop shadow lifts it off ANY photo so
   it always reads as a distinct chip. */
.tech-blob{position:absolute; top:12px; left:12px; display:inline-flex; align-items:center; gap:6px;
  background:#fff; color:var(--ink); font-size:.7rem; font-weight:600;
  padding:5px 10px; border-radius:7px; box-shadow:0 1px 3px rgba(22,24,29,.10); border:none}
.tech-blob .d{width:6px; height:6px; border-radius:50%; background:var(--orange)}
.type-tag{position:absolute; top:12px; right:12px; font-family:var(--ff-mono); font-size:.6rem; font-weight:var(--fw-mono);
  letter-spacing:.07em; text-transform:uppercase; padding:5px 8px; border-radius:6px}
.type-tag.panel{background:var(--ink); color:#fff}
.type-tag.single{background:#fff; color:var(--ink-2); border:none}
/* Regulatory-status pill (replaces the panel/single tag on cards). Sits over the
   product photo, so it is opaque + high-contrast + carries a soft shadow to
   separate from a light box image.
   ONE style for EVERY status — deliberately. The three variants used to differ
   (CE-IVDR inverted dark-on-white, RUO set in the lighter --ink-2), so the same
   pill read as three different components and the lighter ones washed out over
   pale product photos. The STATUS IS THE TEXT ("CE-IVDR" / "CE-IVD" / "RUO");
   the chrome carries no meaning and must not vary. Matches .tech-blob exactly,
   so the two pills at the top of a card are visibly one system. */
.type-tag.reg{font-size:.66rem; padding:5px 9px; background:#fff; color:var(--ink); box-shadow:0 1px 3px rgba(22,24,29,.10); border:none}
.type-tag.reg-ce-ivdr,
.type-tag.reg-ce-ivd,
.type-tag.reg-ruo{background:#fff; color:var(--ink); border:none}
.pcard-body{padding:18px; display:flex; flex-direction:column; flex:1}
.pcard-body h3{font-size:var(--h-sub); line-height:1.3; margin-bottom:11px}
.targets{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.66rem; color:var(--muted); letter-spacing:.04em; text-transform:uppercase; margin-bottom:14px}
.pcard-foot{margin-top:auto; display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding-top:14px; border-top:1px solid var(--line)}
.pcard-foot .req{flex:0 0 auto; white-space:nowrap; font-weight:600; font-size:.85rem; color:var(--orange-ink); display:inline-flex; align-items:center; gap:6px;
  background:none; border:none; cursor:pointer; font-family:inherit; padding:0}
.pcard-foot .req span{white-space:nowrap}
.pcard-foot .req:hover{color:#a45a0f}
.pcard-foot .view{flex:0 0 auto; white-space:nowrap; font-size:.83rem; color:var(--muted); font-weight:500}
.pcard-foot .view:hover{color:var(--ink)}

/* ---------- 10. BADGE / CHIP ---------- */
.badge{display:inline-flex; align-items:center; gap:6px; font-size:.74rem; font-weight:var(--fw-mono); padding:6px 11px;
  border-radius:7px; font-family:var(--ff-mono); font-weight:var(--fw-mono); letter-spacing:.03em}
.badge .d{width:6px; height:6px; border-radius:50%; background:currentColor; display:inline-block}
.badge.tech{background:var(--orange-wash); color:var(--orange-ink)}
.badge.panel{background:var(--ink); color:#fff}
.badge.single{background:var(--grey); color:var(--ink-2); border:1px solid var(--line-2)}
.badge.reg{background:#fff; color:var(--ink); border:none}

.chip{display:inline-flex; align-items:center; gap:7px; background:var(--grey); border:1px solid var(--line); color:var(--ink-2);
  font-size:.79rem; font-weight:500; padding:6px 12px; border-radius:var(--radius-pill)}
.chip.removable{padding-right:8px}
.chip button{border:none; background:none; cursor:pointer; color:var(--muted); display:grid; place-items:center; width:16px; height:16px}
.chip button:hover{color:var(--ink)}
.chip-clear{font-size:.82rem; color:var(--orange-ink); font-weight:600; cursor:pointer; background:none; border:none}

/* ---------- 11. BREADCRUMB ---------- */
.crumb{padding:22px 0 0; font-size:.83rem; color:var(--muted); display:flex; gap:8px; align-items:center; flex-wrap:wrap}
.crumb a{color:inherit; transition:color .18s var(--ease)}
.crumb a:hover{color:var(--ink)}
.crumb .sep{opacity:.5; -webkit-user-select:none; user-select:none}
.crumb .cur{color:var(--ink); font-weight:500}

/* ---------- 12. FORMS ---------- */
.field{margin-bottom:20px}
.field-row{display:grid; grid-template-columns:1fr 1fr; gap:18px}
.label{display:block; font-size:.85rem; font-weight:500; color:var(--ink); margin-bottom:8px}
.label .req-star{color:var(--orange-ink)}
.input,.select,.textarea{
  width:100%; font-family:inherit; font-size:.95rem; color:var(--ink); background:#fff;
  border:1px solid var(--line-2); border-radius:var(--radius-sm); padding:12px 14px; transition:border-color .2s, box-shadow .2s;
}
.textarea{min-height:140px; resize:vertical; line-height:1.6}
.select{appearance:none; cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236a717b' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 14px center; background-size:18px; padding-right:42px}
.input:focus,.select:focus,.textarea:focus{outline:none; border-color:var(--orange); box-shadow:0 0 0 3px var(--orange-wash)}
.input::placeholder,.textarea::placeholder{color:var(--muted)}
.help{font-size:.8rem; color:var(--muted); margin-top:7px}

/* search box (used in header search + catalogue) */
.search-box{display:flex; align-items:center; gap:12px; border:1px solid var(--line-2); border-radius:11px;
  padding:13px 16px; background:#fff; transition:border-color .2s, box-shadow .2s}
.search-box:focus-within{border-color:var(--orange); box-shadow:0 0 0 3px var(--orange-wash)}
.search-box > svg{width:19px; height:19px; color:var(--muted); flex-shrink:0}
.search-box input{flex:1; border:none; outline:none; font-family:inherit; font-size:.95rem; color:var(--ink); background:none}
.search-box kbd{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.69rem; color:var(--muted); border:1px solid var(--line-2); border-radius:6px; padding:3px 7px}

/* ---------- 13. TABLE ---------- */
.table{width:100%; border-collapse:collapse; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden;
  font-variant-numeric:tabular-nums}
.table caption{text-align:left; font-size:.8rem; color:var(--muted); padding-bottom:14px; caption-side:top}
.table th,.table td{text-align:left; padding:14px 18px; border-bottom:1px solid var(--line); font-size:.92rem; vertical-align:top}
.table thead th{background:var(--surface); font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.7rem; letter-spacing:.07em;
  text-transform:uppercase; color:var(--muted); font-weight:var(--fw-mono)}
.table tbody th{font-weight:600; color:var(--ink); background:#fff}
.table tbody td{color:var(--ink-2)}
.table tbody tr:last-child th,.table tbody tr:last-child td{border-bottom:none}
.table tbody tr:hover th,.table tbody tr:hover td{background:var(--surface)}
.table .gene{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.85rem; color:var(--orange-ink)}

/* ---------- 14. ACCORDION (.acc) ---------- */
.acc{border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; background:#fff}
.acc-item{border-bottom:1px solid var(--line)}
.acc-item:last-child{border-bottom:none}
.acc-item > button{width:100%; display:flex; justify-content:space-between; align-items:center; gap:16px; background:#fff;
  border:none; padding:20px 24px; font:600 1.04rem 'Poppins'; color:var(--ink); cursor:pointer; text-align:left}
.acc-item > button svg{width:20px; height:20px; flex-shrink:0; transition:transform .25s; color:var(--muted)}
.acc-item.open > button svg{transform:rotate(45deg)}
.acc-body{max-height:0; overflow:hidden; transition:max-height .35s var(--ease)}
.acc-body .inner{padding:0 24px 24px; color:var(--ink-2); font-size:.95rem; line-height:1.75}
.acc-body .inner ul{margin:10px 0 0 18px}
.acc-body .inner li{margin-bottom:6px}
/* Overview key-features list — "Label: text" bullets parsed from key_features.
   A calm, scannable list; the label reads as a lead-in, the text follows. */
.acc-body .inner ul.pdp-features{list-style:none; margin:14px 0 0; padding:0; display:grid; gap:10px}
.acc-body .inner ul.pdp-features li{position:relative; margin:0; padding-left:20px; line-height:1.65}
.acc-body .inner ul.pdp-features li::before{content:""; position:absolute; left:0; top:9px; width:7px; height:7px;
  border-radius:50%; background:var(--orange)}
.acc-body .inner ul.pdp-features li b{color:var(--ink); font-weight:600}

/* ---------- 15. PAGINATION ---------- */
.pagination{display:flex; justify-content:center; gap:8px; margin-top:48px; flex-wrap:wrap}
.pagination a{min-width:42px; height:42px; display:grid; place-items:center; border:1px solid var(--line-2); border-radius:9px;
  font-size:.9rem; font-weight:500; color:var(--ink-2); padding:0 6px; transition:.18s}
.pagination a:hover{border-color:var(--ink)}
.pagination a.cur{background:var(--ink); color:#fff; border-color:var(--ink)}
.pagination a.dots{border:none; pointer-events:none}

/* ---------- 16. QUOTE BAR (sticky, PDP / cart) ---------- */
.quote-bar{position:fixed; left:0; right:0; bottom:0; z-index:55; background:rgba(255,255,255,.94); backdrop-filter:blur(12px);
  border-top:1px solid var(--line); transform:translateY(110%); transition:transform .3s var(--ease)}
.quote-bar.show{transform:translateY(0)}
.quote-bar .wrap{display:flex; align-items:center; gap:18px; padding:13px var(--sp-gutter)}
.quote-bar .qb-info{min-width:0}
.quote-bar .qb-info b{display:block; font-size:.95rem; color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.quote-bar .qb-info small{font-size:.78rem; color:var(--muted)}
.quote-bar .btn{margin-left:auto}

/* ---------- 17. SPACING / DISPLAY UTILITIES ---------- */
.mt-0{margin-top:0}.mt-1{margin-top:var(--s-1)}.mt-2{margin-top:var(--s-2)}.mt-3{margin-top:var(--s-3)}
.mt-4{margin-top:var(--s-4)}.mt-5{margin-top:var(--s-5)}.mt-6{margin-top:var(--s-6)}.mt-7{margin-top:var(--s-7)}
.mb-0{margin-bottom:0}.mb-1{margin-bottom:var(--s-1)}.mb-2{margin-bottom:var(--s-2)}.mb-3{margin-bottom:var(--s-3)}
.mb-4{margin-bottom:var(--s-4)}.mb-5{margin-bottom:var(--s-5)}.mb-6{margin-bottom:var(--s-6)}
.text-center{text-align:center}
.text-muted{color:var(--muted)}
.measure{max-width:var(--measure)}
.flex{display:flex}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.gap-2{gap:var(--s-2)}.gap-3{gap:var(--s-3)}
.hidden{display:none}
.cta-row{display:flex; gap:12px; flex-wrap:wrap}

/* ---------- 18. REVEAL + FOCUS ---------- */
/* Gated on html.js (stamped by an inline script in header.php before first
   paint): with JS off the pre-reveal hidden state never applies, so content
   is always readable. Resting CSS = final state. */
/* Opacity reaches full in .26s while the slide keeps its .7s ease: during a
   700ms fade the WHOLE card is translucent, and on a product card that
   reads as "the pills are see-through" — they sit on a photo, so their
   transparency is the most visible part of it. Motion is unchanged. */
html.js [data-reveal]{opacity:0; transform:translateY(16px); transition:opacity .26s var(--ease-out), transform .7s var(--ease-out); transition-delay:var(--d,0s)}
html.js [data-reveal].in{opacity:1; transform:none}
:focus-visible{outline:2px solid var(--orange-ink); outline-offset:2px; border-radius:3px}
.btn:focus-visible{outline:2px solid var(--orange-ink); outline-offset:2px}
.skip-link{position:absolute; left:-9999px; top:0; z-index:200; background:var(--ink); color:#fff; padding:10px 16px; border-radius:0 0 8px 0}
.skip-link:focus{left:0}

/* ============================================================
   HOMEPAGE COMPONENTS  (canon for the whole site)
   ============================================================ */

/* hero */
.hero{position:relative; padding:clamp(56px,8vw,96px) 0 clamp(64px,8vw,104px);
  background:linear-gradient(180deg,#fff 0%, var(--surface) 100%)}
.hero-grid{display:grid; grid-template-columns:1.05fr .95fr; gap:var(--gap-lg); align-items:center}
.hero-copy h1{margin:22px 0}
.hero-copy .lede{max-width:500px; margin-bottom:0}
.hero-cta{display:flex; gap:12px; flex-wrap:wrap; margin:32px 0 22px}
.hero-trust{display:flex; align-items:center; gap:10px; color:var(--muted); font-size:.85rem}
.hero-trust .dot{width:6px; height:6px; border-radius:50%; background:var(--orange); flex-shrink:0}
.hero-visual{position:relative}
.hero-img{border-radius:var(--radius-lg); overflow:hidden; box-shadow:var(--shadow); aspect-ratio:4/3.4; border:1px solid var(--line); position:relative}
.hero-img img{width:100%; height:100%; object-fit:cover}
.hero-chip{position:absolute; top:22px; right:-14px; background:#fff; color:var(--ink); padding:9px 15px;
  border-radius:9px; font-size:.77rem; font-weight:500; box-shadow:var(--shadow); display:flex; align-items:center; gap:8px; border:1px solid var(--line)}
.hero-chip .d{width:7px; height:7px; border-radius:50%; background:var(--orange)}
.hero-flow{position:absolute; left:-20px; bottom:24px; background:#fff; border:1px solid var(--line); border-radius:14px; box-shadow:var(--shadow); padding:14px 17px}
.hero-flow .lbl{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.62rem; letter-spacing:.13em; text-transform:uppercase; color:var(--muted); margin-bottom:11px; display:block}
.hero-flow .steps{display:flex; align-items:center; gap:11px}
.hero-flow .st{display:flex; flex-direction:column; align-items:center; gap:7px}
.hero-flow .st .ic{width:40px; height:40px; border-radius:10px; background:var(--surface); border:1px solid var(--line); display:grid; place-items:center; color:var(--ink)}
.hero-flow .st .ic svg{width:20px; height:20px}
.hero-flow .st span{font-size:.66rem; color:var(--ink-2); font-weight:500}
.hero-flow .ar{color:var(--line-2)}
.hero-flow .ar svg{width:14px; height:14px}

/* workflow band */
.flow-track{display:flex; border:1px solid var(--line); border-radius:var(--radius); background:#fff; overflow:hidden}
.flow-step{flex:1; padding:28px 24px; display:flex; flex-direction:column; gap:13px; min-height:220px}
.flow-step:not(:last-child){border-right:1px solid var(--line)}
.flow-step .top{display:flex; align-items:center; justify-content:space-between}
.flow-step .ic{width:46px; height:46px; border-radius:11px; background:var(--surface); border:1px solid var(--line); display:grid; place-items:center; color:var(--ink); transition:.25s}
.flow-step:hover .ic{background:var(--orange-wash); border-color:var(--orange-wash); color:var(--orange-ink)}
.flow-step .ic svg{width:23px; height:23px}
.flow-step .n{font-family:var(--ff-mono); font-size:.72rem; color:var(--line-2); font-weight:var(--fw-mono)}
.flow-step h3{font-size:var(--h-sub); margin:0}
.flow-step p{font-size:.86rem; color:var(--muted); line-height:1.6; margin:0}
.flow-step .tag{margin-top:auto; font-size:.67rem; color:var(--orange-ink); font-family:var(--ff-mono); font-weight:var(--fw-mono); letter-spacing:.04em}

/* why-Goffin trust grid */
.why-card{position:relative; background:var(--surface); border:1px solid var(--line); border-radius:var(--radius); padding:30px 26px;
  transition:transform .5s var(--ease-out), box-shadow .5s var(--ease-out), border-color .35s var(--ease-out)}
.why-card .ic{position:relative; width:46px; height:46px; border-radius:11px; background:#fff; border:1px solid var(--line); color:var(--ink); display:grid; place-items:center; margin-bottom:20px;
  transition:background .35s var(--ease-out), color .35s var(--ease-out), border-color .35s var(--ease-out), transform .5s var(--ease-out)}
.why-card .ic::after{content:""; position:absolute; inset:0; border-radius:inherit; border:2px solid var(--orange); opacity:0; pointer-events:none}
.why-card:hover{transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--line-2)}
.why-card:hover .ic{background:var(--orange); color:#fff; border-color:var(--orange); transform:scale(1.1)}
.why-card:hover .ic::after{animation:goffin-bloom .7s var(--ease-out)}
.why-card .ic svg{width:23px; height:23px}
.why-card h3{font-size:var(--h-sub); margin-bottom:10px}
.why-card p{color:var(--muted); font-size:.89rem; line-height:1.65}

/* brands LOGO WALL — no vanity numbers, recognisable tiles */
.brand-wall{display:grid; grid-template-columns:repeat(5,1fr); gap:14px}
.brand-tile{display:grid; place-items:center; min-height:96px; border:1px solid var(--line); border-radius:var(--radius-sm);
  background:#fff; padding:20px 16px; text-align:center;
  transition:transform .5s var(--ease-out), box-shadow .5s var(--ease-out), border-color .35s var(--ease-out)}
/* no icon-box in the plain wall → Icon-Bloom lift+shadow half only (the brands
   page adds a .bt-mark monogram that blooms — see template-brands.php) */
.brand-tile:hover{transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--line-2)}
.brand-tile .wordmark{font-weight:600; font-size:1.05rem; letter-spacing:-.01em; color:var(--ink); opacity:.6; transition:opacity .25s}
.brand-tile:hover .wordmark{opacity:1}
.brand-tile .wordmark .tld{color:var(--muted); font-weight:500}
/* Every brand logo ships on one identical 156x44 canvas with its optical scale
   already baked in (see goffin_brand_logo_map()), so the box is uniform and a
   wide wordmark can no longer render three times bigger than a compact mark.
   Sizing by width — never max-height — keeps that baked-in scale intact. */
.brand-tile img{width:156px; max-width:100%; height:auto; object-fit:contain; opacity:.7; filter:grayscale(1); transition:.25s}
.brand-tile:hover img{opacity:1; filter:none}

/* application-notes teaser */
.note-card{border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; background:#fff;
  transition:transform .5s var(--ease-out), box-shadow .5s var(--ease-out), border-color .35s var(--ease-out); display:flex; flex-direction:column}
/* no icon-box → Icon-Bloom lift+shadow half only */
.note-card:hover{transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--line-2)}
.note-top{padding:24px 26px 0}
.note-tag{display:inline-flex; align-items:center; min-width:0; max-width:100%; overflow:hidden; text-overflow:ellipsis;
  font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.63rem; letter-spacing:.09em;
  text-transform:uppercase; color:var(--orange-ink); font-weight:var(--fw-mono); background:var(--orange-wash);
  padding:5px 11px; border-radius:var(--radius-pill); white-space:nowrap}
.note-card h3{padding:16px 26px 0; font-size:var(--h-sub); line-height:1.32; letter-spacing:-.008em}
.note-card .nbody{padding:10px 26px 24px; color:var(--muted); font-size:.89rem; line-height:1.65; flex:1}
/* footer: meta (left) truncates with an ellipsis before it can ever squeeze the
   "Read note" link — previously both sat in an unguarded flex row, so a long
   meta string (e.g. "Application note · Presto 100 CT/NG PCR Kit") forced
   "Read note" to wrap mid-word instead of staying on one line. */
.note-card .nfoot{padding:16px 26px; border-top:1px solid var(--line); display:flex; justify-content:space-between;
  align-items:center; gap:14px; font-size:.83rem}
.note-card .nfoot .read{font-weight:600; color:var(--orange-ink); display:inline-flex; gap:6px; align-items:center;
  white-space:nowrap; flex-shrink:0}
.note-card .nfoot .read svg{transition:transform .2s var(--ease)}
.note-card:hover .nfoot .read svg{transform:translateX(3px)}
.note-card .nfoot .meta{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.74rem; color:var(--muted); min-width:0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap}

/* final CTA */
.cta-band{background:var(--ink); position:relative; overflow:hidden}
.cta-band::before{content:""; position:absolute; inset:0;
  background-image:radial-gradient(rgba(255,255,255,.04) 1px, transparent 1px); background-size:30px 30px}
.cta-inner{position:relative; z-index:1; text-align:center; max-width:680px; margin:0 auto}
.cta-inner h2{margin:18px 0 16px; color:#fff}
.cta-inner p{color:rgba(255,255,255,.62); font-size:1.06rem; margin:0 auto 36px; line-height:1.7}
.cta-inner .eyebrow{color:rgba(255,255,255,.7)}
.cta-inner .btns{display:flex; gap:12px; justify-content:center; flex-wrap:wrap}

/* ============================================================
   RESPONSIVE  (mobile-first refinements at 1280 / 1024 / 768 / 375)
   ============================================================ */
@media(max-width:1080px){
  .grid-4{grid-template-columns:repeat(2,1fr)}
  .brand-wall{grid-template-columns:repeat(3,1fr)}
}
@media(max-width:900px){
  .site-menu,.quote-btn-label{display:none}
  .burger{display:grid}
  .site-nav-right .search-btn{display:grid}
  .hero-grid{grid-template-columns:1fr; gap:42px}
  .hero-visual{order:-1; max-width:520px; margin:0 auto}
  .hero-flow{position:static; margin-top:18px; box-shadow:none}
  .hero-chip{right:12px}
  .flow-track{flex-direction:column}
  .flow-step{min-height:0}
  .flow-step:not(:last-child){border-right:none; border-bottom:1px solid var(--line)}
  .grid-3,.grid-2{grid-template-columns:1fr}
  .foot-grid{grid-template-columns:1fr 1fr; gap:32px}
  .field-row{grid-template-columns:1fr}
}
@media(max-width:560px){
  .grid-4,.grid-3,.grid-2,.brand-wall{grid-template-columns:1fr}
  .brand-wall{grid-template-columns:repeat(2,1fr)}
  .hero-chip{right:8px}
  .section-head-row{align-items:flex-start}
}
@media(prefers-reduced-motion:reduce){
  *{animation:none !important; transition:none !important}
  [data-reveal]{opacity:1 !important; transform:none !important}
  html{scroll-behavior:auto}
}
/* Icon-Bloom, reduced-motion: keep the colour/border feedback on hover, drop
   the lift, the icon scale and the ring bloom (shared card blocks in site.css). */
@media(prefers-reduced-motion:reduce){
  .card.hover:hover,.why-card:hover,.pcard:hover,.note-card:hover,.brand-tile:hover{transform:none}
  .card.hover:hover .card-ic,.why-card:hover .ic{transform:none}
  .card.hover:hover .card-ic::after,.why-card:hover .ic::after{animation:none}
}


/* ============================================================
   PROMO BAR — sitewide dismissible announcement strip, rendered above
   the header on every template (see inc/promo-bar.php). Off unless an
   editor enables it via Goffin instellingen → Promo-balk.
   ============================================================ */
.goffin-promo{
  position:relative;display:block;background:var(--orange);color:#fff;
  text-decoration:none;font-size:.86rem;line-height:1.4;
}
div.goffin-promo{cursor:default}
.goffin-promo-in{
  max-width:var(--maxw,1240px);margin:0 auto;padding:11px 52px 11px 28px;
  display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:8px 10px;text-align:center;
}
.goffin-promo-badge{
  display:inline-flex;align-items:center;flex-shrink:0;
  font-family:var(--ff-mono); font-size:.68rem;font-weight:var(--fw-mono);
  letter-spacing:.04em;text-transform:uppercase;
  background:rgba(255,255,255,.2);color:#fff;
  border-radius:var(--radius-pill,100px);padding:2px 10px;
}
.goffin-promo-text{font-weight:500}
.goffin-promo-cta{
  display:inline-flex;align-items:center;gap:5px;flex-shrink:0;
  font-weight:600;text-decoration:underline;text-underline-offset:2px;
}
.goffin-promo-cta svg{width:12px;height:12px}
a.goffin-promo:hover .goffin-promo-cta{text-decoration-thickness:2px}
a.goffin-promo:focus-visible{outline:2px solid #fff;outline-offset:-3px}
.goffin-promo-close{
  position:absolute;top:50%;right:14px;transform:translateY(-50%);
  display:flex;align-items:center;justify-content:center;
  width:28px;height:28px;padding:0;border:0;border-radius:50%;
  background:transparent;color:#fff;opacity:.8;cursor:pointer;
  transition:opacity .2s,background .2s;
}
.goffin-promo-close svg{width:14px;height:14px}
.goffin-promo-close:hover{opacity:1;background:rgba(255,255,255,.16)}
.goffin-promo-close:focus-visible{outline:2px solid #fff;outline-offset:2px;opacity:1}
.goffin-promo[hidden],
.goffin-promo-close[hidden]{display:none}
@media (max-width:640px){
  .goffin-promo-in{padding:10px 44px 10px 16px;font-size:.8rem}
  .goffin-promo-close{right:8px}
}

/* ============================================================
   UNIFIED HEADER (ported from the home composition) — gives every
   inner page the SAME ogx- mega header. Injected by site.js into
   [data-site-header]. .ogx-lit is set immediately (no entrance dep).
   ============================================================ */
.ogx-nav1{
  /* modular type scale — base 16px, ratio 1.25 (major third) */
  --t-2:.64rem;   /* 10.24 */
  --t-1:.8rem;    /* 12.8  */
  --t-0:.875rem;  /* 14    */
  --t1:.92rem;    /* ~14.7 */
  --t2:1.05rem;
  --t3:1.4rem;    /* logo word */
  /* 8px spacing rhythm */
  --s1:8px; --s2:16px; --s3:24px; --s4:32px;
  --ease-out:cubic-bezier(.16,1,.3,1);
  position:relative;z-index:1;font-family:'Poppins',-apple-system,sans-serif;color:var(--ink-2);
  -webkit-font-smoothing:antialiased
}
.ogx-nav1 *{box-sizing:border-box}
/* Header runs FULL WIDTH (only the header) so the nav has room to breathe — the
   rest of the site stays inside --maxw. Generous side padding keeps it off the edge. */
.ogx-nav1 .ogx-wrap{max-width:none;margin:0 auto;padding:0 clamp(24px,3.2vw,56px)}
/* nav labels never wrap ("Application notes" was breaking onto two lines) */
.ogx-nav1 .ogx-menu > li > a{white-space:nowrap}
.ogx-nav1 [class^="ogx-"]{font-variant-numeric:tabular-nums}

/* ---- utility topbar (reuse .util pattern) ---- */
.ogx-nav1 .ogx-util{background:var(--ink);color:rgba(255,255,255,.78);font-size:.79rem;
  position:relative;overflow:hidden}
.ogx-nav1 .ogx-util::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:linear-gradient(90deg,transparent,rgba(233,138,44,.5),transparent);
  transform:scaleX(0);transform-origin:left;transition:transform .9s var(--ease-out) .25s}
.ogx-nav1.ogx-lit .ogx-util::after{transform:scaleX(1)}
.ogx-nav1 .ogx-util .ogx-wrap{display:flex;justify-content:space-between;align-items:center;height:40px;gap:18px}
.ogx-nav1 .ogx-util a{color:rgba(255,255,255,.78);text-decoration:none;transition:color .2s}
.ogx-nav1 .ogx-util a:hover{color:#fff}
.ogx-nav1 .ogx-util a:focus-visible{outline:2px solid var(--orange);outline-offset:3px;border-radius:4px;color:#fff}
.ogx-nav1 .ogx-util-l{display:flex;align-items:center;gap:9px;min-width:0}
.ogx-nav1 .ogx-util-l span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ogx-nav1 .ogx-util-l svg{flex-shrink:0}
.ogx-nav1 .ogx-pin{transform-origin:50% 70%}
.ogx-nav1.ogx-lit .ogx-pin{animation:ogx-pin-drop .7s var(--ease-out) .15s both}
@keyframes ogx-pin-drop{0%{opacity:0;transform:translateY(-7px) scale(.7)}60%{opacity:1}100%{opacity:1;transform:none}}
.ogx-nav1 .ogx-util-r{display:flex;gap:20px;align-items:center;white-space:nowrap}
.ogx-nav1 .ogx-util-r .ogx-sep{width:1px;height:12px;background:rgba(255,255,255,.18)}
.ogx-nav1 .ogx-util-r .ogx-clock{display:flex;align-items:center;gap:7px}
.ogx-nav1 .ogx-util-r .ogx-clock svg{opacity:.7}
.ogx-nav1 .ogx-util-r .ogx-clock .ogx-now{font-family:inherit;font-size:inherit;line-height:inherit;
  font-variant-numeric:tabular-nums;letter-spacing:0;color:rgba(255,255,255,.9)}
.ogx-nav1 .ogx-util-r .ogx-dot{width:6px;height:6px;border-radius:50%;background:#3fbf6a;
  box-shadow:0 0 0 0 rgba(63,191,106,.55);animation:ogx-pulse 2.6s ease-out infinite}
@keyframes ogx-pulse{0%{box-shadow:0 0 0 0 rgba(63,191,106,.5)}70%{box-shadow:0 0 0 6px rgba(63,191,106,0)}100%{box-shadow:0 0 0 0 rgba(63,191,106,0)}}

/* ---- header / main nav row (reuse .head/.nav pattern) ---- */
.ogx-nav1 .ogx-head{background:rgba(255,255,255,.92);backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line);box-shadow:0 1px 0 var(--line)}
.ogx-nav1 .ogx-nav{display:flex;align-items:center;gap:28px;height:72px}

/* staggered entrance — items lift in on load (observe → .in) */
.ogx-nav1 .ogx-stag{opacity:0;transform:translateY(-10px);
  transition:opacity .52s var(--ease-out),transform .52s var(--ease-out);transition-delay:var(--d,0s)}
.ogx-nav1.ogx-lit .ogx-stag{opacity:1;transform:none}

.ogx-nav1 .ogx-logo{display:flex;align-items:center;flex-shrink:0;text-decoration:none;border-radius:8px}
/* max-width:none defeats the global img{max-width:100%} reset, which was clamping
   the wide wordmark to its grid column and squishing it (object-fit:fill). The
   wordmark logo renders at its natural ratio; object-fit:contain is a belt-and-braces
   guard so it can never distort. Height tuned for the wordmark (shorter than the old
   icon+wordmark lockup); a touch smaller on mobile so it clears the burger. */
/* Client asked for a more prominent mark; 52px read as timid against the
   full-width header. max-width:none stays essential — the global
   img{max-width:100%} would clamp the width and object-fit would squash it. */
.ogx-nav1 .ogx-logo img{height:64px;width:auto;max-width:none;object-fit:contain;transition:transform .3s var(--ease-out)}
@media(max-width:980px){ .ogx-nav1 .ogx-logo img{height:50px} }
.ogx-nav1 .ogx-logo:hover img{transform:scale(1.03)}
.ogx-nav1 .ogx-logo .ogx-word{font-size:var(--t3);font-weight:700;letter-spacing:-.03em;color:var(--ink)}
.ogx-nav1 .ogx-logo:focus-visible{outline:2px solid var(--orange-ink);outline-offset:4px}

.ogx-nav1 .ogx-menu{display:flex;align-items:center;gap:2px;margin-left:8px;list-style:none}
.ogx-nav1 .ogx-menu>li{position:relative}
.ogx-nav1 .ogx-menu>li>a{position:relative;display:flex;align-items:center;gap:6px;padding:10px 13px;border-radius:8px;
  font-size:var(--t1);font-weight:500;color:var(--ink-2);text-decoration:none;
  transition:background .22s var(--ease-out),color .22s var(--ease-out)}
.ogx-nav1 .ogx-menu>li>a::after{content:"";position:absolute;left:13px;right:13px;bottom:5px;height:1.5px;
  background:var(--orange);border-radius:2px;transform:scaleX(0);transform-origin:left;
  transition:transform .28s var(--ease-out)}
.ogx-nav1 .ogx-menu>li>a:hover,
.ogx-nav1 .ogx-menu>li:hover>a,
.ogx-nav1 .ogx-menu>li:focus-within>a{background:var(--grey);color:var(--ink)}
.ogx-nav1 .ogx-menu>li>a:hover::after,
.ogx-nav1 .ogx-menu>li:focus-within>a::after{transform:scaleX(1)}
.ogx-nav1 .ogx-menu>li>a:focus-visible{outline:2px solid var(--orange-ink);outline-offset:2px}
.ogx-nav1 .ogx-caret{width:13px;height:13px;opacity:.5;transition:transform .28s var(--ease-out)}
.ogx-nav1 .ogx-menu>li:hover>a .ogx-caret,
.ogx-nav1 .ogx-menu>li:focus-within>a .ogx-caret{transform:rotate(180deg)}

/* ---- dropdown: display:none when closed → no empty space ---- */
.ogx-nav1 .ogx-dd{display:none;position:absolute;top:calc(100% + 10px);left:0;min-width:296px;background:#fff;
  border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow,0 18px 48px -28px rgba(22,24,29,.22));padding:12px;z-index:70}
.ogx-nav1 .ogx-dd::before{content:"";position:absolute;left:0;right:0;top:-10px;height:10px}/* hover bridge */
.ogx-nav1 .ogx-menu>li:hover>.ogx-dd,
.ogx-nav1 .ogx-menu>li:focus-within>.ogx-dd{display:block;animation:ogx-dd-in .26s var(--ease-out)}
@keyframes ogx-dd-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* per-row stagger inside the open dropdown */
.ogx-nav1 .ogx-menu>li:hover>.ogx-dd a,
.ogx-nav1 .ogx-menu>li:focus-within>.ogx-dd a{animation:ogx-row-in .34s var(--ease-out) both}
.ogx-nav1 .ogx-dd a:nth-of-type(1){animation-delay:.03s}
.ogx-nav1 .ogx-dd a:nth-of-type(2){animation-delay:.06s}
.ogx-nav1 .ogx-dd a:nth-of-type(3){animation-delay:.09s}
.ogx-nav1 .ogx-dd a:nth-of-type(4){animation-delay:.12s}
.ogx-nav1 .ogx-dd a:nth-of-type(5){animation-delay:.15s}
@keyframes ogx-row-in{from{opacity:0;transform:translateX(-6px)}to{opacity:1;transform:none}}
.ogx-nav1 .ogx-dd-label{font-family:var(--ff-mono); font-weight:var(--fw-mono);font-size:var(--t-2);letter-spacing:.16em;
  line-height:1.4;text-transform:uppercase;color:var(--muted);padding:8px 12px 8px}
.ogx-nav1 .ogx-dd a{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:10px 12px;border-radius:9px;font-size:var(--t1);font-weight:500;color:var(--ink-2);text-decoration:none;
  transition:background .18s var(--ease-out),color .18s var(--ease-out),padding-left .18s var(--ease-out)}
.ogx-nav1 .ogx-dd a:hover{background:var(--grey);color:var(--ink);padding-left:18px}
.ogx-nav1 .ogx-dd a:focus-visible{outline:2px solid var(--orange-ink);outline-offset:-2px}
.ogx-nav1 .ogx-dd a .ogx-n{font-family:var(--ff-mono); font-weight:var(--fw-mono);font-size:var(--t-1);color:var(--muted);
  transition:color .18s var(--ease-out)}
.ogx-nav1 .ogx-dd a:hover .ogx-n{color:var(--orange-ink)}
.ogx-nav1 .ogx-dd-foot{margin-top:8px;border-top:1px solid var(--line);padding-top:8px}
.ogx-nav1 .ogx-dd-foot a{color:var(--orange-ink);font-weight:600}

/* ---- right cluster ---- */
.ogx-nav1 .ogx-nav-right{margin-left:auto;display:flex;align-items:center;gap:8px}
.ogx-nav1 .ogx-icon-btn{width:44px;height:44px;display:grid;place-items:center;border-radius:9px;background:transparent;
  border:none;cursor:pointer;color:var(--ink);transition:background .2s var(--ease-out)}
.ogx-nav1 .ogx-icon-btn:hover{background:var(--grey)}
.ogx-nav1 .ogx-icon-btn:focus-visible{outline:2px solid var(--orange-ink);outline-offset:2px}
.ogx-nav1 .ogx-icon-btn svg{width:20px;height:20px;transition:transform .25s var(--ease-out)}
.ogx-nav1 .ogx-search:hover svg{transform:scale(1.08) rotate(-6deg)}

/* magnetic CTA with cursor-sheen */
.ogx-nav1 .ogx-btn{position:relative;overflow:hidden;display:inline-flex;align-items:center;gap:9px;cursor:pointer;
  font-family:inherit;font-weight:500;font-size:var(--t1);line-height:1;padding:13px 22px;border-radius:10px;
  border:1.5px solid transparent;min-height:46px;white-space:nowrap;text-decoration:none;background:var(--orange);color:#fff;
  transition:background .2s var(--ease-out),box-shadow .25s var(--ease-out),transform .12s var(--ease-out);
  will-change:transform}
.ogx-nav1 .ogx-btn .ogx-btn-in{display:inline-flex;align-items:center;gap:9px;position:relative;z-index:2}
.ogx-nav1 .ogx-btn svg{width:17px;height:17px}
.ogx-nav1 .ogx-btn::before{content:"";position:absolute;top:-60%;left:var(--mx,50%);width:120px;height:220%;
  transform:translateX(-50%);pointer-events:none;z-index:1;opacity:0;
  background:radial-gradient(closest-side,rgba(255,255,255,.45),transparent);transition:opacity .25s var(--ease-out)}
.ogx-nav1 .ogx-btn:hover{background:#d97b1f;box-shadow:0 10px 26px -12px rgba(233,138,44,.7)}
.ogx-nav1 .ogx-btn:hover::before{opacity:1}
.ogx-nav1 .ogx-btn:active{transform:scale(.97)}
.ogx-nav1 .ogx-btn:focus-visible{outline:2px solid var(--orange-ink);outline-offset:3px}

/* secondary "Contact" button — subtle, sits where the account icon used to */
.ogx-nav1 .ogx-btn2{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:inherit;font-weight:500;
  font-size:var(--t1);line-height:1;padding:12px 18px;border-radius:10px;border:1.5px solid var(--line);
  min-height:46px;white-space:nowrap;text-decoration:none;background:#fff;color:var(--ink);
  transition:border-color .2s var(--ease-out),background .2s var(--ease-out),transform .12s var(--ease-out),box-shadow .25s var(--ease-out)}
.ogx-nav1 .ogx-btn2 svg{width:17px;height:17px}
.ogx-nav1 .ogx-btn2:hover{border-color:var(--ink);background:var(--surface);box-shadow:0 8px 22px -14px rgba(22,24,29,.5);transform:translateY(-1px)}
.ogx-nav1 .ogx-btn2:active{transform:translateY(0)}
.ogx-nav1 .ogx-btn2:focus-visible{outline:2px solid var(--orange-ink);outline-offset:3px}
/* quote count badge — anchored to the CTA's top-right corner via a wrapper that does
   NOT clip overflow (the button itself is overflow:hidden for its hover sheen). */
.ogx-nav1 .ogx-btn-wrap{position:relative;display:inline-flex}
.ogx-nav1 .ogx-btn-wrap .quote-badge{top:-7px;right:-7px;box-shadow:0 0 0 2px var(--paper)}

/* ---- My Account control + light dropdown (mirrors .ogx-dd) ---- */
.ogx-nav1 .ogx-account{position:relative}
.ogx-nav1 .ogx-account-btn svg{width:21px;height:21px}
.ogx-nav1 .ogx-account:hover .ogx-account-btn,
.ogx-nav1 .ogx-account.open .ogx-account-btn{background:var(--grey)}
.ogx-nav1 .ogx-account-btn[aria-expanded="true"]{background:var(--grey)}
/* the panel — a light card aligned to the control's right edge */
.ogx-nav1 .ogx-acc-dd{display:none;position:absolute;top:calc(100% + 10px);right:0;min-width:248px;background:#fff;
  border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow,0 18px 48px -28px rgba(22,24,29,.22));
  padding:12px;z-index:80}
.ogx-nav1 .ogx-acc-dd::before{content:"";position:absolute;left:0;right:0;top:-10px;height:10px}/* hover bridge */
.ogx-nav1 .ogx-account:hover .ogx-acc-dd,
.ogx-nav1 .ogx-account:focus-within .ogx-acc-dd,
.ogx-nav1 .ogx-account.open .ogx-acc-dd{display:block;animation:ogx-dd-in .26s var(--ease-out)}
/* per-row stagger inside the open panel */
.ogx-nav1 .ogx-account:hover .ogx-acc-dd a,
.ogx-nav1 .ogx-account:focus-within .ogx-acc-dd a,
.ogx-nav1 .ogx-account.open .ogx-acc-dd a{animation:ogx-row-in .34s var(--ease-out) both}
.ogx-nav1 .ogx-acc-dd a:nth-of-type(1){animation-delay:.03s}
.ogx-nav1 .ogx-acc-dd a:nth-of-type(2){animation-delay:.06s}
.ogx-nav1 .ogx-acc-dd a:nth-of-type(3){animation-delay:.09s}
.ogx-nav1 .ogx-acc-dd a:nth-of-type(4){animation-delay:.12s}
/* logged-in greeting — mono eyebrow + name */
.ogx-nav1 .ogx-acc-dd-greet{padding:8px 12px 10px;margin-bottom:4px;border-bottom:1px solid var(--line)}
.ogx-nav1 .ogx-acc-eyebrow{display:block;font-family:var(--ff-mono); font-weight:var(--fw-mono);font-size:var(--t-2);
  letter-spacing:.16em;text-transform:uppercase;color:var(--muted);line-height:1.4}
.ogx-nav1 .ogx-acc-name{display:block;font-weight:600;font-size:var(--t1);color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}
/* rows — identical language to .ogx-dd a, with a leading glyph */
.ogx-nav1 .ogx-acc-dd a{position:relative;display:flex;align-items:center;gap:12px;
  padding:10px 12px;border-radius:9px;font-size:var(--t1);font-weight:500;color:var(--ink-2);text-decoration:none;
  transition:background .18s var(--ease-out),color .18s var(--ease-out),padding-left .18s var(--ease-out)}
.ogx-nav1 .ogx-acc-dd a:hover{background:var(--grey);color:var(--ink);padding-left:16px}
.ogx-nav1 .ogx-acc-dd a:focus-visible{outline:2px solid var(--orange-ink);outline-offset:-2px}
.ogx-nav1 .ogx-acc-row-in{display:inline-flex;align-items:center;gap:11px}
.ogx-nav1 .ogx-acc-dd a svg{width:17px;height:17px;flex-shrink:0;color:var(--muted);transition:color .18s var(--ease-out)}
.ogx-nav1 .ogx-acc-dd a:hover svg{color:var(--orange-ink)}
.ogx-nav1 .ogx-acc-dd-foot{margin-top:8px;border-top:1px solid var(--line);padding-top:8px}
.ogx-nav1 .ogx-acc-dd-foot a{color:var(--orange-ink);font-weight:600}
.ogx-nav1 .ogx-acc-dd-foot a svg{color:var(--orange-ink)}

/* ---- header nav: a touch larger / more prominent (tasteful, within 72px row) ---- */
.ogx-nav1 .ogx-menu{gap:4px;margin-left:12px}
.ogx-nav1 .ogx-menu>li>a{font-size:var(--t2);font-weight:560;letter-spacing:-.005em;padding:11px 16px}
.ogx-nav1 .ogx-nav-right{gap:10px}

/* suppress GTranslate's floating flag widget if the plugin is ever (re)activated —
   the site is English-only and renders no inline switcher */
.gtranslate_wrapper[id^="gt_float"],.gt_float_switcher,#gt_float_wrapper{display:none !important}

/* ---- mobile account accordion in the drawer ---- */
.ogx-macc-acc .ogx-macc-acc-lbl{display:inline-flex;align-items:center;gap:11px}
.ogx-macc-acc .ogx-macc-uic{width:19px;height:19px;color:var(--muted);flex-shrink:0}

.ogx-nav1 .ogx-burger{display:none}

/* the CTA is text-only on desktop; the icon carries the collapsed mobile pill */
.ogx-nav1 .ogx-btn .ogx-quote-ic{display:none}

@media(max-width:980px){
  .ogx-nav1 .ogx-menu,.ogx-nav1 .ogx-util,.ogx-nav1 .ogx-search,.ogx-nav1 .ogx-quote-txt,.ogx-nav1 .ogx-account{display:none}
  .ogx-nav1 .ogx-btn .ogx-quote-ic{display:block;width:18px;height:18px}
  .ogx-nav1 .ogx-burger{display:grid}
  .ogx-nav1 .ogx-nav{height:64px}
}
@media(max-width:560px){.ogx-nav1 .ogx-wrap{padding:0 20px}}

@media(prefers-reduced-motion:reduce){
  .ogx-nav1 .ogx-stag{opacity:1;transform:none;transition:none}
  .ogx-nav1 *{animation:none !important}
  .ogx-nav1 .ogx-util::after{transform:scaleX(1)}
  .ogx-nav1 .ogx-btn::before{display:none}
}

/* ============================================================
   SMART MENU — full-width mega panel (desktop) + mobile drawer
   Additive; reuses the composition's tokens (orange-sparing, calm).
   ============================================================ */

/* anchor the full-width panel to the header, not the <li>.
   The override must out-specify the composition's `.ogx-menu>li{position:relative}`. */
/* lift header+mega above the hero panel. !important because the composition's
   main stylesheet lives in a <body><style> that loads AFTER enhance.css. */
.ogx-nav1{z-index:500 !important}
.ogx-nav1 .ogx-head{position:relative}
/* position:static AND transform:none so the <li> is NOT a containing block
   (its .ogx-stag entrance transform would otherwise trap the absolute panel). */
.ogx-nav1 .ogx-menu > li.ogx-has-mega{position:static; transform:none !important; will-change:auto !important}

.ogx-nav1 .ogx-mega{
  position:absolute; left:0; right:0; top:100%;
  opacity:0; visibility:hidden; transform:translateY(8px);
  transition:opacity .24s var(--ease-out,ease), transform .24s var(--ease-out,ease), visibility .24s;
  pointer-events:none; z-index:90;
}
.ogx-nav1 .ogx-mega::before{content:""; position:absolute; left:0; right:0; top:-14px; height:14px} /* hover bridge */
.ogx-nav1 .ogx-has-mega:hover > .ogx-mega,
.ogx-nav1 .ogx-has-mega:focus-within > .ogx-mega,
.ogx-nav1 .ogx-has-mega.open > .ogx-mega{opacity:1; visibility:visible; transform:none; pointer-events:auto}
.ogx-nav1 .ogx-has-mega:hover > a .ogx-caret,
.ogx-nav1 .ogx-has-mega:focus-within > a .ogx-caret,
.ogx-nav1 .ogx-has-mega.open > a .ogx-caret{transform:rotate(180deg)}

.ogx-mega-inner{
  max-width:var(--maxw); margin:10px auto 0; padding:24px;
  background:#fff; border:1px solid var(--line); border-radius:18px;
  box-shadow:0 34px 80px -38px rgba(22,24,29,.34), 0 1px 0 rgba(22,24,29,.03);
}
/* minmax(0,1fr) is load-bearing: plain 1fr = minmax(auto,1fr), and the auto
   minimum floors a column at its min-content width — the unbreakable word
   "Immunodiagnostics" made that column ~49px wider than its siblings. 0 as
   the minimum makes every track truly equal; --mcols is set inline by
   header.php from the ACF domain count (fallback 4). The old 1.08fr slot was
   for the feature column when it sat in the row; it now spans below (1/-1). */
.ogx-mega-cols{display:grid; grid-template-columns:repeat(var(--mcols,4),minmax(0,1fr)); gap:0 30px}
/* Padding is IDENTICAL on every column (0 left / 30 right) so each content box is
   the same width and the hairline sits exactly halfway in the gutter: 30px of the
   column's own padding-right on one side, the 30px grid gap on the other. The old
   `:first-child{padding-left:6px}` exception made column 1's content start at a
   different offset than the rest, which read as uneven gaps. */
.ogx-mcol{display:flex; flex-direction:column; padding:4px 30px 4px 0; border-right:1px solid rgba(22,24,29,.16); position:relative}
/* `.ogx-mcol:last-of-type` was DEAD: :last-of-type matches the last sibling of the
   same TAG, and .ogx-mfeat is a div that comes after — so no .ogx-mcol ever matched
   and the last domain column kept a trailing hairline hanging at the right edge.
   Match the real last column instead (the one followed by the feature column), with
   :last-child as a fallback if .ogx-mfeat is ever removed. */
.ogx-mcol:has(+ .ogx-mfeat),
.ogx-mcol:last-child{border-right:none}
/* per-domain colour tab above each column head — turns the faint hairline into
   four unmistakably separate, colour-coded columns (calm, clinical, no new copy). */
.ogx-mcol::before{content:""; display:block; width:28px; height:3px; border-radius:2px; margin:0 0 14px; background:var(--line)}
.ogx-mcol[data-dom="mol"]::before{background:var(--orange)}
.ogx-mcol[data-dom="imm"]::before{background:#2F7E78}
.ogx-mcol[data-dom="auto"]::before{background:#5B6CB8}
.ogx-mcol[data-dom="ngs"]::before{background:#5B6CB8}
.ogx-mcol[data-dom="poc"]::before{background:#4f9a77}
.ogx-mcol-head{display:flex; gap:12px; align-items:flex-start; padding:4px 4px 14px; margin-bottom:8px;
  min-height:92px; border-bottom:1px solid var(--line); border-radius:10px}
.ogx-mcol-head:hover{background:var(--surface)}
.ogx-mic{width:38px; height:38px; border-radius:10px; background:var(--surface); border:1px solid var(--line);
  display:grid; place-items:center; color:var(--ink); flex-shrink:0; transition:.2s}
.ogx-mcol-head:hover .ogx-mic{background:var(--orange-wash); border-color:var(--orange-wash); color:var(--orange-ink)}
.ogx-mic svg{width:20px; height:20px}
/* min-height reserves 2 lines always, so column titles of different lengths
   still end at the same Y — see enhance.css for the full rationale. */
/* min-width:0 lets this flex item shrink inside .ogx-mcol-head now the grid
   track can go below min-content; hyphens+anywhere let a long single word
   ("Immunodiagnostics") wrap instead of overflowing the equal-width column. */
.ogx-mct{min-height:2.5em; min-width:0; display:flex; flex-direction:column; justify-content:center}
.ogx-mct b{display:block; font-size:.94rem; color:var(--ink); font-weight:600; letter-spacing:-.01em; line-height:1.25;
  overflow-wrap:break-word; hyphens:auto}
.ogx-mct small{display:block; font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.64rem; letter-spacing:.03em;
  color:var(--muted); margin-top:4px}
.ogx-mcol > a:not(.ogx-mcol-head):not(.ogx-mall){
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:9px 10px; border-radius:8px; font-size:.9rem; color:var(--ink-2);
  transition:background .16s, color .16s, padding-left .16s;
}
.ogx-mcol > a:not(.ogx-mcol-head):not(.ogx-mall):hover{background:var(--grey); color:var(--ink); padding-left:15px}
.ogx-mcol .ogx-n{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.72rem; color:var(--muted); transition:color .16s}
.ogx-mcol > a:hover .ogx-n{color:var(--orange-ink)}
.ogx-mall{margin-top:auto; padding-top:14px !important; color:var(--orange-ink); font-weight:600; font-size:.84rem;
  display:inline-flex; align-items:center; gap:7px}
.ogx-mall svg{width:15px; height:15px; transition:transform .2s}
.ogx-mall:hover svg{transform:translateX(3px)}

/* feature column */
/* padding-left:0 — the feature block must align flush left with the domain
   columns above it (and with the .fsm-title); the old 22px indent left it
   hanging 22px to the right of everything else. */
.ogx-mfeat{display:flex; flex-direction:column; padding:4px 4px 4px 0; border-right:none}
.ogx-mfeat .ogx-dd-label{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.64rem; letter-spacing:.16em;
  text-transform:uppercase; color:var(--muted); padding:4px 0 12px}
.ogx-mq{display:flex; align-items:center; gap:11px; padding:10px 12px; border-radius:10px;
  font-size:.9rem; font-weight:500; color:var(--ink); transition:background .16s}
.ogx-mq > span:nth-child(2){flex:1}
.ogx-mq:hover{background:var(--surface)}
.ogx-mqic{width:32px; height:32px; border-radius:8px; background:var(--orange-wash); color:var(--orange-ink);
  display:grid; place-items:center; flex-shrink:0}
.ogx-mqic svg{width:17px; height:17px}
.ogx-mq .ogx-n{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.72rem; color:var(--orange-ink)}
.ogx-mcta{margin-top:14px; background:var(--ink); color:#fff; border-radius:12px; padding:18px}
.ogx-mcta b{display:block; font-size:.94rem; margin-bottom:6px}
.ogx-mcta p{font-size:.81rem; color:rgba(255,255,255,.68); line-height:1.55; margin:0 0 14px}
.ogx-mcta-btn{display:inline-flex; align-items:center; gap:8px; background:var(--orange); color:#fff;
  padding:10px 16px; border-radius:9px; font-weight:600; font-size:.84rem; transition:background .2s, transform .2s}
.ogx-mcta-btn:hover{background:#d97b1f; transform:translateY(-1px)}
.ogx-mcta-btn svg{width:15px; height:15px}

.ogx-mega-foot{display:flex; justify-content:space-between; align-items:center; gap:16px;
  margin-top:18px; padding-top:16px; border-top:1px solid var(--line); font-size:.79rem; color:var(--muted); flex-wrap:wrap}
.ogx-mega-foot b{color:var(--ink); font-family:var(--ff-mono); font-weight:var(--fw-mono)}
.ogx-mega-tag{font-style:italic}

@media(max-width:1100px){ .ogx-mega-inner{padding:18px} .ogx-mcol{padding:4px 12px} }

/* ---------- MOBILE DRAWER (burger) ---------- */
.ogx-mscrim{position:fixed; inset:0; background:rgba(20,22,26,.46); z-index:190; opacity:0; visibility:hidden; transition:.3s}
.ogx-mscrim.open{opacity:1; visibility:visible}
/* Full-screen mobile menu: covers the whole viewport (no page peeking behind),
   slides in from the right, and cascades its rows in for a considered entrance. */
.ogx-mdrawer{position:fixed; inset:0; width:100%; height:100dvh; background:#fff; z-index:600;
  transform:translateX(100%); transition:transform .42s var(--ease-out,cubic-bezier(.16,1,.3,1)); overflow-y:auto; -webkit-overflow-scrolling:touch;
  padding:16px 20px calc(30px + env(safe-area-inset-bottom)); display:flex; flex-direction:column}
.ogx-mdrawer.open{transform:none}
/* staggered row reveal — every direct child except the sticky-feeling head */
.ogx-mdrawer > *:not(.ogx-md-head){opacity:0; transform:translateY(12px); transition:opacity .45s var(--ease-out,ease), transform .45s var(--ease-out,ease)}
.ogx-mdrawer.open > *:not(.ogx-md-head){opacity:1; transform:none}
.ogx-mdrawer.open > *:nth-child(2){transition-delay:.05s}
.ogx-mdrawer.open > *:nth-child(3){transition-delay:.09s}
.ogx-mdrawer.open > *:nth-child(4){transition-delay:.13s}
.ogx-mdrawer.open > *:nth-child(5){transition-delay:.17s}
.ogx-mdrawer.open > *:nth-child(6){transition-delay:.21s}
.ogx-mdrawer.open > *:nth-child(7){transition-delay:.25s}
.ogx-mdrawer.open > *:nth-child(8){transition-delay:.29s}
.ogx-mdrawer.open > *:nth-child(9){transition-delay:.33s}
.ogx-mdrawer.open > *:nth-child(10){transition-delay:.37s}
.ogx-mdrawer.open > *:nth-child(n+11){transition-delay:.41s}
.ogx-md-head{display:flex; align-items:center; justify-content:space-between; padding:4px 2px 16px; margin-bottom:6px; border-bottom:1px solid var(--line)}
.ogx-md-head img{height:30px}
.ogx-md-close{width:42px; height:42px; border:none; background:transparent; border-radius:9px; display:grid; place-items:center; cursor:pointer; color:var(--ink)}
.ogx-md-close:hover{background:var(--grey)}
.ogx-md-close svg{width:22px; height:22px}
.ogx-macc{border-bottom:1px solid var(--line)}
.ogx-macc > button{width:100%; display:flex; align-items:center; justify-content:space-between; gap:12px;
  background:none; border:none; padding:16px 4px; font:600 1rem 'Poppins',sans-serif; color:var(--ink); cursor:pointer; text-align:left}
.ogx-macc > button .cv{width:20px; height:20px; transition:transform .25s; color:var(--muted); flex-shrink:0}
.ogx-macc.open > button .cv{transform:rotate(180deg)}
.ogx-macc-body{max-height:0; overflow:hidden; transition:max-height .3s var(--ease-out,ease)}
.ogx-macc-body a{display:flex; align-items:center; justify-content:space-between; gap:12px; padding:11px 10px;
  font-size:.92rem; color:var(--ink-2); border-radius:8px}
.ogx-macc-body a:hover{background:var(--grey); color:var(--ink)}
.ogx-macc-body a .ogx-n{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.72rem; color:var(--muted)}
.ogx-macc-body{padding-bottom:6px}
.ogx-md-link{display:block; padding:16px 4px; font:600 1rem 'Poppins',sans-serif; color:var(--ink); border-bottom:1px solid var(--line)}
.ogx-md-cta{margin-top:20px; display:flex; align-items:center; justify-content:center; gap:9px;
  background:var(--orange); color:#fff; padding:14px; border-radius:11px; font-weight:600; font-size:.95rem}
.ogx-md-cta svg{width:18px; height:18px}
.ogx-md-meta{margin-top:16px; font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.68rem; letter-spacing:.04em; color:var(--muted); text-align:center}

@media(prefers-reduced-motion:reduce){
  .ogx-nav1 .ogx-mega{transition:none}
  .ogx-mdrawer,.ogx-macc-body{transition:none}
  .ogx-mdrawer > *:not(.ogx-md-head){opacity:1; transform:none; transition:none}
}

/* ============================================================
   .prose — site-wide long-form body type (page.php legal/content
   pages + any template-less page). Mirrors the article body styled
   inline in single.php so generic WP-editor content renders with the
   same brand typography. single.php keeps its own scoped copy for the
   richer article-hero context; this is the shared baseline.
   ============================================================ */
.prose{max-width:66ch}
.prose > *:first-child{margin-top:0}
.prose p{font-size:1.08rem; line-height:1.82; color:var(--ink-2); margin-bottom:26px; max-width:66ch}
.prose p:last-child{margin-bottom:0}
.prose p > strong,.prose strong{color:var(--ink); font-weight:600}
.prose em{font-style:italic}
.prose a{color:var(--orange-ink); font-weight:500; text-decoration:underline; text-decoration-thickness:1px; text-underline-offset:3px; text-decoration-color:var(--line-2); transition:text-decoration-color .2s}
.prose a:hover{text-decoration-color:var(--orange)}
.prose h2{font-size:var(--h-section); margin:clamp(40px,4.5vw,56px) 0 18px; scroll-margin-top:calc(var(--head-h) + 20px)}
.prose h3{font-size:var(--h-sub); margin:36px 0 12px; color:var(--ink)}
.prose h4{font-size:var(--h-minor); margin:28px 0 10px; color:var(--ink)}
.prose img{max-width:100%; height:auto; border-radius:var(--radius); border:1px solid var(--line); margin:clamp(20px,3vw,30px) 0}
.prose ul{list-style:none; margin:0 0 28px; max-width:66ch; display:flex; flex-direction:column; gap:13px}
.prose ul li{position:relative; padding-left:30px; font-size:1.05rem; line-height:1.7; color:var(--ink-2)}
.prose ul li::before{content:""; position:absolute; left:4px; top:13px; width:8px; height:2px; background:var(--orange)}
.prose ul li b,.prose ul li strong{color:var(--ink); font-weight:600}
.prose ol{margin:0 0 28px 1.1em; padding:0; max-width:66ch; display:flex; flex-direction:column; gap:13px}
.prose ol li{font-size:1.05rem; line-height:1.7; color:var(--ink-2); padding-left:6px}
.prose ol li::marker{color:var(--orange); font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.9em}
.prose blockquote{margin:clamp(40px,5vw,56px) 0; padding:6px 0 6px 30px; border-left:3px solid var(--orange); max-width:60ch}
.prose blockquote p{font-size:clamp(1.3rem,2.2vw,1.65rem); line-height:1.45; letter-spacing:-.018em; color:var(--ink); font-weight:500; margin:0}
.prose blockquote cite,.prose .wp-block-pullquote cite{display:block; margin-top:16px; font-style:normal; font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.78rem; letter-spacing:.04em; color:var(--muted)}
/* WordPress core pull-quote → same restrained orange-rail quote. */
.prose .wp-block-pullquote{margin:clamp(40px,5vw,56px) 0; padding:6px 0 6px 30px; border-left:3px solid var(--orange); max-width:60ch; text-align:left}
.prose .wp-block-pullquote p{font-size:clamp(1.3rem,2.2vw,1.65rem); line-height:1.45; letter-spacing:-.018em; color:var(--ink); font-weight:500; margin:0}
/* figures + captions — frame the image and mark the caption with the orange dot
   used throughout the design (.article-hero / .inline-fig figcaption). Covers
   both the WordPress core image block and a bare <figure><figcaption>. */
.prose figure,.prose .wp-block-image{margin:clamp(24px,3vw,32px) 0}
.prose figure img,.prose .wp-block-image img{display:block; max-width:100%; height:auto; border:1px solid var(--line); border-radius:var(--radius); margin:0}
.prose figure figcaption,.prose .wp-block-image figcaption,.prose .wp-element-caption{margin-top:12px; font-size:.81rem; color:var(--muted); line-height:1.5; display:flex; align-items:center; gap:9px; text-align:left}
.prose figure figcaption::before,.prose .wp-block-image figcaption::before{content:""; width:6px; height:6px; border-radius:50%; background:var(--orange); flex-shrink:0}
.prose table{width:100%; border-collapse:collapse; margin:0 0 28px; font-size:.96rem}
.prose th,.prose td{text-align:left; padding:12px 14px; border-bottom:1px solid var(--line)}
.prose th{color:var(--ink); font-weight:600}
.prose .page-links{margin-top:28px; font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.82rem; color:var(--muted); display:flex; gap:10px; flex-wrap:wrap}

/* ---------- 15b. BODY-COPY WEIGHT UNIFORMITY ----------
   Client rule: all running body copy reads at ONE weight (the body 400).
   Inline <strong>/<b> inside prose, ledes and section answer/body paragraphs
   must NOT bump the weight mid-sentence (e.g. the hero lede's "Goffin
   Diagnostics", the about "two units" names, bolded FAQ terms). Emphasis
   stays visible via colour — it is just no longer heavier.
   SCOPED to body-copy paragraphs ONLY: headings, buttons, nav, badges,
   eyebrows, table headers, list lead-in labels, stat/result counts and the
   mega-menu/footer bold counts sit outside these selectors and keep their
   own weight. .lede is pinned to 400 so every lede matches standard <p>. */
.lede{font-weight:400}
.lede strong,.lede b,
.prose p strong,.prose p > strong,.prose p b,
.acc-body .inner p strong,.acc-body .inner p b,
.ab-sec .cols p strong,.ab-sec .cols p b{font-weight:inherit}

/* ---------- 16. CATALOGUE (shop archive) — filters + grid ----------
   Ported 1:1 from the static design (client-home/shop.html inline styles).
   Uses ONLY the shared design tokens above so the catalogue inherits the
   exact calm/clinical system. Lives in site.css (not inline on the archive)
   so the AJAX-replaced grid + drawer inherit identical styling. */

/* page header — eyebrow + big H1 + descriptive lede */
.cat-head{background:linear-gradient(180deg,#fff 0%, var(--surface) 100%); border-bottom:1px solid var(--line)}
.cat-head .wrap{padding-top:clamp(28px,4vw,46px); padding-bottom:clamp(34px,5vw,56px)}
.cat-head .eyebrow{margin-bottom:18px}
.cat-head h1{margin-bottom:18px}
.cat-head .lede{max-width:60ch; margin-bottom:0}
/* "All products" back-link shown on a catalogue search header */
.cat-searchback{display:inline-flex; align-items:center; gap:8px; margin-top:16px; font-weight:500; font-size:.9rem;
  color:var(--orange-ink); text-decoration:none}
.cat-searchback svg{width:16px; height:16px; transition:transform .18s var(--ease-out)}
.cat-searchback:hover svg{transform:translateX(-3px)}
/* category description relocated below the products — a calm centred closing
   note (no offset card, so it never misaligns with the grid above or the help
   strip below); a single hairline sets it apart from the products. */
.cat-outro{border-top:1px solid var(--line)}
.cat-outro .wrap{padding-top:clamp(40px,5vw,66px); padding-bottom:clamp(8px,1.5vw,16px)}
.cat-outro-inner{max-width:680px; margin:0 auto; text-align:center}
.cat-outro-eyebrow{display:inline-flex; align-items:center; gap:9px; font-family:var(--ff-mono); font-size:.68rem; letter-spacing:.1em; text-transform:uppercase; color:var(--orange-ink); font-weight:var(--fw-mono)}
.cat-outro-eyebrow::before,.cat-outro-eyebrow::after{content:""; width:20px; height:1px; background:var(--line-2)}
.cat-outro-body{margin-top:15px; color:var(--muted); font-size:1.05rem; line-height:1.72}
.cat-outro-body p{margin:0 0 .7em}
.cat-outro-body p:last-child{margin-bottom:0}
.cat-head .cat-meta{display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.78rem; letter-spacing:.04em; color:var(--muted); margin-top:26px}
.cat-head .cat-meta .pill{display:inline-flex; align-items:center; gap:8px; background:#fff;
  border:1px solid var(--line); border-radius:var(--radius-pill); padding:7px 14px; color:var(--ink-2)}
.cat-head .cat-meta .pill b{color:var(--ink); font-weight:600}
.cat-head .cat-meta .pill .d{width:6px; height:6px; border-radius:50%; background:var(--orange)}

/* two-column catalogue shell — generous gutter between rails */
.cat-shell{display:grid; grid-template-columns:268px 1fr; gap:clamp(28px,4vw,56px); align-items:start}
.cat-main{min-width:0}

/* ---- FILTERS sidebar (scrolls with the page — not sticky, per preference) ---- */
.filters{position:static; align-self:start}
.filters-head{display:none; align-items:center; justify-content:space-between; margin-bottom:18px}
.filters-head strong{font-size:1.05rem; color:var(--ink)}
.fcard{background:#fff; border:1px solid var(--line); border-radius:var(--radius); overflow:hidden}
.fgroup{padding:24px; border-bottom:1px solid var(--line)}
.fgroup:last-child{border-bottom:none}
.fgroup > h4{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.7rem; letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted); font-weight:var(--fw-mono); margin-bottom:16px; display:flex; align-items:center; gap:9px}
.fgroup > h4::before{content:""; width:14px; height:2px; background:var(--orange); flex-shrink:0}

/* category navigator — site-wide drill-down (breadcrumb + child categories) */
.catnav-crumbs{display:flex; flex-wrap:wrap; align-items:center; gap:3px 6px; margin-bottom:15px; font-size:.78rem; line-height:1.4}
.catnav-crumb{color:var(--muted); text-decoration:none}
a.catnav-crumb:hover{color:var(--orange-ink)}
.catnav-crumb.is-current{color:var(--ink); font-weight:600}
.catnav-sep{color:var(--line-2)}
.catnav-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:2px}
.catnav-item{display:flex; align-items:center; gap:10px; padding:9px 10px; border-radius:9px; text-decoration:none;
  color:var(--ink); transition:background .16s, color .16s}
.catnav-item:hover{background:var(--surface); color:var(--orange-ink)}
.catnav-name{flex:1; min-width:0; font-size:.9rem; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.catnav-cnt{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.72rem; color:var(--muted); flex-shrink:0}
.catnav-item:hover .catnav-cnt{color:var(--orange-ink)}
.catnav-arrow{width:15px; height:15px; color:var(--line-2); flex-shrink:0; transition:transform .16s, color .16s}
.catnav-item:hover .catnav-arrow{transform:translateX(2px); color:var(--orange-ink)}
.catnav-leaf{font-size:.85rem; color:var(--muted); line-height:1.5; margin:0}

/* segmented control — All / Panel / Single */
.seg{display:grid; grid-template-columns:repeat(3,1fr); gap:4px; background:var(--grey);
  border:1px solid var(--line); border-radius:var(--radius-sm); padding:4px}
/* regulatory status seg has 4 options (All + up to 3) — two tidy rows */
.seg-reg{grid-template-columns:repeat(2,1fr)}
.seg input{position:absolute; opacity:0; pointer-events:none}
.seg label{display:flex; align-items:center; justify-content:center; height:38px; border-radius:7px;
  font-size:.84rem; font-weight:500; color:var(--ink-2); cursor:pointer; transition:background .18s, color .18s, box-shadow .18s}
.seg label:hover{color:var(--ink)}
.seg input:checked + label{background:#fff; color:var(--ink); box-shadow:var(--shadow-sm); font-weight:600}
.seg input:focus-visible + label{outline:2px solid var(--orange-ink); outline-offset:2px}

/* checkbox facets with counts */
.facet{display:flex; align-items:center; gap:11px; padding:8px 0; cursor:pointer;
  font-size:.9rem; color:var(--ink-2); transition:color .15s}
.facet:hover{color:var(--ink)}
/* The "show more" toggle hides overflow rows via the [hidden] attribute; the
   .facet display:flex above would otherwise override the UA hidden rule. */
.facet[hidden]{display:none !important}
.facet input{appearance:none; -webkit-appearance:none; width:18px; height:18px; flex-shrink:0; border:1.5px solid var(--line-2);
  border-radius:5px; background:#fff; cursor:pointer; transition:.18s; position:relative}
.facet input:hover{border-color:var(--muted)}
.facet input:checked{background:var(--orange); border-color:var(--orange)}
.facet input:checked::after{content:""; position:absolute; left:5px; top:1.5px; width:5px; height:9px;
  border:solid #fff; border-width:0 2px 2px 0; transform:rotate(45deg)}
.facet input:focus-visible{outline:2px solid var(--orange-ink); outline-offset:2px}
.facet .fname{flex:1}
.facet .cnt{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.74rem; color:var(--muted); font-variant-numeric:tabular-nums}
.facet input:checked ~ .cnt{color:var(--orange-ink)}

.filters-reset{margin-top:16px}

/* facet "show more / fewer" toggle — quiet, mono, matches the facet group */
.facet-more{display:inline-flex; align-items:center; gap:7px; margin-top:10px; padding:0; background:none; border:0; cursor:pointer;
  font-family:var(--ff-mono); font-size:.74rem; letter-spacing:.04em; color:var(--orange-ink); font-weight:var(--fw-mono)}
.facet-more:hover{text-decoration:underline}
.facet-more:focus-visible{outline:2px solid var(--orange-ink); outline-offset:3px; border-radius:4px}
.facet-more svg{width:14px; height:14px; transition:transform .2s var(--ease)}
.facet-more[aria-expanded="true"] svg{transform:rotate(180deg)}

/* ---- MAIN column ---- */
.cat-toolbar{display:flex; align-items:center; justify-content:space-between; gap:18px; flex-wrap:wrap; margin-bottom:20px}
.cat-toolbar .result-count{font-size:.95rem; color:var(--ink-2)}
.cat-toolbar .result-count b{color:var(--ink); font-weight:600}
.cat-toolbar .sortbox{display:flex; align-items:center; gap:10px; margin:0}
.cat-toolbar .sortbox .slbl{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.72rem; letter-spacing:.06em;
  text-transform:uppercase; color:var(--muted)}
.cat-toolbar .sortbox .select{padding:9px 38px 9px 14px; font-size:.88rem; min-width:170px; border-radius:var(--radius-sm)}
/* in-catalogue product search (toolbar) */
.cat-toolbar .shop-search{display:flex; align-items:center; gap:8px; flex:1 1 240px; max-width:440px;
  border:1px solid var(--line); border-radius:12px; background:#fff; padding:5px 5px 5px 12px;
  transition:border-color .15s var(--ease), box-shadow .15s var(--ease)}
.cat-toolbar .shop-search:focus-within{border-color:var(--ink); box-shadow:0 6px 20px -14px rgba(22,24,29,.4)}
.cat-toolbar .shop-search .ss-ic{display:inline-flex; color:var(--muted); flex:0 0 auto}
.cat-toolbar .shop-search .ss-ic svg{width:18px; height:18px}
.cat-toolbar .shop-search .ss-input{flex:1 1 auto; min-width:0; border:0; outline:0; background:transparent;
  font:inherit; font-size:.92rem; color:var(--ink); padding:7px 0}
.cat-toolbar .shop-search .ss-input::placeholder{color:var(--muted)}
.cat-toolbar .shop-search .ss-go{flex:0 0 auto; background:var(--ink); color:#fff; border:0; border-radius:9px;
  padding:8px 15px; font:inherit; font-size:.84rem; font-weight:500; cursor:pointer; transition:background .18s var(--ease)}
.cat-toolbar .shop-search .ss-go:hover{background:var(--orange)}
@media(max-width:720px){.cat-toolbar .shop-search{order:3; flex-basis:100%; max-width:none}}

/* active-filter chip row */
.active-row{display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:26px;
  padding-bottom:24px; border-bottom:1px solid var(--line)}
.active-row:empty{display:none}
.active-row .albl{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.7rem; letter-spacing:.07em; text-transform:uppercase;
  color:var(--muted); margin-right:2px}
.active-row .chip.removable a{display:grid; place-items:center; width:16px; height:16px; color:var(--muted)}
.active-row .chip.removable a:hover{color:var(--ink)}
.filters-open-btn{display:none}

/* product grid — generous gaps */
.cat-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:var(--gap)}
/* when the grid holds only the empty-state card, let it span full width */
.cat-grid.is-empty{grid-template-columns:1fr}
/* AJAX in-flight: gently dim + lock interaction while results swap */
.cat-grid[aria-busy="true"]{opacity:.55; pointer-events:none; transition:opacity .2s var(--ease)}

/* target micro-chips inside a pcard (catalogue-only detail) */
.target-chips{display:flex; flex-wrap:wrap; gap:6px; margin-bottom:14px}
.target-chips span{font-size:.7rem; color:var(--ink-2); background:var(--surface); border:1px solid var(--line);
  border-radius:6px; padding:4px 9px; line-height:1.2}
.target-chips span.more{color:var(--muted); background:#fff}

/* empty state — design-matched calm card */
.cat-empty{grid-column:1/-1; text-align:center; padding:48px 18px}
.cat-empty.card{background:#fff; border:1px solid var(--line); border-radius:var(--radius); padding:clamp(36px,5vw,56px) 24px; max-width:520px; margin-inline:auto}
.cat-empty.card h3{margin-bottom:12px}
.cat-empty.card p{color:var(--ink-2); max-width:42ch; margin:0 auto 22px}
.cat-empty-actions{display:flex; gap:12px; justify-content:center; flex-wrap:wrap}

/* mobile filter drawer chrome — hidden on desktop */
.filters-scrim{display:none}

/* ---------- catalogue responsive ---------- */
@media(max-width:1080px){
  .cat-grid{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:900px){
  .cat-shell{grid-template-columns:1fr; gap:0}
  /* sidebar becomes an off-canvas drawer */
  .filters{position:fixed; inset:0 0 0 auto; width:min(360px,90vw); background:#fff; z-index:90;
    transform:translateX(100%); transition:transform .35s var(--ease); padding:22px 22px 128px; top:0;
    height:100vh; height:100dvh; overflow-y:auto; -webkit-overflow-scrolling:touch; overscroll-behavior:contain;
    box-shadow:-20px 0 60px -30px rgba(0,0,0,.35)}
  .filters.show{transform:translateX(0)}
  .filters-head{display:flex}
  .filters-scrim{display:block; position:fixed; inset:0; background:rgba(20,22,26,.45); z-index:80;
    opacity:0; visibility:hidden; transition:.3s}
  .filters-scrim.show{opacity:1; visibility:visible}
  .filters-open-btn{display:inline-flex}
}
@media(max-width:560px){
  .cat-grid{grid-template-columns:1fr}
  .cat-toolbar{align-items:flex-start}
  .cat-toolbar .sortbox{width:100%}
  .cat-toolbar .sortbox .select{flex:1; min-width:0}
}
@media(prefers-reduced-motion:reduce){
  .facet-more svg,.cat-grid[aria-busy="true"]{transition:none}
}

/* ============================================================
   HEADER — OPTION C (chosen 2026-06-28)
   Balanced centred nav · bold catalogue trigger → full-screen
   animated menu (#goffinFsMenu, wired in main.js) · expanding
   search. The hover .ogx-mega is hidden but kept in the DOM as the
   clone source for the full-screen menu. Mobile (≤980) keeps the
   existing burger + drawer untouched (centred grid is desktop-only).
   ============================================================ */

/* topbar location-pin was rendering unconstrained (~287px) — restore icon size */
.ogx-nav1 .ogx-util .ogx-pin{width:14px;height:14px;flex-shrink:0}

/* replace the hover mega with the full-screen menu (keep markup as clone source) */
.ogx-nav1 .ogx-mega{display:none !important}
.ogx-nav1 .ogx-head{position:relative}

@media(min-width:981px){
  .ogx-nav1 .ogx-nav{display:grid;grid-template-columns:1fr auto 1fr;gap:24px;align-items:center}
  .ogx-nav1 .ogx-logo{justify-self:start}
  .ogx-nav1 .ogx-menu{justify-self:center;margin-left:0}
  .ogx-nav1 .ogx-nav-right{justify-self:end;margin-left:0;gap:6px}
  /* catalogue = bold trigger (li.ogx-has-mega>a out-specifies .ogx-menu>li>a) */
  .ogx-nav1 .ogx-menu>li.ogx-has-mega>a{background:var(--grey);border:1px solid var(--line);padding:9px 16px;border-radius:999px;color:var(--ink);font-weight:600}
  .ogx-nav1 .ogx-menu>li.ogx-has-mega>a::after{display:none}
  .ogx-nav1 .ogx-menu>li.ogx-has-mega>a:hover{background:#fff;border-color:var(--orange);color:var(--ink)}
  .ogx-nav1 .ogx-menu>li.ogx-has-mega>a .ogx-caret{opacity:.7}
  /* type refinement — lighter, more editorial nav weight (Poppins 500, a real
     weight vs the synthesised 560); the bold catalogue pill + CTA carry the
     emphasis, with a touch of tracking for an elegant feel */
  .ogx-nav1 .ogx-menu>li>a{font-weight:500;letter-spacing:.012em}
  .ogx-nav1 .ogx-menu>li.ogx-has-mega>a{font-weight:600;letter-spacing:.006em}
  .ogx-nav1 .ogx-btn-wrap{margin-left:12px;position:relative}
  .ogx-nav1 .ogx-btn-wrap::before{content:"";position:absolute;left:-12px;top:50%;transform:translateY(-50%);width:1px;height:24px;background:var(--line)}
}

/* ---- full-screen catalogue menu ---- */
#goffinFsMenu{position:fixed;inset:0;z-index:3000;display:flex;flex-direction:column;overflow:auto;background:#f4f3f1;opacity:0;visibility:hidden;transition:opacity .45s ease,visibility .45s}
#goffinFsMenu.open{opacity:1;visibility:visible}
#goffinFsMenu .fsm-bar{display:flex;align-items:center;justify-content:flex-end;width:100%;max-width:1240px;margin:0 auto;padding:24px 28px}
#goffinFsMenu .fsm-eyebrow{font-family:var(--ff-mono); font-weight:var(--fw-mono);font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;color:var(--orange-ink);display:flex;align-items:center;gap:10px}
#goffinFsMenu .fsm-eyebrow::before{content:"";width:22px;height:2px;background:var(--orange)}
#goffinFsMenu .fsm-close{width:46px;height:46px;border-radius:12px;border:1px solid var(--line);background:#fff;display:grid;place-items:center;cursor:pointer;color:var(--ink);transition:background .2s,color .2s,transform .35s}
#goffinFsMenu .fsm-close:hover{background:var(--ink);color:#fff;transform:rotate(90deg)}
#goffinFsMenu .fsm-close svg{width:20px;height:20px}
#goffinFsMenu .fsm-panel{width:100%;max-width:1240px;margin:0 auto;padding:6px 28px 64px;opacity:0;transform:translateY(-16px);transition:opacity .5s ease,transform .5s ease}
#goffinFsMenu.open .fsm-panel{opacity:1;transform:none;transition-delay:.05s}
#goffinFsMenu .fsm-title{font-size:clamp(1.7rem,3.6vw,2.6rem);letter-spacing:-.02em;line-height:1.08;margin:4px 0 30px;max-width:20ch}
#goffinFsMenu .fsm-title b{color:var(--orange-ink)}
#goffinFsMenu .ogx-mega-inner{max-width:none;margin:0;padding:0;background:none;border:0;box-shadow:none}
#goffinFsMenu .ogx-mega-cols{gap:0 30px}
/* Every column carries the SAME padding (0 left / 30 right): equal tracks with
   equal content boxes, column 1's content flush with the .fsm-title above it, and
   the hairline exactly centred in the gutter — 30px of padding-right on its left,
   the 30px grid gap on its right. The previous `padding:6px 30px` +
   `:first-child{padding-left:0}` pair put column 1's content at a different offset
   from every other column, which is the uneven-gap the client spotted. */
#goffinFsMenu .ogx-mcol{border-right:1px solid rgba(22,24,29,.16)}
/* Was `:last-of-type` — a dead selector (see the base rule): .ogx-mfeat is the last
   div sibling, so the last domain column kept a hairline dangling at the far right. */
#goffinFsMenu .ogx-mcol:has(+ .ogx-mfeat),
#goffinFsMenu .ogx-mcol:last-child{border-right:none}
#goffinFsMenu .ogx-mcol{padding:6px 30px 6px 0;opacity:0;transform:translateY(28px);transition:opacity .55s ease,transform .55s cubic-bezier(.2,.7,.2,1)}
#goffinFsMenu.open .ogx-mcol{opacity:1;transform:none}
/* Left-to-right entrance stagger, generated from the column's own index so an
   editor-added 5th/6th domain keeps its place in the sequence (the old fixed
   nth-child(1..4) list left any further column with a 0s delay). */
#goffinFsMenu.open .ogx-mcol{transition-delay:calc(.12s + (var(--mi, 0) * .06s))}
#goffinFsMenu .ogx-mcol-head{min-height:108px}
/* 1.06rem, not 1.18rem. Equal-width tracks give the title a 184.5px text box, and
   "Immunodiagnostics" — one unbreakable word — measures 191.2px at 1.18rem. It
   therefore broke mid-word as "Immunodiagnostic|s", which looks like a defect.
   At 1.06rem the word measures 171.4px and sits on one line with ~13px to spare,
   while the other three titles still break naturally at their spaces. Measured in
   the browser at 1280/1440/1920; 1.12rem also fits but only by 3px, too tight to
   survive font-rendering differences. */
#goffinFsMenu .ogx-mcol-head b{font-size:1.06rem}
#goffinFsMenu .ogx-mfeat{opacity:0;transform:translateY(28px);transition:opacity .55s ease,transform .55s cubic-bezier(.2,.7,.2,1);transition-delay:.34s}
#goffinFsMenu.open .ogx-mfeat{opacity:1;transform:none}
/* No max-width / auto-margins / side padding: this sits INSIDE .fsm-panel, which
   already caps the width at 1240px and supplies the 28px gutter. Its own 28px was
   added on top, pushing the foot text 28px right of every column above it. */
#goffinFsMenu .ogx-mega-foot{margin:26px 0 0;padding:20px 0 0;border-top:1px solid var(--line);opacity:0;transition:opacity .5s ease;transition-delay:.5s}
#goffinFsMenu.open .ogx-mega-foot{opacity:1}
/* minmax(0,1fr) here too — plain 1fr would re-floor a column at the
   min-content width of "Immunodiagnostics" and unequalize the pair again. */
@media(max-width:900px){#goffinFsMenu .ogx-mega-cols{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){#goffinFsMenu .ogx-mega-cols{grid-template-columns:minmax(0,1fr)}}
html.goffin-fsm-lock,body.goffin-fsm-lock{overflow:hidden}

/* ---- expanding search: the search icon unfolds into a centred bar ---- */
.ogx-xsearch{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(.97);width:min(620px,58%);height:48px;display:flex;align-items:center;gap:10px;padding:0 8px 0 18px;background:#fff;border:1px solid var(--line);border-radius:999px;box-shadow:0 16px 40px -22px rgba(22,24,29,.45);opacity:0;visibility:hidden;pointer-events:none;z-index:60;transition:opacity .3s var(--ease-out),transform .42s var(--ease-out),visibility .3s}
.ogx-nav1.xsearching .ogx-xsearch{opacity:1;visibility:visible;pointer-events:auto;transform:translate(-50%,-50%) scale(1)}
.ogx-nav1 .ogx-menu{transition:opacity .26s var(--ease-out),transform .26s var(--ease-out)}
.ogx-nav1.xsearching .ogx-menu{opacity:0;pointer-events:none;transform:translateY(-6px)}
.ogx-xsearch .xs-lead{width:20px;height:20px;color:var(--muted);flex-shrink:0}
.ogx-xsearch input{flex:1;min-width:0;border:0;outline:0;background:none;font-family:inherit;font-size:1rem;font-weight:500;color:var(--ink)}
.ogx-xsearch input::placeholder{color:var(--muted);font-weight:400}
.ogx-xsearch .xs-kbd{font-family:var(--ff-mono); font-weight:var(--fw-mono);font-size:.62rem;letter-spacing:.05em;color:var(--muted);border:1px solid var(--line);border-radius:6px;padding:4px 7px;flex-shrink:0;background:var(--grey)}
.ogx-xsearch .xs-close{width:36px;height:36px;border-radius:50%;border:0;background:var(--grey);display:grid;place-items:center;cursor:pointer;color:var(--ink);flex-shrink:0;transition:background .2s,color .2s,transform .35s}
.ogx-xsearch .xs-close:hover{background:var(--ink);color:#fff;transform:rotate(90deg)}
.ogx-xsearch .xs-close svg{width:16px;height:16px}
/* live suggestions dropdown under the expanding search */
.ogx-xsearch .xs-suggest{position:absolute;top:calc(100% + 8px);left:0;right:0;background:#fff;border:1px solid var(--line);
  border-radius:16px;box-shadow:0 26px 64px -32px rgba(22,24,29,.5);padding:6px;max-height:min(62vh,440px);overflow-y:auto;text-align:left}
.ogx-xsearch .xs-sgroup{font-family:var(--ff-mono); font-weight:var(--fw-mono);font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;
  color:var(--muted);padding:11px 12px 6px}
.ogx-xsearch .xs-sitem{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:9px;color:var(--ink);
  text-decoration:none;font-size:.9rem;transition:background .14s,color .14s}
.ogx-xsearch .xs-sitem:hover,.ogx-xsearch .xs-sitem.is-active{background:var(--surface);color:var(--orange-ink)}
.ogx-xsearch .xs-sitem-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ogx-nav1.xsearching .ogx-search{background:var(--orange-wash);color:var(--orange-ink)}
.ogx-nav1 .ogx-search svg{transition:transform .3s var(--ease-out)}
.ogx-nav1.xsearching .ogx-search svg{transform:scale(1.1)}
@media(max-width:980px){.ogx-xsearch{display:none}}

@media(prefers-reduced-motion:reduce){
  #goffinFsMenu,#goffinFsMenu .fsm-panel,#goffinFsMenu .ogx-mcol,#goffinFsMenu .ogx-mfeat,#goffinFsMenu .ogx-mega-foot,.ogx-xsearch,.ogx-nav1 .ogx-menu{transition:none !important}
  #goffinFsMenu.open .fsm-panel,#goffinFsMenu.open .ogx-mcol,#goffinFsMenu.open .ogx-mfeat{transform:none !important}
}

/* ============================================================
   UNIFORM BODY-COPY WEIGHT — running text reads at ONE weight
   ------------------------------------------------------------
   Client rule: no stray bold words inside paragraphs of running
   text (e.g. the hero lede must not bold "Goffin Diagnostics"
   mid-sentence). Body copy is already the normal 400 weight; the
   only thing breaking uniformity is inline <strong>/<b>, which the
   UA renders bold (700) — and .prose paragraph strong, set to 600
   above. Make that inline emphasis INHERIT the surrounding weight
   so an emphasised word no longer jumps out by weight. Colour
   emphasis from existing rules (e.g. .prose strong → --ink) is left
   intact — this only equalises WEIGHT.
   Scoped to running-text paragraph/lede/prose bodies ONLY. NOT
   touched (keep their intended weight): headings, buttons,
   eyebrows / .mono / .targets labels, table headers, nav, stat &
   count figures, and list-item "Label:" lead-ins (.prose ul li b,
   .acc-body .inner ul.pdp-features li b).
   ============================================================ */
.lede strong,.lede b,
.prose p strong,.prose p b,
.section-head p strong,.section-head p b,
.why-card p strong,.why-card p b,
.card p strong,.card p b,
.flow-step p strong,.flow-step p b,
.note-card .nbody strong,.note-card .nbody b,
.cta-inner p strong,.cta-inner p b,
.cols p strong,.cols p b,
.cat-outro-body strong,.cat-outro-body b{font-weight:inherit}


/* SAFETY NET — <b>/<strong> nested in a mono label inherit its cut.
   The UA's 'bolder' default would otherwise render them heavier than
   their siblings. Selector list is generated; keep it comment-free. */
#goffinFsMenu .fsm-eyebrow b,
#goffinFsMenu .fsm-eyebrow strong,
.active-row .albl b,
.active-row .albl strong,
.badge b,
.badge strong,
.card-domain .idx b,
.card-domain .idx strong,
.cat-head .cat-meta b,
.cat-head .cat-meta strong,
.cat-outro-eyebrow b,
.cat-outro-eyebrow strong,
.cat-toolbar .sortbox .slbl b,
.cat-toolbar .sortbox .slbl strong,
.catnav-cnt b,
.catnav-cnt strong,
.eyebrow b,
.eyebrow strong,
.facet .cnt b,
.facet .cnt strong,
.facet-more b,
.facet-more strong,
.fgroup > h4 b,
.fgroup > h4 strong,
.flow-step .n b,
.flow-step .n strong,
.flow-step .tag b,
.flow-step .tag strong,
.goffin-promo-badge b,
.goffin-promo-badge strong,
.hero-flow .lbl b,
.hero-flow .lbl strong,
.mono b,
.mono strong,
.note-card .nfoot .meta b,
.note-card .nfoot .meta strong,
.note-tag b,
.note-tag strong,
.ogx-macc-body a .ogx-n b,
.ogx-macc-body a .ogx-n strong,
.ogx-mcol .ogx-n b,
.ogx-mcol .ogx-n strong,
.ogx-mct small b,
.ogx-mct small strong,
.ogx-md-meta b,
.ogx-md-meta strong,
.ogx-mfeat .ogx-dd-label b,
.ogx-mfeat .ogx-dd-label strong,
.ogx-mq .ogx-n b,
.ogx-mq .ogx-n strong,
.ogx-nav1 .ogx-acc-eyebrow b,
.ogx-nav1 .ogx-acc-eyebrow strong,
.ogx-nav1 .ogx-dd a .ogx-n b,
.ogx-nav1 .ogx-dd a .ogx-n strong,
.ogx-nav1 .ogx-dd-label b,
.ogx-nav1 .ogx-dd-label strong,
.ogx-xsearch .xs-kbd b,
.ogx-xsearch .xs-kbd strong,
.ogx-xsearch .xs-sgroup b,
.ogx-xsearch .xs-sgroup strong,
.prose .page-links b,
.prose .page-links strong,
.prose .wp-block-pullquote cite b,
.prose .wp-block-pullquote cite strong,
.prose blockquote cite b,
.prose blockquote cite strong,
.quote-badge b,
.quote-badge strong,
.search-box kbd b,
.search-box kbd strong,
.site-footer .units b,
.site-footer .units strong,
.site-footer h4 b,
.site-footer h4 strong,
.table .gene b,
.table .gene strong,
.table thead th b,
.table thead th strong,
.targets b,
.targets strong,
.type-tag b,
.type-tag strong{font-weight:var(--fw-mono)}

/* Three mono labels build their emphasis with a bare <b>, whose UA default
   "bolder" outranks the inherited cut. Named explicitly because they sit in
   containers the generated safety net above does not cover. */
.eyebrow b, .eyebrow strong,
.gh-count b, .gh-count strong,
.pdp-eyebrow b, .pdp-eyebrow strong{font-weight:var(--fw-mono)}

/* ---- quote flyout ----
   Confirmation anchored to the header's quote button rather than a detached
   corner toast, so the visitor's eye lands on the destination. Calm sheet:
   white, hairline, one orange accent on the tick and the link. */
.q-fly{position:absolute; top:calc(100% + 12px); right:0; z-index:600; width:288px; max-width:calc(100vw - 32px);
  background:#fff; border:1px solid var(--line); border-radius:var(--radius-sm);
  box-shadow:0 18px 40px -14px rgba(22,24,29,.28), 0 2px 6px rgba(22,24,29,.08);
  padding:14px 15px 12px; opacity:0; transform:translateY(-6px); pointer-events:none;
  transition:opacity .22s var(--ease-out), transform .22s var(--ease-out)}
.q-fly.show{opacity:1; transform:none; pointer-events:auto}
.q-fly::before{content:""; position:absolute; top:-6px; right:26px; width:11px; height:11px; background:#fff;
  border-left:1px solid var(--line); border-top:1px solid var(--line); transform:rotate(45deg)}
.q-fly-top{display:flex; align-items:center; gap:8px; color:var(--orange-ink); font-size:.82rem; font-weight:600}
.q-fly-name{margin:8px 0 0; font-size:.94rem; line-height:1.35; color:var(--ink)}
.q-fly-foot{display:flex; align-items:center; justify-content:space-between; gap:12px;
  margin-top:12px; padding-top:10px; border-top:1px solid var(--line)}
.q-fly-n{font-family:var(--ff-mono); font-weight:var(--fw-mono); font-size:.72rem; letter-spacing:.06em;
  text-transform:uppercase; color:var(--muted)}
.q-fly-n::after{content:" in request"}
.q-fly-cta{font-size:.82rem; font-weight:600; color:var(--orange-ink); text-decoration:none; white-space:nowrap}
.q-fly-cta:hover{text-decoration:underline}
/* the badge answers the flyout so the two read as one event */
@keyframes goffin-badge-pulse{0%{transform:scale(1)}38%{transform:scale(1.38)}100%{transform:scale(1)}}
.quote-badge.pulse{animation:goffin-badge-pulse .45s var(--ease-out)}
@media(prefers-reduced-motion:reduce){
  .q-fly{transition:none}
  .quote-badge.pulse{animation:none}
}
@media(max-width:560px){ .q-fly{right:-8px; width:min(288px, calc(100vw - 24px))} }

/* --- product cards reveal by MOVEMENT ONLY ---
   A fade means the whole card — pills included — is translucent for the
   duration, and the pills sit on a photo so that is exactly where it shows.
   Reported twice as "the pills are see-through". Cards therefore slide in at
   full opacity: the motion still reads as a reveal, and nothing is ever
   half-transparent. Everything else on the site keeps the fade. */
html.js .pcard[data-reveal],
html.js .gh-card[data-reveal],
html.js [data-reveal] .pcard,
html.js [data-reveal] .gh-card{opacity:1}
html.js .pcard[data-reveal]{transition:transform .55s var(--ease-out); transition-delay:var(--d,0s)}
html.js .gh-card[data-reveal]{transition:transform .55s var(--ease-out); transition-delay:var(--d,0s)}
