/* ==========================================================================
   Decision Lab — styles.css
   Architecture ported verbatim from NetNam Maritime; theme is Decision Lab.

   INHERITED RULES (do not change without a deliberate decision)
     · html font-size is fluid: 1.0582vw → 1em = 16px at a 1512px viewport.
       Locks to 16px at ≤991px so mobile stays predictable.
     · Every dimension resolves to a multiple of 8 (occasionally 4).
     · Semantic elements are styled raw — h1–h4, p, li need no classes.
     · Layout is CSS Grid: .c-section > .c-container > .c-grid > .u-col-N.
     · Prefixes: c- component · s- page-section · l- layout · u- utility · is- state

   THEME
     · Poppins throughout.
     · Blue #28AAF0 + black are primary. The other nine hues are decorative and
       appear only where the design calls for them (expert cards, solution groups).
     · SQUARE CORNERS. Radius is reserved for pill shapes: buttons, the eyebrow
       pill, and small badges. Cards, media, tables and inputs are all square.
     · Reading text is the raw <p> at 18px. Components use 16px, meta 14px,
       controls 14px (--fs-mini). Colour changes go through utilities, not
       per-element classes.
   ========================================================================== */

:root{
  /* ---- Blue (primary) ------------------------------------------------- */
  --blue-50:#F1F8FE;--blue-100:#E1F1FD;--blue-200:#BCE2FB;--blue-300:#81CCF8;--blue-400:#28AAF0;
  --blue-500:#1599E2;--blue-600:#097AC0;--blue-700:#08619C;--blue-800:#0B5381;--blue-900:#0F456B;--blue-950:#0A2C47;
  --blue-lighter:#94D5F7;--blue-light:#5EBFF4;--blue-default:#28AAF0;--blue-dark:#2291CC;--blue-darker:#1C77A8;

  /* ---- Neutrals ------------------------------------------------------- */
  --stone-50:#FAFAFA;--stone-100:#F6F6F6;--stone-200:#E9E9E9;--stone-300:#B2B2B2;--stone-400:#909090;
  --stone-500:#6E6E6E;--stone-600:#4C4C4C;--stone-700:#2A2A2A;--stone-800:#191919;--stone-900:#0C0C0C;
  --black:#000;--white:#FFF;

  /* ---- Decorative hues (full brand set) ------------------------------- */
  --green-lighter:#80EEC0;--green-light:#40E5A1;--green-default:#00DC82;--green-dark:#00BB6F;--green-darker:#009A5B;
  --lime-lighter:#DEE9A7;--lime-light:#CEDF7B;--lime-default:#D1E231;--lime-dark:#A1B443;--lime-darker:#849437;
  --yellow-lighter:#FFF2AC;--yellow-light:#FFEC83;--yellow-default:#FFE65A;--yellow-dark:#D9C34D;--yellow-darker:#B3A13F;
  --orange-lighter:#F9C580;--orange-light:#F7A840;--orange-default:#F48B00;--orange-dark:#CF7600;--orange-darker:#AB6100;
  --red-lighter:#FFB1A3;--red-light:#FF8B74;--red-default:#FF6446;--red-dark:#D9553C;--red-darker:#B34631;
  --pink-lighter:#FCBBCF;--pink-light:#FB9AB7;--pink-default:#FA789F;--pink-dark:#D56687;--pink-darker:#AF546F;
  --purple-lighter:#E0B5DF;--purple-light:#D190CE;--purple-default:#C26BBE;--purple-dark:#A55BA2;--purple-darker:#884B85;
  --indigo-lighter:#80B1E3;--indigo-light:#408BD6;--indigo-default:#0466C8;--indigo-dark:#0055AA;--indigo-darker:#00468C;
  --teal-lighter:#80F2F2;--teal-light:#40EBEB;--teal-default:#00E5E5;--teal-dark:#00C3C3;--teal-darker:#00A0A0;

  /* ---- Semantic ------------------------------------------------------- */
  --color-brand:var(--blue-default);
  --color-brand-hover:var(--blue-dark);
  --color-heading:var(--black);
  --color-text:#000;
  --color-text-muted:#000;
  --color-surface:var(--white);
  --color-page:var(--stone-100);
  --color-border:var(--stone-200);
  --color-border-strong:var(--stone-300);
  --ground:var(--black);
  --ground-soft:var(--stone-800);
  --accent:var(--blue-default);
  --rule-dotted:#252525;
  /* light smoke — the pale neutral used for hero beds and hairlines */
  /* smoke ramp — light neutral surfaces, lightest to deepest */
  --smoke:#F4F6F7;--smoke-1:#F3F4F7;--smoke-2:#E9EBF0;
  --smoke-grad:linear-gradient(308deg,var(--smoke) 0%,var(--smoke) 100%);
  /* tinted panel used by the check bullets */
  --panel-tint:rgba(232,237,246,.25);   /* #E8EDF6 @ 25% */
  --panel-line:#E9EEF0;
  /* visible hairline for dividers that must read against white — the source's
     download-column rule */
  --rule-strong:#D3D9DB;
  --panel-dark:#111;   /* solution card body */

  /* ---- Radius — pills only -------------------------------------------- */
  --radius-pill:62.5em;

  /* ---- Type ----------------------------------------------------------- */
  --font-body:"Poppins",system-ui,-apple-system,sans-serif;
  --fs-display:3em;    /* 48 — h1 */
  --fs-title:2.5em;    /* 40 — h2 */
  --fs-cap-lg:1.5em;   /* 24 — h3 */
  --fs-cap-md:1.25em;  /* 20 — h4 */
  --fs-body:1em;       /* 16 — component text (cards, meta rows, nav items) */
  --fs-lead:1.125em;   /* 18 — STANDARD reading size: the raw <p> tag */
  --fs-small:.875em;   /* 14 — eyebrow, meta, ticker */
  /* 14 — CONTROLS ONLY: buttons, card CTAs, nav actions. Separate token so
     control sizing can move without touching the reading sizes. */
  --fs-mini:.875em;
  --fs-stat:3.5em;

  /* ---- Space / shell -------------------------------------------------- */
  --maxw:82em;
  --gutter:3.5em;
  --nav-pad:6.5em;
  --shadow-sm:0 .0625em .1875em rgba(0,0,0,.06);
  --shadow-md:0 .5em 2.5em rgba(0,0,0,.08);
  --shadow-lg:0 2em 5em rgba(0,0,0,.10);
  --transition:200ms ease;
  --nav-h:5em;
}

@media (max-width:991px){
  :root{--gutter:2.5em;--fs-display:2.5em;--fs-title:2em;--fs-cap-lg:1.375em;--fs-stat:3em;}
}
@media (max-width:767px){
  :root{--gutter:1.5em;--fs-display:2.25em;--fs-title:1.75em;--fs-cap-lg:1.25em;--fs-cap-md:1.125em;--fs-stat:2.5em;}
}

/* ==========================================================================
   RESET + BASE
   ========================================================================== */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;border-radius:0;}

html{font-size:1.0582vw;scroll-behavior:smooth;}
body{
  font-family:var(--font-body);font-size:1.0582vw;line-height:1.5;
  color:var(--color-text);background:var(--color-surface);
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
}
@media (max-width:991px){html,body{font-size:16px;}}

img,svg,video{max-width:100%;display:block;}
a{color:inherit;text-decoration:none;}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer;}
ul,ol{list-style:none;}

h1{font-size:var(--fs-display);line-height:1.125;font-weight:700;letter-spacing:-.02em;color:var(--color-heading);margin:0 0 2rem;}
h2{font-size:var(--fs-title);line-height:1.15;font-weight:700;letter-spacing:-.02em;color:var(--color-heading);margin:0 0 1.5rem;}
h3{font-size:var(--fs-cap-lg);line-height:1.25;font-weight:600;letter-spacing:-.01em;color:var(--color-heading);margin:0 0 1rem;}
h4{font-size:var(--fs-cap-md);line-height:1.4;font-weight:600;letter-spacing:-.01em;color:var(--color-heading);margin:0 0 .5rem;}
/* Raw <p> is the standard reading size. Prefer a bare <p> and change colour
   with a utility (.u-text-white) or a parent combo, not a per-element class. */
p{font-size:var(--fs-lead);line-height:1.6;color:var(--color-text);margin:0 0 1rem;}
li{font-size:var(--fs-lead);line-height:1.6;color:var(--color-text);}
strong,b{font-weight:600;color:var(--color-heading);}
p:last-child{margin-bottom:0;}

/* Dark beds re-point tokens rather than being overridden component by
   component — a descendant rule scoped to only ONE of these two classes drifts
   silently (that is how the CTA band's outline button ended up black-on-black). */
.c-section--dark,.c-band--cta{--color-heading:var(--white);--color-text:rgba(255,255,255,.75);--accent:var(--blue-300);
  --btn-line-fg:var(--white);--btn-line-bd:rgba(255,255,255,.35);}
.c-section--dark h1,.c-section--dark h2,.c-section--dark h3,.c-section--dark h4,
.c-band--cta h1,.c-band--cta h2,.c-band--cta h3{color:var(--white);}

/* ==========================================================================
   LAYOUT
   ========================================================================== */
/* Desktop: no side padding — content simply caps at --maxw and centres.
   Tablet/mobile: the gutter comes back so text never touches the edge. */
.c-container{max-width:var(--maxw);margin-inline:auto;padding-inline:0;}
@media (max-width:991px){.c-container{padding-inline:var(--gutter);}}

/* Combo: full-bleed shell used by the nav and the mega menu. Deliberately
   drops the max-width so the logo stays pinned --nav-pad from the viewport
   edge on any display, rather than pulling in to a centred column. */
.c-container--nav{max-width:none;padding-inline:var(--nav-pad);}
@media (max-width:991px){.c-container--nav{padding-inline:var(--gutter);}}

.c-section{position:relative;padding-block:7.5em;}
.c-section--hero{padding-block:0;}
.c-section--tight{padding-block:3.5em;}
.c-section--dark{background:var(--ground);}
.c-section--tint{background:var(--color-page);}
/* combo: white bed with a smoke hairline that fades out at both ends */
.c-container--ruled{padding-top:7.5em;position:relative;}
.c-container--ruled::before{content:"";position:absolute;top:0;left:0;right:0;height:1px;
  background:var(--stone-200);}
.c-section:has(> .c-section__bg){overflow:hidden;}
.c-section__bg{position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none;}
.c-section > .c-container{position:relative;z-index:1;}

.c-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:2em;}
.c-grid--header{margin-bottom:3rem;align-items:end;}
.c-grid__col{min-width:0;}
.u-col-1{grid-column:span 1}.u-col-2{grid-column:span 2}.u-col-3{grid-column:span 3}
.u-col-4{grid-column:span 4}.u-col-5{grid-column:span 5}.u-col-6{grid-column:span 6}
.u-col-7{grid-column:span 7}.u-col-8{grid-column:span 8}.u-col-9{grid-column:span 9}
.u-col-10{grid-column:span 10}.u-col-12{grid-column:span 12}

@media (max-width:991px){
  .c-grid{grid-template-columns:1fr;gap:2.5em;}
  .c-grid > [class*="u-col-"]{grid-column:auto;}
  .c-section{padding-block:5em;}
  /* re-assert: same specificity as the rule above but later in source,
     so the base .c-section--hero{padding-block:0} would otherwise lose */
  .c-section--hero{padding-block:0;}
  .c-section--tight{padding-block:2.5em;}
  .c-grid--header{margin-bottom:2.5rem;}
}

/* ==========================================================================
   UTILITIES
   ========================================================================== */
.u-text-white{color:var(--white)!important;}
.u-text-blue{color:var(--accent)!important;}
.u-text-center{text-align:center;}
.u-mb-0{margin-bottom:0!important;}
.u-mb-32{margin-bottom:2rem;}
.u-mt-32{margin-top:2rem;}
.u-pt-0{padding-top:0!important;}
/* off-screen but still read by screen readers — for labels on placeholder-only
   inputs. Was previously done with inline styles on the newsletter label. */
.u-visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;}
@media (max-width:991px){.u-hide-tablet{display:none!important;}}

/* ==========================================================================
   COMPONENTS
   ========================================================================== */

/* ---- Eyebrow ---------------------------------------------------------- */
.c-eyebrow{
  display:inline-flex;align-items:center;gap:.5em;align-self:flex-start;width:fit-content;
  font-size:var(--fs-small);font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--color-text-muted);margin-bottom:1rem;
}
.c-eyebrow--pill{
  border:1px solid var(--accent);border-radius:var(--radius-pill);
  background:var(--blue-100);color:var(--accent);padding:.375em 1.25em .375em .375em;gap:.75em;
}
.c-section--dark .c-eyebrow,.c-band--cta .c-eyebrow{color:var(--blue-300);}
/* over the Solutions photo bed the muted blue loses contrast — go white */
.s-solutions .c-eyebrow{color:var(--white);}
.c-eyebrow__ico{width:2em;height:2em;padding:.4375em;border-radius:var(--radius-pill);
                background:var(--accent);color:var(--white);flex:none;}

/* ---- Buttons — the only pill shapes on the page ----------------------- *
   light bg → black button, hover blue · dark bg → white button, hover blue
   Text on blue hover is black: white on #28AAF0 is 2.3:1 and fails.       */
.c-cta-row{display:flex;flex-wrap:wrap;align-items:center;gap:1em;}
.c-cta-row--center{justify-content:center;}

.c-btn{
  display:inline-flex;align-items:center;gap:.5em;
  font-family:inherit;font-size:var(--fs-body);font-weight:500;line-height:1.5;
  padding:.75em 1.5em;border:1px solid transparent;border-radius:var(--radius-pill);
  cursor:pointer;transition:background var(--transition),color var(--transition),border-color var(--transition);
}
/* Control-sized button — nav actions, card CTAs. Uses --fs-mini, not a text size. */
.c-btn--mini{font-size:var(--fs-mini);font-weight:600;padding:.625em 1.25em;}

.c-btn__ico{width:1em;height:1em;flex:none;transition:transform var(--transition);}
.c-btn:hover .c-btn__ico{transform:translateX(.125em);}

/* light bed: black → blue, label + arrow stay white throughout */
.c-btn--primary{background:var(--black);color:var(--white);border-color:var(--black);}
.c-btn--primary:hover{background:var(--color-brand);border-color:var(--color-brand);color:var(--white);}
/* dark bed: white → blue; label + arrow flip black → white */
.c-btn--onDark{background:var(--white);color:var(--black);border-color:var(--white);}
.c-btn--onDark:hover{background:var(--color-brand);border-color:var(--color-brand);color:var(--white);}
/* reads its colours from tokens, so any dark bed re-points them automatically */
.c-btn--line{background:transparent;color:var(--btn-line-fg,var(--black));
             border-color:var(--btn-line-bd,var(--color-border-strong));}
.c-btn--line:hover{border-color:var(--color-brand);color:var(--color-brand);}

.c-link{display:inline-flex;align-items:center;gap:.5em;font-size:var(--fs-small);font-weight:600;color:var(--accent);}
.c-link:hover{color:var(--color-brand-hover);}
.c-link .c-btn__ico{width:1em;height:1em;}

/* ---- Boxed check bullets ---------------------------------------------- */
.c-checks{display:flex;flex-direction:column;gap:1em;}
/* li carries no font-size of its own here — it inherits the body scale */
.c-checks > li{font-size:inherit;}
.c-checks__item{display:flex;gap:1.25em;align-items:flex-start;padding:1.5em;
                background:var(--panel-tint);border:1px solid var(--panel-line);}
/* filled checkbox marker rather than an outline circle */
.c-checks__ico{width:1.25em;height:1.25em;flex:none;color:var(--white);
               background:var(--accent);padding:.1875em;
               border-radius:50%;margin-top:.25em;}
.c-checks__item h4{margin-bottom:.5rem;}
/* combo: body copy inside the panel sits a step lighter than the heading */
.c-checks__item p{margin-bottom:0;color:var(--stone-600);}

/* ---- Cards ------------------------------------------------------------ */
.c-card{position:relative;display:flex;flex-direction:column;background:var(--color-surface);
        overflow:hidden;transition:box-shadow var(--transition),transform var(--transition);}
.c-card--bordered{border:1px solid var(--color-border);}
.c-card__media{position:relative;aspect-ratio:16/9;overflow:hidden;background:var(--color-page);}
.c-card__media img{width:100%;height:100%;object-fit:cover;}
.c-card__body{display:flex;flex-direction:column;gap:.5em;padding:1.5em;flex:1;}
/* the source's card tags are plain muted sentence case — NOT the uppercase
   blue eyebrow used for section headers */
.c-card__tag{font-size:var(--fs-small);font-weight:500;letter-spacing:0;
             text-transform:none;color:var(--stone-400);}
.c-card__title{font-size:var(--fs-cap-md);line-height:1.4;font-weight:600;color:var(--color-heading);margin:0;}
.c-card__text{font-size:var(--fs-body);color:var(--color-text);margin:0;}
a.c-card:hover{box-shadow:var(--shadow-lg);}
.c-card--dark{background:var(--stone-800);}
.c-card--dark .c-card__title{color:var(--white);}
.c-card--dark .c-card__text{color:rgba(255,255,255,.75);}

/* Featured card — image with dark scrim, title over it */
.c-card--feature{min-height:26em;justify-content:flex-end;}
.c-card--feature img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;}
.c-card--feature .c-card__scrim{position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.1) 30%,rgba(0,0,0,.85));}
/* flex:0 — inheriting .c-card__body's flex:1 stretches it over the whole card
   and parks the text at the TOP; the header group belongs at the bottom */
.c-card--feature .c-card__body{position:relative;z-index:1;flex:0 auto;}
.c-card--feature .c-card__title{color:var(--white);font-size:2em;font-weight:700;line-height:1.25;}
.c-card--feature .c-card__tag{color:rgba(255,255,255,.8);}

/* Article card — title ABOVE the image, as the source. The body comes first
   in the DOM; nothing here reorders it. */
.c-card--article{padding:2em 1.5em;gap:1.5em;}
.c-card--article .c-card__body{padding:0;flex:0 auto;}
.c-card--article .c-card__media{aspect-ratio:16/9;}

/* Horizontal card — thumbnail left, text right */
.c-card--row{flex-direction:row;align-items:center;gap:1em;padding:.75em 1.25em .75em .75em;}
.c-card--row .c-card__media{flex:none;width:12em;aspect-ratio:16/9;align-self:center;}
.c-card--row .c-card__body{padding:0;justify-content:center;}
.c-card--row .c-card__title{font-size:var(--fs-body);font-weight:500;line-height:1.5;}

/* Download card — a bordered COLUMN, not a boxed card: the source butts them
   together with no gap and separates them with a left rule. */
/* TWO children only — group + foot. With three (body/cover/foot) the
   space-between free space also lands BETWEEN body and cover, so a short title
   left a gap and every card's cover sat at a different height. */
.c-download{display:flex;flex-direction:column;justify-content:space-between;gap:2em;
  height:100%;padding:0 2em;border-left:1px solid var(--rule-strong);}
/* title grows down from the top, cover pinned to the bottom by margin-top:auto,
   so all covers share one baseline whatever the title length */
.c-download__main{display:flex;flex-direction:column;flex:1;min-height:0;}
.c-download__body{display:flex;flex-direction:column;gap:.5em;padding:0;}
/* no fixed height: the image sizes the cover. The panel is a bottom-aligned
   band the cover rises above, not a full backdrop. */
.c-download__cover{position:relative;display:flex;justify-content:center;align-items:flex-end;
  margin-top:auto;padding:2em 1.25em 1.25em;width:100%;}
.c-download__panel{position:absolute;inset:auto 0 0;height:9.5em;
  background:var(--blue-default);overflow:hidden;}
/* DIRECT child — a descendant selector also matches the six .c-rings__ring
   images inside the panel and outranks .c-rings__ring, breaking the cluster */
/* width-driven now that the cover has no fixed height — height:100% would
   resolve to auto against an auto-height parent */
.c-download__cover > img{position:relative;z-index:1;width:100%;height:auto;
  box-shadow:var(--shadow-lg);}
.c-download__foot{padding:0;}

/* ---- Logo wall -------------------------------------------------------- *
   Each logo is optically sized: the WRAPPER sets padding (how much air the
   mark gets) and the IMAGE sets width (how big the mark is drawn). Two
   independent axes — a square mark like BMW needs 50% width, a wordmark like
   Mercedes needs the full box. Values lifted from the source.              */
.c-logos{position:relative;display:flex;align-items:center;width:100%;gap:1.5em;overflow:hidden;}
/* fade both ends of the marquee into the page */
.c-logos::before,.c-logos::after{content:"";position:absolute;top:0;bottom:0;width:6em;z-index:2;pointer-events:none;}
.c-logos::before{left:0;background:linear-gradient(to right,var(--color-surface),rgba(255,255,255,0));}
.c-logos::after{right:0;background:linear-gradient(to left,var(--color-surface),rgba(255,255,255,0));}
.c-logos__track{display:flex;align-items:center;gap:3.5em;width:max-content;animation:dl-marquee 30s linear infinite;}
.c-logos__group{display:flex;flex:none;align-items:center;justify-content:space-between;gap:3.5em;}

.c-logo{position:relative;z-index:3;display:flex;align-items:center;justify-content:center;
        width:8em;height:5em;padding:.75em .5em;flex:none;}
.c-logo--reg{padding-left:1em;padding-right:1em;}
.c-logo--full{padding:0;}
.c-logo--xs{padding:1.25em 1em;}
.c-logo--long{padding:1em 0;}

.c-logo__img{position:relative;width:100%;height:100%;object-fit:contain;}
.c-logo__img--reg{width:85%;}
.c-logo__img--sqr{width:50%;}

@keyframes dl-marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){.c-logos__track{animation:none;}}
@media (min-width:1440px){.c-logos__track{gap:2em;}}

/* ---- Ranking table ---------------------------------------------------- */
.c-rank{background:var(--white);border:1px solid var(--color-border);}
.c-rank__head{padding:1.5em;border-bottom:1px solid var(--color-border);}
.c-rank__head h4{margin-bottom:.25rem;}
.c-rank__meta{font-size:var(--fs-small);color:var(--color-text-muted);margin:0;}
/* rows grouped in their own padded box, so the hover highlight is inset from
   the card edge instead of running into it */
.c-rank__rows{padding:1em;}
.c-rank__row{display:flex;align-items:center;gap:1.5em;padding:.75em .5em;
  border-bottom:1px solid var(--color-border);transition:background var(--transition);}
.c-rank__row:last-child{border-bottom:none;}
.c-rank__row:hover{background:var(--stone-50);}
.c-rank__num{font-size:var(--fs-small);font-weight:600;color:var(--color-text-muted);width:1.5em;flex:none;}
.c-rank__brand{display:flex;align-items:center;gap:1em;flex:1;min-width:0;}
.c-rank__logo{width:2.5em;height:1.75em;object-fit:contain;flex:none;}
.c-rank__name{font-size:var(--fs-body);font-weight:500;color:var(--color-heading);}
.c-rank__delta{display:inline-flex;align-items:center;gap:.375em;font-size:var(--fs-small);font-weight:600;
               padding:.25em .75em;border-radius:var(--radius-pill);flex:none;}
.c-rank__delta.is-up{color:var(--green-darker);background:rgba(0,220,130,.14);}
.c-rank__delta.is-down{color:var(--red-darker);background:rgba(255,100,70,.14);}
.c-rank__delta.is-flat{color:var(--color-text-muted);background:var(--color-page);}

/* ---- People — coloured background cards ------------------------------- */
/* Two INDEPENDENT mechanisms build the image, exactly as the original:
     (a) __band  — a coloured strip across the bottom carrying the hexagons
     (b) __pos + __img — where the portrait frame sits in the card, and where
         the portrait sits inside that frame. Two axes, set separately.       */
.c-person{display:flex;flex-direction:column;}
.c-person__photo{position:relative;display:flex;flex-direction:column;
                 justify-content:flex-end;overflow:hidden;}

/* (a) colour band + hexagons — behind the portrait */
.c-person__band{position:absolute;inset:auto 0 0;height:9.5em;z-index:0;overflow:hidden;}
.c-person__band--blue  {background:var(--blue-default);}
.c-person__band--red   {background:var(--red-light);}
.c-person__band--orange{background:var(--orange-light);}
.c-person__band--green {background:var(--green-light);}
/* square sub-box the hexagon cluster anchors within; the original reaches the
   same place via hr-alg → pos → size */
.c-person__ptrn{position:absolute;top:0;bottom:0;aspect-ratio:1;}
.c-person__ptrn--rgt{right:0;}
.c-person__ptrn--lft{left:0;}

/* (b) portrait: __pos aligns the frame, __img aligns the photo inside it */
.c-person__pos{position:relative;z-index:5;display:flex;height:13.5em;overflow:hidden;}
.c-person__pos--lft{justify-content:flex-start;}
.c-person__pos--ctr{justify-content:center;}
.c-person__pos--rgt{justify-content:flex-end;}
.c-person__frame{position:relative;width:70%;height:100%;}
.c-person__img{width:100%;height:100%;object-fit:contain;object-position:50% 100%;}
.c-person__img--lft{object-position:0% 100%;}
.c-person__img--rgt{object-position:100% 50%;}
/* zoom: overflows the frame and is clipped by __pos */
.c-person__img--lg{height:125%;}

/* social icons: bottom-centre of the band, revealed on card hover */
.c-person__some{position:absolute;inset:0;z-index:15;display:flex;gap:.5em;
  justify-content:center;align-items:flex-end;padding:1em;
  opacity:0;transform:translateY(1em);
  transition:opacity var(--transition),transform var(--transition);}
.c-person:hover .c-person__some,
.c-person:focus-within .c-person__some{opacity:1;transform:translateY(0);}
.c-person__some-item{display:flex;justify-content:center;align-items:center;
  width:2.5em;height:2.5em;border-radius:50%;background:var(--white);opacity:.75;
  -webkit-backdrop-filter:blur(2em);backdrop-filter:blur(2em);
  box-shadow:0 2px 24px rgba(0,0,0,.2);transition:opacity var(--transition);}
.c-person__some-item:hover{opacity:1;}
.c-person__some-item img{width:50%;height:50%;}

/* body tile */
.c-person__body{display:flex;flex-direction:column;gap:1em;padding:1.25em;
                background:var(--smoke);}
.c-person__head{display:flex;flex-direction:column;gap:.25em;}
.c-person__name{font-size:1.125em;font-weight:600;color:var(--stone-800);margin:0;}
.c-person__role{font-size:var(--fs-small);font-weight:500;color:var(--stone-400);margin:0;}

/* ---- Stat ------------------------------------------------------------- */
.c-stat__num{display:block;font-size:var(--fs-stat);line-height:1;font-weight:700;letter-spacing:-.02em;color:var(--color-heading);margin-bottom:.5rem;}
.c-stat p{margin-bottom:0;}
.c-section--dark .c-stat__num,.c-band--cta .c-stat__num{color:var(--accent);}

/* ---- Quote ------------------------------------------------------------ */
.c-quote{display:flex;flex-direction:column;align-items:center;gap:2em;text-align:center;
         max-width:52em;margin-inline:auto;width:100%;}
/* Control bar: arrows at the ends, the current author's company logo centred on
   a hairline rule. One bar for the whole slider — ui.js swaps the logo per
   slide, so the arrows are not duplicated inside every slide. */
.c-quote__bar{display:flex;align-items:center;gap:1.5em;width:100%;
              max-width:52em;margin:0 auto 2em;}
.c-quote__rule{flex:1;height:1px;background:var(--stone-300);opacity:.25;}
.c-quote__logo{flex:none;display:flex;align-items:center;justify-content:center;
               width:5em;height:4em;padding-inline:.5em;}
.c-quote__logo img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;}
.c-quote__body{display:flex;flex-direction:column;gap:2em;width:85%;margin-inline:auto;}
.c-quote__text{font-size:1.25em;line-height:1.7;color:var(--color-text);margin:0;}
.c-quote__name{font-size:1.25em;font-weight:600;line-height:1.25;letter-spacing:.1em;
               text-transform:uppercase;color:var(--color-heading);margin:0;}
.c-quote__role{font-size:var(--fs-body);color:var(--color-text-muted);margin:0;}

/* ---- Slider ----------------------------------------------------------- */
.l-slider{position:relative;}
.l-slider__track{display:flex;gap:2em;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;}
.l-slider__track::-webkit-scrollbar{display:none;}
/* display:flex so the card inside can take height:100% — the track stretches
   every slide to the tallest, giving all cards one height */
.l-slider__slide{flex:0 0 100%;scroll-snap-align:start;display:flex;}
.l-slider--edge .l-slider__btn{position:absolute;top:50%;transform:translateY(-50%);z-index:2;}
.l-slider--edge .l-slider__btn[data-slide="prev"]{left:-1.5em;}
.l-slider--edge .l-slider__btn[data-slide="next"]{right:-1.5em;}
.l-slider__nav{display:flex;gap:.75em;margin-top:2em;}
.l-slider__btn{width:3em;height:3em;border-radius:var(--radius-pill);border:1px solid var(--color-border-strong);
               display:flex;align-items:center;justify-content:center;background:var(--white);
               color:var(--black);transition:all var(--transition);}
.l-slider__btn:hover{background:var(--color-brand);border-color:var(--color-brand);color:var(--black);}
.l-slider__btn[disabled]{opacity:.3;cursor:default;}
.l-slider__btn:hover[disabled]{background:var(--white);border-color:var(--color-border-strong);}
@media (max-width:991px){
  .l-slider--edge .l-slider__btn{position:static;transform:none;}
  .l-slider--edge .l-slider__nav{display:flex;}
}

/* Case card — landscape, text left / image right */
.c-case{display:grid;grid-template-columns:1fr 1fr;background:var(--stone-800);
        min-height:22em;width:100%;height:100%;}
.c-case__body{display:flex;flex-direction:column;justify-content:center;gap:.75em;padding:3em;}
.c-case__media{position:relative;overflow:hidden;}
.c-case__media img{width:100%;height:100%;object-fit:cover;}
.c-case__tag{font-size:var(--fs-small);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--blue-300);}
.c-case h3{color:var(--white);margin-bottom:.5rem;}
.c-case p{color:rgba(255,255,255,.75);}
@media (max-width:767px){.c-case{grid-template-columns:1fr;}.c-case__body{padding:2em;}.c-case__media{aspect-ratio:16/9;}}

/* ---- Ticker ----------------------------------------------------------- */
.c-ticker{display:flex;align-items:flex-start;gap:1.5em;}
.c-ticker__label{display:flex;flex-direction:column;justify-content:space-between;
                 align-self:stretch;gap:1em;padding-block:.75em;flex:none;}
.c-ticker__title{display:flex;align-items:center;gap:.375em;
                 font-size:var(--fs-small);color:var(--white);white-space:nowrap;}
.c-ticker__nav{display:flex;gap:.5em;justify-content:flex-end;}
.c-ticker__btn{display:flex;align-items:center;justify-content:center;
               width:2em;height:2em;border-radius:var(--radius-pill);
               border:1px solid rgba(255,255,255,.4);color:var(--white);
               transition:background var(--transition),border-color var(--transition),color var(--transition);}
.c-ticker__btn:hover{background:var(--white);border-color:var(--white);color:var(--black);}
.c-ticker__btn svg{width:.875em;height:.875em;}

.c-ticker__items{position:relative;flex:1;min-width:0;}
.c-ticker__item{width:100%;padding:.5em;box-shadow:var(--shadow-lg);
  background:rgba(255,255,255,.8);
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);
  opacity:0;transform:translateY(1em);transition:opacity .25s ease,transform .25s ease;}
.c-ticker__item:not(.is-active){display:none;}
.c-ticker__item.is-active{opacity:1;transform:translateY(0);}
.c-ticker__inner{display:flex;align-items:center;gap:1em;}
.c-ticker__media{flex:none;width:10em;height:7em;overflow:hidden;}
.c-ticker__media img{width:100%;height:100%;object-fit:cover;}
/* name and body are separate spans inside ONE paragraph: inline on desktop so
   the sentence runs continuously, and mobile can drop the body and keep the
   name without touching the markup */
.c-ticker__copy{font-size:var(--fs-small);line-height:1.5;color:var(--color-text);
                margin:0;padding-right:1.5em;}
.c-ticker__name{display:inline;font-weight:600;color:var(--color-heading);}
.c-ticker__body{display:inline;}
@media (max-width:767px){
  /* stack: the label sitting beside the card leaves it only ~80px for text */
  .c-ticker{flex-direction:column;gap:.5em;}
  .c-ticker__label{flex-direction:row;align-items:center;justify-content:space-between;
                   align-self:auto;padding-block:0;}
  .c-ticker__items{max-width:none;width:100%;}
  .c-ticker__item{padding:.5em;}
  .c-ticker__media{width:2.5em;height:2.5em;}
  /* the card collapses to its title only — the body copy is desktop-only */
  .c-ticker__body{display:none;}
  .c-ticker__copy{padding-right:0;}
}

/* ---- Divider row with pill label -------------------------------------- */
.c-divider-row{display:flex;align-items:center;gap:1.5em;margin-block:3.5em 2.5em;}
.c-divider-row__label{font-size:var(--fs-small);font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--color-text-muted);border:1px solid var(--color-border-strong);border-radius:var(--radius-pill);
  padding:.75em 1.25em;flex:none;background:var(--white);}
.c-divider-row__line{height:1px;background:var(--color-border);flex:1;}

/* ---- Band ------------------------------------------------------------- */
.c-band--cta{background:var(--ground);text-align:center;}
.c-band--cta .c-container{max-width:56em;}
.c-band--cta p{margin-bottom:2rem;}

/* ---- Hexagon ring pattern — reusable component ------------------------- *
   Drop .c-rings-frame into ANY host with position:relative. The frame fills
   the host, clips itself, and centres the hexagon cluster on one of five
   anchor points. Whatever falls outside the host is clipped — that is what
   produces the quarter-hexagon corner treatments.

     --top-left      centre on top-left corner     → bottom-right quarter shows
     --top-right     centre on top-right corner    → bottom-left quarter shows
     --center        centre of the frame           → whole hexagon shows
     --bottom-left   centre on bottom-left corner  → top-right quarter shows
     --bottom-right  centre on bottom-right corner → top-left quarter shows

   Size: --rings-size (any length). Tone: --dark inverts for photo/dark beds.

   ⚠ The frame is absolutely positioned, so sibling content needs
   position:relative (z-index ≥ 1) or the pattern paints over it. Inside
   .c-section this is already handled: .c-container is position:relative;z-index:1.

   Replaces the source's five-level nest (hr-alg → pos → size → rings): since
   the cluster's centre always lands exactly on the anchor point, a centred
   absolute element expresses the same geometry — and unlike the original it
   also covers the centre case without a special path.                      */
.c-rings-frame{position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none;}
.c-rings{position:absolute;width:var(--rings-size,32em);aspect-ratio:1;transform:translate(-50%,-50%);}

.c-rings-frame--top-left     .c-rings{top:0;    left:0;   }
.c-rings-frame--top-right    .c-rings{top:0;    left:100%;}
/* centre must always show the WHOLE hexagon, so cap it to the frame — a
   --rings-size larger than the host would otherwise clip it like a corner */
.c-rings-frame--center       .c-rings{top:50%;  left:50%; max-width:100%;max-height:100%;}
.c-rings-frame--bottom-left  .c-rings{top:100%; left:0;   }
.c-rings-frame--bottom-right .c-rings{top:100%; left:100%;}

/* --dark inverts the strokes to white for dark grounds; opacity still runs
   through the one knob so every placement is regulated the same way */
.c-rings-frame--dark .c-rings{opacity:var(--rings-opacity,.75);filter:invert();}

/* .c-rings__ring / .u-ring-N removed: the cluster is one element with six
   baked background layers now — see css/parts/00-rings.css */
/* the source applies ring-5 to BOTH Hexagon-Layer-5 and -6, so two marks sit
   at 80%/.1 and its ring-6 rule (100%) is never used. Reproduced as-is. */
.u-ring-5{z-index:3;width:80%;opacity:.1;}
.u-ring-6{z-index:2;width:100%;opacity:.1;}

/* ==========================================================================
   NAV — three zones: brand left, menu genuinely centred, actions right.
   grid 1fr auto 1fr centres the middle column regardless of how wide the
   logo or the action cluster become; space-between only centres by luck.
   ========================================================================== */
.c-nav{position:sticky;top:0;z-index:50;height:var(--nav-h);display:flex;align-items:stretch;background:var(--black);}
/* DIRECT child only — the mega menu nests another .c-container inside .c-nav,
   and a descendant selector would turn that into a 3-column grid too, crushing
   the panel's content into the first 1fr track. */
.c-nav > .c-container{display:grid;grid-template-columns:1fr auto 1fr;align-items:stretch;width:100%;height:100%;}

.c-brand{display:flex;align-items:center;justify-self:start;}
.c-brand__logo{width:8.5em;height:auto;}

.c-menu{display:flex;align-items:stretch;justify-content:center;}
.c-nav__actions{display:flex;align-items:center;justify-content:flex-end;gap:.75em;justify-self:end;}

/* Panels resolve against .c-nav (sticky = containing block) so they span the
   full viewport. Nothing between may be position:relative. */
.c-menu__tabsbar{display:flex;align-items:stretch;}
.c-menu__tabs{display:flex;align-items:stretch;}
.c-menu__hint{display:none;}
.c-menu__link{display:flex;align-items:center;gap:.375em;height:100%;padding-inline:1.25em;
              font-size:var(--fs-body);font-weight:600;color:var(--white);
              border-bottom:2px solid transparent;transition:color var(--transition),border-color var(--transition);}
/* hover/open only — the current page is deliberately NOT highlighted */
.c-menu__link:hover,.c-menu__link.is-open{
              color:var(--color-brand);border-bottom-color:var(--color-brand);}
.c-menu__caret{width:.75em;height:.75em;flex:none;transition:transform var(--transition);}
.c-menu__link.is-open .c-menu__caret{transform:rotate(180deg);}

/* ---- Mega menu — full-bleed panel, our grid inside ---------------------- */
.c-nav__mega{
  position:absolute;top:100%;left:0;width:100%;z-index:49;
  border-top:1px solid var(--stone-700);
  background-color:rgba(0,0,0,.85);
  -webkit-backdrop-filter:blur(24px) saturate(140%);backdrop-filter:blur(24px) saturate(140%);
  padding-block:3.5em 5em;
  opacity:0;visibility:hidden;transform:translateY(-.5em);
  transition:opacity var(--transition),transform var(--transition),visibility var(--transition);
}
.c-nav__mega.is-open{opacity:1;visibility:visible;transform:translateY(0);}
.c-nav__mega .c-grid{column-gap:5em;}
.c-nav__group{font-size:var(--fs-body);font-weight:700;margin-bottom:1.5em;}
/* the three pillar colours — same set as the Solutions section */
.c-nav__group--blue{color:var(--blue-default);}
.c-nav__group--teal{color:var(--teal-default);}
.c-nav__group--green{color:var(--green-default);}
/* single-group menus (Industries / Inside the Lab / Insights) use white —
   the pillar colours are reserved for the three Solutions columns */
.c-nav__group--white{color:var(--white);}
.c-nav__item{display:flex;align-items:flex-start;justify-content:space-between;gap:1em;
             padding-block:1.25em;color:rgba(255,255,255,.65);
             border-bottom:1px solid rgba(255,255,255,.10);
             transition:color var(--transition),border-color var(--transition);}
/* every row keeps its rule, including the last — no :last-child reset */
.c-nav__item:hover{color:var(--white);border-bottom-color:rgba(255,255,255,.50);}
.c-nav__item-title{display:block;font-size:var(--fs-body);font-weight:600;color:inherit;margin-bottom:.25em;}
.c-nav__item-text{display:block;font-size:var(--fs-small);color:inherit;opacity:.72;}
/* arrow is permanent — it only brightens with the row */
.c-nav__item-ico{width:1.25em;height:1.25em;flex:none;color:inherit;
                 transition:transform var(--transition);}
.c-nav__item:hover .c-nav__item-ico{transform:translate(.125em,-.125em);}

/* ---- Chat with us (hotline) -------------------------------------------- *
   The trigger is a real .c-btn.c-btn--mini so it matches "Contact us" exactly
   in padding and type; --chat is only a skin (transparent fill, blue rule,
   coloured icons). The panel uses the same frost as the mega menu.          */
.c-hotline{position:relative;}
/* label, icon and caret are all blue at rest and all turn white on hover —
   currentColor carries the icons so one rule moves the whole control. */
.c-btn--chat{background:transparent;border-color:var(--color-brand);color:var(--color-brand);gap:.5em;}
.c-btn--chat:hover{background:transparent;border-color:var(--white);color:var(--white);}
.c-btn--chat .c-hotline__ico{width:1.125em;height:1.125em;flex:none;color:inherit;}
.c-btn--chat .c-hotline__caret{width:.75em;height:.75em;flex:none;color:inherit;
                               transition:transform var(--transition);}
.c-hotline.is-open .c-hotline__caret{transform:rotate(180deg);}

/* anchored to the nav's bottom edge, same as the mega panel */
.c-hotline__panel{position:absolute;top:calc(100% + ((var(--nav-h) - 100%) / 2));right:0;z-index:51;max-width:17em;width:17em;
                  display:flex;flex-direction:column;gap:.75em;padding:1.25em;
                  background-color:rgba(0,0,0,.62);
                  -webkit-backdrop-filter:blur(18px) saturate(140%);backdrop-filter:blur(18px) saturate(140%);
                  border:1px solid rgba(255,255,255,.14);
                  opacity:0;visibility:hidden;transform:translateY(-.5em);
                  transition:opacity var(--transition),transform var(--transition),visibility var(--transition);}
.c-hotline.is-open .c-hotline__panel{opacity:1;visibility:visible;transform:translateY(0);}
.c-hotline__row{display:flex;align-items:center;justify-content:center;gap:1em;
                border-radius:var(--radius-pill);background:rgba(255,255,255,.08);
                padding:.625em 1em;font-size:var(--fs-small);color:var(--white);
                transition:background var(--transition);}
.c-hotline__row:hover{background:rgba(255,255,255,.16);}
.c-hotline__avatars{display:flex;}
.c-hotline__avatars img{width:1.75em;height:1.75em;border-radius:var(--radius-pill);
                        object-fit:cover;border:2px solid rgba(0,0,0,.5);margin-left:-.5em;}
.c-hotline__avatars img:first-child{margin-left:0;}

/* ---- Mega menu: wrapped 2-up list + featured card ---------------------- *
   Industries / Inside the Lab / Insights use a different shape from Solutions:
   a two-column wrapped list at 8 cols, plus a feature card at 4.            */
.c-nav__wrap{display:grid;grid-template-columns:1fr 1fr;column-gap:3.5em;}
.c-nav__card{display:flex;flex-direction:column;justify-content:space-between;gap:2em;
             background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);
             padding:1.5em;transition:background var(--transition);}
.c-nav__card:hover{background:rgba(255,255,255,.12);}
.c-nav__card .c-nav__item-ico{color:rgba(255,255,255,.55);opacity:1;}
.c-nav__card:hover .c-nav__item-ico{color:var(--white);}
.c-nav__card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:1em;}
.c-nav__card-title{font-size:var(--fs-body);font-weight:600;color:var(--white);}
.c-nav__card-media{position:relative;aspect-ratio:16/10;overflow:hidden;}
/* video affordance, bottom-left of the card art */
.c-nav__card-play{position:absolute;left:.75em;bottom:.75em;z-index:1;
                  display:flex;align-items:center;justify-content:center;
                  width:2.25em;height:2.25em;border-radius:var(--radius-pill);
                  background:rgba(0,0,0,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);}
.c-nav__card-play img{width:1.125em;height:1.125em;}
.c-nav__card-media img{width:100%;height:100%;object-fit:cover;}

/* ---- Burger / mobile ---------------------------------------------------- */
.c-nav__burger{display:none;width:2.5em;height:2.5em;align-items:center;justify-content:center;color:var(--white);}

@media (max-width:991px){
  .c-nav > .c-container{grid-template-columns:auto 1fr;}
  .c-nav__burger{display:flex;}
  .c-hotline{display:none;}
  .c-nav__actions{justify-self:end;gap:.75em;}

  /* Full-height drawer, content aligned to the top. */
  .c-menu{
    position:fixed;inset:var(--nav-h) 0 0;z-index:40;
    flex-direction:column;justify-content:flex-start;align-items:stretch;
    background:var(--black);padding:0;
    /* visibility, not transform alone: a full-height drawer translated -100%
       parks its BOTTOM edge on the nav's bottom edge, so the closed panel
       would sit as an opaque black rectangle over the logo and buttons. */
    visibility:hidden;transform:translateY(-100%);
    transition:transform 300ms ease,visibility 300ms ease;
    overflow:hidden;overscroll-behavior:contain;
  }
  .c-menu.is-open{visibility:visible;transform:translateY(0);}

  /* --- tab strip: pills, scrolls sideways when they overflow --- */
  .c-menu__tabsbar{position:relative;flex:none;
                   border-bottom:1px solid rgba(255,255,255,.12);}
  .c-menu__tabs{
    display:flex;flex-wrap:nowrap;align-items:center;gap:.375em;
    overflow-x:auto;overflow-y:hidden;scrollbar-width:none;
    padding:.75em var(--gutter);
  }
  .c-menu__tabs::-webkit-scrollbar{display:none;}
  .c-menu__link{
    flex:none;white-space:nowrap;height:auto;
    padding:.5em 1em;justify-content:flex-start;
    border:1px solid rgba(255,255,255,.18);border-radius:var(--radius-pill);
    font-size:var(--fs-small);
  }
  .c-menu__link.is-open{background:var(--blue-lighter);border-color:var(--blue-lighter);
                        color:var(--black);}
  .c-menu__caret{display:none;}   /* tabs, not accordions — no caret */

  /* scroll affordance: fades the strip out at the right edge with a chevron,
     so a tab sitting off-screen reads as "there is more" rather than missing */
  .c-menu__hint{
    position:absolute;inset:0 0 1px auto;z-index:2;pointer-events:none;
    display:flex;align-items:center;padding-inline:1.25em .75em;color:var(--white);
    background:linear-gradient(to right,rgba(0,0,0,0),var(--black) 55%);
  }
  .c-menu__hint svg{width:1.125em;height:1.125em;}

  /* --- panels: only the active one shows, scrolls under the strip --- */
  .c-nav__mega{
    position:static;width:auto;padding:.5em 0 2em;flex:1;
    border-top:none;background:none;
    -webkit-backdrop-filter:none;backdrop-filter:none;
    display:none;opacity:1;visibility:visible;transform:none;
    overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;
  }
  .c-nav__mega.is-open{display:block;}
  .c-nav__mega .c-container--nav{padding-inline:0;max-width:none;}
  .c-nav__mega .c-grid{display:block;column-gap:0;gap:0;}
  .c-nav__wrap{grid-template-columns:1fr;column-gap:0;}

  /* group titles are Solutions-only on mobile; the other panels are flat lists */
  .c-nav__group{display:none;}
  .c-nav__item-text{display:none;}
  /* cards return below each panel's list, wider crop than desktop */
  .c-nav__card{margin:.75em var(--gutter) 0;}
  .c-nav__card-media{aspect-ratio:16/9;}

  /* --- child rows: blue square bullet, arrow hard right --- */
  .c-nav__item{
    display:flex;align-items:center;gap:.75em;
    padding:.75em var(--gutter);border-bottom:none;
  }
  .c-nav__item::before{
    content:"";flex:none;width:.375em;height:.375em;background:var(--color-brand);
  }
  .c-nav__item > span{flex:1;min-width:0;}
  .c-nav__item-ico{width:1em;height:1em;margin-left:auto;}

  /* --- Solutions only: its 3 groups behave as an accordion --- */
  [data-panel="solutions"] .c-nav__group{
    display:flex;align-items:center;justify-content:space-between;gap:1em;
    margin:0;padding:.875em var(--gutter);cursor:pointer;
    font-size:var(--fs-body);opacity:1;
    background:hsl(0deg 0% 100% / 10%);
    border-bottom:1px solid rgba(255,255,255,.15);
  }
  [data-panel="solutions"] .c-nav__group::after{
    content:"";flex:none;width:.5em;height:.5em;margin-right:.125em;
    border-right:2px solid currentColor;border-bottom:2px solid currentColor;
    transform:rotate(45deg) translate(-.125em,-.125em);
    transition:transform var(--transition);
  }
  [data-panel="solutions"] .c-nav__group.is-open::after{
    transform:rotate(-135deg) translate(-.125em,-.125em);
  }
  [data-panel="solutions"] .c-nav__groupitems{display:none;padding-block:.75em;}
  [data-panel="solutions"] .c-grid__col.is-open .c-nav__groupitems{display:block;}
}

/* Body scroll lock while the drawer is open */
body.is-nav-open{overflow:hidden;}

/* ==========================================================================
   SUB-NAV — pinned to the bottom of the hero fold, then sticks under the nav.
   Hidden until the hero has been scrolled past (JS adds .is-stuck).
   ========================================================================== */
.c-subnav{position:absolute;inset:auto 0 0;z-index:6;background:rgba(255,255,255,.92);
          -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
          border-top:1px solid var(--color-border);
          opacity:0;visibility:hidden;transition:opacity var(--transition),visibility var(--transition);}
/* revealed once the hero has scrolled past — JS adds .is-stuck */
.c-subnav.is-stuck{opacity:1;visibility:visible;position:fixed;inset:var(--nav-h) 0 auto;
                   border-top:none;border-bottom:1px solid var(--color-border);}
.c-subnav .c-container{max-width:none;padding-inline:6.25em;}
.c-subnav__row{display:flex;align-items:center;justify-content:space-between;gap:2.5em;}

/* breadcrumb: each part its own element, filled triangle between them */
.c-subnav__crumb{display:flex;align-items:center;gap:1em;flex:none;}
.c-subnav__crumb > div{font-size:var(--fs-small);color:var(--color-text-muted);white-space:nowrap;}
.c-subnav__crumb > div.is-lead{font-weight:500;color:var(--color-brand);}
.c-subnav__crumb > div.is-current{font-weight:500;color:var(--color-heading);}
.c-subnav__arrow{width:0;height:0;flex:none;
                 border-top:.3125em solid transparent;border-bottom:.3125em solid transparent;
                 border-left:.375em solid var(--color-border-strong);}

/* links pushed right, with a mini CTA closing the row */
.c-subnav__links{display:flex;align-items:center;gap:2em;margin-left:auto;
                 overflow-x:auto;scrollbar-width:none;}
.c-subnav__links::-webkit-scrollbar{display:none;}
.c-subnav__links a{font-size:var(--fs-small);font-weight:500;color:var(--color-text);
                   padding-block:1.25em;border-bottom:2px solid transparent;
                   white-space:nowrap;transition:all var(--transition);}
.c-subnav__links a:hover{color:var(--color-heading);}
.c-subnav__links a.is-current{color:var(--color-brand);border-bottom-color:var(--color-brand);}
.c-subnav__cta{flex:none;}

@media (max-width:991px){
  /* on mobile it simply sits in flow under the hero — always visible */
  .c-subnav,.c-subnav.is-stuck{position:static;background:var(--white);
    opacity:1;visibility:visible;border-top:1px solid var(--color-border);border-bottom:none;}
  .c-subnav .c-container{padding-inline:var(--gutter);}
  .c-subnav__row{gap:1.5em;overflow-x:auto;scrollbar-width:none;}
  .c-subnav__row::-webkit-scrollbar{display:none;}
  .c-subnav__crumb{display:none;}
  .c-subnav__cta{display:none;}
}

/* ==========================================================================
   FOOTER
   ========================================================================== */
/* Ported from the source's footer system. The nesting maps 1:1:
     __col   = a grid cell, may stack several blocks   (mjx-col-1-3)
     __block = one heading + its items                 (mjx-dl-footer_col)
     __items = the link groups                         (_col-items)
     __group = a sub-heading + its links               (_col-item)
   Spacing ladder: block 1.5em · items 1em · group .5em + 1em trailing.     */
.c-footer{background:var(--black);color:var(--stone-500);padding-block:5em 0;}
.c-footer__brand{display:block;margin-bottom:3.5em;}
.c-footer__brand img{width:12em;height:auto;}
.c-footer__grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.4fr;gap:2em;padding-bottom:3.5em;}
.c-footer__col{display:flex;flex-direction:column;gap:2.5em;}
.c-footer__block{display:flex;flex-direction:column;gap:1.5em;}
/* the ruled heading is the footer's defining detail — it was missing entirely */
.c-footer__lbl{font-size:1em;font-weight:700;color:var(--stone-100);margin:0;
               padding-bottom:.75em;border-bottom:1px solid var(--stone-700);}
.c-footer__items{display:flex;flex-direction:column;gap:1em;}
.c-footer__group{display:flex;flex-direction:column;gap:.5em;margin-bottom:1em;}
.c-footer__sub{font-size:.875em;font-weight:600;color:var(--stone-300);margin:0 0 .5em;}
.c-footer__col a{font-size:.875em;color:var(--stone-500);transition:color var(--transition);}
.c-footer__col a:hover{color:var(--blue-default);}
.c-footer__addr{display:flex;flex-direction:column;gap:.5em;font-size:.875em;color:var(--stone-500);margin:0;}
/* the addr block is already .875em; without this the nested tel:/mailto: links
   take .c-footer__col a's .875em on top and render ~12px, smaller than the
   street lines directly above them */
.c-footer__addr a{font-size:inherit;}
/* filled circles, not outlines */
.c-socials{display:flex;gap:1em;}
.c-socials a{width:2.5em;height:2.5em;border-radius:var(--radius-pill);background:var(--stone-700);
             display:flex;align-items:center;justify-content:center;padding:.75em;
             color:var(--white);transition:background var(--transition);}
.c-socials a:hover{background:var(--blue-default);}
.c-socials .c-btn__ico{width:100%;height:100%;}
.c-footer__form{display:flex;}
.c-footer__form input[type=email]{flex:1;min-width:0;font:inherit;font-size:.875em;height:4em;padding:1em;
  background:transparent;border:1px solid var(--stone-700);color:var(--white);}
.c-footer__form input[type=email]::placeholder{color:var(--stone-500);}
.c-footer__form button{font-size:.875em;font-weight:500;padding:0 1.5em;
  background:var(--blue-default);color:var(--white);border:1px solid var(--blue-default);}
.c-footer__form button:hover{background:var(--blue-dark);border-color:var(--blue-dark);}
/* lifted off pure black rather than separated by a hairline */
.c-footer__bottom{background:var(--stone-800);padding-block:1.5em;
                  font-size:.875em;color:var(--stone-500);}
.c-footer__bottom .c-container{display:flex;align-items:center;justify-content:space-between;gap:1.5em;flex-wrap:wrap;}
.c-footer__legal{display:flex;gap:1.5em;}
.c-footer__legal a{color:var(--stone-500);transition:color var(--transition);}
.c-footer__legal a:hover{color:var(--blue-default);}
@media (max-width:991px){.c-footer__grid{grid-template-columns:1fr 1fr;gap:2.5em;}}
/* RESTORED: these were lost when the sheet was split at line 916 during the
   consolidation, which left the footer stuck at two columns below 767 and
   pushed 7px of horizontal overflow onto every mobile page. */
@media (max-width:767px){
  .c-footer__grid{grid-template-columns:1fr;}
  .c-footer__bottom .c-container{flex-direction:column;align-items:flex-start;}
}

/* ========================================================================
   PAGE SECTIONS — s-*  (MRC).  Merged from css/parts/ by build.py.
   Edit the part files, never this block.
   ======================================================================== */

/* ---- 00-capability.css --------------------------------------------- */
/* ── Capability (tabbed solution detail) ──────────────────────────────────
   Sits inside the same dark bed as the industry Solutions section
   (.s-solutions__box / __bg / __glass), so the tab panel reads white on a
   photographic ground. Measured off the Webflow source:
     track      rgba(255,255,255,.05), pill
     inactive   rgba(0,0,0,.25) on rgba(255,255,255,.5) text
     active     --color-brand (#28AAF0) on white
     button     white ground, ink text, pill
   Tabs reuse eventTabs() in ui.js. Panels hide with the `hidden` attribute so
   the first still reads with JS off. */
.s-cap__wrap{margin-top:2.5em;}

.c-tabstrip{display:inline-flex;flex-wrap:wrap;gap:.5em;padding:.5em;
  border-radius:var(--radius-pill);background:rgba(255,255,255,.05);}
.c-tabstrip__btn{padding:.75em 2em;border:0;border-radius:var(--radius-pill);
  background:rgba(0,0,0,.25);color:rgba(255,255,255,.5);
  font-size:var(--fs-small);cursor:pointer;
  transition:background var(--transition),color var(--transition);}
.c-tabstrip__btn:hover{color:#fff;}
.c-tabstrip__btn[aria-selected="true"]{background:var(--color-brand);color:#fff;}

.s-cap__panel{padding-top:3em;}
.s-cap__panel[hidden]{display:none;}
.s-cap__body h3{color:#fff;font-size:1.25em;}
.s-cap__body p{margin-block:1em 2em;color:rgba(255,255,255,.75);}
.s-cap__media img{width:100%;aspect-ratio:4/3;object-fit:cover;}

@media (max-width:767px){
  .s-cap__wrap{margin-top:2em;}
  .s-cap__panel{padding-top:2em;}
  .c-tabstrip{display:flex;}
  .c-tabstrip__btn{padding:.75em 1.5em;}
}

/* White button on the dark bed — measured from the source: white ground,
   ink text, hairline border, pill. */
.c-btn--white{background:#fff;color:var(--black);border:1px solid var(--panel-line);}
.c-btn--white:hover{background:var(--panel-line);}

/* ---- 00-chrome.css ------------------------------------------------- */
/* ---- Programme nav — deltas on the Industry .c-nav ----------------------
   Everything structural (5em height, 8.5em logo, 6.5em gutters, sticky top)
   comes from .c-nav itself. These are the only differences. */
.c-nav--mrc .c-brand{gap:1.25em;}
.c-nav__rule{width:1px;height:1.75em;background:rgba(255,255,255,.25);flex:none;}
.c-brand__link{display:flex;align-items:center;}
.c-nav__proglabel{font-size:var(--fs-small);font-weight:600;letter-spacing:.08em;
                  text-transform:uppercase;color:rgba(255,255,255,.55);white-space:nowrap;
                  transition:color var(--transition);}
.c-nav__proglabel:hover{color:var(--white);}
/* no centre column on these pages, so the brand keeps the left track and the
   action keeps the right one */
.c-nav--mrc > .c-container{grid-template-columns:auto 1fr;}

/* FIXED, not sticky. Sticky keeps the bar in normal flow, so the hero began
   80px down and its last 80px fell below the fold — the fold was nav + 100vh,
   not 100vh. Fixed lifts it out of flow: the hero starts at y=0 and is a true
   full viewport, with the bar floating over it and still pinned when scrolling. */
.c-nav--mrc{position:fixed;top:0;left:0;right:0;}
/* Two labels, one visible at a time: the full line beside the wordmark on
   desktop, a short one on mobile where the burger takes the remaining room. */
.c-nav__proglabel-short{display:none;}
@media (max-width:640px){
  .c-nav__proglabel-full{display:none;}
  .c-nav__proglabel-short{display:inline;}
}

/* ---- Mobile drawer ------------------------------------------------------
   Only three links, so this is a short panel under the bar rather than the
   Industry nav's full-height drawer. .c-nav--mrc is position:fixed, so it is
   the containing block for the absolute panel. */
.c-navdrawer{position:absolute;top:100%;left:0;width:100%;z-index:49;
  border-top:1px solid var(--stone-700);background:rgba(0,0,0,.92);
  -webkit-backdrop-filter:blur(24px) saturate(140%);
          backdrop-filter:blur(24px) saturate(140%);
  opacity:0;visibility:hidden;transform:translateY(-.5em);
  transition:opacity var(--transition),transform var(--transition),visibility var(--transition);}
.c-navdrawer.is-open{opacity:1;visibility:visible;transform:translateY(0);}
.c-navdrawer .c-container{padding-block:1em;}
.c-navdrawer__list{display:flex;flex-direction:column;}
.c-navdrawer__link{display:block;padding:.875em 0;font-size:var(--fs-lead);
  font-weight:600;color:var(--white);border-bottom:1px solid rgba(255,255,255,.12);}
.c-navdrawer__list a:last-child{border-bottom:none;}
.c-navdrawer__link[aria-current=page]{color:var(--blue-300);}
/* the action moves INTO the drawer on mobile — full width, below the links.
   White on the frosted black bed, flipping to the brand orange on press.
   The border moves with the background or the white edge stays behind the
   orange fill; the SVG uses currentColor, so the arrow follows the text. */
.c-navdrawer__cta{display:flex;justify-content:center;margin-top:1.25em;}
/* Scoped to the drawer (0-2-0): .c-btn--mrc is also 0-1-0 and is declared
   LATER in this same file, so a bare class here loses on source order. The
   drawer inverts that button — white at rest, orange on press. */
.c-navdrawer .c-navdrawer__cta{
  background:var(--white);border-color:var(--white);color:var(--black);}
.c-navdrawer .c-navdrawer__cta:hover,
.c-navdrawer .c-navdrawer__cta:focus-visible,
.c-navdrawer .c-navdrawer__cta:active{
  background:var(--red-default);border-color:var(--red-default);color:var(--white);}

/* The burger is for these three links only; above 991 they are not needed and
   the bar shows the CTA alone, exactly as before. */
@media (min-width:992px){
  .c-nav--mrc .c-nav__burger{display:none;}
  .c-navdrawer{display:none;}
}
/* Below 992 the bar carries the burger alone; the CTA lives in the drawer. */
@media (max-width:991px){
  .c-nav--mrc .c-nav__actions > .c-btn{display:none;}
}

/* ---- Frosted date bar — CTA + programme dates on one pill --------------- */
.c-datebar{display:inline-flex;align-items:center;gap:2em;
  padding:.75em 2.5em .75em .75em;border-radius:var(--radius-pill);color:var(--white);
  background:rgba(255,255,255,.15);
  -webkit-backdrop-filter:blur(.5em);backdrop-filter:blur(.5em);}
/* The 2.5em right padding is run-out for the dates. With the dates hidden or
   swept out of the DOM the pill is visibly lopsided, so the right side drops
   back to match the left. :has() re-evaluates after the sweep removes them. */
.c-datebar:not(:has(.c-datebar__dates)){padding-right:.75em;}
.c-datebar__dates{display:flex;align-items:center;gap:1em;}
.c-datebar__item{display:flex;flex-direction:column;}
.c-datebar__lbl{font-size:var(--fs-small);font-weight:400;text-transform:uppercase;
                color:rgba(255,255,255,.56);margin:0;}
.c-datebar__val{font-size:var(--fs-lead);font-weight:600;color:var(--white);margin:0;}

.c-datebar__rule{width:1px;height:2.5em;background:rgba(255,255,255,.4);flex:none;}

/* MRC CTA — colour variant only. Size/padding stay on the system's .c-btn so
   the button matches every other button on the site. */
.c-btn--mrc{background:var(--red-default);border-color:var(--red-default);color:var(--white);}
.c-btn--mrc:hover{background:var(--white);border-color:var(--white);color:var(--black);}

/* glass eyebrow pill used over the hero photo.
   Needs the .c-section--dark prefix: that rule is 0-2-0 and would otherwise
   repaint the label blue-on-blue and make it unreadable. */
.c-eyebrow--glass,
.c-section--dark .c-eyebrow--glass{border-color:var(--stone-400);
  background:rgba(225,241,253,.6);color:var(--stone-700);
  -webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);}
.c-eyebrow__ico--bare{background:none;padding:0;width:1.5em;height:1.5em;}

/* Date ordinals ("7th", "24th") appear in the hero date bar and in the event
   chips at different base sizes. One rule so they read the same everywhere —
   otherwise one inherits an explicit .6em and the other the UA's ~.83em. */
/* proportional, but floored: .625em of the 14px chip would be 8.75px, which is
   unreadable. max() keeps it optically right at 18px and legible at 14px. */
sup{font-size:max(.625em,11px);vertical-align:super;line-height:0;}

/* ---- 00-contact.css ------------------------------------------------ */
/* ── Contact ─────────────────────────────────────────────────────────────
   New here:
     .c-eyebrow--avatars  eyebrow pill carrying stacked consultant faces
     .s-reach             two-tone card straddling the hero: white left,
                          tinted right, prompts left / form right
     .s-office            office details beside an embedded map
   Reused: .s-hero--centred from Media Centre, .c-btn, form field styling. */
.c-eyebrow--avatars{padding-left:.5em;gap:.75em;}
.c-avatars{display:inline-flex;}
.c-avatars img{width:1.75em;height:1.75em;border-radius:50%;object-fit:cover;
  border:2px solid var(--white);margin-right:-.625em;}
.c-avatars img:last-child{margin-right:0;}

.s-reach{position:relative;z-index:3;margin-top:-6em;}
.s-reach__grid{display:grid;grid-template-columns:5fr 7fr;box-shadow:var(--shadow-md);}
.s-reach__prompts{background:var(--white);padding:4em 3em;display:flex;flex-direction:column;gap:3em;}
.s-reach__form{background:var(--smoke);padding:4em 3em;}
.c-prompt__badge{display:flex;align-items:center;justify-content:center;
  width:3em;height:3em;border-radius:50%;background:var(--black);color:var(--white);margin-bottom:1.5em;}
.c-prompt__badge svg{width:1.25em;height:1.25em;}
.c-prompt__label{display:block;font-size:var(--fs-mini);letter-spacing:.06em;
  text-transform:uppercase;color:var(--color-text-muted);margin-bottom:.5em;}
.c-prompt h2{font-size:var(--fs-title);margin-bottom:1em;}
.c-prompt p{color:var(--color-text-muted);margin-bottom:1.5em;}
.c-prompt + .c-prompt{padding-top:3em;border-top:1px solid var(--color-border);}

.s-reach__chips{display:flex;flex-direction:column;gap:.75em;align-items:flex-end;}
.s-reach__chip{padding:.75em 1.5em;border-radius:var(--radius-pill);
  background:var(--white);font-size:var(--fs-small);box-shadow:var(--shadow-sm);}
.s-reach__or{display:flex;align-items:center;gap:1.5em;margin-block:2.5em;
  color:var(--color-text-muted);font-size:var(--fs-small);}
.s-reach__or::before,.s-reach__or::after{content:"";flex:1;height:1px;background:var(--color-border);}
.s-reach__fields{display:grid;grid-template-columns:1fr 1fr;gap:1.5em;}
.s-reach__fields .is-wide{grid-column:1 / -1;}

.s-office__grid{display:grid;grid-template-columns:5fr 7fr;gap:0;align-items:stretch;}
.s-office__body{background:var(--white);padding:3em;}
.s-office__body h2{margin-bottom:2em;}
.s-office__item{padding-block:1.5em;border-top:1px solid var(--color-border);}
.s-office__item span{display:block;font-size:var(--fs-mini);letter-spacing:.06em;
  text-transform:uppercase;color:var(--color-text-muted);margin-bottom:.5em;}
.s-office__map{min-height:24em;}
.s-office__map iframe{display:block;width:100%;height:100%;border:0;}

@media (max-width:991px){
  .s-reach__grid,.s-office__grid{grid-template-columns:1fr;}
  .s-reach{margin-top:-3em;}
  .s-reach__chips{align-items:flex-start;}
}
@media (max-width:640px){
  .s-reach__prompts,.s-reach__form,.s-office__body{padding:2.5em 1.5em;}
  .s-reach__fields{grid-template-columns:1fr;}
}

/* ---- 00-industry-sections.css -------------------------------------- */
:root{--panel-mist:#E0E9EE;}   /* tinted hero ground, solution detail */

/* Industry page sections — extracted so build.py owns the whole stylesheet. */
/* ---- Hero ------------------------------------------------------------- */
.s-hero{position:relative;min-height:calc(100vh - var(--nav-h));display:flex;align-items:stretch;
        background-image:var(--smoke-grad);}
.s-hero__grid{display:grid;grid-template-columns:1fr 1fr;width:100%;}
/* ---- Hero, solution-detail variant -------------------------------------
   A diff on .s-hero, not a new block: media moves left, the dark full-bleed
   photo becomes a D-clipped inset on a tinted ground, and the hexagons dim.
   Ticker, scroll cue and sub-nav all come along unchanged.                 */
.s-hero--flip .s-hero__media{order:-1;}
.s-hero--solution .s-hero__media{display:flex;align-items:center;justify-content:center;
  padding:5em 6.25em;background:var(--panel-mist);}
.s-hero--solution .s-hero__media > img{border-radius:0 50% 50% 0;}
.s-hero--solution .s-hero__scrim{display:none;}          /* no scrim over a light ground */
.s-hero--solution .s-hero__media > img{position:relative;z-index:2;}
.s-hero--solution .c-rings-frame{z-index:1;}             /* beneath the photo */
.s-hero--solution .s-hero__content{background:var(--color-page);}

/* Solution hero ticker: label stacks above the cards and both sit left,
   rather than the industry hero's column-beside-card arrangement. */
/* combo, so it outranks the base .s-hero__overlay wherever it sits in the file */
.s-hero__overlay.s-hero__overlay--solution{inset:auto 0 8em;padding:0 6.25em 0 9em;}
.c-ticker--stack{flex-direction:column;align-items:stretch;gap:0;}
.c-ticker--stack .c-ticker__label{flex-direction:row;align-items:center;
  justify-content:flex-start;gap:1.5em;align-self:auto;padding-block:0;
  margin-bottom:1.25em;}
.c-ticker--stack .c-ticker__nav{justify-content:flex-start;}
@media (max-width:991px){
  .s-hero__overlay.s-hero__overlay--solution{inset:auto 0 1.5em;padding:0 1.5em;}
}
@media (max-width:991px){
  .s-hero--solution .s-hero__media{aspect-ratio:auto;padding:3em 1.5em;}
}
/* centred section header — Solution's experts block, vs the industry split */
.c-grid--header.is-centred{justify-items:center;text-align:center;}
.c-grid--header.is-centred .c-eyebrow{margin-inline:auto;}

.s-hero__content{display:flex;flex-direction:column;justify-content:center;padding:5em 6.25em 9em;
                 background-image:var(--smoke-grad);}
.s-hero__content h1{margin-bottom:1.5rem;}
.s-hero__content .c-eyebrow{margin-bottom:2.5em;}
.s-hero__lead{max-width:32em;margin-bottom:2rem;}
/* scroll cue: a nudge downwards, purely decorative */
/* arrow sits under the label, both centred on the same axis */
.s-hero__cue{display:inline-flex;flex-direction:column;align-items:center;gap:.5em;
             margin-top:6.5em;font-size:var(--fs-small);color:var(--color-text-muted);
             align-self:flex-start;text-align:center;}
.s-hero__cue svg{width:1em;height:1em;animation:dl-cue 1.8s ease-in-out infinite;}
@keyframes dl-cue{0%,100%{transform:translateY(0);opacity:.55}50%{transform:translateY(.375em);opacity:1}}
/* TEMPORARILY HIDDEN on both pages — delete this rule to bring it back */
.s-hero__cue{display:none;}
@media (prefers-reduced-motion:reduce){.s-hero__cue svg{animation:none;}}
.s-hero__media{position:relative;overflow:hidden;background:var(--stone-800);}
.s-hero__media > img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;}
.s-hero__scrim{position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.1),rgba(0,0,0,.45));}
/* ticker sits above the sub-nav bar, not on it */
.s-hero__overlay{position:absolute;inset:auto 0 8em;padding:0 6.25em;z-index:5;}
@media (max-width:991px){
  .s-hero{display:block;min-height:0;}
  .s-hero__grid{grid-template-columns:1fr;}
  .s-hero__content{padding:3.5em var(--gutter);order:2;}
  .s-hero__media{order:1;aspect-ratio:4/3;}
  .s-hero__overlay{inset:auto 0 1.5em;padding:0 1.5em;}
  .c-rings-frame{--rings-size:40em;}   /* hero pattern shrinks on mobile */
}

/* ---- Solutions (dark) — a BOXED section --------------------------------
   The original insets the whole section, then paints a background box that
   stops at 90% height so the white CTA card can straddle its bottom edge.
   Photo + dark gradient + a blurred glass layer stack inside that box.     */
/* the SECTION reads white; the dark treatment lives inside the box only.
   2 classes so it beats .c-section--dark's background.
   TRANSPARENT, not white: the page behind is already white so it looks
   identical, but it lets the ranking section's split tint bleed up underneath
   the box. z-index:1 keeps the box and CTA above that tint — the ranking
   section is later in the DOM and would otherwise paint over them. */
.c-section.s-solutions{background:transparent;padding:0;z-index:1;}
.s-solutions__box{position:relative;margin-inline:6.5em;padding:5em 3.5em 0;}
/* the bed stops short so the CTA overlaps it */
.s-solutions__bg{position:absolute;inset:0 0 auto;height:90%;z-index:0;overflow:hidden;}
/* square, top-anchored. bottom must stay auto — with inset:0 the box is
   over-constrained and aspect-ratio is ignored. The overflow below the bed is
   what the scroll lift travels into.
   min-height is the coverage floor: once the cards stack the bed grows taller
   than a square image is wide, and without it the lift would expose the bed's
   bottom. +37vh is the full travel of solutionsParallax(). */
.s-solutions__bg img{position:absolute;top:0;left:0;width:100%;aspect-ratio:1;
                     min-height:calc(100% + 37vh);
                     object-fit:cover;object-position:100% 50%;will-change:transform;
                     transform:translate3d(0,0,0);}
.s-solutions__bg::after{content:"";position:absolute;inset:0;z-index:2;
  background-image:linear-gradient(#0000007d,#00000080 65%,#0000);}
.s-solutions__glass{position:absolute;inset:0;z-index:1;opacity:1;
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);}
.s-solutions__box > .c-container{position:relative;z-index:2;max-width:none;padding-inline:0;}

/* each group is a card: tinted header over a near-black body */
.s-solutions__group{display:flex;flex-direction:column;height:100%;overflow:hidden;
  background-image:linear-gradient(#18181880,#18181880);box-shadow:0 2em 4em rgba(0,0,0,.25);}
/* one --accent per group drives BOTH the rule and the title, so they can never
   drift apart */
.s-solutions__group--1{--accent:var(--blue-default);}
.s-solutions__group--2{--accent:var(--teal-default);}
.s-solutions__group--3{--accent:var(--green-default);}
.s-solutions__head{padding:1.25em 1.5em;border-bottom:2px solid var(--accent);}
.s-solutions__head h3{margin:0;color:var(--accent);font-size:var(--fs-body);font-weight:700;line-height:1.35;}
.s-solutions__group--1 .s-solutions__head{
  background-image:linear-gradient(#28aaf033,#28aaf033),linear-gradient(var(--panel-dark),var(--panel-dark));}
.s-solutions__group--2 .s-solutions__head{
  background-image:linear-gradient(#00e5e533,#00e5e533),linear-gradient(var(--panel-dark),var(--panel-dark));}
.s-solutions__group--3 .s-solutions__head{
  background-image:linear-gradient(#00dc8233,#00dc8233),linear-gradient(var(--panel-dark),var(--panel-dark));}

.s-solutions__list{display:flex;flex-direction:column;height:100%;
                   background:var(--panel-dark);padding:1em;}
.s-solutions__list a{display:flex;align-items:center;justify-content:space-between;gap:.5em;
  font-size:var(--fs-body);font-weight:500;color:#fff;padding:1.25em .5em;
  border-bottom:1px dotted var(--rule-dotted);
  transition:color var(--transition),background var(--transition),border-color var(--transition);}
.s-solutions__list a:last-child{border-bottom:none;}
/* arrow is always visible; it takes the row's colour on hover via currentColor */
.s-solutions__list .c-btn__ico{opacity:1;}
.s-solutions__group--1 .s-solutions__list a:hover{color:var(--blue-default);border-bottom-color:var(--blue-darker);background-image:linear-gradient(#28aaf00d,#28aaf00d);}
.s-solutions__group--2 .s-solutions__list a:hover{color:var(--teal-default);border-bottom-color:var(--teal-darker);background-image:linear-gradient(#00e5e50d,#00e5e50d);}
.s-solutions__group--3 .s-solutions__list a:hover{color:var(--green-default);border-bottom-color:var(--green-darker);background-image:linear-gradient(#00dc820d,#00dc820d);}

/* white CTA card, 65% wide, straddling the bed's bottom edge */
/* white card inside a --dark context: reset the inherited light text or the
   copy renders white-on-white */
.s-solutions__cta{position:relative;z-index:3;display:flex;align-items:center;gap:2em;
  width:65%;margin:5em auto 0;padding:.75em 1.5em .75em .75em;
  /* frosted, same recipe as the hero trend cards (.c-ticker__item) */
  background:rgba(255,255,255,.8);
  -webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);
  box-shadow:var(--shadow-lg);
  --color-text:var(--stone-600);--color-heading:var(--black);color:var(--black);}
.s-solutions__cta p{color:var(--color-text);}
.s-solutions__cta img{flex:none;width:12em;height:8em;object-fit:cover;}
.s-solutions__cta p{margin-bottom:1rem;font-size:var(--fs-small);}

@media (max-width:991px){
  .s-solutions__box{margin-inline:2.5em;padding:5em 2em 0;}
  .s-solutions__cta{width:100%;}
}
@media (max-width:767px){
  .s-solutions__box{margin-inline:1.5em;padding:3.5em 1.25em 0;}
  .s-solutions__cta{flex-direction:column;align-items:flex-start;}
  .s-solutions__cta img{width:100%;height:10em;}
}

/* ---- Ranking / benchmark ---------------------------------------------- */
/* Two decorative layers, ported from the original's .m-bg-split + .m-bg-img:
   a soft tint that overshoots the section's top edge to sit under the
   Solutions box, and the line pattern pinned to the bottom edge. */
.s-rank__bg{position:absolute;inset:0;z-index:0;pointer-events:none;}
/* top is negative so the tint starts above this section. It is allowed to
   overflow — nothing in the chain clips it. */
.s-rank__split{position:absolute;top:-30%;left:0;width:100%;height:100%;z-index:-10;
  background-image:linear-gradient(#e8edf680,#e8edf600);}
.s-rank__pattern{position:absolute;inset:auto 0 0;height:18.5em;}
/* mirrored horizontally, as the original's .is-reversed */
.s-rank__pattern img{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;transform:rotateY(180deg);}
/* lift the real content clear of the decorative layers */
.s-rank > .c-container{position:relative;z-index:1;}

/* ---- Experts ---------------------------------------------------------- */
.s-experts__grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5em;}
@media (max-width:991px){.s-experts__grid{grid-template-columns:repeat(2,1fr);}}
@media (max-width:560px){.s-experts__grid{grid-template-columns:1fr;}}

/* ---- Press ------------------------------------------------------------ */
.s-press__top{display:grid;grid-template-columns:1.4fr 1fr;gap:1.5em;}
.s-press__stack{display:flex;flex-direction:column;gap:1.5em;}
.s-press__row{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5em;margin-top:1.5em;}
/* no gap: the download columns are separated by their own left rules */
.s-downloads{display:grid;grid-template-columns:repeat(3,1fr);gap:0;}
@media (max-width:991px){
  .s-press__top{grid-template-columns:1fr;}
  .s-press__row,.s-downloads{grid-template-columns:1fr;}
}

/* ---- 00-lab-blocks.css --------------------------------------------- */
/* ── Inside the Lab: content blocks ──────────────────────────────────────
   Four shapes, all built on .c-grid so they inherit the 12-column rhythm. */

/* Vision + mission, with a stat strip beneath */
.s-mission__pair{display:grid;grid-template-columns:1fr 1fr;gap:2em;margin-top:3em;}
.s-mission__card{padding:2em;border:1px solid var(--color-border);border-radius:1em;
  background:var(--color-surface);}
.s-mission__card h3{margin-bottom:.5em;font-size:var(--fs-lead);}
.s-mission__card p{color:var(--color-text-muted);}
.s-mission__stats{display:flex;flex-wrap:wrap;gap:3em;margin-top:3em;
  padding-top:2em;border-top:1px solid var(--color-border);}
.s-mission__stat b{display:block;font-size:var(--fs-stat);color:var(--color-heading);line-height:1;}
.s-mission__stat span{color:var(--color-text-muted);font-size:var(--fs-small);}

/* Story timeline — a rule with year markers hanging off it */
.s-timeline__list{margin-top:3em;border-left:2px solid var(--color-border);padding-left:2em;}
.s-timeline__item{position:relative;padding-bottom:2em;}
.s-timeline__item::before{content:"";position:absolute;left:-2.5em;top:.5em;
  width:.75em;height:.75em;border-radius:50%;background:var(--color-brand);}
.s-timeline__year{display:block;font-size:var(--fs-lead);color:var(--color-heading);font-weight:600;}
.s-timeline__item p{color:var(--color-text-muted);margin-top:.25em;}

/* Values — four equal cards */
.s-values__grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2em;margin-top:3em;}
.s-values__card{padding:2em;border-radius:1em;background:var(--panel-tint);}
.s-values__card h3{font-size:var(--fs-lead);margin-bottom:.5em;}
.s-values__card p{color:var(--color-text-muted);font-size:var(--fs-small);}

/* Contact — routing cards beside the form, per the source (one 1036px band) */
.s-contact__grid{display:grid;grid-template-columns:5fr 7fr;gap:4em;align-items:start;}
.s-contact__routes{display:grid;gap:2em;}
.s-contact__route{display:flex;flex-direction:column;padding:2em;
  border:1px solid var(--color-border);border-radius:1em;}
.s-contact__route h3{font-size:var(--fs-lead);margin-bottom:.5em;}
.s-contact__route p{color:var(--color-text-muted);font-size:var(--fs-small);margin-bottom:1.5em;}
.s-contact__route a{margin-top:auto;}
.s-contact__form .c-field{margin-bottom:1.5em;}
.s-contact__form label{display:block;margin-bottom:.5em;font-size:var(--fs-small);color:var(--color-text-muted);}
.s-contact__form input,.s-contact__form textarea{width:100%;padding:1em;
  border:1px solid var(--color-border);border-radius:.5em;background:var(--color-surface);
  font:inherit;color:var(--color-text);}
.s-contact__form textarea{min-height:8em;resize:vertical;}
.s-contact__form input:focus,.s-contact__form textarea:focus{outline:2px solid var(--color-brand);outline-offset:0;}

/* Offices */
.s-offices__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2em;margin-top:3em;}
.s-offices__item h3{font-size:var(--fs-lead);margin-bottom:.5em;}
.s-offices__item p,.s-offices__item a{display:block;color:var(--color-text-muted);margin-top:.5em;}
.s-offices__item a:hover{color:var(--color-brand);}

@media (max-width:991px){
  .s-values__grid{grid-template-columns:repeat(2,1fr);}
  .s-contact__grid{grid-template-columns:1fr;gap:2em;}
  .s-offices__grid{grid-template-columns:1fr;}
}
@media (max-width:767px){
  .s-mission__pair{grid-template-columns:1fr;}
  .s-mission__stats{gap:2em;}
  .s-values__grid{grid-template-columns:1fr;}
}

/* Purpose: three pillars beneath the vision/mission pair */
.s-mission__pillars{display:grid;grid-template-columns:repeat(3,1fr);gap:2em;margin-top:3em;}
.s-mission__pillar h3{font-size:var(--fs-lead);margin-bottom:.5em;}
.s-mission__pillar p{color:var(--color-text-muted);font-size:var(--fs-small);}

/* Purpose: five-across values row above the solutions catalogue */
.s-values__grid.is-five{grid-template-columns:repeat(5,1fr);}
@media (max-width:991px){.s-mission__pillars{grid-template-columns:1fr;}
  .s-values__grid.is-five{grid-template-columns:repeat(2,1fr);}}
@media (max-width:640px){.s-values__grid.is-five{grid-template-columns:1fr;}}

/* Purpose: media mosaic — mixed-size tiles under the hero */
.s-mosaic{padding:0;}
.s-mosaic__grid{display:grid;grid-template-columns:repeat(6,1fr);gap:.75em;}
.s-mosaic__tile{position:relative;overflow:hidden;background:var(--panel-dark);}
.s-mosaic__tile img{width:100%;height:100%;object-fit:cover;display:block;}
.s-mosaic__tile--wide{grid-column:span 2;}
.s-mosaic__tile--tall{grid-row:span 2;}
.s-mosaic__tile{aspect-ratio:4/3;}
.s-mosaic__tile--tall{aspect-ratio:auto;}
@media (max-width:991px){.s-mosaic__grid{grid-template-columns:repeat(3,1fr);}}
@media (max-width:640px){.s-mosaic__grid{grid-template-columns:repeat(2,1fr);}}

/* ---- 00-lab-sections.css ------------------------------------------- */
/* ── Inside the Lab: shared section shells ───────────────────────────────
   Two shapes cover the six pages:
     .s-herosbs  side-by-side hero — --bg tints the panel, --img bleeds the
                 image to the section edge (the two Webflow hero variants)
     .s-split    image one side, copy the other; --flip reverses at desktop
   Both collapse to a single column at 767 and below. */
.s-herosbs{padding-block:6em 4em;}
.s-herosbs--bg{background:var(--panel-tint);}
.s-herosbs__body{align-self:center;}
.s-herosbs__body p{margin-top:1em;color:var(--color-text-muted);font-size:var(--fs-lead);}
.s-herosbs__media img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:1em;}
/* the full-bleed variant is a shorter band in the source (500px vs 574px) */
.s-herosbs--img{padding-block:4em 3em;}
.s-herosbs--img .s-herosbs__media img{aspect-ratio:16/10;border-radius:0;}

.s-split__media img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:1em;}
.s-split__body{align-self:center;}
.s-split__body p{margin-top:1em;color:var(--color-text-muted);}
.s-split--flip .s-split__media{order:2;}

@media (max-width:767px){
  .s-herosbs{padding-block:4em 3em;}
  .s-herosbs__media,.s-split__media{margin-top:2em;}
  .s-split--flip .s-split__media{order:0;}
}

/* ---- 00-mediacentre.css -------------------------------------------- */
/* ── Media Centre ────────────────────────────────────────────────────────
   Three new pieces; "All resources" reuses .s-rescards from before.
     .s-hero--centred  centred copy over a full-bleed scrimmed photo
     .c-contactcard    dark card: round icon badge, heading, contact chips
     .c-kit            dark list — label, file size, download icon
   Mint CTA uses the existing --teal-light token, not a new colour. */
.s-hero--centred{position:relative;min-height:0;padding:0;background:var(--panel-dark);}
.s-hero--centred .s-hero__media{position:absolute;inset:0;}
/* .s-hero is a flex row, so the body must claim the full width before its own
   centring means anything; the eyebrow inherits align-self from the hero rules */
.s-hero--centred .s-hero__body{position:relative;z-index:2;width:100%;
  display:flex;flex-direction:column;align-items:center;text-align:center;padding:8em 2em;}
.s-hero--centred .s-hero__body > *{align-self:center;}
.s-hero--centred h1{color:var(--white);max-width:18em;}
.s-hero--centred .c-eyebrow{margin-bottom:1.5em;background:rgba(255,255,255,.85);color:var(--black);}
.c-btn--mint{background:var(--teal-light);color:var(--black);border:0;}
.c-btn--mint:hover{background:var(--teal-default);}

.s-contact-cards{display:grid;grid-template-columns:1fr 1fr;gap:2em;}
.c-contactcard{display:flex;align-items:flex-start;gap:1.5em;padding:2em;
  background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);}
.c-contactcard__badge{flex:none;display:flex;align-items:center;justify-content:center;
  width:3em;height:3em;border-radius:50%;background:var(--white);color:var(--black);}
.c-contactcard__badge svg{width:1.25em;height:1.25em;}
.c-contactcard h3{color:var(--white);margin-bottom:1em;}
.c-contactcard__chips{display:flex;flex-wrap:wrap;gap:.75em;}
.c-contactcard__chip{display:inline-flex;align-items:center;gap:.5em;
  padding:.75em 1.25em;border:1px solid rgba(255,255,255,.25);border-radius:var(--radius-pill);
  color:rgba(255,255,255,.85);font-size:var(--fs-small);}
.c-contactcard__chip:hover{border-color:var(--white);color:var(--white);}
.c-contactcard__chip svg{width:1em;height:1em;}

.s-kit{background:var(--panel-dark);}
.s-kit h2{color:var(--white);}
.c-kit{margin-top:2em;}
.c-kit__row{display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:2em;
  padding:1.5em 0;border-top:1px solid rgba(255,255,255,.12);color:rgba(255,255,255,.85);}
.c-kit__row:last-child{border-bottom:1px solid rgba(255,255,255,.12);}
.c-kit__size{font-size:var(--fs-small);color:rgba(255,255,255,.55);}
.c-kit__dl{display:flex;align-items:center;color:var(--white);}
.c-kit__dl svg{width:1.25em;height:1.25em;}

@media (max-width:767px){
  .s-hero--centred .s-hero__body{padding:5em 1.5em;}
  .s-contact-cards{grid-template-columns:1fr;}
  .c-kit__row{grid-template-columns:1fr auto;gap:1em;}
}

/* ---- 00-mrc-state.css ---------------------------------------------- */
/* ==========================================================================
   MRC PROGRAMME STATE + EVENT TABS
   ========================================================================== */

/* ---- Page state gate ----------------------------------------------------
   Generated from scripts/_states.py — the same list the modules are built
   from, so rules and markup cannot drift. One pair per secondary state:

     1. a secondary variant is hidden unless the page is in that state;
     2. the default is hidden ONLY when a variant for the active state exists
        in the same group.

   Rule 2 is what makes a missing override fall back to the default instead of
   leaving a hole — which is why it needs :has() rather than a flat selector.
   [data-state-group] is display:contents so wrapping two variants never
   disturbs a flex or grid parent.

   The live HubSpot page gets an identical copy inline from the ghost module,
   so the switch keeps working even against a cached stylesheet. */
/* [data-state-group] is a MARKER ONLY — it carries no display of its own,
   because on the HubSpot modules it sits on the <section> itself and a section
   with display:contents would lose its background and padding. Where a wrapper
   really is inserted around two button variants, .u-stategroup makes it
   invisible to layout so a flex or grid parent is unaffected. */
.u-stategroup{display:contents;}
html:not(.mrc-state-closed) [data-state="closed"]{display:none;}
html.mrc-state-closed [data-state-group]:has([data-state="closed"]) [data-state="default"]{display:none;}

/* ---- Section visibility -------------------------------------------------
   HubSpot has no built-in show/hide for modules on a hardcoded page template
   (that only exists inside dnd areas), so each module wraps its own output in
   {% if module.show_section %}. Nothing to style — noted here so the next
   person looks in the module, not the stylesheet. */

/* ---- Event tabs ---------------------------------------------------------
   Only present when the event repeater holds 2+ items. */
.c-tabs{display:flex;gap:.5em;margin-bottom:1.5em;flex-wrap:wrap;}
.c-tabs__btn{display:inline-flex;align-items:center;gap:.5em;
  padding:.5em 1.25em;border-radius:var(--radius-pill);
  border:1px solid rgba(255,255,255,.35);background:transparent;
  font-family:inherit;font-size:var(--fs-small);font-weight:600;
  letter-spacing:.04em;color:rgba(255,255,255,.75);white-space:nowrap;
  cursor:pointer;transition:background var(--transition),color var(--transition),
                            border-color var(--transition);}
.c-tabs__btn:hover{color:var(--white);border-color:var(--white);}
.c-tabs__btn.is-active{background:var(--white);border-color:var(--white);
  color:var(--black);}

@media (max-width:640px){
  .c-tabs{gap:.375em;}
  .c-tabs__btn{padding:.5em 1em;}
}

/* ---- Event card spacing -------------------------------------------------
   Applies whether the card shows one event or a tab strip of several. */
.s-infopack__cta{margin-top:2rem;}
/* the event name sits ABOVE the tabs: with two sessions the name is the shared
   thing ("Hybrid Career Day") and the tabs are the variants under it */
.s-infopack__event-title{margin-bottom:1.25rem;}

/* No HubSpot form styling here on purpose: the embed renders the form inside
   HubSpot's own iframe, so nothing in this stylesheet can reach it. It arrives
   already styled — which is why the original site never needed any. */

/* ---- Closed-state prose on the Application + Career Day pages -----------
   Same treatment as the Info Pack's: prose, not a panel. The Career Day one
   sits on a dark bed, so it reads the section's white token. */
.s-appform__closed p{margin:0 0 1em;font-size:var(--fs-lead);}
.s-appform__closed p:last-child{margin-bottom:0;}
.s-appform__closed{padding:2.5em;}

.s-eventabout__closed{color:var(--white);}
.s-eventabout__closed p{margin:0 0 1em;font-size:var(--fs-lead);color:var(--white);}
.s-eventabout__closed p:last-child{margin-bottom:0;}

/* ==========================================================================
   SIMPLE FOOTER — the reduced, two-block variant
   A separate module rather than a variant of the full footer, so nothing here
   can affect .c-footer as used elsewhere. Everything is scoped to --simple.
   ========================================================================== */
/* .c-footer__grid declares its own FOUR-column track (1.4fr 1fr 1fr 1.4fr) and
   is declared after .c-grid, so it wins — u-col-5/1/6 were spanning into four
   columns, not twelve. Put the 12-column track back for this variant only. */
.c-footer--simple .c-footer__grid--simple{grid-template-columns:repeat(12,1fr);
  align-items:start;}
/* the blocks are grid columns here, not <details> — no accordion behaviour */
.c-footer--simple .c-footer__block{border:none;padding:0;}
.c-footer--simple .c-footer__lbl{display:block;margin-bottom:1em;}
.c-footer--simple .c-footer__items--contact{margin-top:0;}
.c-footer--simple .c-footer__addr{margin:0;}

@media (max-width:991px){
  /* stack, and drop the empty gutter so it does not leave a gap behind */
  .c-footer--simple .c-footer__grid--simple{grid-template-columns:1fr;}
  .c-footer--simple .c-grid__col[aria-hidden]{display:none;}
}

/* ==========================================================================
   EMPTY / SWITCHED-OFF SECTIONS
   A global roster has ONE content set, so a show/hide on it would apply to
   every page. Per-page visibility therefore has to be decided by what the page
   actually rendered, or by a per-page module — never by the roster itself.

   Two rules, both scoped to sections that opted in with data-hide-if-empty:
     1. nothing matched this page  -> no [data-roster-item] -> hide the section
     2. the per-page header says off -> [data-section-off] -> hide the section
   Automotive with no case stories needs NO toggle: pick no cases and rule 1
   removes the heading, the slider and the padding together.
   ========================================================================== */
[data-hide-if-empty]:not(:has([data-roster-item])){display:none;}
[data-hide-if-empty]:has([data-section-off]){display:none;}

/* ---- 00-partnerships.css ------------------------------------------- */
/* ── Partnerships ────────────────────────────────────────────────────────
   Two new pieces, the rest derived:
     .s-hero--plain   dark, text-only hero — no reference existed, so this is
                      mirrored from the source and becomes the reference
     .c-ptnr          partner card: logo, external link, name, description
   Reused as-is: .c-stat (with its count-up), .c-download for the report grid,
   .c-tabstrip (given a light variant here), .c-grid--header for the headers. */

/* hero: no media column, so the grid is two text columns on a dark ground */
.s-hero--plain{min-height:0;background:var(--panel-dark);background-image:none;
  padding:9em 0 12em;}
.s-hero--plain .s-hero__content{background:none;padding:0;justify-content:flex-start;}
.s-hero--plain h1{color:var(--white);}
.s-hero--plain .s-hero__lead{color:rgba(255,255,255,.75);max-width:32em;}
.s-hero--plain .c-eyebrow{background:rgba(255,255,255,.15);color:var(--white);}
.s-hero__aside{display:flex;flex-direction:column;justify-content:center;}

/* stat band: a white card straddling the hero's bottom edge — same trick as
   .s-solutions__cta, pulled up over the boundary */
.c-statcard{position:relative;z-index:3;margin-top:-6em;padding:3em 2em;
  background:var(--white);box-shadow:var(--shadow-md);}
.c-statcard .c-stat{padding-inline:2em;border-left:1px solid var(--color-border);}
.c-statcard .c-stat:first-child{border-left:0;}
.c-statcard .c-stat p{color:var(--color-text-muted);font-size:var(--fs-small);}

/* tabstrip, light ground: outlined pills, ink when active */
.c-tabstrip--light{display:flex;padding:0;background:none;gap:.75em;}
.c-tabstrip--light .c-tabstrip__btn{background:none;color:var(--color-text);
  border:1px solid var(--color-border);font-size:var(--fs-mini);
  letter-spacing:.04em;text-transform:uppercase;}
.c-tabstrip--light .c-tabstrip__btn:hover{border-color:var(--color-heading);color:var(--color-heading);}
.c-tabstrip--light .c-tabstrip__btn[aria-selected="true"]{background:var(--color-heading);
  border-color:var(--color-heading);color:var(--white);}

/* partner card */
.s-ptnr__grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2em;
  margin-top:3em;padding-top:3em;border-top:1px solid var(--color-border);}
.s-ptnr__grid[hidden]{display:none;}
.c-ptnr{display:flex;flex-direction:column;gap:1em;padding:1.5em;
  border:1px solid var(--color-border);border-radius:1em;background:var(--white);}
.c-ptnr__top{display:flex;align-items:flex-start;justify-content:space-between;gap:1em;}
.c-ptnr__logo{width:3em;height:3em;object-fit:contain;border-radius:.5em;}
.c-ptnr__link{display:inline-flex;align-items:center;gap:.25em;
  font-size:var(--fs-mini);color:var(--color-text-muted);}
.c-ptnr__link:hover{color:var(--color-brand);}
.c-ptnr h3{font-size:var(--fs-lead);}
.c-ptnr p{font-size:var(--fs-small);color:var(--color-text-muted);}

/* report grid reuses .c-download */
.s-works__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2em;margin-top:2em;}
.s-works__label{font-size:var(--fs-mini);letter-spacing:.08em;text-transform:uppercase;
  color:var(--color-text-muted);padding-bottom:1em;border-bottom:1px solid var(--color-border);}

@media (max-width:991px){
  .s-ptnr__grid{grid-template-columns:repeat(2,1fr);}
  .s-works__grid{grid-template-columns:repeat(2,1fr);}
  .c-statcard{margin-top:-3em;}
}
@media (max-width:767px){
  .s-hero--plain{padding:5em 0 8em;}
  .s-ptnr__grid,.s-works__grid{grid-template-columns:1fr;}
  .c-statcard .c-stat{border-left:0;padding-inline:0;}
}

/* ---- 00-rings.css -------------------------------------------------- */
/* ==========================================================================
   HEXAGON RING CLUSTER — one element, six baked background layers
   Was six <img> per cluster (702 B, 6 nodes). The images were never the cost —
   six unique URLs are six requests however many tags point at them — but the
   markup was: 21 KB and 180 DOM nodes once 30 expert cards exist.

   Opacity is baked into each asset because CSS background layers cannot carry
   individual alpha. Layers are listed smallest-first: the first background
   paints on TOP, matching the old z-index order (ring 1 = z-7 = smallest).
   Inlined as data URIs so one shared stylesheet resolves identically offline
   and on hubfs, and so the six requests disappear entirely.

   Quotes are percent-encoded: an unencoded " would end the url("…") string.
   The comma after data:image/svg+xml is part of the URI and is literal inside
   the quotes — only commas OUTSIDE url() separate layers.
   ========================================================================== */
/* One knob for the whole component. Each layer still carries its own
   falloff inside the SVG; this regulates the cluster as a unit so every
   placement reads the same weight. Default is a 50% dark line. */
.c-rings{opacity:var(--rings-opacity,.5);
  background-repeat:no-repeat;background-position:center center;
  background-size:20%, 35%, 50%, 65%, 80%, 80%;
  background-image:url("data:image/svg+xml,<svg opacity=%220.5%22 width=%2271%22 height=%2261%22 viewBox=%220 0 71 61%22 fill=%22none%22 xmlns=%22http://www.w3.org/2000/svg%22> <path fill-rule=%22evenodd%22 clip-rule=%22evenodd%22 d=%22M68.9524 33.2629C69.9573 31.5578 69.9573 29.4569 68.9524 27.7518L54.6201 3.43328C53.6152 1.72814 51.758 0.677735 49.7482 0.677735L21.0838 0.677737C19.0739 0.677737 17.2167 1.72814 16.2118 3.43328L1.87958 27.7518C0.874654 29.4569 0.874654 31.5578 1.87958 33.2629L16.2118 57.5814C17.2167 59.2866 19.0739 60.337 21.0838 60.337L49.7482 60.337C51.758 60.337 53.6152 59.2866 54.6201 57.5814L68.9524 33.2629Z%22 stroke=%22black%22/> </svg>"),
    url("data:image/svg+xml,<svg opacity=%220.4%22 width=%22139%22 height=%22121%22 viewBox=%220 0 139 121%22 fill=%22none%22 xmlns=%22http://www.w3.org/2000/svg%22> <path fill-rule=%22evenodd%22 clip-rule=%22evenodd%22 d=%22M136.695 66.0201C138.705 62.6099 138.705 58.4082 136.695 54.9979L108.03 6.36071C106.02 2.95043 102.306 0.849611 98.2863 0.849611L40.9572 0.849614C36.9375 0.849614 33.2231 2.95043 31.2132 6.36071L2.54873 54.9979C0.538869 58.4082 0.538869 62.6099 2.54873 66.0201L31.2133 114.657C33.2231 118.068 36.9375 120.168 40.9572 120.168L98.2863 120.168C102.306 120.168 106.02 118.068 108.03 114.657L136.695 66.0201Z%22 stroke=%22black%22/> </svg>"),
    url("data:image/svg+xml,<svg opacity=%220.3%22 width=%22208%22 height=%22181%22 viewBox=%220 0 208 181%22 fill=%22none%22 xmlns=%22http://www.w3.org/2000/svg%22> <path fill-rule=%22evenodd%22 clip-rule=%22evenodd%22 d=%22M204.453 98.7734C207.468 93.658 207.468 87.3555 204.453 82.2401L161.456 9.28423C158.441 4.16881 152.87 1.01758 146.84 1.01758L60.8465 1.01758C54.8169 1.01758 49.2453 4.16881 46.2305 9.28424L3.23377 82.2401C0.218983 87.3555 0.218983 93.658 3.23377 98.7734L46.2306 171.729C49.2453 176.845 54.8169 179.996 60.8465 179.996L146.84 179.996C152.87 179.996 158.441 176.845 161.456 171.729L204.453 98.7734Z%22 stroke=%22black%22/> </svg>"),
    url("data:image/svg+xml,<svg opacity=%220.2%22 width=%22276%22 height=%22241%22 viewBox=%220 0 276 241%22 fill=%22none%22 xmlns=%22http://www.w3.org/2000/svg%22> <path fill-rule=%22evenodd%22 clip-rule=%22evenodd%22 d=%22M272.207 131.527C276.227 124.706 276.227 116.303 272.207 109.482L214.878 12.2078C210.858 5.38719 203.429 1.18555 195.39 1.18555L80.7318 1.18556C72.6924 1.18556 65.2636 5.38719 61.2439 12.2078L3.91484 109.482C-0.10488 116.303 -0.104879 124.706 3.91484 131.527L61.2439 228.801C65.2636 235.622 72.6924 239.823 80.7318 239.823L195.39 239.823C203.429 239.823 210.858 235.622 214.878 228.801L272.207 131.527Z%22 stroke=%22black%22/> </svg>"),
    url("data:image/svg+xml,<svg opacity=%220.1%22 width=%22345%22 height=%22301%22 viewBox=%220 0 345 301%22 fill=%22none%22 xmlns=%22http://www.w3.org/2000/svg%22> <path fill-rule=%22evenodd%22 clip-rule=%22evenodd%22 d=%22M339.961 164.288C344.986 155.762 344.986 145.258 339.961 136.732L268.3 15.1391C263.275 6.61338 253.989 1.36133 243.94 1.36133L100.617 1.36134C90.5678 1.36134 81.2819 6.61339 76.2572 15.1391L4.59591 136.732C-0.428742 145.258 -0.428741 155.762 4.59591 164.288L76.2572 285.881C81.2819 294.407 90.5678 299.659 100.617 299.659L243.94 299.659C253.989 299.659 263.275 294.407 268.3 285.881L339.961 164.288Z%22 stroke=%22black%22/> </svg>"),
    url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZ0AAAFnCAYAAAB91pTdAAAUFklEQVR42u3d61LbWNoF4IVkwMZND9NJZe7/Ar+qJISEc74f2g4ODQGDJOvwPFXUTPXM1CTC9ta7vbTXQRi7gySH5WdRfuryn9UuDyN1n+Quyc8kt+Xnpvz8dHnG/YHF+ByVn+OyyDx+Q96U/96dS8VI1eXzqSo3VPXWjdVdkusk38trH4sOHf2u1kmW5Y34vbzxrl0aZnjTtSw/SXJe3gdusiw6tLjYnCS5LD8WGnhYgE6SrMqN2DeLj0WH9y8235NcxF425A/bceuy+Pwo7xeLj0WHV1om+U9585xbbGCnxee0TEDn5T0E/OEm4D9JPpU3DfD2xedTeT9JccIf3iR/m0ChNX+V95WFZ0AfdGQQ22n/LdsBFy4HtGYTuvlPmu94RKyZvVW5E1u4FNCZRXmfrVwKLDgmTkiPW9gWHjLXLTULDlh4oLcXvi01yN622rz/cKcFpM+tbUlR6bXJ+zsPhxUC+3FbPv82x0vRk8ol6P3u6jjN+VDAfp2XhWfpUjDlbTXTJWRQB4b+L7bZbK9N0Gmah9OcBQXDcVc+B4+TXLkcsb02ocV9GdtqkIFus60izWbSmZB/0hxvowcHMuhz2uxEmHQyhfBA7cUMg3ax9dA2jJqH0CCjCRV4die218Y+rt+bciBjCRUclptEW+GxvTbW+lzhAcioQgUnbshNOhnpyQNXEcOEMfmZZntNqMCkEycPAH34Vm7IVcZbdDKmB0HPXQYYrc9JzlyG2F7LeMIDphzIqEMFy/IZKVRg0hEeAHqZdk4iQm3SifAAkN5CBSvvaZNOBtpGeJyHJ5uBTOKkguMIFZBhnjygDRSmZ5nkg8tg0snAItJqC2CaNs2ia5eCKGcD0s/2ubI3QYIMJTxgyoFpu1f2FttrA1m0nTwAmVXZm1CBSWdvPpQFx8NjMB/r2Nkw6WQ/4YHKiw8yx7I3SVV6dRDhAYiyN2J7LcrZgCh7i+21CS3UJxEegDn7kua7HTfuJp04Xw1IT9vsyt5MOumjnM35aoCyN9LH+WpLlwGIUEFsr6WX8IApB8ijsrcqQgWxvaacDUhvZW9u4k06ER4A0lPZ20keTqTGpJP37Nk6Xw3ICycVHAoVEOVsQI83qB9dBpNO3hmRvokcPvCy6zRbbcreiHI2oK/PDWVvggR5a3jgNr4YBLJzqGAZwaPYXtu9nM0zOUDeECpQ9kaEB4D0+H3wB5fBpPPaF0siPAC83Q9lb0R4AEi/EWqhAkGCPzpNc5aSKQdIC+ey1WkeGnUuW2yvPbUAL+PkAaA951H2ZtJ5xlmS7+5IgHRzSr0dFJNOtsMDh14UQLqJUB9EhJr8HpH2ggCi7C2213oqZ/vuUgDpLlRwVD5zr22vzXvRPY3wANC9r1H2NvtJ5+80Z6s5IwlIT+eyzTpUMOdJZxnlbEB6DxXU8R1ynK8GkF5DBbG9Nh/rMuqacoDsIVSwnGuooJrpQru24AB79Ll8Dh2YdDKL8MB1hAeA7D1UsJrbZ1GlnA0g+woVLCNUEOEBgCh7M+m8/5d7H+erARlc2dvapYhyNoAoexMkyNvCA8rZgAy47O04MwgVVDMKD4hIAxlw2dsqycKkM37/pEmJKGcDouzNpJOOwwO1bTUg44hQJ02MmhE6SBMeWLgUQJS9xfZaP+VsphwgIwoVHJab5Wvba85XA+jal0y47K2ecET6Ks5XAzLarwcmGSqoJhoeEJEGxuzbVMveprjonKbJvANk5PUHZ7G9ljGEB0w5QJS9mXSEBwB2m3YmFSqohQcAMvSyt+VUPtumMuksIjwAZLInFRxH2VuUswH0Y5mJlL1VE4lIqy0Apuwyyt6inA0gvX6NMPqyt3oC4YHbrbsAgKm6n0LZWzWBcrYLr0Ug8yp7OzLp9O9DmrSacjZgbtYZ6ffY1YjDA5XwAJD5lr1J7KbfcjbhASAzLnsbZaigVs4GEGVvsb323CJ5EicPAHxJ893OqIaH2vlqABn76fo/TDrprJxNRBogv0IFtXPZ0tn5akuXASCPQwWfMpJQQT2y8IApByBPlr1VGUGooBrJwnga4QGAjL3srR5JeOAywgMAeaHs7WToZ1FWI9irVM4GkFeFCg6FCqKcDaDHG/WPJp28+UC7mzh5AOC1rtNstSl7i3I2gL4+Pwd7LlutnA0gUwwVLDPAAFalnA0gUwwVrIQKIjwAkP6ODvtg0nn5IiXCAwDv9WMrlEWEBwAyt7K3IX3An6Y5Q8iUA5DWzmXbfE9+ZXvt98VvGScPALTtPM1XF4MYMoYy6Zwl+Z6R1a4CRNnb6CadVZrzgmyrAaSzCPVBRKiTNOGBhcsAkMmXvdUDKWcz5QCk81DBUfncv57j9lqdJj8uPADQj6/Zc9lbvefz1a6inA0gPZ/LtrdQwb4mnWWUswFkT6GCOjMLFThfDSB7DxVkDttr6zLimXIAsrdQwXIfoYJKeABglj6nCRUcTHnS+busqsIDABlEqGDV52dypZwNIHMOFRxnoqEC4QGAzLvsrerxL+XkAYAoe4tyNoAoe+shVFD3FB5QzgYQZW9VT+EBEWmAjKLsbTHmSedDWXCUswFE2VvVcXigsq0GkDFFqJPmtIJROYhyNoAoe0sv22vK2QAy2lDBYRkarsewveZ8NYBx+5KOyt5q5WwA5OmvSVoPFVQdhAdEpAHG71sXZW9tLzqnabLeAGQS9QdnbYYK6g7CA6YcgEyq7K1KS6GCSngAgFeUvbUypNTCAwDk5bK3ZRuf8W1MOosIDwBE2VuUswHQimWSj/uedFZJbuLkAYCpu0yz1bZWzgZAHxZ5Z9lb/c7wwG1Z/QCYvvv3lr1V7yxnu/A7AMgcy96O+px0lLMBzNs6b/g+v1LOBkDeVva2Eh4AID2Vve0cKqjfME4pZwPgrqwhh9nhq5ZqxwXqJE4eACC/QgXrXQaY2vlqAOT9LQM/2px0ViLSAOTpUEHrZW+f0py7AwB5IlTwKa8IFdQ7lLOZcgDIM6GCo7KmXL9ne61OU0EtPADAn3zNK8re6leEBy4jPABAXlX2dvKnMzmrF7oTlLMBkB1CBYd5Y6hAORsAeUOo4OOuk846ytkA2N11dix7c74aAHnnOZ1PnstWK2cDIN2ECpZ5FESrlLMBkG5CBavHw039xJRzLSINQAv+Ne1UT5wiLTwAQFvTzvH2dzv1o+dydOUAkJZDBb86d7YnnVMLDgAtu0yzi5btRWeRh3w1AKTF53aSckrBZtE5FpEGoMNp57dFZ2nRAaDDRed4e9E5SnPsDQC07Sbla5yq/JubNE+QAkA6OKHgZ5LFZtG5c00ASLeBgsPtSQcAunKbpDbpANCHu82icxDf5wDQg6r83LsUAHQ86Swq1wGAPicdAOht0bmLamoAul9v7k06AKSnQrf7KiU77XoAkG57de5srwHQh8Mkt1Wa0wiOXQ8AOp50bjfbawfZ6rAGgLT7fc6vSSdl4Tl0XQBIN1tr18nDczpXaYrcAKBtv4pCq60jpy06AHS16Fw9XnSS0mENAC052voa57eo9OaLnivXCICW/JXkx2bR2T6R4KKMQFJsAKSlmPRJHnbT/vVQ6GGaUrdr1wqAd1qnOYDgR545Zfq8/JdMOwC0MeV8e/wPt/0s/+zQtAPAO5w+nnKe69PZTDvOYwPgrVPO8vGUkxcWlr8er1AA8ApnaR4GvXptc+hFmu91PLcDwC5Wab6iuciOddVfy2olVABAdvgu52v+sO/2nLsy6dQRKgAgr3oQ9P65KeelSWcz7ZwIFQCQl8MDp3kiPPDaSSdpItQHZeG5dE0BeMbfz4UHdpl0UsakwwgVAJBnT5E+fmnKyY6nhH5yXQF4wqc0qbW8Zg/uNe7KSlYluXF9AcjD+Wo/25xytheo/0WEGoCHdeHTLmGzXVJpm1DBUucOAGnCA9e7rAnVjv8HF2n27YQKAEw5x+nhuLRVkg+uN0CEB3ZUveH/6MfWl0cAZJbnq933eSj0UYQKACI8sPv/+C3utvbzhAoAMu9ytnS4vZatsrdVkoXfAcC8y9m6nnSi7A0gcyxn+553NA9U7/wDXGw9uwNAJl/OtvchY3Mum1ABQCYdkV60sT/3Xndl9VsoewPIlMvZ3j3lVC39gc6j7A0gEw0PrNPSgZ5tLRKbc9mECgAyufPVrtLS4zFVi3+wi7KIOZcNIJMJDxx3UVsQZW8ApIXz1dLD9loelb3VESoAyATCA61OOVUHf9DPaUIFItQAER7octJJHkIFqziXDSBzDw90PekkTajgOEIFAGOzKJ/fF2P7gy+j7A0gcw8P9DHpJMlllL0BRDlbv2OasjeATLucbZ9Bgm33yt4AMpbwwF3XU07Vw19kU/YmVAAw3Cmnl5MH+jygc+1cNoBB+lAWnM4f6q96+gtdbH1JBUAGFR6opjgUKHsDGJaDPsID2dP2mrI3gEyznC0D217b+BJlbwAZSHjgJD3XFtR7GueUvQFkmuerDWnSSVlVlb0BZO/lbBdz+QsLFQBkr+erLbOnPb192JS9VREqAMgewgN7mXKqPf7FPwsVAEyjnG3ok07yUPZ2kocTqQHItMIDQ5l0Usa7wwgVAKSncrZvc78QR0k+ej0AZLTlbGOZdJImSPAzyt4A0mFE+iaej8z2d0vK3gBGWs42hiBBHoUKlL0BpJPwwG0GEtiqBnRhlL0BdFPOduFS5Nl9xw8uA0AmEx4Y6qSTPHzJpewN4P038REeyKsi1EIFAJlGeGCIQYI8OpetTvPQqHPZAHZ3Wj5LBzflVAO9YOdpnttxLhvA7sPEMgM9eaAewWmo9iMBXu8sTTx6kI+fVAO+cBdpvtcRoQbIq8MDhyLSUfYGkH4i0kdD3/sbsrtyAesIFQDkFeVs34f8h6xGcCG/RtkbwEsDxGlGUFswhg/yTdmbUAFAnj1f7XIMZ1dWI7mgF2WBFCoA+N0yytnSZagAgAz3fLWMfHstW6GCZZnObrzOALJO8xWEKUfZG8A8z1ebyqSTrVDBKsregMw+PHA9ts/CaoQX+iLNNptQAaCcjSh7A4jwwFQmneTheZ211x4ww5vue88tRtkbQIQHJhUkyBNlb8cRKgCinC2219JH2dsqycJrEVDOZtKJsjeAVvyTJq026hP3qwn8Ii62zh8CyETDA7Wb6yh7A0g/EenFVPYIp+AuTUXrQtkbkGmWs01iyqkm9Is5j7I3IJMLD6wzoQM9p/QBrewNyATPV7vKhB4LqSb2C/qm7A3IdMIDkytnqyb4i/qc5MzrFcj4HwQ9zwT3C6dmU/ZWR6gAyKjDA5MrZ6sm+gv7nCZUIEINCA+YdKLsDSDzCA/MYdJJmpMKjiNUAIzHQjnbuC2j7A2IcjaTTj8uo+wNyGgi0neeM5zGuKrsDYhyNkGCPtwrewMy/PDALKacaia/0E3Zm1ABMMSb/+OpRqTnOOlsW9svBQbmQ1lwZvEwezWjX+zF1pd1ABlIeKByM5xJl70JFQBDcJCZhAcy4+01ZW9AlLPF9lqPvqT5bkfZG7DPG/6TzCQ8MOdJZ3usVfYGxPlqJp0oewMy/XI256tlfqGCT0IFQPo/X22ZGe8rztWm7K2KUAGQXsMDs51yqpm/ADZlb0IFQB83+aeZYXjApJN/lb2d5OFEaoB0FB64zMzPgKy8DnKR5tkdoQIgHX6HfDz3KYffXxAfXQYgytlMOj24TrPVpuwNSAcR6Zt4LpD8+/st57IBytkECdJnqGAZZW9AWgsP3EZQKbbX8myoQNkb0GY5m5MHyEv7rx9cBiDCAyadHvxQ9ga0cPMa4QGi7A2I8IAgQYZ3Llud5qFR57IBuzgtnyGmnNhe28V5lL0Bu9/IL+PkAZNO3ncqrDsW4DXOknyPHRKTTt4eoT6ICDWQV4UHDt2kEmVvQPqJSLtBje21tBAqOCrXysgM5A/lbN9dithea8HXKHsDnr95X0d4wKST9s9lEyoA8sT5aldxZqNJJ+2HCurYswUeLKOcjXQfKgCI89Viey3dhwqWQgVAmu9xfppyYnutY5/Li02EGoQHLDgmnfQVKljFF4eQGYcHrn0GmHTSY6jgOEIFoJwNouwNiPCASSeTLHtbuxQwq5vNe8/rEWVvQJSzCRJkHmVvx/GFImQG4QHlbLG9lgGUva2SLFwKmHx4QETapBNlb0DX/kmTVvNQuEknQ4lQJ81pBUAmFx6o3VQSZW9Axw7K+9r2eWyvZYChgsPy4jSCQyZVzmbKie21IfoSZW/gfDVMOj2P40IFEOVsmHT68E3ZG2QK4QERaYtOxlR/cOYywGidpnkGj9hei7I3IN2HB0w5Jp3RTTtCBSA8gEknfZa9LeOLSIjwACadKHsDflkIDzAFyyh7gyhnw6TTj8soe4OMICKttoBJje3K3iDK2Vxs+nCv7A0y5PDAbR52JYjttUyo7E2oAIZXznbhUpCJhgo+xjYbRHjA9hrduy13VYexzQZx8kBsr5E+TipYuruCvVqnOTHEgkPmkmbTRgj7ff/Z6SFz+37HCx+yl3j00qUgM30gzcID/S44trax8Nhqg/SxpWbBkV6LRFtz/Mam9O3GJYHWb+zOknyNB0DhX6P/Xy4FtOIgzWkDtrAH9kthWAvPaZpTC/6vTEDA7o7KdHOd5EuafissOvxhO+A0zQOk3yw+sNNn2ml5D32J7TSLDjvX5q7SHLd+YfGBP36WbR74/F7eL6Ybiw7v2HJblTfTj7JlADTbaMvyY7Gx6NDy4nNUFqCUbYNLCxAzXWiOylRzX94HFhuLDun2mYOT8sar08Sub9Jsv92UN+JP23FM4HGOw/I5dVh+FuX1flVuuNx0WXTYw+9w+w25KP+sjgNdGa+7rX+93bqxujHRjNv/A4VWUsO2qxqcAAAAAElFTkSuQmCC");}

/* ---- 00-team.css --------------------------------------------------- */
/* ── Team ────────────────────────────────────────────────────────────────
   Measured off the source:
     .s-photomrq  13-column photo marquee, two tracks (546px band)
     .s-expdir    experts directory — 11 industry tabs, 8 cards per panel
     .s-exco      executive committee, 4 ring-backed cards (726px)
   Tabs reuse .c-tabstrip and eventTabs(). */
.s-photomrq{overflow:hidden;}
.s-photomrq__track{display:flex;gap:1em;width:max-content;
  animation:photomrq 60s linear infinite;}
.s-photomrq__track img{width:12em;height:16em;object-fit:cover;border-radius:.5em;}
@keyframes photomrq{from{transform:translateX(0);}to{transform:translateX(-50%);}}
@media (prefers-reduced-motion:reduce){.s-photomrq__track{animation:none;}}

.s-expdir__wrap{margin-top:2.5em;}
.s-expdir__grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2em;padding-top:3em;}
.s-expdir__grid[hidden]{display:none;}
.s-expdir__card{display:flex;flex-direction:column;}
.s-expdir__card img{width:100%;aspect-ratio:3/4;object-fit:cover;border-radius:1em;}
.s-expdir__card h3{margin-top:1em;font-size:var(--fs-lead);}
.s-expdir__card p{color:var(--color-text-muted);font-size:var(--fs-small);}

.s-exco__grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2em;margin-top:3em;}
.s-exco__card{position:relative;overflow:hidden;padding:2em;border-radius:1em;
  background:var(--panel-tint);}
.s-exco__card .c-rings-frame{position:absolute;inset:auto -4em -4em auto;z-index:0;}
.s-exco__card img{position:relative;z-index:2;width:6em;height:6em;border-radius:50%;object-fit:cover;}
.s-exco__card h3{position:relative;z-index:2;margin-top:1em;font-size:var(--fs-lead);}
.s-exco__card p{position:relative;z-index:2;color:var(--color-text-muted);font-size:var(--fs-small);}

@media (max-width:991px){
  .s-expdir__grid,.s-exco__grid{grid-template-columns:repeat(2,1fr);}
}
@media (max-width:640px){
  .s-expdir__grid,.s-exco__grid{grid-template-columns:1fr;}
  .s-photomrq__track img{width:8em;height:11em;}
}

/* ---- app-form.css -------------------------------------------------- */
/* ==========================================================================
   MRC APPLICATION — form block
   ========================================================================== */

/* No block padding at all — the card sits flush under the hero so the black
   band reads as one continuous field, and the embed runs straight into the
   next section. */
.s-appform{padding-block:0;overflow:hidden;}

/* The "split" half of the section. --ground, not --stone-900: the source's
   gray-900 leaves a visible seam against the hero's pure-black scrim, which
   defeats the point of the band. */
.s-appform__band{position:absolute;inset:0 0 auto;height:16em;
  background:var(--ground);z-index:0;}

/* Card. Square corners per the system; the shadow is what lifts it off the
   band. No padding, no width cap: the HubSpot embed brings its own internal
   spacing and measure, so anything here would double up on it. */
.s-appform__card{position:relative;z-index:1;
  background:var(--white);border:1px solid var(--color-border);
  box-shadow:var(--shadow-lg);}

@media (max-width:991px){
  .s-appform__band{height:10em;}
}

/* ---- app-hero.css -------------------------------------------------- */
/* ==========================================================================
   MRC APPLICATION — hero
   Everything structural (photo bed, scrim, container padding, h1 shadow) is
   inherited from .s-mrchero in styles.css. Only the deltas live here.
   ========================================================================== */

/* Not a cover: no viewport fold, no minimum height at all. The hero is sized
   by its own content plus the top padding that clears the fixed nav.
   hero-home.css sets `.c-section.s-mrchero{padding:0;min-height:100vh}` at
   0-2-0 AND loads after this file, so matching its specificity loses on source
   order. Chaining the modifier onto the base takes it to 0-3-0. */
.c-section.s-mrchero.s-mrchero--app{min-height:0;padding-top:15em;}

/* Plain system h1 (--fs-display). hero-home.css/zz push .s-mrchero h1 to 5em
   for the cover; at 0-2-1 this outranks that regardless of file order. */
.c-section.s-mrchero--app h1{font-size:var(--fs-display);}

/* head runs side-by-side (source: m-sec-head.is-sbs) — title left, deadline
   right, both sitting on the same baseline */
.s-mrchero__head{width:100%;align-items:end;}

/* ---- Breadcrumb --------------------------------------------------------- */
.s-apphero__crumb{display:flex;align-items:center;gap:1em;flex-wrap:wrap;}
/* .c-eyebrow carries a 1rem bottom margin for its usual stacked position; in a
   row that margin drops it off the arrow's centreline */
.s-apphero__crumb .c-eyebrow{margin-bottom:0;}
/* arrow + current label travel as one wrap unit — see the note in the markup */
.s-apphero__crumb-tail{display:inline-flex;align-items:center;gap:1em;}
.s-apphero__crumb-arrow{width:1.25em;height:1.25em;flex:none;opacity:.7;}
/* same meta treatment as the eyebrow it follows, minus the pill */
.s-apphero__crumb-current{font-size:var(--fs-small);font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:rgba(255,255,255,.8);transition:color var(--transition);}
.s-apphero__crumb-current:hover{color:var(--white);}

/* ---- Deadline ----------------------------------------------------------- */
.s-apphero__aside{display:flex;justify-content:flex-end;align-items:flex-end;}
/* no leading CTA here, so the asymmetric padding that made room for one on the
   Home hero is evened out */
.c-datebar--solo{padding:.75em 2em;}

@media (max-width:991px){
  .c-section.s-mrchero.s-mrchero--app{min-height:0;padding-top:10em;}
  /* zz-visual-match gives the Home hero a 10rem container top padding at this
     width; here the section already carries the offset, so don't add it twice */
  .c-section.s-mrchero.s-mrchero--app > .c-container{padding-top:0;}
  /* .c-grid collapses to one column at this width — the pill returns to the
     left edge under the title */
  .s-apphero__aside{justify-content:flex-start;}
  /* the stacked .c-datebar rule turns the pill into a rounded block; with a
     single date there is nothing to stack, so keep it a pill */
  .c-datebar--solo{flex-direction:row;align-items:center;
                   border-radius:var(--radius-pill);padding:.75em 2em;}
}

/* ---- event-about.css ----------------------------------------------- */
/* ==========================================================================
   MRC Career Day — Section B: "About the event"
   Photo bed + two columns. Layout is .c-section / .c-container--ruled /
   .c-grid; the bullets are .c-checks. New here: the scrim, the agenda table
   and the white form card.
   ========================================================================== */

.s-eventabout{padding-top:0;}
/* the photo is a face-on group shot — anchor it to the bottom so heads are not
   cropped when the section grows taller than the frame */
.s-eventabout .c-section__bg img{width:100%;height:100%;object-fit:cover;object-position:50% 100%;}
/* Three stacked layers, same idea as the source: black in from the left so the
   copy column always has a dark ground, black in from top and bottom so the
   section joins the beds above and below, then a flat wash over the lot.
   The wash is heavier than the source's .15 — our copy column runs further
   right, over the brightest part of the stage. */
.s-eventabout__scrim{position:absolute;inset:0;
  background-image:
    linear-gradient(90deg,#000,rgba(0,0,0,.35) 60%,rgba(0,0,0,.35) 85%,#000 99%),
    linear-gradient(#000,rgba(0,0,0,.13) 68%,#000 97%),
    linear-gradient(rgba(0,0,0,.35),rgba(0,0,0,.35));}

/* --ruled draws its hairline in stone-200 for white beds; on the photo that
   reads as a bright line. Same rule, dark-bed tone, and a shorter run-in. */
.s-eventabout .c-container--ruled{padding-top:5em;}
.s-eventabout .c-container--ruled::before{background:rgba(255,255,255,.15);}

.s-eventabout__cols{column-gap:5em;}

/* the two content groups own their own rhythm, so heading/paragraph margins
   are zeroed and `gap` does the spacing — one ladder instead of two */
.s-eventabout__head{display:flex;flex-direction:column;gap:3.5em;}
.s-eventabout__block{display:flex;flex-direction:column;gap:1.5em;}
.s-eventabout__block > *{margin-bottom:0;}

/* ---- Bullets: .c-checks, stripped of its panel ------------------------- *
   The source's list is naked ticks on the photo, not the boxed panel the
   component ships with, and the icon is a supplied white check rather than the
   filled blue marker.                                                       */
.s-eventabout__list{gap:.75em;}
.s-eventabout__list .c-checks__item{background:transparent;border:0;padding:0;gap:1.5em;}
.s-eventabout__list .c-checks__ico{background:none;padding:0;border-radius:0;
  width:1.5em;height:1.5em;margin-top:.125em;}
/* the component pins its body copy to stone-600 for light beds — on the photo
   that is unreadable, so hand it back to the dark bed's text token */
.s-eventabout__list .c-checks__item p{color:var(--color-text);}

/* ---- Agenda ------------------------------------------------------------ */
.s-eventabout__agenda{display:flex;flex-direction:column;gap:.75em;padding:2em 1.5em;
  background:rgba(255,255,255,.10);
  -webkit-backdrop-filter:blur(1em);backdrop-filter:blur(1em);}
.s-eventabout__slot{display:flex;align-items:center;gap:1.5em;}
/* fixed-width chip so every time reads on one baseline and the descriptions
   all start at the same x — a shrink-to-fit chip ragged the column */
.s-eventabout__slot dt{flex:none;width:11.5em;padding:.375em 1em;text-align:center;
  font-size:var(--fs-small);line-height:1.5;color:var(--white);
  background:rgba(255,255,255,.25);border:1px solid rgba(255,255,255,.35);
  border-radius:var(--radius-pill);
  -webkit-backdrop-filter:blur(1em);backdrop-filter:blur(1em);}
.s-eventabout__slot dd{flex:1;min-width:0;margin:0;
  font-size:var(--fs-body);line-height:1.5;color:var(--white);}

/* ---- Registration column ----------------------------------------------- */
.s-eventabout__register{display:flex;flex-direction:column;gap:2.5em;}
.s-eventabout__register h3{margin-bottom:0;}
/* white card lifted off the photo, as the source's form wrapper.
   Re-points the text tokens rather than overriding each element: the section
   is .c-section--dark, so anything inheriting would arrive white-on-white. */
.s-eventabout__form{--color-heading:var(--black);--color-text:var(--stone-600);
  background:var(--white);box-shadow:var(--shadow-lg);}

@media (max-width:991px){
  .s-eventabout__cols{column-gap:2em;}
  .s-eventabout__head{gap:2.5em;}
  .s-eventabout .c-container--ruled{padding-top:3.5em;}
}
@media (max-width:767px){
  /* the chip plus a long description will not sit side by side in a 1fr
     column — stack them and let the chip shrink to its text */
  .s-eventabout__slot{flex-direction:column;align-items:flex-start;gap:.5em;}
  .s-eventabout__slot dt{width:auto;}
  /* stacked, the row gap has to beat the .5em INSIDE a pair or the six slots
     read as one twelve-line block */
  .s-eventabout__agenda{padding:1.5em 1.25em;gap:1.5em;}
}
@media (max-width:640px){
  .s-eventabout__list .c-checks__item{gap:1em;}
}

/* ---- event-decade.css ---------------------------------------------- */
/* ==========================================================================
   MRC Career Day — Section C: "A decade of shaping Vietnam's top research
   talent". A .l-slider rail of .c-card--row cards on the black bed. The cards
   and the slider mechanics are the system's; only the rail width and the dark
   arrows are new.
   ========================================================================== */

.s-eventdecade__title{margin-bottom:2rem;}

/* Short cards, so more than one slide belongs on screen. .l-slider__slide
   ships at 100% for full-width cases — narrow it and the native scroll-snap
   pages a rail instead of a carousel. Steps match the source's rail widths. */
.s-eventdecade .l-slider__slide{flex:0 0 40%;}
.s-eventdecade .l-slider__track{padding-block:.25em;}

/* the track stretches every slide to the tallest; the card has to fill it or
   the row cards end up at different heights */
.s-eventdecade .c-card--row{width:100%;height:100%;padding:1em 2em 1em 1em;}
.s-eventdecade .c-card__media{width:10.5em;align-self:stretch;aspect-ratio:auto;min-height:6.5em;}
/* the component sizes the image with height:100%, which goes indefinite once
   the frame takes its height from aspect-ratio instead of from a stretched
   flex line — the thumbnail then only covered the top of a pale box. Pinning
   it to the frame works whichever way the frame got its height. */
.s-eventdecade .c-card__media img{position:absolute;inset:0;}
.s-eventdecade .c-card__body{gap:.5em;}

/* arrows sit over a black bed: white fill would flare, so they take the same
   frosted treatment as the rest of the page and turn solid on hover */
.s-eventdecade .l-slider__btn{background:rgba(255,255,255,.35);border-color:rgba(255,255,255,.35);
  color:var(--white);-webkit-backdrop-filter:blur(.5em);backdrop-filter:blur(.5em);}
.s-eventdecade .l-slider__btn:hover{background:var(--white);border-color:var(--white);color:var(--black);}

/* the nav wrapper only earns its 2em on tablet, where the buttons drop back
   into flow; on desktop they float over the rail and it would just be a gap */
.s-eventdecade .l-slider__nav{margin-top:0;}

@media (max-width:991px){
  .s-eventdecade .l-slider__slide{flex:0 0 50%;}
  .s-eventdecade .l-slider__nav{margin-top:2em;}
}
@media (max-width:767px){
  .s-eventdecade .l-slider__slide{flex:0 0 75%;}
  /* at this width the thumbnail leaves the title about 8em — stack instead */
  .s-eventdecade .c-card--row{flex-direction:column;align-items:stretch;gap:1em;padding:1em;}
  .s-eventdecade .c-card__media{width:100%;aspect-ratio:16/9;min-height:0;}
}
@media (max-width:640px){
  .s-eventdecade .l-slider__slide{flex:0 0 100%;}
}

/* ---- event-hero.css ------------------------------------------------ */
/* ==========================================================================
   MRC Career Day — Section A: nav variant + "Online Career Day" hero
   Everything structural comes from .c-mrcnav / .s-mrchero / .c-datebar.
   Only the genuinely new pieces live here.
   ========================================================================== */

/* ---- Nav: event variant ------------------------------------------------- *
   The Career Day bar carries a right-hand action, so its container becomes a
   two-zone row. Scoped to --event because .c-mrcnav is shared with MRC home,
   where the bar is brand-only and must stay left-aligned.                    */
.c-mrcnav--event > .c-container{display:flex;align-items:center;justify-content:space-between;gap:2em;}
.c-mrcnav--event .c-btn{flex:none;}

/* ---- Hero breadcrumb ---------------------------------------------------- *
   Replaces the home hero's single eyebrow pill: the same pill, an arrow, then
   the current page. The trailing crumb borrows the eyebrow's type so the row
   reads as one unit rather than a pill with a sentence stuck to it.          */
.s-eventhero__crumb{display:flex;align-items:center;gap:.5em;flex-wrap:wrap;}
/* the eyebrow carries a 1rem bottom margin for stacked use — the row owns
   spacing here, so zero it */
.s-eventhero__crumb .c-eyebrow{margin-bottom:0;}
.s-eventhero__crumb-arw{width:1.25em;height:1.25em;flex:none;}
.s-eventhero__crumb-here{font-size:var(--fs-small);font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--white);}

/* ---- Hero action row ---------------------------------------------------- *
   Unlike the home hero, the dates are NOT inside the frosted pill: the pill
   holds the CTA and the event facts sit alongside it on the scrim.           */
.s-eventhero__cta{display:flex;align-items:center;gap:2.5em;flex-wrap:wrap;}

/* --event: the pill wraps a single control, so the right padding drops back
   to match the left instead of the home bar's long 2.5em run-out. */
.c-datebar--event{gap:0;padding-right:.75em;flex:none;}

/* ---- Event fact list ---------------------------------------------------- *
   Icon + one line of component text. Shared: Section B re-uses it beside the
   registration form so the event facts read identically in both places.      */
.c-eventmeta{display:flex;flex-direction:column;gap:1em;}
.c-eventmeta li{display:flex;align-items:center;gap:1em;
  font-size:var(--fs-body);line-height:1.5;color:var(--white);}
.c-eventmeta__ico{width:1.5em;height:1.5em;flex:none;}

/* The hero container is a flex item of .s-mrchero (column flex) carrying
   margin-inline:auto. Auto margins beat align-items:stretch, so it was
   shrink-wrapping its content and centring itself — the whole title + event
   block sat mid-screen instead of on the gutter. width:100% restores the
   stretch, which is what left-aligns it. Applies at every width; the mobile
   block below only adds padding.
   0-3-0 on purpose: zz-visual-match sets `.s-mrchero > .c-container` at 0-2-0
   and loads after this file, so an equal-weight rule would lose. */
.c-section.s-eventhero > .c-container{width:100%;}

@media (max-width:991px){
  .c-section.s-eventhero > .c-container{padding:25rem var(--gutter) 5rem;}

  .s-eventhero__cta{flex-direction:column;align-items:flex-start;gap:1.5em;}
  /* the shared 991 rule turns .c-datebar into a full-width rounded block;
     with one button inside it that leaves a wide empty pill, so keep it
     hugging its content */
  .c-datebar--event{flex-direction:row;width:auto;border-radius:var(--radius-pill);padding:.75em;}
}
@media (max-width:640px){
  .c-eventmeta li{align-items:flex-start;gap:.75em;}
}

/* ---- hero-home.css ------------------------------------------------- */
/* ---- MRC home hero ------------------------------------------------------ */
/* full viewport fold, everything sits on the bottom edge */
.c-section.s-mrchero{padding:0;position:relative;overflow:hidden;
  min-height:100vh;min-height:100svh;display:flex;flex-direction:column;justify-content:flex-end;}
.s-mrchero__bg{position:absolute;inset:0;z-index:0;overflow:hidden;}
.s-mrchero__bg img{width:100%;height:100%;object-fit:cover;object-position:50% 50%;}
/* transparent → solid black by 85%, over a flat 20% wash, exactly as the source */
.s-mrchero__scrim{position:absolute;inset:0;
  background-image:linear-gradient(rgba(0,0,0,0),#000 85%),linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2));}
/* keeps the standard horizontal gutters; only the bottom padding is set */
.s-mrchero > .c-container{position:relative;z-index:1;padding-block:0 5rem;}
.s-mrchero__top{display:flex;flex-direction:column;align-items:flex-start;gap:1.5em;}
/* type comes from the system: h1/h2 and the raw <p>. The only hero-specific
   bits are the drop-shadow (it sits on a photo) and the zeroed margins. */
.s-mrchero h1{margin:0;filter:drop-shadow(0 .25em 2em rgba(0,0,0,.25));}
.s-mrchero__bottom{margin-top:3.5em;}
.s-mrchero__bottom h2{margin:0;}
.s-mrchero__bottom p{margin:0;}

@media (max-width:991px){
  .s-mrchero__bottom{margin-top:3.5em;}
  .c-datebar{flex-direction:column;align-items:flex-start;gap:1.25em;
             border-radius:1.5em;padding:1.25em;}
}
@media (max-width:640px){
  .c-datebar__dates{flex-direction:column;align-items:flex-start;gap:.75em;}
  .c-datebar__rule{width:100%;height:1px;}
}


/* ==========================================================================
   REVEAL — progressive enhancement (content ships visible)
   ========================================================================== */
.js-reveal-armed{opacity:0;transform:translateY(1em);}
.js-reveal-armed.is-revealed{opacity:1;transform:translateY(0);
  transition:opacity .6s cubic-bezier(.25,.46,.45,.94),transform .6s cubic-bezier(.25,.46,.45,.94);}
@media (prefers-reduced-motion:reduce){
  .js-reveal-armed{opacity:1;transform:none;}
  .c-ticker__item{transition:none;}
}

/* ---- home-batches.css ---------------------------------------------- */
/* ==========================================================================
   MRC home — "A decade of shaping Vietnam's top research talent"
   A rail of the announcement post for every MRC batch. Everything structural
   comes from .l-slider + .c-card--dark; the rules below only do the two things
   the system cannot know: how many cards fit per view, and where the arrows go.
   ========================================================================== */

/* Heading left, arrows right on one baseline. The nav is a child of .l-slider
   (ui.js scopes its [data-slide] lookup to the slider root), so it is lifted
   out of its default below-the-track position rather than moved in the DOM. */
.s-batches__head{display:flex;align-items:flex-end;justify-content:space-between;
                 gap:2em;margin-bottom:3.5em;}
.s-batches__head h3{margin:0;max-width:20em;}
.s-batches__head .l-slider__nav{margin-top:0;flex:none;}
/* the arrow pills are white-on-white by default — on this black bed they read
   as outlines instead, matching the source's ghost arrows */
.s-batches .l-slider__btn{background:transparent;border-color:rgba(255,255,255,.35);
                          color:var(--white);}
.s-batches .l-slider__btn:hover{background:var(--white);border-color:var(--white);
                                color:var(--black);}

/* slide width + card geometry now live in zz-visual-match.css, which mirrors
   the live page's compact 31em x 8.5em row card. */

/* card interior: the read link is pinned to the bottom so every card's CTA
   shares a baseline however long the title wraps */
.s-batches .c-card__body{gap:.75em;}
.s-batches .c-card__title{margin:0;}
.s-batches .c-card__tag{color:var(--blue-300);}
.s-batches .c-link{margin-top:auto;padding-top:.5em;}
/* the whole card is the link — lift the image rather than shadowing a dark
   card against a black bed, where a shadow is invisible */
.s-batches .c-card img{transition:transform var(--transition);}
.s-batches a.c-card:hover img{transform:scale(1.04);}

@media (max-width:991px){
  .s-batches__head{flex-direction:column;align-items:flex-start;gap:1.5em;
                   margin-bottom:2.5em;}
  .s-batches__head h3{max-width:none;}
  .s-batches .l-slider__slide{flex:0 0 calc((100% - 2em) / 2);}
}
@media (max-width:767px){
  /* one card per view, with the next one just peeking so the rail reads as
     swipeable without an on-screen affordance */
  .s-batches .l-slider__slide{flex:0 0 85%;}
}
@media (max-width:640px){
  .s-batches .l-slider__slide{flex:0 0 100%;}
}

/* ---- home-infopack.css --------------------------------------------- */
/* ==========================================================================
   s-infopack — MRC home §4 "Info Pack & Events"
   Two 6-col columns on a tinted bed: the info-pack download panel (left) and
   the Career Day event card (right). Only genuinely new rules live here —
   layout, type and buttons all come from the system.
   Reused: c-section--tint · c-container · c-grid/u-col-6 · c-card ·
           c-rings-frame · l-slider · c-btn--onDark · js-reveal
   ========================================================================== */

/* both columns are vertical stacks: head, then the stateful block, and the
   stateful block grows to the column height so the two cards align */
.s-infopack__col{display:flex;flex-direction:column;}
.s-infopack__head{margin-bottom:2.5em;}
.s-infopack__head h2{margin-bottom:1.5rem;}
.s-infopack__head p:last-child{margin-bottom:0;}

/* ---- LEFT: the info-pack panel (STATE=OPEN) ---------------------------- */
/* pale blue bed so the deck and the form read as one unit against the tint */
.s-infopack__panel{position:relative;display:flex;flex-direction:column;gap:2em;
  flex:1;padding:2em;background:var(--blue-100);border:1px solid var(--blue-200);}
/* the rings frame is absolutely positioned inside the panel — everything else
   needs a stacking context or the hexagons paint over the deck and the form */
.s-infopack__panel > *:not(.c-rings-frame){position:relative;z-index:1;}

.s-infopack__deck .l-slider__slide img{width:100%;height:auto;
  box-shadow:var(--shadow-md);}
.s-infopack__deck .l-slider__nav{margin-top:0;}

/* Placeholder standing in for the HubSpot embed in this offline rebuild.
   The dashed rule is deliberate: it must not read as finished UI. */
.s-infopack__form{background:var(--white);border:1px dashed var(--blue-300);
  padding:2.5em 2em;text-align:center;}
.s-infopack__slot{font-size:var(--fs-small);color:var(--stone-500);margin:0;}

/* ---- RIGHT: the Career Day event card ---------------------------------- */
/* Photo card. Colours are re-pointed at the token level, the way
   .c-section--dark does it, so the raw h3/p inside come out light without a
   per-element class — and a future child element inherits correctly too. */
.s-infopack__event{
  --color-heading:var(--white);
  --color-text:rgba(255,255,255,.8);
  position:relative;flex:1;justify-content:flex-end;min-height:30em;
  background:var(--stone-900);
}
.s-infopack__event-bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;}
/* near-transparent at the top so the photo still reads, solid at the bottom
   where the copy sits */
.s-infopack__event-scrim{position:absolute;inset:0;
  background-image:linear-gradient(rgba(0,0,0,.15) 20%,rgba(0,0,0,.88));}
.s-infopack__event-body{position:relative;z-index:1;
  display:flex;flex-direction:column;align-items:flex-start;gap:1.5em;padding:2.5em;}
.s-infopack__event-body h3{margin:0;}

/* ---- Event chips ------------------------------------------------------- */
/* meta rows, so --fs-small — these are captions, not reading copy */
.s-infopack__chips{display:flex;flex-direction:column;align-items:flex-start;gap:.75em;}
.s-infopack__chip{display:inline-flex;align-items:center;gap:.625em;
  font-size:var(--fs-small);font-weight:500;line-height:1.5;color:var(--white);
  padding:.5em 1.25em;border-radius:var(--radius-pill);
  border:1px solid rgba(255,255,255,.24);background:rgba(255,255,255,.14);
  -webkit-backdrop-filter:blur(.5em);backdrop-filter:blur(.5em);}
/* sup is left to the UA's own smaller size — no font-size declared here */
.s-infopack__chip-ico{width:1.125em;height:1.125em;flex:none;}

/* ---- STATE=CLOSED message ---------------------------------------------- */
/* raw reading size (18) — it is a sentence to the visitor, not a chip */
.s-infopack__closed{max-width:26em;margin:0;}
/* The card re-points --color-heading/--color-text to white, but a token only
   applies where a rule reads it — and this block is a plain div, so it was
   inheriting body's dark colour straight through. Read the token here. */
.s-infopack__event .s-infopack__closed,
.s-infopack__event .s-infopack__closed p,
.s-infopack__event .s-infopack__closed a{color:var(--white);}
.s-infopack__event .s-infopack__closed a{text-decoration:underline;}

/* ---- CTA + venue / online note ----------------------------------------- */
.s-infopack__cta{display:flex;flex-direction:column;align-items:flex-start;gap:1em;}
.s-infopack__note{display:inline-flex;align-items:center;gap:.5em;
  font-size:var(--fs-small);color:var(--color-text);margin:0;}

/* ---- Responsive --------------------------------------------------------- */
@media (max-width:991px){
  /* c-grid already collapses to one column here; only the internals shrink */
  .s-infopack__head{margin-bottom:2em;}
  .s-infopack__panel{padding:1.5em;gap:1.5em;}
  .s-infopack__event{min-height:26em;}
  .s-infopack__event-body{padding:2em;}
}
@media (max-width:767px){
  .s-infopack__form{padding:2em 1.5em;}
  .s-infopack__event-body{padding:1.5em;gap:1.25em;}
}
@media (max-width:640px){
  .s-infopack__panel{padding:1.25em;}
  /* the date chip wraps to two lines on a narrow screen — let it be a block so
     the pill hugs the text instead of overflowing the card */
  .s-infopack__chip{align-items:flex-start;}
  .s-infopack__chip-ico{margin-top:.125em;}
}

/* ---- home-intro.css ------------------------------------------------ */
/* ==========================================================================
   MRC home — "A selective pathway for high-potential future consultants"
   Programme intro (left) + the application track cards (right), over the
   office photo the source uses as the section backdrop.
   ========================================================================== */

/* photo bed — same construction as the hero, but the crop is anchored to the
   TOP (the source's is-alg-top) so faces are not cut off as the section grows */
.s-intro{overflow:hidden;}
.s-intro__bg{position:absolute;inset:0;z-index:0;overflow:hidden;}
.s-intro__bg img{width:100%;height:100%;object-fit:cover;object-position:50% 0%;}
/* heavy, near-flat wash: this bed carries a full column of reading copy, so it
   needs far more cover than the hero's bottom-weighted gradient */
.s-intro__scrim{position:absolute;inset:0;
  background-image:linear-gradient(90deg,#000 20%,rgba(0,0,0,.72) 100%),
                   linear-gradient(rgba(0,0,0,.55),rgba(0,0,0,.55));}

/* the one coloured phrase in the headline — the source's #FF6446 is already a
   brand token, so no new hex enters the system */
.s-intro__hl{color:var(--red-default);}

/* ---- Track cards ------------------------------------------------------- */
.s-intro__stack{display:flex;flex-direction:column;gap:2em;}

/* .c-card supplies the surface, overflow clip and hover transition; the track
   card only changes the axis (text beside portrait) and swaps the white fill
   for the dark bed's frosted panel, matching .c-nav__card. */
.s-intro__track{flex-direction:row;align-items:stretch;gap:2em;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);
  -webkit-backdrop-filter:blur(1em);backdrop-filter:blur(1em);
  transition:background var(--transition);}

.s-intro__track .c-card__body{gap:1em;padding:2.5em;justify-content:center;}
.s-intro__track h3{margin:0;}
.s-intro__track p{margin:0;}
/* .c-btn is inline-flex; inside the column body it would otherwise stretch to
   the full card width */
.s-intro__cta{align-self:flex-start;margin-top:.5em;}
/* The card used to BE the anchor. It is a <div> now so each programme state can
   point somewhere different, and the CTA stretches over the whole card to keep
   the original click target. Only one CTA survives the sweep, so only one
   overlay ever exists. */
.s-intro__track{position:relative;}
.s-intro__cta::after{content:"";position:absolute;inset:0;z-index:1;}
.s-intro__track:hover{background:rgba(255,255,255,.12);box-shadow:none;}

/* portrait column: a cut-out PNG, so it sits ON the panel floor rather than
   filling a media box — contain + bottom anchor, never cover */
.s-intro__portrait{position:relative;flex:none;width:14em;align-self:flex-end;}
.s-intro__portrait img{width:100%;height:100%;max-height:18em;
                       object-fit:contain;object-position:50% 100%;}

@media (max-width:991px){
  .s-intro__scrim{background-image:linear-gradient(rgba(0,0,0,.78),rgba(0,0,0,.78));}
  .s-intro__portrait{width:11em;}
  .s-intro__track .c-card__body{padding:2em;}
}
@media (max-width:640px){
  /* stack: below this the portrait leaves the copy roughly two words a line */
  .s-intro__track{flex-direction:column;gap:0;}
  .s-intro__portrait{width:100%;align-self:center;}
  .s-intro__portrait img{max-height:14em;}
}

/* ---- shared-faq.css ------------------------------------------------ */
/* ==========================================================================
   c-faq — accordion built on native <details>/<summary>
   No JS: the browser owns open/close, Enter/Space and the expanded state that
   screen readers announce. Nothing here hides content that CSS alone cannot
   bring back, so the section is complete with scripting off.
   Used by s-mrcfaq (shared across all three MRC pages).
   ========================================================================== */

/* the source stacks title over list with a 3.5em gap */
.s-mrcfaq__title{margin-bottom:3.5rem;}

.c-faq{display:flex;flex-direction:column;gap:1em;}

.c-faq__item{
  background:var(--color-surface);border:1px solid var(--color-border);
  transition:background var(--transition),border-color var(--transition);
}
/* Open row is tinted but KEEPS its border — the source drops the border on the
   active pane, which shifts every row below it by 2px on each toggle. */
.c-faq__item[open]{background:var(--color-page);border-color:var(--color-border-strong);}

/* ---- Question ---------------------------------------------------------- */
/* list-style + the WebKit pseudo-element both have to go, or the default
   triangle sits beside our chevron. */
.c-faq__q{
  display:flex;align-items:flex-start;justify-content:space-between;gap:1.5em;
  padding:1.5em 2em;cursor:pointer;list-style:none;
}
.c-faq__q::-webkit-details-marker{display:none;}
.c-faq__q::marker{content:"";}
/* the whole row is the hit target, so the ring belongs on the row */
.c-faq__q:focus-visible{outline:2px solid var(--color-brand);outline-offset:-2px;}

/* h3 for the document outline, sized to --fs-cap-md as the source has it —
   at --fs-cap-lg nine stacked questions read as nine section headings. */
.c-faq__q .c-faq__title{font-size:var(--fs-cap-md);line-height:1.35;font-weight:600;margin:0;}
.c-faq__item:hover .c-faq__q .c-faq__title{color:var(--color-brand);}

.c-faq__ico{
  width:1.25em;height:1.25em;flex:none;margin-top:.25em;color:var(--color-text);
  transition:transform var(--transition),color var(--transition);
}
.c-faq__item[open] .c-faq__ico{transform:rotate(180deg);color:var(--color-brand);}

/* ---- Answer ------------------------------------------------------------ */
/* padding-left matches the question so the answer aligns under it; the right
   inset clears the chevron column. Body copy stays the raw <p> at 18px. */
.c-faq__a{display:flex;flex-direction:column;gap:1em;padding:0 4.75em 2em 2em;}
.c-faq__a p{margin:0;}

@media (max-width:767px){
  .c-faq__q{padding:1.25em;gap:1em;}
  .c-faq__a{padding:0 1.25em 1.25em;}
  .s-mrcfaq__title{margin-bottom:2.5rem;}
}

/* ---- shared-footer.css --------------------------------------------- */
/* ==========================================================================
   SHARED FOOTER — additions only. The whole component already exists in
   styles.css (search FOOTER); everything below is the MRC delta.
   ========================================================================== */

/* The Industry footer runs four link columns (1.4/1/1/1.4). MRC has only two
   blocks — the sign-up form and the contact details — so those tracks would
   leave the form squeezed into a 1.4fr sliver. Two equal tracks across the
   left two-thirds reproduces the source's mjx-col-2-3 / mjx-col-1-3 layout. */
.c-footer__grid--mrc{grid-template-columns:repeat(2,minmax(0,1fr));max-width:66.6%;}
@media (max-width:991px){.c-footer__grid--mrc{max-width:none;}}
@media (max-width:767px){.c-footer__grid--mrc{grid-template-columns:minmax(0,1fr);}}

/* .c-footer__col a and .c-footer__addr both set .875em, so a link inside the
   address compounds to ~12px and the phone/email read smaller than the street
   lines above them. Inherit instead so the block is one consistent size. */
.c-footer__addr a{font-size:inherit;}

/* <address> is used for the contact block (it is a real postal address);
   browsers italicise it by default, which the source did not. */
.c-footer__addr{font-style:normal;}

/* ---- shared-testimonials.css --------------------------------------- */
/* ==========================================================================
   s-mrcquote — MRC testimonial slider (shared by all three MRC pages)
   Reuses: .l-slider (+ track/slide/btn/nav) · .c-person__photo/__band/__ptrn/
           __pos/__frame/__img · .c-rings-frame + .c-rings · .c-quote__name /
           .c-quote__role.
   New here: the two-column card shell, the pale-blue quote bed and the two
   portrait sizes the MRC layout needs (the people grid's portrait is half
   this height, so those two values are overridden rather than re-declared).
   ========================================================================== */

/* the pattern band on this card is nearly double the people-card band, so the
   portrait it sits behind grows with it — both values come from the source */
.s-mrcquote{--mrcquote-band:17.5em;--mrcquote-portrait:25em;}

/* min-height comes from the source (37em): without it a short quote collapses
   the card below the 25em portrait + 17.5em band and the hexagons crop badly.
   height:100% lets the track stretch every card to the tallest quote. */
.s-mrcquote__card{
  display:flex;width:100%;height:100%;min-height:37em;
  border:1px solid var(--color-border);background:var(--color-surface);
}

/* ---- Portrait column -------------------------------------------------- */
/* .c-person__photo already gives position:relative + bottom-aligned + clipped;
   only the width and the two heights are MRC-specific. */
.s-mrcquote__portrait{flex:none;width:35%;background:var(--color-surface);}
.s-mrcquote__portrait .c-person__band{height:var(--mrcquote-band);}
.s-mrcquote__portrait .c-person__pos{height:var(--mrcquote-portrait);}
.s-mrcquote__portrait .c-person__frame{width:90%;}

/* Pink band — the fourth author's colour. The people component ships blue /
   red / orange / green only, so the missing variant is added here rather than
   substituting a colour the source does not use. */
.c-person__band--pink{background:var(--pink-light);}

/* ---- Quote column ------------------------------------------------------ */
.s-mrcquote__body{position:relative;
  flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;
  align-items:flex-start;gap:2em;padding:5em 3.5em;background:var(--blue-100);
}
/* filled disc holding the quote glyph, as the source */
.s-mrcquote__mark{
  flex:none;display:flex;align-items:center;justify-content:center;
  width:3.5em;height:3.5em;padding:.25em;
  background:var(--blue-200);border-radius:50%;
}
.s-mrcquote__mark img{width:100%;height:100%;object-fit:contain;}

/* blockquote resets its own margin; the size is a token, not the source's 1.75em */
.s-mrcquote__text{margin:0;}
.s-mrcquote__text p{font-size:var(--fs-cap-lg);line-height:1.5;color:var(--blue-900);margin:0;}

.s-mrcquote__auth{display:flex;flex-direction:column;gap:.5em;width:100%;}

/* ---- Arrows ------------------------------------------------------------ */
/* Desktop: straddle the card's left/right edges. The nav itself is click-through
   so it cannot swallow taps on the card underneath it. */
@media (min-width:992px){
  .s-mrcquote .l-slider{position:relative;}
  .s-mrcquote__nav{
    position:absolute;inset:0 -1.5em;z-index:2;margin:0;
    display:flex;align-items:center;justify-content:space-between;
    pointer-events:none;
  }
  .s-mrcquote__nav .l-slider__btn{pointer-events:auto;}
}

/* ---- Responsive -------------------------------------------------------- */
@media (max-width:991px){
  /* side by side, the 35% portrait leaves the quote an unreadable column */
  .s-mrcquote__card{flex-direction:column;min-height:0;}
  .s-mrcquote__portrait{width:100%;}
  .s-mrcquote__body{padding:3em 2.5em;gap:1.5em;}
  .s-mrcquote{--mrcquote-band:12em;--mrcquote-portrait:20em;}
}
@media (max-width:767px){
  .s-mrcquote__body{padding:2em 1.5em;}
  .s-mrcquote{--mrcquote-band:10em;--mrcquote-portrait:17em;}
}
@media (max-width:640px){
  .s-mrcquote__mark{width:2.5em;height:2.5em;}
}

/* ---- zz-visual-match.css ------------------------------------------- */
/* ==========================================================================
   VISUAL MATCH TO THE LIVE MRC PAGES
   --------------------------------------------------------------------------
   Loads last, so everything here is a deliberate, reviewable override of an
   Industry-system default. Delete this file and the pages fall back to plain
   system defaults — nothing else depends on it.

   HOW THE NUMBERS WERE DERIVED
   The live pages run on a 16.8px base (1.05rem); ours is 16px. So every live
   value is exactly 1.05x a clean one. Dividing the measured live px by 1.05
   recovers the design's real intent, and every result lands on an even number:

       live 83.99 -> 80    live 42   -> 40    live 33.6 -> 32
       live 29.4  -> 28    live 25.2 -> 24    live 21   -> 20    live 16.8 -> 16

   We use the even value, NOT the fractional live one. Body copy stays at the
   system's 18px everywhere regardless of what the live page does.
   ========================================================================== */

/* ---- Headings: mirror the live hierarchy on our scale ------------------- */

/* live 83.99px -> 5em. The system h1 is 3em/48px, which is right for a content
   page but far too quiet for this hero. */
.s-mrchero h1{font-size:5em;}
@media (max-width:991px){ .s-mrchero h1{font-size:3.5em;} }
@media (max-width:640px){ .s-mrchero h1{font-size:2.5em;} }

/* Section h2s are live 42px -> 2.5em = --fs-title. Already correct; no rule
   needed. Listed here so the absence is obviously deliberate, not an omission. */

/* live 29.4px -> 1.75em, set on the PARAGRAPH inside the blockquote. Sizing the
   blockquote itself compounded with the p's own em and blew the quote up. */
.s-mrcquote__text p{font-size:1.75em;line-height:1.5;}

/* live 25.2px -> 1.5em. Same specificity as the rule above so source order,
   not weight, decides — and these two never match the same element anyway. */
.s-mrcquote__body .c-quote__name{font-size:1.5em;}
/* live 18.9px -> 1.125em, i.e. the standard reading size */
.s-mrcquote__body .c-quote__role{font-size:var(--fs-lead);}


/* live 16.8px -> 1em: batch cards are compact, their titles sit at body size */
.s-batches .c-card__title{font-size:var(--fs-body);}

/* live 33.6px -> 2em */
.s-infopack__event .c-card__title,
.s-infopack__event h3{font-size:2em;margin-bottom:1.25rem;}

/* ---- Batches: compact rows, five across -------------------------------- *
   Live card is 521x143 with a 176x109 thumb — a horizontal strip, not the
   3-up portrait cards we had. Ours were 439px tall, which inflated the
   section from 378px to 827px and left a black void under it.
   521/16.8 = 31em · 143/16.8 = 8.5em · 176/16.8 = 10.5em · 109/16.8 = 6.5em  */
.s-batches .l-slider__slide{flex:0 0 31em;}
.s-batches .c-card{width:100%;height:8.5em;flex-direction:row;align-items:center;
  gap:1em;padding:1em 2em 1em 1em;background:var(--stone-800);overflow:hidden;}
.s-batches .c-card__media{flex:none;width:10.5em;height:6.5em;aspect-ratio:auto;}
.s-batches .c-card__media img{width:100%;height:100%;object-fit:cover;}
.s-batches .c-card__body{padding:0;gap:.25em;flex:1;min-width:0;justify-content:center;}
.s-batches .c-card__title{line-height:1.35;}

@media (max-width:991px){ .s-batches .l-slider__slide{flex:0 0 26em;} }
@media (max-width:640px){
  .s-batches .l-slider__slide{flex:0 0 88%;}
  .s-batches .c-card{height:auto;padding:1em;}
}

/* ---- Info Pack: the live colours, which are both already our tokens ----- *
   left  rgb(148,213,247) = #94D5F7 = --blue-lighter  (we had the far paler --blue-100)
   right rgb(244,246,247) = #F4F6F7 = --smoke         (we had plain white)      */
.s-infopack{background:var(--smoke);}
.s-infopack__panel{background:var(--blue-lighter);}
/* the closed-state copy is prose, not a panel: no card, no border, no shadow */
.s-infopack__panel--closed{background:none;border:none;box-shadow:none;padding:0;}
.s-infopack__panel--closed p{font-size:var(--fs-lead);}

/* live event card 588x318 -> 35em x 19em, frosted white at 25% over blur(1em) */
.s-infopack__event{background:rgba(255,255,255,.25);
  -webkit-backdrop-filter:blur(1em);backdrop-filter:blur(1em);}

/* ---- Testimonial: live portrait 423x420 -> 25em square ----------------- */
/* no fixed box — the portrait sizes from its own art, as the live page does */

/* ==========================================================================
   VISUAL MIRROR — pass 2, from side-by-side screenshots against the live page
   ========================================================================== */

/* ---- "A selective pathway" ---------------------------------------------
   Three things were wrong: the photo was drowned, the track card was solid
   instead of frosted, and we rendered a second card the live page hides.     */

/* The live scrim is THREE stacked gradients and the middle of the frame is
   only ~13% dark — that is why the stage, chart and spotlights all read.
   Ours was a flat heavy wash that turned the photo into a black rectangle. */
.s-intro__scrim{
  background-image:
    linear-gradient(90deg, #000, rgba(0,0,0,0) 15%, rgba(0,0,0,0) 85%, #000 99%),
    linear-gradient(#000, rgba(0,0,0,.13) 68%, #000 97%),
    linear-gradient(rgba(0,0,0,.15), rgba(0,0,0,.15));
}

/* frosted glass, not a solid panel: rgba(255,255,255,.25) over blur(1em) */
.s-intro__track{
  background:rgba(255,255,255,.25);
  -webkit-backdrop-filter:blur(1em);backdrop-filter:blur(1em);
  border:none;
}
/* the live "Apply now" is black on the frosted panel, not our white onDark */
.s-intro__cta{background:var(--black);border-color:var(--black);color:var(--white);}
.s-intro__cta:hover{background:var(--white);border-color:var(--white);color:var(--black);}

/* Only the Young Talent track is open for 2026 — the live page hides the
   Experienced Researcher card (it is commented out in the source). Kept in the
   markup so it can be switched back on for an intake that offers both. */
.s-intro__stack > .s-intro__track:nth-of-type(2){display:none;}

/* ---- "Download MRC Info Pack today" -------------------------------------
   This is a full-bleed 50/50 split, NOT a padded section with a grid inside.
   Live: section padding 0, left column starts at x=0 and is exactly half the
   viewport (756 of 1512), running the full 795px height with no gutter.      */
.c-section.s-infopack{padding:0;background:var(--smoke);}
.s-infopack > .c-container{max-width:none;padding:0;}
/* two equal full-bleed halves. The columns still carry u-col-6 from the base
   12-track grid, so their `grid-column: span 6` has to be cleared or they
   overflow one-per-row. */
.s-infopack .c-grid{grid-template-columns:1fr 1fr;gap:0;}
.s-infopack .c-grid__col{grid-column:auto;}
/* the LEFT COLUMN itself is the blue field — edge to edge, full height. The
   blue was previously a box sitting inside a padded column, which read as a
   floating panel instead of a split. */
/* was :first-child — each column now comes from its own module, so both
   would match. The side is named explicitly instead. */
.s-infopack__col--pack{background:var(--blue-lighter);}
.s-infopack__col{padding:7.5em var(--gutter);display:flex;flex-direction:column;gap:2.5em;
  /* the two columns come from separate modules now, so one having more content
     than the other would leave the shorter one's tint ending early */
  height:100%;position:relative;}
/* optional full-bleed photo behind a column. .s-infopack__event-bg was the wrong
   class for this — it is positioned for the event card, not the column. */
.s-infopack__col-bg{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;z-index:0;}
.s-infopack__col > *:not(.s-infopack__col-bg):not(.c-rings-frame){position:relative;z-index:1;}
/* the panels sit inside a display:contents state wrapper, so the direct-child
   rule above cannot reach them — and a positioned z-index:0 frame paints ABOVE
   non-positioned content, which would put the hexagons over the form. Lift the
   content elements by name instead of by position in the tree. */
.s-infopack__col .s-infopack__head,
.s-infopack__col .s-infopack__panel{position:relative;z-index:1;}
/* the pattern is column-level artwork now, not part of the slider/form panel:
   .c-rings-frame is already inset:0/z-index:0, so it fills the column and
   stays behind everything once the column is a positioned ancestor */
.s-infopack__panel{background:none;padding:0;}
@media (max-width:991px){
  .s-infopack .c-grid{grid-template-columns:1fr;}
  .s-infopack__col{padding:5em var(--gutter);}
}

/* ---- Testimonials -------------------------------------------------------
   Weight and colour, not size, were the problem: the quote is regular weight
   and the attribution is grey, so the block reads quietly. Ours was heavier
   and darker, which made it shout.                                          */
.s-mrcquote__body blockquote{font-weight:400;line-height:1.5;}
.s-mrcquote__body .c-quote__name{font-weight:500;color:rgb(72,72,72);}
.s-mrcquote__body .c-quote__role{color:rgb(128,128,128);}

/* ==========================================================================
   MRC HERO + NAV — pass 3
   ========================================================================== */

/* Eyebrow: borderless tinted pill, and the icon becomes a white disc. */
.c-eyebrow--mrc,
.c-section--dark .c-eyebrow--mrc{border:none;background:rgba(225,241,253,.35);}
.c-eyebrow--mrc .c-eyebrow__ico--bare{
  width:2em;height:2em;padding:.25em;border-radius:50%;background:var(--white);}

/* H1 display treatment. Needs the .s-mrchero prefix: hero-home.css already
   has `.s-mrchero h1{margin:0}` at 0-1-1, which outranks a bare class and
   was zeroing the margin-bottom below. */
.s-mrchero .s-mrchero__title{font-weight:600;line-height:1;margin-bottom:1.25rem;}

/* the hero CTA is a size up from the standard button */
.s-mrchero .c-btn--mrc{font-size:1.25em;}

/* ==========================================================================
   PASS 4
   ========================================================================== */

/* ---- Ruled section tops -------------------------------------------------
   Section padding-top goes to 0 and the breathing room moves onto the
   container, so the hairline sits flush at the section's top edge.
   .c-container--ruled already does 7.5em + a 1px line; on these dark beds the
   system's stone-200 line is far too bright, so it is re-tinted. */
.s-batches, .s-intro{padding-top:0;}
.s-batches > .c-container--ruled::before,
.s-intro   > .c-container--ruled::before{background:rgba(255,255,255,.15);}

/* ---- "A selective pathway" ---------------------------------------------- */
.s-intro{padding-bottom:16em;}
/* both tracks are open again — the live page hides one, but we show two here */
.s-intro__stack > .s-intro__track:nth-of-type(2){display:flex;}
.s-intro__track{padding:2em;}
.s-intro__portrait{padding-top:1.25em;}

/* ---- Info Pack left column: slider above form, one white panel ------------- */
.s-infopack__panel{display:flex;flex-direction:column;gap:0;
                   background:var(--white);padding:2em;}
.s-infopack__deck{position:relative;}
/* arrows centred on the slider's own left and right edges */
.s-infopack__deck .l-slider__nav{position:static;}
.s-infopack__deck .l-slider__btn{position:absolute;top:50%;transform:translateY(-50%);z-index:3;
  background:var(--black);border-color:var(--black);color:var(--white);}
.s-infopack__deck .l-slider__btn[data-slide="prev"]{left:.75em;}
.s-infopack__deck .l-slider__btn[data-slide="next"]{right:.75em;}
.s-infopack__deck .l-slider__btn:hover{background:var(--color-brand);border-color:var(--color-brand);}
.s-infopack__form{padding-top:2em;}

/* ---- Testimonials: arrows on the pane's left and right edges, black ------ */
.s-mrcquote .l-slider{position:relative;}
.s-mrcquote__nav{position:static;}
.s-mrcquote .l-slider__btn{position:absolute;top:50%;transform:translateY(-50%);z-index:3;
  background:var(--black);border-color:var(--black);color:var(--white);}
.s-mrcquote .l-slider__btn[data-slide="prev"]{left:0;}
.s-mrcquote .l-slider__btn[data-slide="next"]{right:0;}
.s-mrcquote .l-slider__btn:hover{background:var(--color-brand);border-color:var(--color-brand);}

/* ---- FAQ: title column beside the accordion ----------------------------- */
.s-mrcfaq__title{margin:0;}
@media (max-width:991px){ .s-mrcfaq__title{margin-bottom:1.5rem;} }

/* ==========================================================================
   PASS 5
   ========================================================================== */

/* ---- Batches ------------------------------------------------------------ */
.s-batches__head h3{max-width:none;}
.s-batches{padding-bottom:5rem;}
.s-batches > .c-container--ruled{padding-top:5rem;}

/* slider buttons are a consistent 2em across the page */
.l-slider__btn{width:2em;height:2em;}

/* ---- MRC profile / "A selective pathway" -------------------------------- *
   The card is edge-to-edge: the portrait bleeds to the card's own edges and
   only the copy is inset, so the padding moves off the card onto the body.   */
.s-intro > .c-container--ruled{padding-top:5rem;}
.s-intro__track{padding:0;gap:0;}
.s-intro__track .c-card__body{padding:2em 0 2em 2em;}
.s-intro__portrait img{max-height:15em;}
/* the track copy sits a step below the standard reading size */
.s-intro__track .c-card__body p{font-size:var(--fs-body);}

/* ---- Info Pack ---------------------------------------------------------- */
.s-infopack__head{margin-bottom:0;}
.s-infopack__col{padding:6.5em 6.25rem;}
/* padding moves off the panel and onto each block inside it */
.s-infopack__panel{padding:0;}
.s-infopack__deck{padding:2em 2em 0;}
.s-infopack__form{padding:0;}
.s-infopack__deck .l-slider__btn{padding:.35em;}

/* ---- Testimonials ------------------------------------------------------- *
   Quote block and attribution are two groups pushed to the top and bottom of
   a full-height column, so the author always sits on the card's baseline.    */
.s-mrcquote__portrait .c-person__pos{height:30em;}
.s-mrcquote__stack{display:flex;flex-direction:column;justify-content:space-between;
                   height:100%;gap:2em;}
.s-mrcquote__quote{display:flex;flex-direction:column;gap:1.5em;}
/* author name reads as plain text — the uppercase/tracking came from the
   Industry .c-quote__name, which is a different context */
.s-mrcquote__auth .c-quote__name{text-transform:none;letter-spacing:normal;}

/* cross-fade between slides instead of a horizontal slide */
.s-mrcquote .l-slider__track{display:grid;overflow:visible;scroll-snap-type:none;}
.s-mrcquote .l-slider__slide{grid-area:1/1;flex:none;width:100%;
  opacity:0;visibility:hidden;transition:opacity .45s ease,visibility .45s ease;}
.s-mrcquote .l-slider__slide.is-active{opacity:1;visibility:visible;}

/* ---- FAQ ---------------------------------------------------------------- */
.s-mrcfaq > .c-container--ruled{padding-top:0;}
.s-mrcfaq > .c-container{padding-top:0;}
/* hanging indent comes from the flex row in PASS 7: the number disc is a
   fixed-width flex item, so wrapped lines align to the text column. */
/* caret becomes a filled white triangle inside a black disc */
.c-faq__ico{display:flex;align-items:center;justify-content:center;flex:none;
  width:2em;height:2em;border-radius:50%;background:var(--black);color:var(--white);
  transition:transform var(--transition);}
.c-faq__ico svg{width:1.25em;height:1.25em;}
.c-faq__item[open] .c-faq__ico{transform:rotate(180deg);}

/* ==========================================================================
   PASS 6
   ========================================================================== */

/* ---- Info Pack ---------------------------------------------------------- */
.s-infopack__form{border:none;}
.s-infopack__deck .l-slider__btn[data-slide="prev"]{left:1em;}
.s-infopack__deck .l-slider__btn[data-slide="next"]{right:1em;}

/* ---- Testimonials ------------------------------------------------------- */
.s-mrcquote__body{padding:5em;}
/* arrows move up to the body's top-right, on the same line as the quote mark.
   Both are inset by the body's own 5em padding, so they share a baseline. */
/* quote mark and arrows share one flex row; arrows pushed to the right */
.s-mrcquote__head{display:flex;align-items:center;justify-content:space-between;gap:1.5em;}
.s-mrcquote__nav{position:static;display:flex;gap:.5em;margin:0;transform:none;flex:none;}
.s-mrcquote .l-slider__btn{position:static;transform:none;
  background:var(--black);border-color:var(--black);color:var(--white);}
.s-mrcquote .l-slider__btn:hover{background:var(--color-brand);border-color:var(--color-brand);}
@media (max-width:991px){ .s-mrcquote__body{padding:2.5em;} }

/* ---- FAQ ---------------------------------------------------------------- */
.c-faq__ico svg{width:1.25em;height:1.25em;}
/* open state: no border, just a soft smoke bed — as the source has it */
.c-faq__item{border:none;}
.c-faq__item[open]{background:var(--smoke);border:none;}
/* the number sits in a small black disc, a step down in size */
.c-faq__n{display:flex;align-items:center;justify-content:center;flex:none;
  width:1.75em;height:1.75em;border-radius:50%;
  background:var(--black);color:var(--white);
  font-size:.75rem;font-weight:600;line-height:1;}

/* ==========================================================================
   PASS 7
   ========================================================================== */

/* ---- FAQ ---------------------------------------------------------------- */
.s-mrcfaq{padding-top:0;}

/* the question is an h4 laid out as a flex row: number disc, then the text */
.c-faq__title{display:flex;gap:1.25rem;align-items:flex-start;margin:0;}
.c-faq__n{width:2.25em;height:2.25em;}
.c-faq__ico{width:1.125em;height:1.125em;}
/* the disc sizes the glyph now, so the svg must not carry its own box */
.c-faq__ico svg{width:auto;height:auto;}

/* Closed: a hairline in the same smoke as the open state's bed, so the rows
   read as a stack. Open: the bed does the work, so the border comes off. */
.c-faq__item{border:1px solid var(--smoke);}
.c-faq__item[open]{border:none;}

/* ==========================================================================
   PASS 8
   ========================================================================== */

/* ---- FAQ accordion ------------------------------------------------------ */
.c-faq__item{border:1px solid var(--smoke-2);}
.c-faq__item[open]{border-color:transparent;background:var(--smoke-1);}
.c-faq__q .c-faq__title{line-height:1.5;}

/* ---- "A selective pathway" gentle parallax ------------------------------
   The bed starts blurred and slightly low, then settles as it scrolls in.
   will-change keeps the filter on the compositor. */
.s-intro__bg img{will-change:transform,filter;transform:translate3d(0,0,0);}

/* ---- University logo marquee ------------------------------------------- */
.c-section.s-unis{background:var(--white);padding-top:7.5em;padding-bottom:0;}
.s-unis__head{text-align:center;margin-bottom:3.5em;}
.s-unis__head h2{margin:0 0 .5rem;}
.s-unis__head p{margin:0;color:var(--color-text-muted);}

/* University marquee: crests and wordmarks in one row.
   The Industry wall tunes each logo by hand on two axes, but these 20 range
   from 250x81 (VNU wordmark) to 250x376 (HUST crest) — at a fixed WIDTH the
   crests tower and the wordmarks vanish. Capping HEIGHT instead makes every
   mark settle to the same optical weight, whatever its shape. */
.s-unis .c-logo{padding:0 1.5em;}
.s-unis .c-logo__img{width:auto;max-width:100%;max-height:3.5em;object-fit:contain;}

/* ==========================================================================
   MOBILE PASS
   ========================================================================== */

/* Footer blocks are native <details>. On desktop they are plain labelled
   columns — the content is forced visible and the marker hidden, so the
   accordion only exists where it earns its keep. */
summary.c-footer__lbl{cursor:default;list-style:none;}
summary.c-footer__lbl::-webkit-details-marker{display:none;}
/* No CSS force-open here: modern browsers hide a closed <details> through
   ::details-content { content-visibility:hidden }, which a child display
   override cannot defeat. footerAccordion() in ui.js owns the open state —
   so with JS off, every block stays open, which is the safe failure. */
@media (max-width:767px){
  /* The label is a ruled column heading on desktop — it carries its own
     border-bottom. As an accordion summary that rule doubles up with the
     block's divider, leaving two lines with dead space between them, so the
     label's own rule and its padding come off here. */
  .c-footer__lbl{border-bottom:none;padding-bottom:0;}
  summary.c-footer__lbl{cursor:pointer;display:flex;align-items:center;
                        justify-content:space-between;gap:1em;}
  /* a chevron that turns when the block opens */
  summary.c-footer__lbl::after{content:"";flex:none;width:.5em;height:.5em;margin-right:.25em;
    border-right:2px solid currentColor;border-bottom:2px solid currentColor;
    transform:rotate(45deg);transition:transform var(--transition);}
  .c-footer__block[open] > .c-footer__lbl::after{transform:rotate(-135deg);}
  .c-footer__col{gap:0;}
  /* Divider on the TOP of every block except the very first. "Last of the last
     column" was unreliable — the five blocks sit across four columns unevenly,
     so :last-child fired on the wrong ones. "First of the first column" is
     deterministic, and a top rule can never leave a trailing line. */
  .c-footer__block{padding-block:1.25em;border-top:1px solid var(--stone-700);border-bottom:none;}
  .c-footer__col:first-child .c-footer__block:first-child{border-top:none;}
  /* the grid gap would add 40px on top of each divider; the dividers are the
     separation now, so the stacked columns close up into one list */
  .c-footer__grid{gap:0;}
  /* breathing room between the summary and its links once opened */
  .c-footer__block[open] > .c-footer__items{padding-top:1.25em;}
}

/* the nav's 1fr track was over-computing and pushing the bar 7px past the
   viewport; two auto tracks pinned apart cannot overflow */
@media (max-width:991px){
  .c-nav--mrc > .c-container{grid-template-columns:auto auto;justify-content:space-between;}
  .c-brand{min-width:0;}
}

@media (max-width:991px){
  /* hero is no longer a full fold on mobile — it grows with its content */
  .c-section.s-mrchero{min-height:0;}
  .s-mrchero > .c-container{padding-block:10rem 5rem;}

  /* the ruled tops need more contrast on the dark beds at small sizes */
  .s-batches > .c-container--ruled::before,
  .s-intro   > .c-container--ruled::before{background:rgba(255,255,255,.28);}

  .s-intro{padding-bottom:5em;}
  .s-intro__track .c-card__body{padding:1.5em 1.5em 0;}

  .s-infopack__col{padding:5em 1.5em;}

  .c-section.s-unis{padding-top:5em;}
}

/* ==========================================================================
   MOBILE PASS 2
   ========================================================================== */

/* the block's own gap doubled up with the items' spacing */
.c-footer__block{gap:0;}
/* "Get in touch" holds a form, address and socials — not a link list, so it is
   never an accordion. No pointer, no chevron, always open. */
.c-footer__block--plain > *:not(.c-footer__lbl){display:flex;}

/* Career Day facts: date and time are two separate pills, stacked.
   .s-infopack__chips is already a column, so they stack by default. */

@media (max-width:991px){
  .s-infopack__deck{padding:1.5em 1.5em 0;}
  .s-mrcquote__portrait .c-person__pos{height:20em;padding-top:2em;}
  .s-mrcquote__body{padding:1.5em;}
  .s-mrcquote__text p{font-size:1.5em;}
}

/* ==========================================================================
   FINAL PASS
   ========================================================================== */

/* The chip is an inline-flex row with a .625em gap, so a bare <sup> in the text
   became its own flex item and the gap opened either side of it — "7  th  May".
   Wrapping the copy in one span leaves the chip with two children: icon + text. */
.s-infopack__chip-txt{display:inline;}

/* ---- Featured blog cards: 16/9 media on every screen -------------------- */
.s-batches .c-card__media{aspect-ratio:16/9;height:auto;}

/* ---- Footer link groups ------------------------------------------------- */
.c-footer__group{margin-top:1em;}

@media (max-width:991px){
  /* the date pair fills the bar rather than hugging its content */
  .c-datebar__dates{width:100%;}
}

@media (max-width:767px){
  /* batch cards go vertical: full-bleed 16/9 image above the copy */
  .s-batches .c-card{flex-direction:column;align-items:stretch;height:auto;padding:0;}
  .s-batches .c-card__media{width:100%;}
  .s-batches .c-card__body{padding:1.25em;}
  /* the accordion supplies its own rhythm on mobile */
  .c-footer__group{margin-top:0;}
}

/* ---- Footer bottom bar alignment ---------------------------------------
   --maxw is 82em, and .c-footer__bottom sets font-size:.875em — so the bar's
   container resolved 82em against 14px (1148px) while the columns above
   resolved it against 16px (1312px), leaving the copyright 82px inboard on
   each side. Keep the container at the root em context and put the small type
   on its children instead. */
.c-footer__bottom > .c-container{font-size:1rem;}
.c-footer__bottom > .c-container > *{font-size:var(--fs-small);}

/* contact column: its items sit a step below the heading */
.c-footer__items--contact{margin-top:1em;}

/* newsletter field reads as a translucent well on the black bed */
.c-footer__form input[type=email]{background:rgba(255,255,255,.14);}

/* ---- Footer: positioning line + oversize wordmark ----------------------- */
/* The line sits beside the logo and is allowed to run about two columns wide,
   matching the Solutions + Industries span rather than wrapping tightly. */
.c-footer__intro{display:flex;flex-direction:column;align-items:flex-start;
                 gap:1em;margin-bottom:3.5em;}

/* Motto in place of the small logo. Plain text on the footer bed — no pill.
   The dot is a trailing pseudo element on every item (hidden on the last one
   for the static desktop row), so the mobile marquee loops without a gap in
   the rhythm at the seam. Spacing lives inside the items, which keeps the
   track gap at 0 — translateX(-50%) is then exactly one group wide. */
.c-footer__motto{width:100%;}
.c-footer__motto-track{display:flex;gap:0;}
.c-footer__motto-group{display:flex;flex:none;flex-wrap:wrap;gap:0;
  list-style:none;margin:0;padding:0;}
.c-footer__motto-item{display:flex;align-items:center;gap:1em;padding-right:1em;
  font-size:var(--fs-small);font-weight:600;letter-spacing:.06em;
  text-transform:uppercase;color:var(--stone-300);white-space:nowrap;}
.c-footer__motto-item::after{content:"";flex:none;
  width:.25em;height:.25em;border-radius:50%;background:var(--stone-500);}

/* Desktop: one static row, no trailing dot, duplicate group not rendered. */
.c-footer__motto-group[aria-hidden]{display:none;}
.c-footer__motto-item:last-child::after{display:none;}

/* Oversize wordmark under the groups. It is decorative, so it must never add
   scroll width or intercept clicks. */
.c-footer__watermark{margin-top:0;pointer-events:none;overflow:hidden;}
/* Rise-on-scroll. reveal() arms the wrapper; we cancel its default fade/shift
   and slide the wordmark up out of the wrapper's own overflow instead, so it
   emerges from the bottom edge rather than just fading in. */
.c-footer__watermark.js-reveal-armed{opacity:1;transform:none;}
.c-footer__watermark.js-reveal-armed img{transform:translateY(100%);}
.c-footer__watermark.js-reveal-armed.is-revealed img{transform:translateY(0);
  transition:transform .9s cubic-bezier(.25,.46,.45,.94);}
/* fades 15% at the top to fully transparent at the bottom. The mask does the
   fade; opacity sets the ceiling. */
.c-footer__watermark img{display:block;width:100%;height:auto;opacity:.45;
  -webkit-mask-image:linear-gradient(to bottom,#000 0%,transparent 100%);
          mask-image:linear-gradient(to bottom,#000 0%,transparent 100%);}

@media (max-width:767px){
  .c-footer__watermark{margin-top:0;}

  /* Motto → marquee. Both groups render, nothing wraps, and every item keeps
     its trailing dot so the loop reads continuously. The edge fades are the
     footer bed, matching .c-logos. */
  .c-footer__motto{position:relative;overflow:hidden;}
  .c-footer__motto::before,.c-footer__motto::after{content:"";position:absolute;
    top:0;bottom:0;width:3em;z-index:2;pointer-events:none;}
  .c-footer__motto::before{left:0;background:linear-gradient(to right,#000,rgba(0,0,0,0));}
  .c-footer__motto::after{right:0;background:linear-gradient(to left,#000,rgba(0,0,0,0));}
  .c-footer__motto-track{width:max-content;animation:dl-marquee 18s linear infinite;}
  @media (prefers-reduced-motion:reduce){.c-footer__motto-track{animation:none;}}
  .c-footer__motto-group{flex-wrap:nowrap;}
  .c-footer__motto-group[aria-hidden]{display:flex;}
  .c-footer__motto-item:last-child::after{display:block;}
}

.s-infopack__closed p{margin:0 0 1em;}
.s-infopack__closed p:last-child{margin-bottom:0;}

/* ---- zzz-reveal.css ------------------------------------------------ */
/* REVEAL — progressive enhancement (content ships visible)
   ========================================================================== */
.js-reveal-armed{opacity:0;transform:translateY(1em);}
.js-reveal-armed.is-revealed{opacity:1;transform:translateY(0);
  transition:opacity .6s cubic-bezier(.25,.46,.45,.94),transform .6s cubic-bezier(.25,.46,.45,.94);}
@media (prefers-reduced-motion:reduce){
  .js-reveal-armed{opacity:1;transform:none;}
  .c-ticker__item{transition:none;}
}
