/*
   Genero public site — ported from Mockup/css/style.css.

   Every rule is scoped under .site for the reason app.css already documents: this file loads
   after MudBlazor.min.css, so a bare element selector here would beat MudBlazor's and leak into
   the admin. The public site wraps its content in .site (MainLayout); the admin does not.

   Two selectors from the mockup are renamed because Blazor has no <body> class to hang them on:
   `body.subpage` becomes `.site--sub` (set by MainLayout when the route is not the home page),
   and the bare `header`/`footer` elements become .site-header/.site-footer.
*/

:root {
    --teal: #0A89AA;
    --teal-deep: #0B4C5F;
    --teal-abyss: #062E3A;
    --blue: #0066B2;
    --yellow: #FFD41D;
    --ice: #EDF6F7;
    --grey: #9FA2A6;
    --ink: #2A2E30;
    --ink-soft: #545454;
    --line: rgba(10, 137, 170, 0.16);
    --shadow: 0 30px 70px -30px rgba(6, 46, 58, 0.35);
    --shadow-sm: 0 12px 30px -16px rgba(6, 46, 58, 0.30);
    /* The card ring: two layers faint enough to lift a card off the page and no
       more. --shadow-sm stays for the surfaces the design has no card for. */
    --ring: 0 1px 3px rgba(11, 76, 95, .08), 0 8px 24px rgba(11, 76, 95, .06);
    --font-display: 'Inria Serif', Georgia, serif;
    --font-body: 'Montserrat', 'Segoe UI', system-ui, sans-serif;
    --maxw: 1200px;
    --ease: cubic-bezier(.22, .61, .36, 1);
}

html { scroll-behavior: smooth; }

/* Body copy is Montserrat Light; anything that needs more weight sets its own. */
.site {
    font-family: var(--font-body);
    font-weight: 300;
    color: var(--ink);
    background: #fff;
    -webkit-font-smoothing: antialiased;
    overflow-x: hidden;
    line-height: 1.75;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

.site-main { flex: 1; }

.site img { max-width: 100%; height: auto; display: block; }
.site a { color: inherit; text-decoration: none; }
.site ul { margin: 0; padding: 0; list-style: none; }
.site section { position: relative; }
.site ::selection { background: var(--yellow); color: var(--teal-abyss); }

.site .container { max-width: var(--maxw); margin: 0 auto; padding: 0 24px; }
@media (max-width: 720px) { .site .container { padding: 0 20px; } }

.site .reveal { opacity: 0; transform: translateY(22px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
.site .reveal.in { opacity: 1; transform: translateY(0); }
@media (prefers-reduced-motion: reduce) {
    .site .reveal { opacity: 1; transform: none; transition: none; }
    html { scroll-behavior: auto; }
    /* The mockup kills the rest of the motion with a bare `*`. Prefixed with .site
       so it stops at the public site and never reaches MudBlazor in the admin.
       The iteration count is what actually ends the looping scroll cue. */
    .site, .site *, .site *::before, .site *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .01ms !important;
    }
}

.site .pattern-bg { position: absolute; inset: 0; overflow: hidden; pointer-events: none; opacity: .16; }
.site .pattern-bg svg { position: absolute; width: 140%; height: 140%; left: -20%; top: -20%; }

.site .corner-accent { position: absolute; top: 0; right: 34px; width: 34px; height: 30px; opacity: .9; }
@media (max-width: 720px) { .site .corner-accent { right: 22px; } }

.site .eyebrow { display: inline-flex; align-items: flex-start; gap: 10px; font-weight: 700; font-size: .72rem; letter-spacing: .22em; text-transform: uppercase; color: var(--teal); margin: 0 0 16px; }
/* The lead-in marker is the GenArrow, not a dash — same rule as everywhere else.
   Inlined as a data URI rather than a <use> reference because ::before cannot
   hold an SVG sprite, and a second element in every eyebrow would put a
   decoration into the content an editor types. */
.site .eyebrow::before {
    content: ""; display: inline-block; flex: none;
    width: 15px; aspect-ratio: 554 / 301; margin-top: 4px;
    background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20554%20301%22%3E%3Cpath%20d%3D%22M0.0%2C192.0%20Q0.0%2C183.0%204.0%2C172.5%20Q8.0%2C162.0%2014.0%2C155.5%20Q20.0%2C149.0%20141.0%2C74.5%20Q262.0%2C0.0%20273.5%2C0.5%20Q285.0%2C1.0%20293.0%2C4.5%20Q301.0%2C8.0%20414.0%2C72.0%20Q527.0%2C136.0%20535.5%2C143.5%20Q544.0%2C151.0%20548.5%2C161.5%20Q553.0%2C172.0%20553.0%2C182.0%20Q553.0%2C192.0%20549.5%2C202.0%20Q546.0%2C212.0%20538.0%2C221.5%20Q530.0%2C231.0%20477.0%2C262.5%20Q424.0%2C294.0%20408.5%2C293.5%20Q393.0%2C293.0%20345.5%2C266.0%20Q298.0%2C239.0%20283.5%2C237.5%20Q269.0%2C236.0%20260.5%2C239.0%20Q252.0%2C242.0%20212.0%2C267.5%20Q172.0%2C293.0%20161.5%2C296.5%20Q151.0%2C300.0%20136.0%2C298.0%20Q121.0%2C296.0%2073.5%2C269.5%20Q26.0%2C243.0%2017.5%2C234.5%20Q9.0%2C226.0%204.5%2C213.5%20Q0.0%2C201.0%200.0%2C192.0%20Z%22%20fill%3D%22%23FFD41D%22%2F%3E%3C%2Fsvg%3E") no-repeat center / contain;
    transform: rotate(90deg);
}
.site .eyebrow.on-dark { color: var(--yellow); }
.site .eyebrow.center-eb { justify-content: center; }

.site h1, .site h2, .site h3, .site h4, .site h5 { margin: 0; font-family: var(--font-body); }
/* The headline is Montserrat Semibold with one keyword in Inria Serif italic — the
   guideline puts the serif on the keyword, not on the whole line. No colour on the
   base rule: several headings sit on a dark band and inherit #fff from it. */
.site h1 { font-weight: 600; font-size: clamp(2.1rem, 5.4vw, 3.6rem); line-height: 1.12; letter-spacing: -.02em; }
.site h2, .site h3 { font-weight: 400; }
.site h1 em { font-family: var(--font-display); font-weight: 400; font-style: italic; letter-spacing: 0; }
.site .section-head { max-width: 660px; margin-bottom: 52px; }
.site .section-head h2 { font-family: var(--font-display); font-style: italic; font-weight: 700; font-size: clamp(1.9rem, 3.2vw, 2.6rem); color: var(--teal-abyss); line-height: 1.16; letter-spacing: -.01em; }
.site .section-head p { margin: 16px 0 0; color: var(--ink-soft); font-size: 1.02rem; line-height: 1.75; max-width: 560px; }
.site .section-head.center { margin-left: auto; margin-right: auto; text-align: center; }
.site .section-head.center p { margin-left: auto; margin-right: auto; }
.site .section-head.on-dark h2 { color: #fff; }
.site .section-head.on-dark p { color: rgba(255,255,255,.75); }

.site .pad { padding: 100px 0; }
.site .pad-sm { padding: 72px 0; }
@media (max-width: 900px) { .site .pad { padding: 64px 0; } .site .pad-sm { padding: 48px 0; } }

.site .bg-ice { background: var(--ice); }
.site .bg-grey { background: #F7F9FA; }
.site .bg-teal { background: linear-gradient(160deg, var(--teal) 0%, var(--teal-deep) 100%); }
.site .bg-abyss { background: linear-gradient(160deg, var(--teal-abyss) 0%, #041b23 100%); }

.site .band { background: var(--teal); padding: 16px 0; text-align: center; }
.site .band h2 { color: #fff; font-weight: 600; font-size: clamp(1.15rem, 2.2vw, 1.4rem); letter-spacing: .01em; }

/* ---------- Buttons ---------- */
.site .btn { display: inline-flex; align-items: center; gap: 10px; font-weight: 600; font-size: .86rem; letter-spacing: .02em; padding: 13px 26px; border-radius: 3px; cursor: pointer; border: 1.5px solid transparent; transition: all .25s ease; white-space: nowrap; font-family: var(--font-body); }
/* Five treatments, as the design has them. Hover swaps the fill and nothing moves —
   the 2px lift and drop shadow came from the older mockup this file was ported from. */
.site .btn-solid { background: var(--teal); color: #fff; }
.site .btn-solid:hover { background: var(--blue); }
.site .btn-primary { background: var(--yellow); color: var(--teal); }
.site .btn-primary:hover { background: #fff; color: var(--teal); }
.site .btn-white { background: #fff; color: var(--teal); }
.site .btn-white:hover { background: var(--ice); }
.site .btn-ghost { border-color: rgba(255,255,255,.75); color: #fff; background: none; }
.site .btn-ghost:hover { background: #fff; color: var(--teal); }
.site .btn-line { border-color: var(--teal); color: var(--teal); background: none; }
.site .btn-line:hover { background: var(--teal); color: #fff; }
@media (max-width: 560px) {
    .site .btn { padding: 12px 20px; font-size: .8rem; }
    .site .hero-actions .btn,
    .site .cta-band .actions .btn { flex: 1 1 100%; justify-content: center; }
}
/* The GenArrow rules above own the button icon now. A generic `.btn svg` rule
   here would set transform:translateX and cancel the arrow's rotation, leaving
   every call to action pointing upwards. */

/* ---------- Language switch ---------- */

/* A real toggle: the Genero Yellow knob slides between the halves rather than the two labels
   swapping backgrounds. The track hides its overflow and drops its gap so each half is exactly
   50% wide and translateX(100%) lands the knob on the second button. */
.site .lang-switch { position: relative; overflow: hidden; display: flex; align-items: center; background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.35); border-radius: 20px; padding: 3px; gap: 0; transition: all .3s ease; }
.site-header.scrolled .lang-switch,
.site-header.menu-open .lang-switch,
.site--sub .lang-switch { background: rgba(10,137,170,.08); border-color: rgba(10,137,170,.25); }
.site .lang-knob { position: absolute; top: 3px; left: 3px; width: calc(50% - 3px); height: calc(100% - 6px); border-radius: 16px; background: var(--yellow); transition: transform .3s ease; pointer-events: none; }
.site .lang-switch.is-id .lang-knob { transform: translateX(100%); }
.site .lang-btn { position: relative; z-index: 1; flex: 1 0 auto; min-width: 42px; text-align: center; border: none; background: none; cursor: pointer; font-family: var(--font-body); font-size: .7rem; font-weight: 700; letter-spacing: .03em; padding: 6px 12px; border-radius: 16px; color: rgba(255,255,255,.75); transition: color .25s ease; }
.site-header.scrolled .lang-btn,
.site-header.menu-open .lang-btn,
.site--sub .lang-btn { color: var(--ink-soft); }
.site .lang-btn.active { background: none; color: var(--teal-abyss); }
.site .mobile-menu .lang-switch { background: rgba(10,137,170,.08); border-color: rgba(10,137,170,.25); justify-content: center; width: fit-content; }
.site .mobile-menu .lang-btn { color: var(--ink-soft); }
.site .mobile-menu .lang-btn.active { color: var(--teal-abyss); }

/* ---------- Header & nav ---------- */

/* The scrim over the hero is an Innovation Teal ::before layer, not a background on the bar
   itself. A gradient is a background-image, and background-image does not interpolate: set on
   .site-header it snaps off the moment .scrolled lands while only the white colour fades. A
   separate layer has an opacity to animate instead.

   It sits at z-index -1, inside the header's own stacking context, so it paints above the page
   and below the logo and nav. Positioning .navbar-inner would do the same job, but it would also
   become the containing block for .dropdown-panel and cap the mega panel at the width of the
   header track.

   .menu-open is the third state that wants the solid bar: the drawer now opens beneath a header
   that stays visible, and a white logo over a white panel reads as nothing. */
.site-header { position: fixed; top: 0; left: 0; right: 0; z-index: 1000; height: 78px; transition: all .35s ease; background: transparent; }
.site-header::before { content: ''; position: absolute; inset: 0; z-index: -1; background: linear-gradient(180deg, rgba(10,137,170,.55) 0%, rgba(10,137,170,0) 100%); transition: opacity .35s ease; pointer-events: none; }
.site-header.scrolled,
.site-header.menu-open,
.site--sub .site-header { background: rgba(255,255,255,.97); backdrop-filter: blur(10px); box-shadow: 0 1px 0 rgba(159,162,166,.35); }
.site-header.scrolled::before,
.site-header.menu-open::before,
.site--sub .site-header::before { opacity: 0; }
.site-header .navbar-inner { display: flex; align-items: center; gap: 20px; height: 100%; padding: 0 22px; max-width: 1320px; margin: 0 auto; }

.site .brand { display: flex; align-items: center; gap: 10px; }
.site .brand img { height: 42px; width: auto; display: block; }
.site .brand img.logo-dark { display: none; }
.site .brand img.logo-light { display: block; }
.site-header.scrolled .brand img.logo-dark,
.site-header.menu-open .brand img.logo-dark,
.site--sub .brand img.logo-dark { display: block; }
.site-header.scrolled .brand img.logo-light,
.site-header.menu-open .brand img.logo-light,
.site--sub .brand img.logo-light { display: none; }

.site nav.main-nav { display: flex; align-items: center; gap: 4px; margin-left: 14px; }
.site .nav-item { position: static; }
/* background, border, font-family and cursor are not decoration here: this class also styles the
   <button> that opens a dropdown and the sign-out button, which render as native grey controls
   without them. */
.site .nav-link { display: flex; align-items: center; gap: 6px; background: none; border: none; font-family: inherit; cursor: pointer; font-size: .755rem; font-weight: 400; letter-spacing: .09em; text-transform: uppercase; color: #fff; padding: 10px 11px; border-radius: 5px; white-space: nowrap; transition: color .25s ease, background .25s ease; }
.site-header.scrolled .nav-link,
.site--sub .nav-link { color: var(--ink); }
.site .nav-item:hover .nav-link,
.site .nav-item.open .nav-link,
.site .nav-link:hover { color: var(--yellow); background: rgba(255,255,255,.16); }
.site-header.scrolled .nav-item:hover .nav-link,
.site--sub .nav-item:hover .nav-link,
.site-header.scrolled .nav-item.open .nav-link,
.site--sub .nav-item.open .nav-link,
.site-header.scrolled .nav-link:hover,
.site--sub .nav-link:hover { color: var(--teal); background: var(--ice); }
.site .nav-link.active { color: var(--yellow); background: rgba(255,255,255,.16); font-weight: 600; }
.site-header.scrolled .nav-link.active,
.site--sub .nav-link.active { color: var(--teal); background: var(--ice); }

/* ---- The GenArrow icon system ---------------------------------------------

   Genero's own mark, used as the ONLY arrow motif anywhere on the site — the
   brand guideline (p.26) is explicit that no generic chevron appears. One
   <symbol> is defined once in the layout and referenced by <use>, so the shape
   is downloaded once and every instance follows the surrounding text colour.

   Direction is a rotation of that single shape rather than four drawings: the
   arrow points up at rest, so a caret is 180° and a "next" arrow is 90°. */

.site .ga-icon { width: 12px; height: auto; aspect-ratio: 554 / 301; flex: none; display: inline-block; transition: transform .3s var(--ease); fill: currentColor; }
.site .ga-icon.caret { width: 9px; transform: rotate(180deg); opacity: .75; }
.site .nav-item:hover .ga-icon.caret,
.site .nav-item.open .ga-icon.caret { transform: rotate(0deg); opacity: 1; }
.site .ga-icon.right { transform: rotate(90deg); }
.site .ga-icon.left { transform: rotate(-90deg); }
.site .ga-icon.down { transform: rotate(180deg); }
.site .ga-icon.sm { width: 11px; }
/* translateY, not X: the nudge is composed after the 90° rotation, so it is the
   axis that moves the arrow along the label. .tlink further down already does it
   this way, and the button had drifted off it. */
.site .btn:hover .ga-icon.right { transform: rotate(90deg) translateY(3px); }

/* ---- Full-width mega dropdown ----------------------------------------------

   Spans the window rather than hanging under its trigger, so .nav-item drops
   to position:static — an absolutely positioned panel measures itself against
   the nearest positioned ancestor, and a relative nav-item would pin it to the
   width of one word.

   Opens on hover and on .open, which the layout sets from a click: hover alone
   leaves the menu unreachable from a keyboard and from every touch device. */

.site .dropdown-panel {
  position: absolute; top: 100%; left: 0; right: 0; transform: translateY(-8px);
  width: 100%; background: #fff; box-shadow: 0 18px 40px rgba(84,84,84,.16);
  border-top: 3px solid var(--yellow);
  opacity: 0; visibility: hidden; transition: opacity .2s ease, transform .2s ease, visibility .2s;
  z-index: 50; pointer-events: none;
}
.site .nav-item:hover .dropdown-panel,
.site .nav-item.open .dropdown-panel,
.site .nav-item:focus-within .dropdown-panel { opacity: 1; visibility: visible; transform: translateY(0); pointer-events: auto; }
/* The mockup closed the panel on any document click. A transparent sheet does that half from
   Blazor; it sits below the header's z-index so a click on another trigger still opens that
   panel in one go rather than only dismissing this one. */
.site .nav-backdrop { position: fixed; inset: 0; z-index: 40; background: transparent; }
.site .dd-grid { display: grid; grid-template-columns: 1fr 1.6fr; gap: 56px; padding: 40px 34px; align-items: start; }
.site .dd-eyebrow { display: block; font-size: .68rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--grey); margin-bottom: 10px; }
.site .dd-intro h4 { font-family: var(--font-body); font-style: normal; font-weight: 600; font-size: 1.4rem; line-height: 1.45; color: var(--teal-deep); margin: 0 0 10px; }
.site .dd-intro p { font-size: .94rem; color: var(--ink-soft); line-height: 1.8; margin: 0 0 18px; }
.site .dd-links { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 40px; align-content: start; }
.site .dd-links li a { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 13px 0; font-size: .92rem; font-weight: 600; color: var(--ink); border-bottom: 1px solid #F0F3F4; transition: all .2s ease; }
.site .dd-links li a .ga-icon { width: 12px; color: var(--yellow); opacity: 0; transition: opacity .2s ease; }
.site .dd-links li a:hover { color: var(--teal); padding-left: 6px; }
.site .dd-links li a:hover .ga-icon { opacity: 1; }
.site .dd-links li a.active { color: var(--teal); }
@media (max-width: 1240px) { .site .dd-grid { padding: 36px 26px; gap: 40px; } }

.site .nav-right { margin-left: auto; display: flex; align-items: center; gap: 16px; }

/* The editors' way in. Nothing in the design corresponds to it, so it is deliberately the
   quietest label in the bar — it is for the handful of people who maintain the site, not for
   the visitor the rest of the header is written for. */
.site .nav-signin { opacity: .72; }
.site .nav-signin:hover { opacity: 1; }
/* A 38px box, which is the target the design gives it — the bars are 24px wide and were
   the whole of it, so the tap area was 24 x 14 with 6px of padding around it. */
.site .burger { display: none; width: 38px; height: 38px; flex-direction: column; justify-content: center; gap: 5px; cursor: pointer; z-index: 1200; background: none; border: none; padding: 0 8px; }
.site .burger span { display: block; height: 2px; border-radius: 2px; background: #fff; transition: transform .28s cubic-bezier(.22,.61,.36,1), opacity .2s, background .3s ease; }
.site-header.scrolled .burger span,
.site--sub .burger span { background: var(--teal); }
.site .burger.open span { background: var(--ink); }
.site .burger.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.site .burger.open span:nth-child(2) { opacity: 0; }
.site .burger.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
/* Two stages, as the mockup has them: the links and the logo shrink first, and only then does
   the row give up and become a burger. Collapsing straight to the burger at 1220px put a
   hamburger on every landscape tablet and small laptop the mockup still shows the nav on. */
@media (max-width: 1180px) { .site .nav-link { padding: 8px 9px; font-size: .67rem; } .site .brand img { height: 34px; } }
@media (max-width: 1024px) { .site nav.main-nav { display: none; } .site .burger { display: flex; } }

/* The one rule outside .site, and the only place a bare element selector is safe here: it needs
   a class the layout sets, so it can never leak into the admin. The drawer is fixed, so the page
   behind it keeps scrolling under the finger unless the document itself is stopped. */
body.menu-locked { overflow: hidden; }

/* Starts below the 78px header rather than covering it. The burger that closes the drawer lives
   inside the header and cannot escape above a panel painted over it, so a full-viewport drawer
   leaves no way out but a link that navigates away. visibility takes the closed drawer's links
   out of the tab order, which a transform alone does not. */
.site .mobile-menu { position: fixed; inset: 78px 0 0; background: #fff; z-index: 900; display: flex; flex-direction: column; transform: translateX(100%); transition: transform .4s cubic-bezier(.2,.7,.2,1), visibility .4s; overflow-y: auto; visibility: hidden; }
.site .mobile-menu.open { transform: translateX(0); visibility: visible; }
.site .mobile-menu-inner { padding: 18px 26px 40px; max-width: 520px; margin: 0 auto; width: 100%; }
.site .mm-item { border-bottom: 1px solid #EEF2F3; }
.site .mm-row { display: flex; align-items: center; justify-content: space-between; padding: 16px 2px; }
.site .mm-row a.mm-link { font-size: 1.05rem; font-weight: 700; color: var(--teal-abyss); flex: 1; }
.site .mm-toggle { background: none; border: none; padding: 8px; cursor: pointer; color: var(--teal); }
.site .mm-toggle .ga-icon { width: 16px; }
.site .mm-toggle .ga-icon { transform: rotate(180deg); }
.site .mm-item.open .mm-toggle .ga-icon { transform: rotate(0deg); }
.site .mm-sub { max-height: 0; overflow: hidden; transition: max-height .3s ease; }
.site .mm-item.open .mm-sub { max-height: 400px; }
.site .mm-sub a { display: block; padding: 10px 2px 10px 14px; font-size: .92rem; color: var(--ink-soft); border-left: 2px solid var(--ice); }
.site .mm-cta { margin-top: 24px; }

/* ---------- Home hero ---------- */
/* The teal is what shows when the row has no picture: HeroBanner leaves .hero-bg off the public
   page in that case, and the copy over it is white. overflow keeps the oversized GenArrow fields
   inside the band. */
.site .hero { min-height: 100vh; display: flex; align-items: flex-end; position: relative; overflow: hidden; background: var(--teal); color: #fff; }
.site .hero-bg { position: absolute; inset: 0; z-index: 0; }
.site .hero-bg img { width: 100%; height: 100%; object-fit: cover; object-position: center 42%; }
/* Empty on purpose. The vertical scrim is gone so the photograph keeps its colour, and only the
   left-hand wash on ::before is left to carry the copy. The box itself stays because cms-edit.css
   takes clicks off it so the editor can reach the image underneath. */
.site .hero-bg::after { content: ""; position: absolute; inset: 0; z-index: 1; }
/* Longhands, not the `padding: 200px 0 100px` shorthand: this element is also a .container, and
   the shorthand's zero cancelled the gutter that lines the hero copy up with the bands below. */
.site .hero-inner { position: relative; z-index: 1; padding-top: 200px; padding-bottom: 100px; width: 100%; }
.site .hero h1 { max-width: 900px; text-shadow: 0 2px 24px rgba(11,76,95,.3); }
.site .lead { font-size: 1.02rem; line-height: 1.8; color: var(--teal-abyss); }
.site .hero .lead { margin: 26px 0 0; font-size: 1.08rem; line-height: 1.8; color: rgba(255,255,255,.92); max-width: 620px; text-shadow: 0 1px 12px rgba(11,76,95,.24); }
.site .hero-actions { display: flex; gap: 16px; margin-top: 40px; flex-wrap: wrap; }
/* Two pills do not fit one phone row, and left to wrap they land as two ragged widths. */
@media (max-width: 560px) { .site .hero-actions .btn { flex: 1 1 100%; justify-content: center; } }
/* Clear of the chat seal, which the design does not have: the mockup leaves this corner
   to the cue and stacks a decorative seal above it, and here the seal is a button that
   sits low enough to be reached. 126px is the seal's own width plus its offset. */
.site .scroll-cue { position: absolute; bottom: 36px; right: 150px; z-index: 1; display: flex; flex-direction: column; align-items: center; gap: 10px; color: rgba(255,255,255,.7); font-size: .68rem; letter-spacing: .2em; text-transform: uppercase; }
.site .scroll-cue .line { width: 1px; height: 38px; background: rgba(255,255,255,.4); position: relative; overflow: hidden; }
.site .scroll-cue .line::after { content: ""; position: absolute; top: -100%; left: 0; width: 100%; height: 100%; background: var(--yellow); animation: scrollcue 1.8s ease-in-out infinite; }
@keyframes scrollcue { 0% { top: -100%; } 50% { top: 0; } 100% { top: 100%; } }
/* Under 900px the copy no longer fills a screen, and a forced 100vh with the text pinned to the
   bottom leaves a tall empty gap under the header. 182px is this header's height, 72px, plus the
   mockup's 110px. */
@media (max-width: 900px) { .site .hero { min-height: auto; } .site .hero-inner { padding-top: 182px; } }
@media (max-width: 720px) { .site .scroll-cue { display: none; } }

/* ---------- Sub-page hero ---------- */
.site .subhero { position: relative; min-height: 340px; display: flex; align-items: flex-end; color: #fff; padding-top: 88px; }
.site .subhero-bg { position: absolute; inset: 0; z-index: 0; }
.site .subhero-bg img { width: 100%; height: 100%; object-fit: cover; }
.site .subhero-bg::after { content: ""; position: absolute; inset: 0; background: linear-gradient(120deg, rgba(6,46,58,.90) 0%, rgba(10,137,170,.78) 100%); }
.site .subhero-inner { position: relative; z-index: 1; padding: 54px 0 46px; width: 100%; }
.site .breadcrumb { display: flex; align-items: center; gap: 8px; font-size: .76rem; color: rgba(255,255,255,.7); margin-bottom: 16px; letter-spacing: .02em; flex-wrap: wrap; }
.site .breadcrumb a { color: rgba(255,255,255,.7); transition: color .2s ease; }
.site .breadcrumb a:hover { color: var(--yellow); }
.site .breadcrumb .ga-icon { opacity: .55; color: currentColor; }
.site .subhero h1 { font-family: var(--font-display); font-style: italic; font-weight: 700; font-size: clamp(2rem, 4vw, 3rem); line-height: 1.15; max-width: 760px; }
.site .subhero p { margin: 14px 0 0; font-size: 1rem; color: rgba(255,255,255,.88); max-width: 600px; line-height: 1.7; }
@media (max-width: 720px) { .site .subhero { min-height: 280px; } }

.site .shape-photo { clip-path: polygon(8% 0%, 100% 0%, 92% 100%, 0% 100%); border-radius: 18px; overflow: hidden; position: relative; }
.site .shape-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
@media (max-width: 720px) { .site .shape-photo { clip-path: polygon(4% 0%, 100% 0%, 96% 100%, 0% 100%); } }

/* ---------- Trust strip ---------- */
.site .trust { padding: 30px 0; background: #fff; border-bottom: 1px solid var(--line); }
.site .trust-row { display: flex; align-items: center; gap: 40px; justify-content: space-between; flex-wrap: wrap; }
.site .trust-label { font-size: .72rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--ink-soft); white-space: nowrap; }
.site .trust-logos { display: flex; align-items: center; gap: 38px; flex-wrap: wrap; }
.site .trust-logos img { height: 36px; width: auto; }
@media (max-width: 720px) {
    .site .trust-row { gap: 20px; }
    .site .trust-logos { gap: 22px; }
    .site .trust-logos img { height: 28px; }
    /* The label is nowrap so it sits on one line beside the logos on a wide screen. At phone
       width that sentence is 447px against a 375px viewport, and .site's overflow-x: hidden was
       quietly clipping the end of it rather than showing a scrollbar. */
    .site .trust-label { white-space: normal; }
}

/* ---------- Sub-nav & page-nav ---------- */
/* The sub-nav is its own strip rather than living inside the first band, because that band is a
   CMS block and the pills are derived chrome. Reproducing the design's spacing therefore means
   taking the band's top padding here and cancelling it on the band that follows. */
.site .subnav-strip { padding: 100px 0 0; }
@media (max-width: 900px) { .site .subnav-strip { padding-top: 64px; } }
.site .subnav-strip + section.pad,
.site .subnav-strip + section.pad-sm { padding-top: 0; }

.site .subnav { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 48px; }
.site .subnav a { font-size: .78rem; font-weight: 700; letter-spacing: .03em; color: var(--teal-deep); background: var(--ice); padding: 9px 18px; border-radius: 20px; transition: all .2s ease; }
.site .subnav a:hover, .site .subnav a.active { background: var(--teal); color: #fff; }

.site .pagenav { display: flex; justify-content: space-between; align-items: center; gap: 20px; flex-wrap: wrap; padding: 44px 0; border-top: 1px solid var(--line); margin-top: 20px; }
.site .pagenav a { display: flex; align-items: center; gap: 14px; max-width: 340px; color: var(--teal); }
.site .pagenav a.next { margin-left: auto; flex-direction: row-reverse; text-align: right; }
.site .pagenav .txt { display: flex; flex-direction: column; gap: 6px; }
.site .pagenav a.next .txt { align-items: flex-end; }
.site .pagenav .lbl { font-size: .7rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--grey); }
.site .pagenav .ttl { font-family: var(--font-display); font-style: italic; font-size: 1.15rem; color: var(--teal-abyss); transition: color .2s ease; }
.site .pagenav a:hover .ttl { color: var(--teal); }
@media (max-width: 600px) { .site .pagenav { flex-direction: column; align-items: stretch; } .site .pagenav a.next { flex-direction: row-reverse; } }

/* ---------- Split content ---------- */
.site .about-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 72px; align-items: center; }
.site .about-media { position: relative; }
.site .about-media img { border-radius: 4px; box-shadow: var(--shadow); }
.site .about-media.shape-photo { box-shadow: none; }
.site .about-quote { position: absolute; left: -36px; bottom: -32px; background: #fff; padding: 26px 28px; max-width: 290px; border-radius: 4px; box-shadow: var(--shadow); border-left: 4px solid var(--yellow); }
.site .about-quote p { font-family: var(--font-display); font-style: italic; font-size: 1.05rem; line-height: 1.5; color: var(--teal-abyss); margin: 0; }
.site .about-copy p { color: var(--ink-soft); font-size: 1rem; line-height: 1.85; margin: 0 0 18px; }
/* The opening sentence is the band's way in, so it takes the heading's navy instead of the body
   grey. Colour only: the design gives it the size and rhythm of the paragraphs under it. */
.site .about-copy p.lead { color: var(--teal-deep); }
/* The design's section-title spec: upright Montserrat in Deep Navy. The display serif italic is
   reserved for a heading that carries an <em>, and this one is plain text. */
.site .about-h2 { font-family: var(--font-body); font-weight: 600; font-size: clamp(1.5rem, 3vw, 2.05rem); line-height: 1.28; letter-spacing: -.01em; color: var(--teal-deep); margin-bottom: 22px; }
/* Photo second, without moving it ahead of the copy in the source. At one column this also puts
   it below the text, which is the order the design uses on a phone. */
.site .about-grid.is-reversed .about-media { order: 2; }

/* Flush: the band carries no vertical padding of its own. The copy column's padding sets the
   height and the photo is cropped to fill it, so the picture touches the bands above and below. */
.site .split-flush { padding: 0; }
.site .about-grid.is-flush { gap: 56px; align-items: stretch; }
.site .about-grid.is-flush > * { min-width: 0; }
.site .about-grid.is-flush .about-copy { padding: 84px 0; align-self: center; }
/* The photo fills the band's height in the flow, not as an absolutely positioned box.
   Both forms ask for height:100%, but a percentage needs a containing block whose height
   is definite: taken out of the flow it depended on the media column having one, which
   is true on the page and was not inside the editor — one extra wrapper there and the
   same rule resolved to zero, so the photo vanished from the screen an editor is meant
   to be editing it on. As a flex item the percentage resolves against the flex
   container. The pull quote stays absolute, so it is unaffected. */
.site .about-grid.is-flush .about-media { min-height: 100%; display: flex; }
.site .about-grid.is-flush .about-media img { flex: 1; min-height: 0; width: 100%; height: 100%; object-fit: cover; border-radius: 0; box-shadow: none; }

/* The home intro runs a tighter body scale than the split bands on the sub-pages, and leaves the
   call to action more room. */
.site:not(.site--sub) .about-copy p { font-size: .94rem; margin: 20px 0 1.05em; }
.site:not(.site--sub) .about-copy .btn { margin-top: 26px; }

@media (max-width: 940px) {
    .site .about-grid { grid-template-columns: 1fr; gap: 60px; }
    .site .about-quote { position: static; margin-top: 22px; max-width: 100%; }
    /* One column leaves the photo's row no height to fill, so the picture goes back into the flow —
       and back above the copy, where the design puts it on a phone. */
    .site .about-grid.is-flush { gap: 32px; }
    .site .about-grid.is-flush .about-copy { padding: 64px 0; }
    .site .about-grid.is-flush .about-media { order: -1; min-height: 0; }
    .site .about-grid.is-flush .about-media img { flex: none; height: auto; }
}

.site .split-visual { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: start; margin-bottom: 56px; }
.site .split-visual .ph { border-radius: 8px; overflow: hidden; box-shadow: var(--shadow-sm); }
.site .split-visual .ph img { width: 100%; }
@media (max-width: 940px) { .site .split-visual { grid-template-columns: 1fr; gap: 34px; } }

.site .coming-soon { background: var(--ice); border: 1px dashed rgba(10,137,170,.35); border-radius: 10px; padding: 44px; text-align: center; max-width: 640px; margin: 0 auto; }
.site .coming-soon .ic { width: 46px; height: 46px; margin: 0 auto 18px; color: var(--teal); }
.site .coming-soon h4 { font-family: var(--font-display); font-style: italic; font-size: 1.3rem; color: var(--teal-abyss); margin: 0 0 12px; }
.site .coming-soon p { color: var(--ink-soft); font-size: .92rem; line-height: 1.7; margin: 0; }

.site .chip-row { display: flex; flex-wrap: wrap; gap: 10px; }
.site .chip { background: var(--ice); color: var(--teal-deep); font-size: .82rem; font-weight: 600; padding: 9px 16px; border-radius: 20px; }
.site .chip.alt { background: #fff; border: 1px solid var(--line); }

/* ---------- Card grids ---------- */
.site .cat-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 8px; }
.site .cat-card { background: #fff; border: 1px solid var(--line); border-radius: 8px; padding: 22px 20px; }
.site .cat-card h5 { font-size: .92rem; font-weight: 700; color: var(--teal-abyss); margin: 0 0 8px; }
.site .cat-card p { font-size: .8rem; color: var(--ink-soft); line-height: 1.6; margin: 0; }
@media (max-width: 860px) { .site .cat-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .site .cat-grid { grid-template-columns: 1fr; } }

.site .industry-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 22px; }
.site .industry-card { text-align: center; }
.site .industry-card .ph { aspect-ratio: 1/1.15; border-radius: 8px; overflow: hidden; margin-bottom: 16px; background: var(--ice); }
.site .industry-card .ph img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s ease; }
.site .industry-card:hover .ph img { transform: scale(1.06); }
.site .industry-card h4 { font-size: .92rem; font-weight: 700; color: var(--teal-abyss); margin: 0; line-height: 1.35; }
@media (max-width: 940px) { .site .industry-grid { grid-template-columns: repeat(3, 1fr); row-gap: 32px; } }
@media (max-width: 560px) { .site .industry-grid { grid-template-columns: repeat(2, 1fr); } }

.site .solutions-quad { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
.site .sq-card { background: #fff; border: 1px solid var(--line); border-radius: 10px; padding: 28px 24px; transition: all .25s ease; }
.site .sq-card:hover { box-shadow: var(--shadow-sm); transform: translateY(-3px); }
.site .sq-card .n { font-family: var(--font-display); font-style: italic; color: var(--teal); font-size: 1.1rem; margin-bottom: 12px; display: block; }
.site .sq-card h5 { font-family: var(--font-display); font-style: italic; font-size: 1.1rem; color: var(--teal-abyss); margin: 0 0 10px; }
.site .sq-card p { font-size: .85rem; color: var(--ink-soft); line-height: 1.65; margin: 0 0 14px; }
.site .sq-card a { font-size: .78rem; font-weight: 700; color: var(--teal); }
@media (max-width: 900px) { .site .solutions-quad { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .site .solutions-quad { grid-template-columns: 1fr; } }

/* ---------- Pillars ---------- */
.site .eco-chips { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin: 44px 0 30px; }
.site .eco-chip { background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.16); border-radius: 6px; padding: 22px 20px; color: #fff; font-size: .88rem; line-height: 1.5; }
.site .eco-chip b { display: block; color: var(--yellow); font-family: var(--font-display); font-style: italic; font-size: 1.5rem; margin-bottom: 8px; }
@media (max-width: 900px) { .site .eco-chips { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .site .eco-chips { grid-template-columns: 1fr; } }

.site .pillars-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 18px; }
.site .pillar { background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.16); border-radius: 8px; padding: 28px 22px; transition: all .3s ease; }
.site .pillar:hover { background: rgba(255,255,255,.13); transform: translateY(-4px); }
.site .pillar .num { font-family: var(--font-display); font-style: italic; color: var(--yellow); font-size: 1.1rem; margin-bottom: 14px; display: block; }
.site .pillar h4 { color: #fff; font-size: 1rem; font-weight: 700; margin: 0 0 10px; line-height: 1.35; }
.site .pillar p { color: rgba(255,255,255,.78); font-size: .85rem; line-height: 1.65; margin: 0; }
.site .pillar a { display: inline-block; margin-top: 12px; font-size: .78rem; font-weight: 700; color: var(--yellow); }
@media (max-width: 1024px) { .site .pillars-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .site .pillars-grid { grid-template-columns: 1fr; } }

/* ---------- Detail hero ---------- */
.site .detail-hero { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
.site .detail-hero .ph { border-radius: 8px; overflow: hidden; box-shadow: var(--shadow); }
.site .detail-copy .eyebrow { margin-bottom: 10px; }
.site .detail-copy h1 { font-family: var(--font-display); font-style: italic; font-size: clamp(1.8rem, 3vw, 2.4rem); color: var(--teal-abyss); margin-bottom: 16px; }
.site .detail-copy p { color: var(--ink-soft); font-size: .98rem; line-height: 1.8; margin: 0 0 20px; }
.site .detail-list { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 20px; margin-bottom: 22px; }
.site .detail-list li { font-size: .87rem; color: var(--ink); padding-left: 20px; position: relative; line-height: 1.5; }
.site .detail-list li::before { content: ""; position: absolute; left: 0; top: 8px; width: 8px; height: 8px; background: var(--yellow); border-radius: 1px; transform: rotate(45deg); }
.site .detail-note { margin-top: 6px; padding: 14px 16px; background: var(--ice); border-left: 3px solid var(--teal); font-size: .82rem; color: var(--teal-deep); border-radius: 2px; }
@media (max-width: 900px) { .site .detail-hero { grid-template-columns: 1fr; gap: 32px; } .site .detail-hero .ph { order: -1; } .site .detail-list { grid-template-columns: 1fr; } }

/* ---------- Stats & addresses ---------- */
.site .stat-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-bottom: 64px; }
.site .stat { text-align: center; padding: 30px 16px; background: #fff; border-radius: 8px; box-shadow: var(--shadow-sm); }
.site .stat b { display: block; font-family: var(--font-display); font-style: italic; font-size: 2.1rem; color: var(--teal); margin-bottom: 6px; }
.site .stat span { font-size: .78rem; color: var(--ink-soft); line-height: 1.4; display: block; }
@media (max-width: 900px) { .site .stat-row { grid-template-columns: 1fr 1fr; } }

.site .address-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.site .address-card { background: #fff; border-radius: 8px; padding: 32px; box-shadow: var(--shadow-sm); border-top: 3px solid var(--teal); }
.site .address-card .tag { font-size: .7rem; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--teal); margin-bottom: 12px; display: block; background: none; padding: 0; border-radius: 0; }
.site .address-card h4 { font-family: var(--font-display); font-style: italic; font-size: 1.25rem; color: var(--teal-abyss); margin: 0 0 14px; }
.site .address-card address { font-style: normal; color: var(--ink-soft); font-size: .92rem; line-height: 1.75; }
@media (max-width: 720px) { .site .address-grid { grid-template-columns: 1fr; } }

/* ---------- Logo strips ---------- */
/* The partner wall is rows of fixed-width tiles, not one wrapping strip: the row counts alternate
   five and six, so every tile lands in the gap of the row above and the wall interlocks — the
   half-cell offset falls out of the centring, so no row has to be shifted.

   The design puts the 40px between the wall and the paragraph beside it; here that paragraph can
   sit on either side of the wall, so the gap is kept on both. */
.site .partner-strip { --cell: 166px; --lgap: 30px; display: flex; flex-direction: column; gap: var(--lgap); margin: 40px 0; }
.site .lrow { display: flex; justify-content: center; gap: var(--lgap); }
/* The easing and the shadow are written out: this stylesheet has a token for neither, and one
   wall is not reason enough to add two site-wide ones. */
.site .logo-cell { background: #fff; border: 1px solid rgba(159,162,166,.32); border-radius: 6px; display: flex; align-items: center; justify-content: center; padding: 12px; transition: all .25s cubic-bezier(.22,.61,.36,1); }
.site .logo-cell:hover { border-color: var(--teal); box-shadow: 0 1px 3px rgba(11,76,95,.08), 0 8px 24px rgba(11,76,95,.06); transform: translateY(-4px); }
.site .logo-cell img { max-height: 44px; width: auto; object-fit: contain; }
/* Width rather than flex-basis: inside the editor a wrapper div comes between the row and the
   tile, and a basis set here would then size nothing. */
.site .partner-strip .logo-cell { width: var(--cell); height: 84px; }
/* The tile shrinks with the viewport rather than letting a row of six wrap into a ragged stub. */
@media (max-width: 1180px) { .site .partner-strip { --cell: 142px; --lgap: 22px; } }
@media (max-width: 1024px) { .site .partner-strip { --cell: 126px; --lgap: 14px; } .site .partner-strip .logo-cell { height: 76px; } }
@media (max-width: 900px) { .site .partner-strip { --cell: 118px; --lgap: 10px; } .site .partner-strip .logo-cell { height: 70px; } }
@media (max-width: 720px) { .site .partner-strip { --cell: 104px; --lgap: 9px; } .site .partner-strip .logo-cell { height: 64px; } }
/* Below this a row of six is unreadable however small the tile, so rows wrap to two instead. */
@media (max-width: 560px) { .site .partner-strip { --cell: calc(50% - 7px); --lgap: 14px; } .site .partner-strip .logo-cell { height: 70px; } .site .lrow { flex-wrap: wrap; } }

/* Both logo walls take the design's small-section rhythm, tighter than the .pad-sm the rest of
   the site uses. This sits below the 900px .pad-sm override, so 56px holds at every width down
   to the 560px rule. */
.site .logo-sec { padding: 56px 0; }
@media (max-width: 560px) { .site .logo-sec { padding: 40px 0; } }

/* The intro line sits above the marks on this wall, so the space between the two
   is this grid's top margin — it used to be a bottom margin, from when the copy
   followed the marks and nothing came after it. */
.site .cert-grid { --cell: 166px; --lgap: 30px; display: flex; flex-direction: column; gap: var(--lgap); margin-top: 40px; }

/* Fixed-width cells in centred rows. Every other row shifts right by half a cell plus half a
   gap, so its tiles sit in the gaps of the row above instead of lining up into a table. The row
   box hugs its cells — a full-width one would carry that shift into the page's scroll area. */
.site .cert-grid .lrow { display: flex; justify-content: center; gap: var(--lgap); width: fit-content; margin: 0 auto; }

/* The width repeats the flex basis because in the editor each logo is wrapped in its own drag
   handle, which becomes the flex item and would otherwise leave the tile sized by its image. */
.site .cert-grid .logo-cell { flex: 0 0 var(--cell); width: var(--cell); height: 84px; background: #fff; border: 1px solid rgba(159,162,166,.32); border-radius: 6px; display: flex; align-items: center; justify-content: center; padding: 12px; transition: all .25s cubic-bezier(.22,.61,.36,1); }
.site .cert-grid .logo-cell:hover { border-color: var(--teal); box-shadow: 0 1px 3px rgba(11,76,95,.08), 0 8px 24px rgba(11,76,95,.06); transform: translateY(-4px); }
.site .cert-grid .logo-cell img { max-height: 44px; width: auto; object-fit: contain; }

.site .cred-copy { max-width: 620px; margin: 0 auto; text-align: center; color: var(--ink-soft); font-size: .93rem; line-height: 1.8; }

/* A row of four only holds while it still fits, so the cell shrinks with the viewport rather
   than letting a row wrap into a ragged stub. */
@media (max-width: 1180px) { .site .cert-grid { --cell: 142px; --lgap: 22px; } }
@media (max-width: 1024px) { .site .cert-grid { --cell: 126px; --lgap: 14px; } .site .cert-grid .logo-cell { height: 76px; } }
@media (max-width: 900px) { .site .cert-grid { --cell: 118px; --lgap: 10px; } .site .cert-grid .logo-cell { height: 70px; } }
@media (max-width: 720px) { .site .cert-grid { --cell: 104px; --lgap: 9px; } .site .cert-grid .logo-cell { height: 64px; } }
/* Narrower than this a row of four is unreadable, so wrap to two per row and drop the shift. */
@media (max-width: 560px) { .site .cert-grid { --cell: calc(50% - 7px); --lgap: 14px; } .site .cert-grid .logo-cell { height: 70px; } .site .cert-grid .lrow { flex-wrap: wrap; width: auto; } }

/* ---------- Quote band ---------- */
.site .quote-wrap { text-align: center; max-width: 880px; margin: 0 auto; }
.site .quote-wrap blockquote { font-family: var(--font-display); font-style: italic; font-weight: 700; font-size: clamp(1.6rem, 3.6vw, 2.6rem); color: #fff; line-height: 1.35; margin: 0 0 56px; }
.site .trait-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; text-align: left; }
.site .trait { border-top: 1px solid rgba(255,255,255,.22); padding-top: 20px; }
.site .trait h5 { color: var(--yellow); font-family: var(--font-display); font-style: italic; font-size: 1.2rem; margin: 0 0 10px; }
.site .trait p { color: rgba(255,255,255,.75); font-size: .87rem; line-height: 1.7; margin: 0; }
@media (max-width: 760px) { .site .trait-row { grid-template-columns: 1fr; } }

/* ---------- FAQ ---------- */
.site .faq-list { max-width: 820px; margin: 0 auto; }
.site .faq-item { border-bottom: 1px solid var(--line); }
.site .faq-q { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 22px 4px; cursor: pointer; background: none; border: none; width: 100%; text-align: left; font-family: var(--font-body); font-size: .98rem; font-weight: 700; color: var(--teal-abyss); }
.site .faq-q svg { width: 18px; height: 18px; flex: none; color: var(--teal); transition: transform .25s ease; }
.site .faq-item.open .faq-q svg { transform: rotate(45deg); }
.site .faq-a { max-height: 0; overflow: hidden; transition: max-height .3s ease; }
.site .faq-item.open .faq-a { max-height: 500px; }
.site .faq-a p { color: var(--ink-soft); font-size: .92rem; line-height: 1.75; padding: 0 4px 22px; margin: 0; }

/* ---------- CTA band ---------- */
/* The band paints itself edge to edge and .container constrains only the copy. The teal sits on
   the section rather than on the photo wash, so a row saved without an image still gives the
   white heading something to stand on. */
.site .cta-band { position: relative; padding: 84px 0; overflow: hidden; text-align: center; background: var(--teal); }
.site .cta-band .bgph { position: absolute; inset: 0; }
.site .cta-band .bgph img { width: 100%; height: 100%; object-fit: cover; }
/* A flat wash rather than a gradient: the photograph stays readable underneath, and the band
   reads as Innovation Teal rather than as a photograph. */
.site .cta-band .bgph::after { content: ""; position: absolute; inset: 0; background: rgba(10,137,170,.86); }
.site .cta-band .inner { position: relative; z-index: 1; }
.site .cta-band h2 { font-family: var(--font-body); font-style: normal; font-weight: 600; letter-spacing: -.01em; color: #fff; font-size: clamp(1.5rem, 3.2vw, 2.15rem); line-height: 1.25; margin: 0 0 16px; }
.site .cta-band p { color: rgba(255,255,255,.92); font-size: .92rem; line-height: 1.75; margin: 0 0 30px; }
.site .cta-band .actions { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
@media (max-width: 560px) { .site .cta-band .actions .btn { flex: 1 1 100%; justify-content: center; } }

/* ---------- Contact ---------- */
.site .contact-grid { display: grid; grid-template-columns: 0.9fr 1.1fr; gap: 72px; }
.site .contact-form { background: var(--ice); border-radius: 10px; padding: 40px; }
.site .field { margin-bottom: 18px; }
.site .field label { display: block; font-size: .76rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--teal-deep); margin-bottom: 8px; }
.site .field input, .site .field textarea, .site .field select { width: 100%; border: 1px solid rgba(10,137,170,.25); background: #fff; border-radius: 4px; padding: 13px 14px; font-family: var(--font-body); font-size: .92rem; color: var(--ink); transition: border-color .2s ease; }
.site .field input:focus, .site .field textarea:focus, .site .field select:focus { outline: none; border-color: var(--teal); }
.site .field textarea { resize: vertical; min-height: 110px; }
/* .validation-message is what Blazor's ValidationMessage emits; it carries the client-side rules
   while .field-error carries the server's. Styled together so a visitor cannot tell which layer
   caught the mistake. */
.site .field .field-error,
.site .field .validation-message { display: block; margin-top: 6px; font-size: .76rem; font-weight: 600; text-transform: none; letter-spacing: 0; color: #9B1C1C; }
.site .field input.invalid, .site .field textarea.invalid { border-color: #9B1C1C; }
.site .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 560px) { .site .form-row { grid-template-columns: 1fr; } }
.site .contact-form .btn-primary { width: 100%; justify-content: center; margin-top: 6px; }
.site .contact-form .btn-primary:disabled { opacity: .6; cursor: not-allowed; transform: none; }
/* Off-screen rather than display:none — a hidden field a bot fills in is the whole point, and
   display:none is the first thing a scripted filler skips. */
.site .hp-field { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.site .toast { margin-top: 16px; background: #fff; border-left: 3px solid var(--teal); padding: 14px 16px; font-size: .85rem; color: var(--teal-deep); border-radius: 3px; }
.site .toast.error { border-left-color: #9B1C1C; color: #9B1C1C; }
.site .contact-info h3 { font-family: var(--font-display); font-style: italic; font-size: 1.5rem; color: var(--teal-abyss); margin: 0 0 18px; }
.site .contact-info > p { color: var(--ink-soft); font-size: .98rem; line-height: 1.8; margin: 0 0 32px; }
@media (max-width: 940px) { .site .contact-grid { grid-template-columns: 1fr; gap: 48px; } }

.site .partner-cta { background: #fff; border: 1px solid var(--line); border-radius: 10px; padding: 36px; display: flex; align-items: center; gap: 28px; justify-content: space-between; flex-wrap: wrap; }
.site .partner-cta p { max-width: 520px; color: var(--ink-soft); font-size: .92rem; line-height: 1.7; margin: 6px 0 0; }
.site .partner-cta h4 { font-family: var(--font-display); font-style: italic; font-size: 1.3rem; color: var(--teal-abyss); margin: 0; }

/* ---------- Footer ---------- */
/* The mockup's last 26px sits on its bottom bar; .foot-bottom has only padding-top, so it stays here. */
.site-footer { background: #fff; padding: 64px 0 26px; border-top: 1px solid rgba(159,162,166,.3); color: #545454; }
.site-footer .foot-top { display: grid; grid-template-columns: 1fr 1fr 1fr 1.5fr; gap: 36px; padding-bottom: 46px; border-bottom: 1px solid rgba(159,162,166,.3); }
.site-footer .foot-col h5 { color: var(--teal-deep); font-size: .78rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; margin: 0 0 18px; }
.site-footer .foot-col a, .site-footer .foot-col address { display: block; font-style: normal; font-size: .82rem; color: #545454; margin-bottom: 0; line-height: 1.9; transition: color .2s ease; }
.site-footer .foot-col a:hover { color: var(--teal); }
.site-footer .f-contact li { display: flex; gap: 10px; margin-bottom: 14px; font-size: .82rem; line-height: 1.8; }
.site-footer .f-contact .ic { width: 15px; height: 15px; flex: none; margin-top: 5px; color: var(--teal); fill: currentColor; }
.site-footer .f-social { margin-top: 26px; }
.site-footer .f-social h5 { margin-bottom: 12px; }
.site-footer .f-social-row { display: flex; gap: 12px; }
.site-footer .f-social-row a { width: 30px; height: 30px; border-radius: 50%; background: var(--teal); display: flex; align-items: center; justify-content: center; color: #fff; transition: background .22s cubic-bezier(.22,.61,.36,1); }
/* The glyph stays white on hover; .foot-col a:hover above would turn it teal. */
.site-footer .f-social-row a:hover { background: var(--blue); color: #fff; }
/* SocialIcon wraps its glyph in a span; left inline, that span sits the mark above the middle of the disc. */
.site-footer .f-social-row .social-icon { display: flex; }
/* No fill here: the outline glyphs carry fill="none" and a fill declaration would flood them solid. */
.site-footer .f-social-row svg { width: 15px; height: 15px; }
.site-footer .foot-bottom { display: flex; justify-content: space-between; align-items: center; padding-top: 26px; font-size: .78rem; color: var(--grey); flex-wrap: wrap; gap: 10px; }
/* guideline p.19 — the portfolio identifier sits bottom-left. */
.site-footer .f-portfolio { display: inline-flex; align-items: center; gap: 8px; }
.site-footer .f-portfolio .ga-icon { width: 10px; color: var(--yellow); }
.site-footer .foot-bottom nav { display: flex; flex-wrap: wrap; gap: 22px; }
.site-footer .foot-bottom a:hover { color: var(--teal); }
@media (max-width: 1000px) { .site-footer .foot-top { grid-template-columns: 1fr 1fr; row-gap: 36px; } }
@media (max-width: 720px) { .site-footer .foot-bottom { flex-direction: column; align-items: flex-start; } }
@media (max-width: 560px) { .site-footer .foot-top { grid-template-columns: 1fr; } }

/* ---------- Page states ---------- */
.site .page-loading, .site .page-message { max-width: var(--maxw); margin: 0 auto; padding: 200px 34px 120px; }
.site .page-message h1 { font-family: var(--font-display); font-style: italic; font-size: 2rem; color: var(--teal-abyss); margin-bottom: 12px; }
.site .page-message p { color: var(--ink-soft); line-height: 1.8; }
.site .page-message a { color: var(--teal); font-weight: 600; }

/* ---------- Brand decoration -------------------------------------------------

   The GenArrow-derived heart and blob, traced from the brand guideline. Purely
   decorative: they sit behind the content, take no clicks, and disappear on a
   phone rather than crowding the copy they are meant to frame. */

.site .decor-shape { position: absolute; inset: 0; overflow: hidden; pointer-events: none; z-index: 0; }
.site .decor-shape img { position: absolute; }
.site .decor-heart img { top: -16%; right: 0%; width: 19%; max-width: 260px; opacity: .85; }
.site .decor-blob img { top: -3%; right: 1%; width: 18%; max-width: 260px; opacity: .55; }
@media (max-width: 900px) {
    .site .decor-heart img { width: 34%; top: -4%; right: -4%; opacity: .7; }
    .site .decor-blob img { width: 30%; top: -2%; right: -4%; opacity: .45; }
}
@media (max-width: 560px) { .site .decor-heart, .site .decor-blob { display: none; } }

@media (max-width: 720px) { .site .trust-label { white-space: normal; letter-spacing: .08em; max-width: 220px; line-height: 1.5; } }

/* ---------- Industry focus: core expertise beside other capabilities --------- */

.site .if-lead { font-family: var(--font-display); font-style: italic; font-size: 1.1rem; color: var(--teal); margin: 0 0 40px; }
.site .industry-groups { display: grid; grid-template-columns: 1fr auto 1fr; gap: 44px; align-items: start; }
.site .ig-divider { width: 1px; background: var(--line); align-self: stretch; min-height: 220px; }
.site .ig-group-title { font-family: var(--font-display); font-style: italic; font-weight: 700; font-size: 1.3rem; color: #D9A400; margin: 0 0 30px; }
.site .ig-row { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; }
.site .ig-row.three { grid-template-columns: repeat(3, 1fr); }
.site .ind2-card { text-align: center; }
.site .ind2-card .ph-wrap { position: relative; aspect-ratio: 1 / 1.05; width: 100%; max-width: 150px; margin: 0 auto 14px; }
.site .ind2-card .ph-accent { position: absolute; top: 6%; left: -16%; width: 100%; height: 100%; z-index: 1; opacity: .92; }
.site .ind2-card .ph-main { position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: contain; z-index: 2; transition: transform .4s ease; }
.site .ind2-card:hover .ph-main { transform: translateY(-4px); }
.site .ind2-card h4 { font-size: .86rem; font-weight: 700; color: var(--teal-abyss); margin: 0; line-height: 1.35; }
.site .if-closing { margin-top: 50px; color: var(--ink-soft); font-size: .92rem; line-height: 1.8; max-width: 900px; }
@media (max-width: 860px) {
    .site .industry-groups { grid-template-columns: 1fr; gap: 36px; }
    .site .ig-divider { display: none; }
    .site .ig-row.three { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 520px) { .site .ig-row, .site .ig-row.three { grid-template-columns: repeat(2, 1fr); } }

/* ---------- End-to-end ecosystem: a rising staircase --------------------------

   Each step is lifted by a fixed offset rather than laid out by the grid,
   because the diagram's meaning is the climb. The offsets are dropped entirely
   below 860px, where four steps side by side would be unreadable and the same
   sequence reads better as a list. */

.site .eco-flow { position: relative; display: flex; align-items: flex-end; justify-content: space-between; gap: 14px; margin: 56px 0 20px; padding-top: 40px; }
.site .ef-step { display: flex; flex-direction: column; align-items: center; text-align: center; width: 23%; position: relative; z-index: 2; }
.site .ef-step[data-step="1"] { transform: translateY(0); }
.site .ef-step[data-step="2"] { transform: translateY(-64px); }
.site .ef-step[data-step="3"] { transform: translateY(-128px); }
.site .ef-step[data-step="4"] { transform: translateY(-192px); }
.site .ef-node { width: 88px; height: 88px; margin-bottom: 18px; filter: drop-shadow(0 10px 18px rgba(10,137,170,.35)); }
.site .ef-node img { width: 100%; height: 100%; }
.site .ef-label { font-size: .86rem; font-weight: 700; color: var(--teal-abyss); max-width: 160px; line-height: 1.45; }
.site .ef-connector { position: absolute; z-index: 1; border-top: 2px solid var(--teal); opacity: .55; width: 9%; }
.site .ef-connector[data-c="1"] { bottom: 44px; left: 19%; width: 10%; transform: rotate(-35deg); transform-origin: left; }
.site .ef-connector[data-c="2"] { bottom: 108px; left: 41%; width: 10%; transform: rotate(-35deg); transform-origin: left; }
.site .ef-connector[data-c="3"] { bottom: 172px; left: 63%; width: 10%; transform: rotate(-35deg); transform-origin: left; }
@media (max-width: 860px) {
    .site .eco-flow { flex-direction: column; align-items: flex-start; gap: 26px; padding-top: 10px; }
    .site .ef-step { width: 100%; flex-direction: row; text-align: left; gap: 16px; transform: none !important; }
    .site .ef-label { max-width: none; }
    .site .ef-node { margin-bottom: 0; width: 64px; height: 64px; flex: none; }
    .site .ef-connector { display: none; }
}

/* ---------- Hero, revised -----------------------------------------------------

   The photograph keeps its colour: a wash from the left carries the copy over
   the bright part of the picture, rather than a flat overlay across all of it. */

.site .hero-bg::before { content: ''; position: absolute; inset: 0; z-index: 1; background: linear-gradient(90deg, rgba(11,76,95,.5) 0%, rgba(11,76,95,.22) 42%, transparent 68%); }
.site .hero .eyebrow { color: var(--yellow); }

/* One keyword of the headline in Inria Serif Italic, per the guideline (p.21).
   The editor decides which by italicising it, so nothing here guesses. */
.site .hero h1 em { color: var(--yellow); font-family: var(--font-display); font-style: italic; font-weight: 400; letter-spacing: 0; }

/* The GenArrow at poster size, used as a field rather than an icon (p.27).
   Decorative only — it takes no clicks and is hidden from assistive software. */
.site .ga-field { position: absolute; pointer-events: none; z-index: 1; line-height: 0; }
.site .ga-field svg { width: 100%; height: auto; display: block; fill: currentColor; }
.site .hero .ga-field.a { bottom: 6%; left: -16%; width: 38%; color: var(--yellow); opacity: .08; transform: rotate(-12deg); }
.site .hero .ga-field.b { top: -16%; right: -7%; width: 28%; color: #fff; opacity: .08; transform: rotate(174deg); }

/* The floating seal. The mark is square, so inside a circle it has to stay
   under d/√2 or the corners clip — 44 of 92 is comfortably inside. */
/* The brand seal that sat here is the chat launcher now — see css/chat.css. It keeps this
   position on the hero, so the corner still reads the way the design draws it, and then follows
   the visitor down the page instead of scrolling away. */

/* ---------- The revised home page ---------------------------------------------

   Section rhythm and headings from genero-v4.css, which the mockup used only on
   index.html. Brought in here so one stylesheet serves the whole site: the CMS
   renders every page through one shell, and a second stylesheet loaded for one
   route would leave the chrome styled twice. */

.site .sec { padding: 84px 0; }
.site .sec-sm { padding: 56px 0; }
@media (max-width: 900px) { .site .sec { padding: 60px 0; } }
@media (max-width: 560px) { .site .sec { padding: 48px 0; } .site .sec-sm { padding: 40px 0; } }
.site .sec.bg-soft { background: #F7F9FA; }
.site .center { text-align: center; }
.site .sec-title { font-weight: 600; font-size: clamp(1.5rem, 3vw, 2.05rem); line-height: 1.25; color: var(--teal-deep); letter-spacing: -.01em; }
.site .sec-sub { max-width: 620px; margin: 14px auto 0; font-size: .93rem; line-height: 1.8; color: var(--ink-soft); }

.site .tlink { display: inline-flex; align-items: center; gap: 8px; font-size: .8rem; font-weight: 600; color: var(--teal); border-bottom: 1px solid currentColor; padding-bottom: 3px; }
.site .tlink:hover .ga-icon.right { transform: rotate(90deg) translateY(3px); }

/* ---- Numbered solution cards -------------------------------------------------

   Six columns rather than five so the last two can be centred beneath: five
   equal cards leave a gap that reads as a missing sixth. */

.site .sols { margin-top: 52px; display: grid; grid-template-columns: repeat(6, 1fr); gap: 40px; }
.site .sol-card { grid-column: span 2; position: relative; display: flex; flex-direction: column; background: #fff; border: 1px solid rgba(159,162,166,.28); border-radius: 6px; padding: 38px 32px 30px; overflow: hidden; transition: transform .3s cubic-bezier(.22,.61,.36,1), box-shadow .3s cubic-bezier(.22,.61,.36,1), border-color .3s cubic-bezier(.22,.61,.36,1); }
.site .sol-card:nth-child(4) { grid-column: 2 / span 2; }
.site .sol-card:nth-child(5) { grid-column: 4 / span 2; }
.site .sol-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--teal); transform: scaleX(0); transform-origin: left; transition: transform .4s cubic-bezier(.22,.61,.36,1); }
.site .sol-card:hover { transform: translateY(-6px); border-color: rgba(10,137,170,.4); box-shadow: 0 18px 44px rgba(11,76,95,.12); }
.site .sol-card:hover::before { transform: scaleX(1); }
.site .sol-n { position: absolute; top: 24px; right: 28px; font-family: var(--font-display); font-style: italic; font-size: 2.3rem; line-height: 1; color: var(--grey); opacity: .28; transition: color .3s cubic-bezier(.22,.61,.36,1), opacity .3s cubic-bezier(.22,.61,.36,1); }
.site .sol-card:hover .sol-n { color: var(--teal); opacity: .5; }
.site .sol-ic { display: block; width: 38px; height: 38px; margin-bottom: 22px; color: var(--teal); }
.site .sol-ic img { width: 100%; height: 100%; object-fit: contain; }
/* The reset near the top of this file covers h1 to h3 only, so this h4 would otherwise
   keep the browser's 1.33em margins — and in a flex column they never collapse. */
.site .sol-card h4 { max-width: 15ch; margin: 0; color: var(--teal-deep); font-size: 1rem; font-weight: 700; line-height: 1.45; }
.site .sol-card p { margin-top: 12px; margin-bottom: 26px; font-size: .86rem; line-height: 1.8; color: var(--ink-soft); }
.site .sol-card .tlink { margin-top: auto; align-self: flex-start; font-size: .75rem; }

/* On the pale band the cards read as white panels floating on ice, so the hairline goes.
   It stays off on hover as well: the lift, the shadow and the teal top rule are the cue. */
.site .bg-ice .sol-card { border-color: transparent; }
@media (max-width: 1024px) {
    .site .sols { grid-template-columns: repeat(4, 1fr); }
    .site .sol-card, .site .sol-card:nth-child(4), .site .sol-card:nth-child(5) { grid-column: span 2; }
    /* The fifth card centres under the pair above rather than sitting in the left cell
       with an empty one beside it. */
    .site .sol-card:nth-child(5) { grid-column: 2 / span 2; }
}
@media (max-width: 720px) {
    .site .sols { grid-template-columns: 1fr; gap: 18px; }
    .site .sol-card, .site .sol-card:nth-child(4), .site .sol-card:nth-child(5) { grid-column: auto; }
    .site .sol-card { padding: 32px 24px 26px; }
    .site .sol-card h4 { max-width: none; }
}

/* ---- The three cards under the introduction ---------------------------------

   Full-bleed and edge to edge: they are panels of colour, not cards on a page,
   so there is no container padding and no gap between them. */

.site .trio { display: grid; grid-template-columns: repeat(3, 1fr); }
.site .pill-card { position: relative; padding: 52px 40px 46px; min-height: 330px; display: flex; flex-direction: column; overflow: hidden; }
.site .pill-card.dark { color: #fff; }
.site .pill-card.blue { background: var(--blue); }
.site .pill-card.teal { background: var(--teal); }
.site .pill-card.light { background: var(--ice); }
.site .pill-card h3 { font-family: var(--font-body); font-style: normal; font-weight: 300; font-size: clamp(1.4rem, 2.5vw, 1.9rem); line-height: 1.25; letter-spacing: -.01em; }
.site .pill-card.dark h3 { color: #fff; }
.site .pill-card.light h3 { color: var(--teal-deep); }
.site .pill-card p { margin-top: auto; padding-top: 34px; font-size: .86rem; line-height: 1.8; }
.site .pill-card.dark p { color: rgba(255,255,255,.94); }
/* The panel link is its own class rather than the .tlink the rest of the site uses:
   plain underlined text with no arrow after it, warming to yellow on hover. */
.site .dlink { position: relative; z-index: 1; align-self: flex-start; margin-top: 26px; display: inline-block; font-weight: 600; font-size: .82rem; line-height: 1.3; color: #fff; border-bottom: 1px solid currentColor; padding-bottom: 4px; transition: color .25s cubic-bezier(.2,.7,.2,1), border-color .25s cubic-bezier(.2,.7,.2,1); }
.site .pill-card.light .dlink { color: var(--teal); }
.site .pill-card.dark .dlink:hover { color: var(--yellow); }
.site .pill-card.light .dlink:hover { color: var(--teal-deep); }

/* The spiral sits behind everything the card says, so each of those is lifted
   above it rather than the spiral being pushed back with a negative index —
   which would put it behind the card's own background as well. */
.site .swirl { position: absolute; z-index: 0; width: 108%; aspect-ratio: 1; pointer-events: none; color: #fff; opacity: .45; }
.site .pill-card.tl .swirl { top: -30%; left: -24%; }
.site .pill-card.tr .swirl { top: -30%; right: -24%; }
.site .pill-card.br .swirl { bottom: -36%; right: -20%; }
.site .pill-card > h3, .site .pill-card > p, .site .pill-card > .dlink { position: relative; z-index: 1; }

@media (max-width: 900px) {
    .site .trio { grid-template-columns: 1fr; }
    .site .pill-card { min-height: 0; padding: 40px 26px 38px; }
    .site .pill-card p { padding-top: 22px; }

    /* One column makes the card full-bleed, so the field would sit right behind the
       copy — pull it back into a corner and drop it well under the text. */
    .site .swirl { width: 60%; opacity: .22; }
    .site .pill-card.tl .swirl { top: -16%; left: -14%; }
    .site .pill-card.tr .swirl { top: -16%; right: -14%; }
    .site .pill-card.br .swirl { bottom: -18%; right: -12%; }
}

/* ---- What the ecosystem lets a partner do ---------------------------------- */

.site .eco4 { margin-top: 44px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px 20px; }
.site .eco4-i { text-align: center; }

/* The icons ship on a solid #EDF6F7 square with no alpha channel — clip to a
   circle so the corners don't print a pale box on the white section. */
.site .q-ic { display: block; width: 86px; height: 86px; margin: 0 auto 16px; border-radius: 50%; overflow: hidden; transition: transform .3s cubic-bezier(.22,.61,.36,1); }
.site .q-ic img { width: 100%; height: 100%; object-fit: contain; }
.site .eco4-i:hover .q-ic { transform: translateY(-5px); }
.site .eco4-i h4 { font-size: .92rem; font-weight: 500; line-height: 1.5; color: var(--teal-deep); margin: 0; }
@media (max-width: 900px) { .site .eco4 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px) { .site .eco4 { grid-template-columns: 1fr; gap: 24px; } }

/* The closing line gets a class rather than an `.eco4 + p` adjacency selector:
   in the editor EditableItem wraps it in a div and the adjacency stops matching. */
.site .eco-closing { margin-top: 34px; }

/* The dark band's pillar link, now that its arrow is drawn rather than typed. */
.site .pillar a { display: inline-flex; align-items: center; gap: 8px; }

/* ---- What clients said ------------------------------------------------------
   One quote at a time, stepped by the arrows or the dots. Which one is showing
   is component state, not a class script writes onto a node: Blazor re-renders
   this list on a language switch and would discard anything JS had put there. */

.site .quotes { position: relative; max-width: 900px; margin: 36px auto 0; display: flex; align-items: center; gap: 26px; }
.site .q-nav { width: 40px; height: 40px; flex: none; padding: 0; background: none; border: 1.5px solid var(--grey); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--teal); cursor: pointer; transition: all .25s cubic-bezier(.22,.61,.36,1); }
.site .q-nav:hover:not(:disabled) { border-color: var(--teal); background: var(--teal); color: #fff; }
.site .q-nav:disabled { opacity: 0; pointer-events: none; }
.site .q-nav .ga-icon { width: 13px; height: 13px; }
.site .q-view { flex: 1; min-width: 0; text-align: center; }

/* The opening quote mark, drawn rather than typed: a literal “ is selectable,
   is read out by a screen reader, and comes from whichever font loaded. */
.site .testi .q-view::before {
    content: ''; display: block; width: 34px; height: 26px; margin: 0 auto 18px; background: var(--teal); opacity: .16;
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 34 26'><path d='M0 26V13C0 5.8 5 .8 13 0v5C8.6 5.8 6 8.4 6 12h7v14zm21 0V13C21 5.8 26 .8 34 0v5c-4.4.8-7 3.4-7 7h7v14z'/></svg>") center/contain no-repeat;
            mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 34 26'><path d='M0 26V13C0 5.8 5 .8 13 0v5C8.6 5.8 6 8.4 6 12h7v14zm21 0V13C21 5.8 26 .8 34 0v5c-4.4.8-7 3.4-7 7h7v14z'/></svg>") center/contain no-repeat;
}

.site .q-item { display: none; }
.site .q-item.on { display: block; animation: qfade .5s cubic-bezier(.22,.61,.36,1); }
@keyframes qfade { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

.site .q-item p { font-size: .98rem; line-height: 1.95; color: var(--ink-soft); margin: 0; }
.site .q-item cite { display: block; margin-top: 20px; font-style: normal; }
.site .q-item cite .who { display: block; font-size: .82rem; font-weight: 600; color: var(--teal-deep); }
.site .q-item cite .role { display: block; margin-top: 2px; font-size: .76rem; font-weight: 300; color: var(--grey); }

.site .q-dots { display: flex; justify-content: center; gap: 7px; margin-top: 26px; }
.site .q-dot { width: 7px; height: 7px; padding: 0; border: none; border-radius: 50%; background: var(--grey); opacity: .45; cursor: pointer; transition: all .25s cubic-bezier(.22,.61,.36,1); }
.site .q-dot.on { opacity: 1; background: var(--teal); width: 22px; border-radius: 99px; }

@media (max-width: 720px) {
    .site .quotes { gap: 12px; }
    .site .q-nav { width: 34px; height: 34px; }
}

/* ---- The latest posts -------------------------------------------------------
   A masonry column layout, as the design has it: the cards vary in height with
   their excerpt, and `columns` lets a short one sit under a short one instead
   of leaving a grid row as tall as its tallest card. */

.site .news-head { display: flex; flex-wrap: wrap; gap: 20px; align-items: flex-start; justify-content: space-between; margin-bottom: 34px; }
.site .news-head .sec-sub { margin: 10px 0 0; max-width: 520px; }
.site .news-grid { columns: 3; column-gap: 22px; }

.site .card { break-inside: avoid; margin-bottom: 22px; background: #fff; border-radius: 4px; overflow: hidden; box-shadow: var(--ring); transition: transform .28s ease, box-shadow .28s ease; }
.site .card:hover { transform: translateY(-4px); box-shadow: 0 14px 40px rgba(11, 76, 95, .14); }
.site .card img { width: 100%; aspect-ratio: 16 / 10; object-fit: cover; }
.site .card-b { padding: 18px 20px 20px; }
.site .card h4 { margin: 0; font-size: .9rem; font-weight: 600; line-height: 1.5; color: var(--teal-deep); }
.site .card h4 a:hover { color: var(--teal); }
.site .card .date { display: block; margin-top: 10px; font-size: .76rem; color: var(--grey); }
.site .card .excerpt { margin-top: 6px; font-size: .79rem; line-height: 1.75; color: var(--ink-soft); }
.site .card .excerpt p { margin: 0; }
/* The one card the band gives more room to. Small in itself — a little more padding
   and a larger heading; most of its extra height comes from having more to say. */
.site .card.feature .card-b { padding: 22px 22px 24px; }
.site .card.feature h4 { font-size: 1.02rem; }

.site .card-f { margin-top: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.site .card-f .tlink { font-size: .72rem; }
/* Scoped to the card foot: a bare .chip here would land on the pill-shaped tags
   the card grids use and strip their background off, because this rule is later
   in the file at the same specificity. */
.site .card-f .chip { background: none; padding: 0; border-radius: 0; font-size: .68rem; font-weight: 600; letter-spacing: .04em; color: var(--teal); }

.site .news-empty { margin-top: 8px; padding: 22px; border: 1px dashed var(--line); border-radius: 4px; font-size: .82rem; line-height: 1.7; color: var(--ink-soft); }

@media (max-width: 1024px) { .site .news-grid { columns: 2; } }
@media (max-width: 720px) { .site .news-grid { columns: 1; } .site .news-head { flex-direction: column; } }

/* ---- The newsletter tile in the news grid ----------------------------------
   A block of colour among the white cards, sized by the same masonry column. */

.site .subscribe { break-inside: avoid; margin-bottom: 22px; background: var(--teal); color: #fff; border-radius: 4px; padding: 30px 26px; text-align: center; }
.site .subscribe h4 { margin: 0; color: #fff; font-size: 1.05rem; font-weight: 700; }
.site .subscribe p { margin-top: 8px; font-size: .79rem; line-height: 1.7; color: rgba(255,255,255,.9); }

.site .sub-form { margin-top: 18px; display: flex; gap: 8px; }
.site .sub-input { flex: 1; min-width: 0; padding: 11px 14px; border: 0; border-radius: 3px; font: inherit; font-size: .8rem; color: var(--ink-soft); }
.site .sub-input:focus-visible { outline: 3px solid var(--yellow); outline-offset: 2px; }
.site .sub-form button { width: 44px; flex: none; padding: 0; border: 0; border-radius: 3px; background: #fff; color: var(--teal); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background .22s ease, color .22s ease; }
.site .sub-form button:hover:not(:disabled) { background: var(--yellow); color: var(--teal-abyss); }
.site .sub-form button:disabled { opacity: .6; cursor: not-allowed; }
.site .sub-form .ga-icon { width: 14px; }

.site .sub-note { margin-top: 12px; font-size: .68rem; line-height: 1.6; color: rgba(255,255,255,.75); }
.site .sub-note--said { color: #fff; font-weight: 600; }
.site .sub-note--wrong { color: var(--yellow); font-weight: 600; }

/* The honeypot: off the screen rather than display:none, which some scripts skip. */
.site .sub-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* Present for a screen reader, absent for everyone else. */
.site .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* The partner wall's "Load More", centred under the rows it extends. */
.site .more-wrap { margin-top: 30px; text-align: center; }
