/* =========================================================================
   Veygo Brand 2026  (V2)

   Design system for the template-brand26-* page templates. Built against the
   Figma export "Veygo Website Brand Update".

   Scoping: `.b26-body` on <body> (header and footer chrome), `.b26-page` on
   <main> (page sections). Only enqueued when a brand26 template is active, so
   nothing here reaches the rest of the site.

   Two things bite repeatedly and are worth knowing before editing:

   1. Generic element resets are wrapped in :where() so they carry zero
      specificity. Written plainly, `.b26-page a { color: inherit }` outranks
      any single-class component rule and silently kills button colours.
   2. Several theme SVGs paint with inline style="fill:…" attributes, which
      beat any selector. Those need !important, and each case is commented.
   ========================================================================= */

/* -------------------------------------------------------------------------
   1. Fonts
   ---------------------------------------------------------------------- */

@font-face {
	font-family: 'Momo Trust Display';
	src: url('fonts/MomoTrustDisplay-Regular.ttf') format('truetype');
	font-weight: 400;
	font-style: normal;
	font-display: swap;
}

@font-face {
	font-family: 'Momo Trust Sans';
	src: url('fonts/MomoTrustSans-Variable.ttf') format('truetype-variations');
	font-weight: 200 800;
	font-style: normal;
	font-display: swap;
}

/* -------------------------------------------------------------------------
   2. Tokens

   Names are the brand's own, from the Veygo brand guidelines page.
   ---------------------------------------------------------------------- */

.b26-body {
	/* Palette, from the "Joe x Anthony" Figma style guide (2026-08-13).
	   Sunshine Yellow is taken from the swatch hex; the RGB label beside it in
	   Figma reads 254 221 0 (#FEDD00), which is a different colour. Queried
	   with design — if the RGB is authoritative, this one token changes. */
	--b26-deep-green: #032b33;
	--b26-turquoise: #00ffe5;
	--b26-mint-white: #effffc;
	--b26-sunshine: #fbfd00;
	--b26-plum: #200c1d;
	--b26-pink: #ffb0f3;
	--b26-danger: #e03b3b;

	--b26-green-70: rgba(3, 43, 51, 0.7);
	--b26-green-12: rgba(3, 43, 51, 0.12);
	--b26-white-72: rgba(239, 255, 252, 0.72);
	--b26-white-30: rgba(239, 255, 252, 0.3);

	/* Type */
	--b26-display: 'Momo Trust Display', 'graphie', 'Segoe UI', system-ui, sans-serif;
	--b26-sans: 'Momo Trust Sans', 'Metropolis Regular', 'Segoe UI', system-ui, -apple-system, sans-serif;

	/* Tracking is specified as a percentage in Figma: Display -4%, Sans -2%. */
	--b26-track-display: -0.04em;
	--b26-track-sans: -0.02em;

	/* Layout. Breakpoint spec: section padding 124 / 96 / 56, side padding
	   96 / 40, content capped at 1100. */
	/*
	 * V3 caps the content column at 1100 and lets the gutters take the rest:
	 * 410 either side at 1920, 170 at 1440. Below 1024 the cap stops binding
	 * and the gutter alone sets the width, which is what V3's 1024/900/760
	 * frames show (viewport minus twice the gutter).
	 *
	 * This was 1440px flat, which gave a 1248 content column - 148 too wide at
	 * every desktop size.
	 */
	/*
	 * Trustpilot's own green, used only for the hero rating line on the Deep
	 * Green heroes. Not a Veygo brand colour, which is why it is named for what
	 * it is rather than added to the palette above.
	 */
	--b26-trustpilot-green: #00B67A;

	--b26-max: calc(1100px + 2 * var(--b26-gutter));
	/*
	 * V3 steps this rather than ramping it smoothly: the 390 and 560 homepage
	 * frames sit on 20px, the 560/760 breakpoint frames on 40px, and 900+ on
	 * 96px. The clamp covers 560 upwards; phones take the override below.
	 */
	/*
	 * Stepped, not fluid. V3's frames set 96 at 1920, 1440, 1024 and 900, then
	 * 40 at 760 and below - so a 5vw ramp undershot the middle badly (51 at
	 * 1024, 45 at 900, against the 96 the design draws). The 20 under 560 is the
	 * client's own instruction, not V3, and stays where it is further down.
	 */
	--b26-gutter: 96px;
	--b26-nav-inset: clamp(12px, 2.9vw, 56px);
	--b26-nav-h: 64px;
	/* On .b26-body, not .b26-header: the drawer is a sibling of the header and
	   needs the same value to line its logo and close button up with the
	   closed state. Scoped to the header it was undefined there, which made the
	   whole padding declaration invalid and collapsed it to zero. */
	--b26-nav-pad: 16px;
	/* The cover finder, steps and several other blocks share this width. */
	--b26-block: 1100px;

	/* Shape */
	--b26-radius-band: 56px;
	--b26-radius-card: 16px;
	--b26-radius-lg: 32px;

	/*
	 * The "O" is the Veygo logo's O, not a circle: 10 units wide by 9.5 tall.
	 * Every O-shape sets its width and derives height from this, so they all
	 * match and can be butted edge to edge without overlapping.
	 */
	--b26-o-ratio: 0.95;

	--b26-section-y: clamp(56px, 6.5vw, 124px);

	/*
	 * Content rhythm, from the "Spacing Rules for Typography & Content
	 * Hierarchy" notes in Figma:
	 *   heading -> the text under it        20px
	 *   text -> the next block (card, CTAs) 40px
	 *   badge -> heading                    40px
	 * Every section used its own ad-hoc value before, ranging from 6px to 72px.
	 */
	--b26-gap-title: 20px;
	--b26-gap-block: 40px;

	/*
	 * Shared hero floor. Hero height was previously whatever the copy made it,
	 * so Learner, New Driver and Temporary each landed at a different height
	 * and the band jumped when moving between them.
	 *
	 * The 57vw ramp this used to carry is gone. It was sized against a 551px
	 * copy column; at V3's 771 every one of the four headlines wraps to the same
	 * number of lines, so the heroes come out identical on their own - 974 at
	 * 1920, 902 at 1600, 861 at 1440 - and the ramp was doing nothing but adding
	 * 120px of empty band at the top of the range, against V3's 968.
	 *
	 * What is left is a plain floor for a hero whose copy is genuinely short.
	 *
	 * min-height, not height: a page whose copy legitimately runs longer still
	 * grows rather than clipping.
	 */
	--b26-hero-min: 820px;

	/* Nav colours, flipped per hero by the modifiers in section 7. */
	/*
	 * Nav glow, per the 25 August feedback. White at 7.5% lifts the bar off
	 * dark content and disappears against light, which is the intent: keep it
	 * legible wherever it happens to be sitting.
	 */
	--b26-nav-glow: 0 8px 16px 0 rgb(255 255 255 / 5%);
	/*
	 * Deliberately unset by default. The mobile bar is painted only where a
	 * template has declared what colour its hero actually is; everywhere else
	 * it falls back to transparent and blends with whatever is behind it.
	 */
	--b26-nav-bg: var(--b26-deep-green);
	--b26-nav-fg: var(--b26-mint-white);
	--b26-nav-pill-bg: var(--b26-mint-white);
	--b26-nav-pill-fg: var(--b26-deep-green);
}

/* Coloured-section components soften on small screens: 56px desktop, 32px
   mobile. Set on the token so bands, cards and media all follow together. */
@media (max-width: 767px) {
	.b26-body {
		--b26-radius-band: 32px;
	}
}

/* -------------------------------------------------------------------------
   3. Base
   ---------------------------------------------------------------------- */

.b26-body {
	margin: 0;
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
	font-family: var(--b26-sans);
	/* P: 20/120% desktop, 18/120% mobile. */
	font-size: clamp(18px, 1.04vw, 20px);
	line-height: 1.2;
	letter-spacing: var(--b26-track-sans);
	-webkit-font-smoothing: antialiased;
	/* clip, never hidden: hidden forces overflow-y to auto and creates a
	   nested scroll container that swallows the first wheel gesture. */
	overflow-x: hidden;
	overflow-x: clip;
	overflow-anchor: none;
}

/*
 * The clip has to be on <html> too, not just <body>.
 *
 * On a real phone the document element is what scrolls, and with overflow-x
 * visible there it still panned into whitespace even though body was clipping:
 * html.scrollWidth measured 638 against a 390 viewport. clip rather than hidden
 * for the same reason as above, and because hidden on <html> would break the
 * sticky header.
 */
html:has(> .b26-body) {
	overflow-x: clip;
}

/*
 * Pin the drawer to the viewport rather than the initial containing block.
 *
 * It is position: fixed with inset: 0, which should be 390 wide on a phone. It
 * measured 638, because the trust ribbon's horizontally scrolling content is
 * 935 wide and that expands the ICB a fixed element sizes against - so the
 * drawer inherited the overflow and then became the thing keeping the document
 * wide. 100vw is the viewport regardless of what the content does.
 */
.b26-drawer {
	max-width: 100vw;
}

.b26-page *,
.b26-body .b26-header *,
.b26-body .b26-footer * {
	box-sizing: border-box;
}

.b26-page img,
.b26-body .b26-header img,
.b26-body .b26-footer img {
	max-width: 100%;
	height: auto;
	display: block;
}

/* :where() keeps these at zero specificity. See the header comment. */
:where(.b26-page) :where(h1, h2, h3, h4, p, ul, ol, figure, blockquote) {
	margin: 0;
}

:where(.b26-page) :where(ul, ol) {
	padding: 0;
	list-style: none;
}

:where(.b26-page) :where(a) {
	color: inherit;
}

.b26-sr {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	border: 0;
}

.b26-skip {
	position: absolute;
	top: -100px;
	left: 16px;
	z-index: 100;
	padding: 14px 22px;
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	border-radius: 999px;
	text-decoration: none;
	font-family: var(--b26-display);
}

.b26-skip:focus {
	top: 16px;
}

.b26-body :focus-visible {
	outline: 3px solid var(--b26-deep-green);
	outline-offset: 3px;
	border-radius: 4px;
}

.b26-section--dark :focus-visible,
.b26-hero--dark :focus-visible,
.b26-header :focus-visible {
	outline-color: var(--b26-turquoise);
}

/* -------------------------------------------------------------------------
   4. Layout
   ---------------------------------------------------------------------- */

.b26-wrap {
	width: 100%;
	max-width: var(--b26-max);
	margin: 0 auto;
	padding: 0 var(--b26-gutter);
}

@media (max-width: 899px) {
	.b26-body {
		--b26-gutter: 40px;
	}
}

.b26-block {
	width: 100%;
	max-width: var(--b26-block);
	margin: 0 auto;
}

.b26-section {
	position: relative;
	padding: var(--b26-section-y) 0;
}

/*
 * Legacy Gutenberg pages only.
 *
 * The old header opened <main id="wrapper" class="flex flex-col gap-16
 * lg:gap-32">. 52 of the 68 ACF block renders set no vertical margin of their
 * own and took 100% of their inter-section spacing from that gap, so without
 * this every legacy page collapses into one unbroken run of sections.
 *
 * Deliberately NOT on plain .b26-page: brand26 templates compose partials that
 * manage their own padding, and a gap here would double it.
 */
.b26-page--legacy {
	display: flex;
	flex-direction: column;
	gap: 4rem;
}

@media (min-width: 1024px) {
	.b26-page--legacy {
		gap: 8rem;
	}
}

/* Full-bleed colour bands. The radius on a 100%-wide element is what makes
   the notched corners in the mockups, so the band itself is not inset. */
.b26-band {
	border-radius: var(--b26-radius-band);
}

.b26-band--top {
	border-radius: var(--b26-radius-band) var(--b26-radius-band) 0 0;
}

.b26-band--bottom {
	border-radius: 0 0 var(--b26-radius-band) var(--b26-radius-band);
}

.b26-section--turquoise {
	background: var(--b26-turquoise);
}

.b26-section--dark {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
}

.b26-section--plum {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
}

.b26-section--pink {
	background: var(--b26-pink);
	color: var(--b26-plum);
}

/* -------------------------------------------------------------------------
   5. Typography
   ---------------------------------------------------------------------- */

/*
 * Scale is straight from the Figma style guide, stated as size/line-height%.
 *
 *            desktop      mobile
 *   H1       96 / 100     52 / 100
 *   H2       80 / 100     48 / 100
 *   H3       40 / 100     32 / 100
 *   H4       24 / 100     22 / 100
 *   H5       20 / 100     18 / 100
 *   CTA      24 / 100     20 / 100
 *   FAQ Q    24 / 120
 *   P Head   30 / 35      20 / 120
 *   P        20 / 120     18 / 120
 *   List     18 / 120     16 / 120
 *
 * Each clamp runs from the mobile value to the desktop value, with the vw
 * term set so the maximum lands at a 1920px viewport (desktop px / 19.2).
 *
 * P Head's desktop "30/35%" is the one value taken literally rather than as a
 * percentage: 35% of 30px would be 10.5px, i.e. lines on top of each other.
 * Read as 30px/35px, a ratio of 1.167. Queried with design.
 */
.b26-page h1,
.b26-page h2,
.b26-page h3,
.b26-page h4,
.b26-display {
	font-family: var(--b26-display);
	font-weight: 400;
	letter-spacing: var(--b26-track-display);
}

.b26-h1 {
	font-size: clamp(49px, 5vw, 96px);
	line-height: 1;
}

.b26-h2 {
	font-size: clamp(48px, 4.17vw, 80px);
	line-height: 1;
}

.b26-h3 {
	font-size: clamp(32px, 2.08vw, 40px);
	line-height: 1;
}

.b26-h4 {
	font-size: clamp(22px, 1.25vw, 24px);
	line-height: 1;
}

.b26-h5 {
	font-size: clamp(18px, 1.04vw, 20px);
	line-height: 1;
}

/*
 * Standfirst / paragraph heading.
 *
 * 120%, like every other text style. The spec card reads "30/35%", which I had
 * taken literally as 30px/35px; design have confirmed it should be 1.2.
 */
.b26-lead {
	font-size: clamp(20px, 1.56vw, 30px);
	line-height: 1.2;
}

.b26-body-copy {
	font-size: clamp(18px, 1.04vw, 20px);
	line-height: 1.2;
}

.b26-list-copy {
	font-size: clamp(16px, 0.94vw, 18px);
	line-height: 1.2;
}

/*
 * Sunshine Yellow text highlight.
 *
 * Geometry is from the brand guidelines: the bar occupies the LOWER HALF of
 * the x-height and sits on the baseline, so its top edge runs through the
 * counters of the letters.
 *
 * Momo Trust Display metrics per em: x-height 0.57, ascent 1.025,
 * descent 0.275. The background box of an inline element is its content box,
 * height 1.3em, so:
 *   bar height = 0.57 / 2          = 0.285em
 *   baseline   = 1.025em from top
 *   bar top    = 1.025 - 0.285     = 0.74em
 *
 * Brand rule: Sunshine Yellow only, on Turquoise or Mint White, behind Deep
 * Green copy. Never in the same section as kinetic type animations.
 */
.b26-mark {
	display: inline;
	background-image: linear-gradient(var(--b26-sunshine), var(--b26-sunshine));
	background-repeat: no-repeat;
	background-size: 100% 0.285em;
	background-position: 0 0.74em;
}

.b26-accent {
	color: var(--b26-turquoise);
}

/* -------------------------------------------------------------------------
   6. Buttons
   ---------------------------------------------------------------------- */

.b26-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	font-family: var(--b26-display);
	/* CTA: 24/100% desktop, 20/100% mobile. Padding 15px vertical, 55px
	   horizontal, maximum corner radius. */
	font-size: clamp(20px, 1.25vw, 24px);
	line-height: 1;
	letter-spacing: var(--b26-track-display);
	text-decoration: none;
	padding: 15px 55px;
	border-radius: 999px;
	border: 2px solid transparent;
	cursor: pointer;
	transition: background-color 0.18s ease, color 0.18s ease, border-color 0.18s ease;
	white-space: nowrap;
}

.b26-btn--green {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	border-color: var(--b26-deep-green);
}

.b26-btn--green:hover {
	background: transparent;
	color: var(--b26-deep-green);
}

.b26-btn--white {
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
	border-color: var(--b26-mint-white);
}

.b26-btn--white:hover {
	background: transparent;
	color: var(--b26-mint-white);
}

.b26-btn--turquoise {
	background: var(--b26-turquoise);
	color: var(--b26-deep-green);
	border-color: var(--b26-turquoise);
}

.b26-btn--turquoise:hover {
	background: transparent;
	color: var(--b26-turquoise);
}

/*
 * The Poppy Pink cards - "Two ways to pay" and the cross-sell - carry Dark
 * Plum pills, not Deep Green. Deep Green on Poppy Pink is the one brand pairing
 * the design never uses.
 */
.b26-btn--plum {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
	border-color: var(--b26-plum);
}

.b26-btn--plum:hover {
	background: transparent;
	color: var(--b26-plum);
}

.b26-btn--outline-plum {
	background: transparent;
	color: var(--b26-plum);
	border-color: var(--b26-plum);
}

.b26-btn--outline-plum:hover {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
}

.b26-btn--outline-green {
	background: transparent;
	color: var(--b26-deep-green);
	border-color: var(--b26-deep-green);
}

.b26-btn--outline-green:hover {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
}

.b26-btn--outline-white {
	background: transparent;
	color: var(--b26-mint-white);
	border-color: var(--b26-mint-white);
}

.b26-btn--outline-white:hover {
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
}

.b26-btns {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
}

/*
 * Mobile CTAs are full width per the style guide. Scoped to .b26-btns so it
 * only affects buttons in a deliberate CTA group, not every inline .b26-btn
 * (nav pill, drawer, carousel controls), which would otherwise stretch.
 */
@media (max-width: 767px) {
	.b26-btns {
		width: 100%;
	}

	.b26-btns .b26-btn {
		width: 100%;
		padding-left: 24px;
		padding-right: 24px;
	}
}

/* -------------------------------------------------------------------------
   7. Header
   ---------------------------------------------------------------------- */

.b26-header {
	position: sticky;
	top: 0;
	z-index: 50;
	/*
	 * The pull-up must equal the header's real height, so both read
	 * --b26-nav-pad. It is declared on .b26-body rather than here, so the
	 * drawer inherits the same value and its logo and close button land exactly
	 * where the closed header's do. Re-declaring it here shadowed the mobile
	 * override and put the two states 4px apart vertically.
	 */
	padding: var(--b26-nav-pad) var(--b26-nav-inset) 0;
	/* Pull the page up so the hero sits behind the floating pill. */
	margin-bottom: calc((var(--b26-nav-h) + var(--b26-nav-pad)) * -1);
}

/* Deep Green hero gets the light pill; Turquoise and Mint White heroes get
   the dark one. Past the hero every page is Mint White, so .is-scrolled
   forces the dark pill back. */
.b26-header--on-dark {
	/* Turquoise pill on the Deep Green hero, per the 1 September frames. */
	--b26-nav-bg: var(--b26-turquoise);
	--b26-nav-fg: var(--b26-deep-green);
	--b26-nav-pill-bg: var(--b26-deep-green);
	--b26-nav-pill-fg: var(--b26-mint-white);
}

/* Painted to match the hero, per the templates that declare one. */
.b26-header--on-turquoise {
	--b26-nav-top-bg: var(--b26-turquoise);
}

.b26-header--on-deep-green {
	--b26-nav-top-bg: var(--b26-deep-green);
}

.b26-header.is-scrolled {
	--b26-nav-bg: var(--b26-deep-green);
	--b26-nav-fg: var(--b26-mint-white);
	--b26-nav-pill-bg: var(--b26-mint-white);
	--b26-nav-pill-fg: var(--b26-deep-green);
}

/*
 * On a Deep Green hero the bar is the same colour as what is behind it, so the
 * glow just draws a halo around nothing. It earns its keep once the page has
 * scrolled and the bar is floating over content, which is when .is-scrolled
 * turns it back on.
 */
.b26-header--on-dark:not(.is-scrolled) .b26-nav {
	box-shadow: none;
}

.b26-nav {
	display: flex;
	align-items: center;
	gap: 28px;
	height: var(--b26-nav-h);
	padding: 0 8px 0 24px;
	background: var(--b26-nav-bg);
	color: var(--b26-nav-fg);
	border-radius: 999px;
	box-shadow: var(--b26-nav-glow);
	transition: background-color 0.25s ease, color 0.25s ease;
}

.b26-nav__logo {
	display: flex;
	align-items: center;
	flex: none;
	width: 128px;
	color: var(--b26-nav-fg);
}

.b26-nav__logo svg {
	width: 100%;
	height: auto;
	/*
	 * The artwork fills its viewBox almost exactly: the descenders of the y and
	 * the g bottom out at 39.90 of 40 units, which is under a tenth of a pixel
	 * of headroom once scaled into the bar. Clipping rounded that away at some
	 * widths and shaved the tails, which is what the client spotted. Nothing
	 * here needs cropping, so let it paint.
	 */
	overflow: visible;
}

/* Forced: the site logo SVG paints with inline fill attributes, and the mark
   has to flip with the pill on Deep Green heroes. */
.b26-nav__logo svg,
.b26-nav__logo svg *,
.b26-drawer__logo svg,
.b26-drawer__logo svg * {
	fill: currentColor !important;
}

.b26-nav__primary {
	display: flex;
	align-items: center;
	gap: 30px;
	margin: 0 auto;
}

.b26-nav__item {
	position: relative;
}

/* A button, not a link: it only discloses the mega panel. Reset the UA button
   styling back to the nav's own type. */
.b26-nav__link {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: inherit;
	font-size: 1rem;
	line-height: inherit;
	color: inherit;
	background: none;
	border: 0;
	padding: 6px 0;
	margin: 0;
	cursor: pointer;
	text-decoration: none;
	white-space: nowrap;
	position: relative;
}

/* Underline grows from the centre, and stays put while the panel is open so
   it is always obvious which panel you are looking at. */
.b26-nav__link::after {
	content: '';
	position: absolute;
	left: 0;
	right: 0;
	bottom: -2px;
	height: 2px;
	background: currentColor;
	border-radius: 2px;
	transform: scaleX(0);
	transition: transform 0.22s ease;
}

.b26-nav__link:hover::after,
.b26-nav__link[aria-expanded='true']::after {
	transform: scaleX(1);
}

.b26-nav__chev {
	display: inline-flex;
	width: 14px;
	height: 14px;
	flex: none;
	transition: transform 0.22s ease;
}

.b26-nav__chev svg {
	width: 100%;
	height: 100%;
	stroke-width: 2.25;
}

.b26-nav__link[aria-expanded='true'] .b26-nav__chev {
	transform: rotate(180deg);
}

/* -------------------------------------------------------------------------
   Mega menu

   One shared panel for all three products. Anchored to .b26-header, which is
   position:sticky and therefore already a containing block, so it spans
   exactly the nav pill's width and sits in one place whichever trigger is
   active.
   ---------------------------------------------------------------------- */

/* Centred under the three nav triggers, not on the pill or the viewport:
   the triggers sit off-centre because the logo and the utils either side are
   different widths. brand26.js measures .b26-nav__primary and writes its
   centre to --b26-mega-x, clamped so the panel cannot run off either edge.
   The fallback keeps it pinned to the pill's left edge if JS never runs. */
.b26-mega {
	position: absolute;
	top: 100%;
	left: var(--b26-mega-x, var(--b26-nav-inset));
	/* Capped rather than stretched the full nav width. The groups stack, so
	   the panel only needs to be as wide as its widest row (the five duration
	   chips). Stretching it left a large dead area on the right. */
	width: min(890px, calc(100% - var(--b26-nav-inset) * 2));
	margin-top: 12px;
	z-index: 1;
	background: var(--b26-nav-bg);
	color: var(--b26-nav-fg);
	border-radius: 28px;
	/* Less at the bottom: the last row of links carries its own descender
	   space, so an even 28px read as too deep. */
	padding: 28px 28px 14px;
	opacity: 0;
	visibility: hidden;
	transform: translateY(-8px);
	transition: opacity 0.22s ease, transform 0.22s ease, visibility 0.22s;
}

/* brand26.js adds this once it has measured and written --b26-mega-x, so the
   panel stays sanely left-anchored if the script never runs. The -50% and the
   open animation share one transform, so every rule below repeats both. */
.b26-mega--centred {
	transform: translateX(-50%) translateY(-8px);
}

.b26-mega[hidden] {
	/* The attribute is only there so the panel is inert before JS runs.
	   Presentation is driven by .is-open, so override the UA display:none. */
	display: block;
}

.b26-mega.is-open {
	opacity: 1;
	visibility: visible;
	transform: none;
}

.b26-mega--centred.is-open {
	transform: translateX(-50%);
}

/* Invisible bridge across the 12px gap, so moving the pointer down from a
   trigger never crosses dead space. */
.b26-mega::before {
	content: '';
	position: absolute;
	left: 0;
	right: 0;
	top: -16px;
	height: 16px;
}

/*
 * Closed state must be genuinely inert.
 *
 * The container sets visibility:hidden when closed, but visibility is one of
 * the few inherited properties a descendant can override — and
 * .b26-mega__panel.is-active does exactly that, setting visibility:visible and
 * pointer-events:auto. Combined with the container's opacity:0 (which does NOT
 * block hit-testing) that left the active panel's links invisible but still
 * hoverable, clickable and in the tab order: you would get a pointer cursor
 * and title tooltips over empty page.
 *
 * brand26.js also toggles the `inert` attribute, which covers focus and the
 * accessibility tree. These rules are the CSS half of the same guarantee.
 */
.b26-mega:not(.is-open) {
	pointer-events: none;
}

.b26-mega:not(.is-open) .b26-mega__panel {
	visibility: hidden;
	pointer-events: none;
}

/* Grid-stacked so all three panels share one cell. The container takes the
   height of the tallest once and never animates its size. */
.b26-mega__inner {
	display: grid;
}

.b26-mega__panel {
	grid-area: 1 / 1;
	display: grid;
	/* 240px rather than 200: the image sets the floor for the shorter panels,
	   so a taller square leaves less dead space under Learner while Temporary
	   (the tallest) still drives the container height. */
	grid-template-columns: 240px minmax(0, 1fr);
	gap: 28px;
	align-items: start;
	opacity: 0;
	visibility: hidden;
	transform: translateY(6px);
	transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
	pointer-events: none;
}

.b26-mega__panel.is-active {
	opacity: 1;
	visibility: visible;
	transform: none;
	pointer-events: auto;
	transition-delay: 0.06s;
}

.b26-mega__media {
	aspect-ratio: 1;
	border-radius: 16px;
	overflow: hidden;
	background: rgba(127, 127, 127, 0.18);
}

.b26-mega__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Lead sits above the groups, and the groups stack. With a capped panel width
   this reads as one column of content beside the image, rather than content
   strung out across a wide bar. */
.b26-mega__body {
	display: flex;
	flex-direction: column;
	gap: 18px;
	padding-top: 2px;
}

/* Groups stack by default. A group marked width:auto shrinks to its content
   so consecutive auto groups share a row — the vehicle types and the
   "or whoever you are" column sit side by side. */
.b26-mega__groups {
	display: flex;
	flex-wrap: wrap;
	gap: 22px 36px;
}

.b26-mega__group--full {
	flex: 0 0 100%;
}

.b26-mega__group--auto {
	flex: 0 1 auto;
}

.b26-mega__lead {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	/* Shrink to content, otherwise it stretches and the arrow is pushed away
	   from the label. */
	align-self: flex-start;
	font-family: var(--b26-display);
	font-size: 1.375rem;
	line-height: 1.1;
	text-decoration: none;
}

.b26-mega__lead svg {
	width: 20px;
	height: 20px;
	flex: none;
	stroke-width: 2;
	transition: transform 0.2s ease;
}

.b26-mega__lead:hover svg {
	transform: translateX(4px);
}


.b26-mega__intro,
.b26-mega__heading {
	font-size: 0.9375rem;
	opacity: 0.72;
	margin-bottom: 10px;
}

/* Inline link inside a group heading, e.g. "young drivers". Underlined so it
   is not colour-only, since the heading is already a muted tone. */
.b26-mega__heading-link {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}

.b26-mega__heading-link:hover {
	color: var(--b26-turquoise);
}

.b26-mega__links {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* Sentence-length labels: vertical rows that read as a continuation of the
   intro line above them. */
.b26-mega__links--list {
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.b26-mega__links--list a {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	align-self: flex-start;
	padding: 7px 12px;
	margin-left: -12px;
	border-radius: 10px;
	font-size: 1.0625rem;
	text-decoration: none;
	transition: background-color 0.18s ease;
}

.b26-mega__links--list a:hover {
	background: rgba(127, 127, 127, 0.18);
}

.b26-mega__links--list svg {
	width: 16px;
	height: 16px;
	flex: none;
	stroke-width: 2;
	opacity: 0;
	transform: translateX(-4px);
	transition: opacity 0.18s ease, transform 0.18s ease;
}

.b26-mega__links--list a:hover svg {
	opacity: 1;
	transform: none;
}

/* Vehicle types: icon beside label, two columns. Capped and tightened so six
   items stay a compact block rather than stretching across the panel. */
.b26-mega__links--icons {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0 4px;
	max-width: 330px;
}

.b26-mega__links--icons a {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	padding: 6px 10px;
	margin-left: -10px;
	border-radius: 10px;
	font-size: 1rem;
	text-decoration: none;
	transition: background-color 0.18s ease;
}

.b26-mega__links--icons a:hover {
	background: rgba(127, 127, 127, 0.18);
}

.b26-mega__icon {
	display: inline-flex;
	width: 20px;
	height: 20px;
	flex: none;
}

.b26-mega__icon svg {
	width: 100%;
	height: 100%;
}

/* Short labels (ages, durations) as a wrapping row of pills. */
.b26-mega__links--chips {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

.b26-mega__links--chips a {
	display: inline-flex;
	align-items: center;
	padding: 9px 18px;
	border-radius: 999px;
	border: 1.5px solid currentColor;
	font-size: 1rem;
	text-decoration: none;
	transition: background-color 0.18s ease, color 0.18s ease;
}

.b26-mega__links--chips a:hover {
	background: var(--b26-nav-pill-bg);
	color: var(--b26-nav-pill-fg);
}

.b26-nav__utils {
	display: flex;
	align-items: center;
	gap: 20px;
	flex: none;
}

.b26-nav__util {
	font-size: 1rem;
	text-decoration: none;
	white-space: nowrap;
}

.b26-nav__util:hover {
	text-decoration: underline;
	text-underline-offset: 3px;
}

.b26-nav__cta,
.b26-nav__login {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: var(--b26-display);
	font-size: 0.9375rem;
	line-height: 1;
	text-decoration: none;
	padding: 14px 20px;
	border-radius: 999px;
	border: 1.5px solid currentColor;
	white-space: nowrap;
	transition: background-color 0.18s ease, color 0.18s ease;
}

.b26-nav__cta {
	color: var(--b26-nav-fg);
}

.b26-nav__cta:hover {
	background: var(--b26-nav-pill-bg);
	color: var(--b26-nav-pill-fg);
}

.b26-nav__login {
	background: var(--b26-nav-pill-bg);
	color: var(--b26-nav-pill-fg);
	border-color: var(--b26-nav-pill-bg);
}

.b26-nav__login:hover {
	background: transparent;
	color: var(--b26-nav-fg);
	border-color: var(--b26-nav-fg);
}

.b26-nav__login svg {
	width: 18px;
	height: 18px;
}

.b26-nav__burger {
	display: none;
	align-items: center;
	justify-content: center;
	/* V3: a 32px circle holding a 15px icon. */
	width: 32px;
	height: 32px;
	flex: none;
	padding: 0;
	border: 0;
	border-radius: 999px;
	/*
	 * Inverse of whatever it sits on, not the nav pill colours.
	 *
	 * On the turquoise hero the pill is Mint White, which gave a white circle
	 * on turquoise; the design has it dark there. But hardcoding Deep Green
	 * made it vanish on the Deep Green product heroes, so the dark-hero case
	 * flips it back below.
	 */
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	cursor: pointer;
}

.b26-header--on-dark .b26-nav__burger,
.b26-header.is-scrolled .b26-nav__burger {
	/*
	 * Flipped once the bar itself goes Deep Green, or the circle would be Deep
	 * Green on Deep Green and only the three bars would show.
	 */
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
}

.b26-nav__burger-bars {
	display: block;
	position: relative;
	width: 15px;
	height: 2px;
	background: currentColor;
	border-radius: 2px;
}

.b26-nav__burger-bars::before,
.b26-nav__burger-bars::after {
	content: '';
	position: absolute;
	left: 0;
	width: 15px;
	height: 2px;
	background: currentColor;
	border-radius: 2px;
}

.b26-nav__burger-bars::before {
	top: -6px;
}

.b26-nav__burger-bars::after {
	top: 6px;
}

/* Mobile drawer. Not in the mockups; built to match the system and signed
   off separately. */
.b26-drawer {
	position: fixed;
	inset: 0;
	z-index: 60;
	display: flex;
	flex-direction: column;
	/* White body with a turquoise strip behind the logo and close button. The
	   whole panel used to be Deep Green. */
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
	padding: 0;
	overflow-y: auto;
	overscroll-behavior: contain;
	opacity: 0;
	visibility: hidden;
	/*
	 * Fade only, no slide. The panel used to translate 8px on the way in and
	 * out, which read as a jump against a full-screen overlay rather than a
	 * transition. visibility is in the list so it holds until the fade
	 * finishes, keeping the closed panel properly inert.
	 */
	transition: opacity 0.18s ease, visibility 0.18s;
}

.b26-drawer.is-open {
	opacity: 1;
	visibility: visible;
}

.b26-drawer__top {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	min-height: 48px;
	/* Mint White while the menu is open, not the Turquoise of the closed bar. */
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
	/*
	 * Same inset as the closed header, not a flat 20px. The two states sit on
	 * top of each other when the menu opens, and a fixed value left the logo
	 * and the button jumping 5-6px sideways as it did.
	 */
	padding: var(--b26-nav-pad) var(--b26-nav-inset);
}

.b26-drawer__utils {
	padding-inline: var(--b26-nav-inset);
}

.b26-drawer__logo {
	/* Matches the closed bar's mark exactly, so it does not resize on open. */
	width: 133px;
	/* Sits on the turquoise strip, so it inks dark. */
	color: var(--b26-deep-green);
}

.b26-drawer__logo svg {
	width: 100%;
	height: auto;
}

.b26-drawer__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/*
	 * The same 32px circle as the burger it replaces. At 48 it grew as the
	 * menu opened, which is visible because the two sit in the same spot.
	 */
	width: 32px;
	height: 32px;
	padding: 0;
	border: 0;
	border-radius: 999px;
	flex: none;
	/*
	 * No background of its own any more: the supplied artwork IS the disc, with
	 * the cross knocked out of it so the drawer shows through. The fallback
	 * glyph below still needs the old treatment.
	 */
	background: transparent;
	color: var(--b26-mint-white);
	cursor: pointer;
}

.b26-drawer__close img {
	display: block;
	width: 32px;
	height: 32px;
}

/* Only reached if the artwork is missing and b26_icon('close') renders. */
.b26-drawer__close:not(:has(img)) {
	background: var(--b26-deep-green);
}

.b26-drawer__close svg {
	/* V3 draws the cross at 11 inside the 32 circle. */
	width: 11px;
	height: 11px;
}

/*
 * The circle is 32 because that is what V3 draws, but 32 is under the 44px
 * minimum for a touch target. This extends the tappable area to 48 without
 * changing the artwork or taking up any layout space, so the button looks like
 * the design and still hits comfortably with a thumb.
 */
.b26-nav__burger,
.b26-drawer__close {
	position: relative;
}

.b26-nav__burger::after,
.b26-drawer__close::after {
	content: '';
	position: absolute;
	inset: -8px;
	border-radius: inherit;
}

.b26-drawer__nav {
	display: flex;
	flex-direction: column;
	margin-top: 28px;
	list-style: none;
	padding: 0 var(--b26-nav-inset);
}

/* No dividers between the links: the design separates them on spacing alone. */
.b26-drawer__nav > li {
	border-bottom: 0;
}

/* Native <details> accordions, so the drawer works with no JS. Same content as
   the desktop mega panel, from the same b26_nav_panels() array. */
.b26-drawer__link {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	font-family: var(--b26-display);
	font-size: 1.5rem;
	text-decoration: none;
	padding: 18px 0;
	color: inherit;
	cursor: pointer;
	list-style: none;
}

.b26-drawer__link::-webkit-details-marker {
	display: none;
}

.b26-drawer__mark {
	display: inline-flex;
	width: 28px;
	height: 28px;
	flex: none;
	transition: transform 0.22s ease;
}

.b26-drawer__mark svg {
	width: 100%;
	height: 100%;
	stroke-width: 2.25;
}

.b26-drawer__group[open] .b26-drawer__mark {
	transform: rotate(180deg);
}

.b26-drawer__panel {
	padding: 0 0 22px;
}

.b26-drawer__lead {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 10px 0 16px;
	font-family: var(--b26-display);
	font-size: 1.125rem;
	text-decoration: none;
	color: inherit;
}

.b26-drawer__lead svg {
	width: 18px;
	height: 18px;
	flex: none;
	stroke-width: 2;
}

.b26-drawer__thumb {
	display: block;
	width: 56px;
	height: 56px;
	flex: none;
	border-radius: 12px;
	overflow: hidden;
	background: var(--b26-white-30);
}

.b26-drawer__thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.b26-drawer__intro,
.b26-drawer__heading {
	font-size: 0.9375rem;
	color: var(--b26-white-72);
	margin: 0 0 10px;
}

.b26-drawer__links {
	list-style: none;
	margin: 0 0 18px;
	padding: 0;
}

.b26-drawer__links--list {
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.b26-drawer__links--list a {
	display: block;
	padding: 9px 0;
	font-size: 1.0625rem;
	text-decoration: none;
	color: inherit;
}

.b26-drawer__links--icons {
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.b26-drawer__links--icons a {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 9px 0;
	font-size: 1.0625rem;
	text-decoration: none;
	color: inherit;
}

.b26-drawer__icon {
	display: inline-flex;
	width: 24px;
	height: 24px;
	flex: none;
}

.b26-drawer__icon svg {
	width: 100%;
	height: 100%;
}

.b26-drawer__links--chips {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

.b26-drawer__links--chips a {
	display: inline-flex;
	align-items: center;
	padding: 9px 18px;
	border-radius: 999px;
	border: 1.5px solid var(--b26-white-30);
	font-size: 1rem;
	text-decoration: none;
	color: inherit;
}

.b26-drawer__utils {
	display: flex;
	flex-direction: column;
	gap: 12px;
	margin-top: 32px;
	padding-bottom: 24px;
}

.b26-drawer__utils .b26-btn {
	width: 100%;
}

/*
 * Stacked, not a row: these now read as two more entries in the same list as
 * the product links above, just in a lighter weight.
 */
.b26-drawer__util-links {
	display: flex;
	flex-direction: column;
	gap: 0;
	margin-top: 0;
	margin-bottom: 24px;
}

.b26-drawer__util-links a {
	font-size: 1.125rem;
	text-decoration: none;
	color: var(--b26-deep-green);
	padding: 14px 0;
}

.b26-drawer__login {
	gap: 8px;
}

.b26-drawer__login svg {
	width: 18px;
	height: 18px;
}

@media (max-width: 1180px) {
	.b26-nav__primary {
		display: none;
	}

	/*
	 * The utility group stays, but only the quote CTA shows: Help, Start a
	 * claim and Log in are all in the drawer on mobile. Keeping the container
	 * rather than moving the button in the markup leaves desktop untouched.
	 */
	.b26-nav__utils > *:not(.b26-nav__cta) {
		display: none;
	}

	/*
	 * Pushed right so the CTA pairs with the burger rather than floating in
	 * the middle: the auto margin takes all the slack, leaving the mark on the
	 * left and the two controls together on the right.
	 */
	.b26-nav__utils {
		gap: 0;
		margin-left: auto;
	}

	/*
	 * Compact enough to sit between the mark and the burger on a small phone,
	 * and Mint White by default like the mark beside it.
	 *
	 * It used to take --b26-nav-fg, which is the DESKTOP pill's foreground: on
	 * a Deep Green hero that is Deep Green, so the button was Deep Green on a
	 * Deep Green bar and invisible until the page scrolled.
	 */
	.b26-nav__cta {
		font-size: 0.875rem;
		padding: 10px 16px;
		border-width: 1px;
		/*
		 * Deep Green by default, which is what the light pages need: the blog
		 * and the article templates leave the bar unpainted, so it sits on Mint
		 * White and a Mint White button is invisible there. The painted bars
		 * flip it back below.
		 */
		color: var(--b26-deep-green);
	}

	.b26-header--on-deep-green .b26-nav__cta,
	.b26-header.is-scrolled .b26-nav__cta {
		color: var(--b26-mint-white);
	}

	/* Below this the drawer accordions carry the same content. */
	.b26-mega,
	.b26-mega[hidden] {
		display: none;
	}

	/*
	 * A full-width rectangle, not the desktop pill: Turquoise over the hero,
	 * Deep Green once past it. The header loses its own inset so the bar can
	 * reach both edges, and the 20px lives inside the bar instead, matching
	 * the page gutter.
	 */
	.b26-header {
		padding-left: 0;
		padding-right: 0;
		padding-top: 0;
		margin-bottom: calc(var(--b26-nav-h) * -1);
	}

	/*
	 * Transparent on load, so the bar takes whatever hero sits behind it and
	 * blends exactly, whatever colour that page uses. It only becomes a bar
	 * once .is-scrolled fires and it is floating over content, which is the
	 * point at which it needs to separate. The glow follows the same rule.
	 *
	 * Painting a token colour here instead meant every hero had to be mirrored
	 * in that token, and any page whose hero did not match got a visible band.
	 */
	.b26-nav {
		justify-content: space-between;
		background: var(--b26-nav-top-bg, transparent);
		box-shadow: none;
		padding: 0 20px;
		border-radius: 0;
		color: var(--b26-mint-white);
		/* Just enough to separate the CTA from the burger beside it. */
		gap: 12px;
	}

	/* The open drawer's bar sits exactly where the closed one did. */
	.b26-drawer__top {
		min-height: var(--b26-nav-h);
		padding: 0 20px;
	}

	/*
	 * Over the Turquoise header the mark is Deep Green, per the supplied
	 * artwork, and the burger's stripes pick up the Turquoise behind it. Once
	 * scrolled onto the Deep Green bar both flip, below.
	 */
	.b26-header:not(.is-scrolled):not(.b26-header--on-dark) .b26-nav__logo,
	.b26-header:not(.is-scrolled):not(.b26-header--on-dark) .b26-nav__cta {
		color: var(--b26-deep-green);
	}

	.b26-header:not(.is-scrolled):not(.b26-header--on-dark) .b26-nav__burger {
		color: var(--b26-turquoise);
	}

	/*
	 * Both on .b26-body, not on .b26-header. The drawer is a sibling of the
	 * header, not a child, so anything declared on the header does not reach
	 * it: --b26-nav-h fell back to the 64px desktop value there and the logo
	 * sat 9px lower with the menu open than with it closed.
	 */
	.b26-body {
		--b26-nav-pad: 20px;
		/*
		 * 72, per the "Nav bar - inside/after the header section" frames. The
		 * bar sits flush to the top of the viewport and the height is what
		 * gives the logo and burger their 20px above and below; at 48 they were
		 * pinned near the top edge.
		 */
		--b26-nav-h: 72px;
	}

	.b26-header.is-scrolled .b26-nav {
		background: var(--b26-deep-green);
		box-shadow: var(--b26-nav-glow);
	}

	/* Mint White in both states: over the Turquoise hero and on the Deep Green. */
	.b26-nav__logo {
		color: var(--b26-mint-white);
		/* V3 draws the mark 133 wide in the mobile bar. */
		width: 133px;
	}

	.b26-nav__burger {
		display: inline-flex;
	}
}

/* -------------------------------------------------------------------------
   8. Hero

   V2: the Homepage hero is Veygo Turquoise with a Deep Green disc. Product
   pages are Deep Green with a Turquoise disc. Both carry a Trustpilot badge
   above the headline.
   ---------------------------------------------------------------------- */

.b26-hero .b26-wrap {
	max-width: calc(1400px + 2 * var(--b26-gutter));
}

.b26-hero {
	position: relative;
	/*
	 * 144 + the headline's own 40px margin puts the h1 at 184, which is where
	 * every one of the 2 September frames pins it.
	 */
	padding: 144px 0 clamp(64px, 7vw, 120px);
	min-height: var(--b26-hero-min);
	display: flex;
	flex-direction: column;
	/*
	 * Top-aligned, not centred. Centring inside the min-height meant a page with
	 * shorter copy pushed its headline down - the four heroes started their h1
	 * anywhere between 191 and 241, where the design pins them all to the same
	 * line. Any slack now falls below the content instead.
	 */
	justify-content: flex-start;
	overflow: hidden;
	overflow: clip;
}

.b26-hero--turquoise {
	background: var(--b26-turquoise);
	--b26-hero-disc: var(--b26-deep-green);
}

.b26-hero--dark {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	--b26-hero-disc: var(--b26-turquoise);
}

.b26-hero--dark .b26-hero__title {
	color: var(--b26-turquoise);
}

.b26-hero__grid {
	position: relative;
	z-index: 2;
	display: grid;
	/*
	 * Tracks, not proportions. V3 gives the hero copy 771 and the art 556 with
	 * 73 between, across a 1400 container - wider than the 1100 the sections
	 * below use, which is why .b26-hero .b26-wrap carries its own cap.
	 */
	grid-template-columns: minmax(0, 1fr) 556px;
	gap: 73px;
	/*
	 * Start, so the copy column does not float against the taller art column
	 * and every hero begins its headline on the same line. The art itself opts
	 * back into centring below - the frames sit the photos on the hero's middle,
	 * not its top.
	 */
	align-items: start;
}

/* Trustpilot badge above the headline. */
/*
 * The Trustpilot line sits between the tick list and the buttons, on every page
 * and both breakpoints. It used to lead the column on desktop; the 2 September
 * frames move it down on the homepage as well as the product pages.
 *
 * The copy column is a flex column so `order` can place it without moving the
 * markup, which keeps the reading order sensible for screen readers.
 */
.b26-hero__copy {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
}

.b26-hero__badge {
	order: 4;
	display: inline-flex;
	align-items: center;
	gap: 8px;
	/*
	 * No container. The Mint White pill is gone from every hero, homepage
	 * included - the frames draw this as a plain line on the band.
	 *
	 * Deep Green is the default because the Turquoise homepage hero uses it.
	 * The Deep Green heroes switch to Trustpilot's own green below; Mint White,
	 * which this used to be, is nowhere in the frames and read at 1.2:1 against
	 * the Turquoise band.
	 */
	color: var(--b26-deep-green);
	padding: 0;
	/*
	 * 38, to land 27px of visible air above the line as the frames show.
	 * Figma measures between tight text bounds; a browser's line box carries
	 * about 11px of leading on top of that, so matching the raw number left it
	 * looking cramped.
	 */
	margin-top: 38px;
	/* The gap to the headline is owned by .b26-hero__title's margin-top, which
	   is the 40px the spec asks for. A margin here as well stacked on top of it
	   and gave 66. */
	margin-bottom: 0;
	font-size: 1rem;
	text-decoration: none;
	white-space: nowrap;
}

.b26-hero__btns {
	order: 5;
}

/* 61 of visible air on desktop, against 27 on mobile - same leading allowance. */
@media (min-width: 901px) {
	.b26-hero__badge {
		margin-top: 72px;
	}
}

/*
 * Mint White on the Deep Green heroes. The star keeps Trustpilot's green on its
 * own - it is an <img> carrying its own fill, not an inlined glyph - so the
 * badge's ink only ever sets the words beside it. Colouring the whole line
 * green, as the frames show it, turned "Excellent 4.6 out of 5 Trustpilot"
 * green too.
 */
.b26-hero--dark .b26-hero__badge {
	color: var(--b26-mint-white);
}

.b26-hero__badge-mark {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	white-space: nowrap;
}

.b26-hero__badge-mark img,
.b26-hero__badge-mark svg {
	width: 15px;
	height: 15px;
	flex: none;
}

/*
 * The star is coloured on its own, not with the words beside it: Deep Green on
 * the Turquoise homepage hero, Trustpilot's own green on the Deep Green product
 * heroes, where the words themselves are Mint White.
 */
.b26-hero__badge-mark svg {
	color: var(--b26-deep-green);
}

.b26-hero--dark .b26-hero__badge-mark svg {
	color: var(--b26-trustpilot-green);
}

.b26-hero__badge b {
	font-family: var(--b26-display);
	font-weight: 400;
}

/*
 * The star is the only SVG in the badge now - the Trustpilot lockup fallback is
 * gone - so its fill follows the colour set on .b26-hero__badge-mark svg above.
 * The height: 18px this rule used to carry was for that lockup and was
 * overriding the mark's own 15px, both selectors being one class and one
 * element deep with this one later in the file.
 */
.b26-hero__badge svg path {
	fill: currentColor;
}

.b26-hero__title {
	max-width: 13ch;
	margin-top: var(--b26-gap-block);
}

.b26-hero__sub {
	margin-top: var(--b26-gap-title);
	max-width: 44ch;
	/*
	 * Two lines' worth reserved, so the Trustpilot line and the buttons start at
	 * the same height whatever the subheading says. Without it a page whose
	 * subheading fits on one line pulled everything below it up by ~27px, and
	 * the four heroes no longer lined up with each other.
	 */
	min-height: 2.4em;
}

/*
 * Desktop drops the second hero CTA.
 *
 * Every hero runs the same pair - "Get a quote" then "Download the app" - and
 * the client wants only the quote on desktop, where the app card further down
 * the page already carries the store links. Mobile keeps both.
 */
@media (min-width: 901px) {
	.b26-hero__btns .b26-btn + .b26-btn {
		display: none;
	}
}

/*
 * 72, not the usual 40 block gap. V3 puts about 70 of visible air between the
 * rating line and the buttons on desktop - it is the one gap in the hero that
 * is deliberately larger than the rhythm elsewhere.
 */
.b26-hero__btns {
	margin-top: 72px;
}

/*
 * Ticked reassurance list under the standfirst.
 */
.b26-hero__points {
	display: flex;
	flex-direction: column;
	gap: 8px;
	/*
	 * Keep this margin. It looks redundant against .b26-hero__sub's min-height,
	 * which reserves room so the elements below stay level across the four
	 * heroes - but that height is only slack while the standfirst fits on one
	 * line. As soon as it wraps the reserve is spent, and without a margin the
	 * list sits flush against the last line with no air at all: measured 0px on
	 * the homepage, New Driver and Temporary at 1920, and on every page at 1024.
	 */
	margin: var(--b26-gap-title) 0 0;
	/* V3: 18/21.6, the same at mobile and desktop. */
	font-size: 18px;
	line-height: 1.2;
}

.b26-hero__points li {
	display: flex;
	align-items: flex-start;
	gap: 9px;
}

/*
 * The tick carries the accent colour, not the text colour: Turquoise on the
 * Deep Green heroes, Deep Green on the Turquoise homepage hero. currentColor
 * alone made it Mint White on the dark pages, which the design never does.
 */
.b26-hero__tick {
	display: inline-flex;
	flex: none;
	margin-top: 1px;
	color: var(--b26-deep-green);
}

.b26-hero--dark .b26-hero__tick {
	color: var(--b26-turquoise);
}

.b26-hero__tick svg {
	width: 15px;
	height: 15px;
}

/*
 * Multi-image hero: a row of O-shapes butted edge to edge.
 *
 * Desktop keeps them in the right-hand column. Mobile turns the row into a
 * full-bleed band under the copy — the "stationary carousel" in the design:
 * it looks like a carousel mid-scroll, circles running off both edges, but
 * nothing moves. See the mobile block in section 8.
 */
.b26-hero__row {
	display: flex;
	align-items: center;
	gap: 0;
}

.b26-hero__o {
	flex: none;
	width: var(--b26-hero-o);
	aspect-ratio: 10 / 9.5;
	border-radius: 50%;
	overflow: hidden;
	background: var(--b26-green-12);
}

.b26-hero__o img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 50%;
}

/*
 * On the product heroes, desktop shows the SECOND and third circles, not the
 * first two. The mobile row carries all three and centres the middle one; the
 * desktop frames drop the leading circle and start from that same middle photo,
 * so it is the one shown whole in both layouts.
 *
 * Applies to every multi hero, the homepage included. It used to be scoped to
 * the dark ones because the homepage led with its first image; the September
 * photography names a desktop pair for that page too, so the rule is now the
 * same everywhere and the templates carry one list rather than two.
 */
@media (min-width: 901px) {
	.b26-hero--multi .b26-hero__o:first-child {
		display: none;
	}
}

.b26-hero__art {
	/* Centred against the copy column, not top-aligned with it. */
	align-self: center;
	position: relative;
	min-height: 380px;
	/*
	 * Both hero O-shapes take this, so they cannot drift out of step.
	 *
	 * 450, per the frames: they draw the pair at x1104 and x1554 in a 1920
	 * viewport, which leaves 366 of the second one showing. At 480 the second
	 * started 30px further right and lost that much again off the edge.
	 */
	--b26-hero-o: min(100%, 450px);
}

.b26-hero__photo {
	position: relative;
	/* The disc is explicitly the bottom layer of the hero art. */
	z-index: 1;
	width: var(--b26-hero-o);
	aspect-ratio: 10 / 9.5;
	border-radius: 50%;
	overflow: hidden;
	background: var(--b26-green-12);
}

.b26-hero__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 50%;
}

/* Anchored to the photo's right edge rather than a percentage of the column,
   so the two shapes stay tangent at every width instead of the disc sliding
   over the photo. Matches the V2 mockup, where the disc's left edge meets the
   photo's right edge. */
/*
 * The two hero O-shapes must be the same size, share a horizontal axis, and
 * touch edge to edge without overlapping. Previously the disc was 620px
 * against a 480px photo and was pulled back 48px so the two overlapped, which
 * the design review picked up. Both now take --b26-hero-o, and the disc's
 * left edge starts exactly where the photo's right edge ends.
 */
.b26-hero__disc {
	position: absolute;
	z-index: 0;
	top: 50%;
	left: var(--b26-hero-o);
	width: var(--b26-hero-o);
	aspect-ratio: 10 / 9.5;
	transform: translateY(-50%);
	background: var(--b26-hero-disc);
	border-radius: 50%;
	pointer-events: none;
}

/*
 * Phones take a 20px gutter, not 40px. Both the current and the V3 mobile
 * homepage frames set every section to 20px left and right; the standalone
 * "390" breakpoint example still says 40px and is the odd one out. Cutting the
 * gutter gives back 40px of line length, which is most of why the mobile copy
 * was running short against the design.
 */
@media (max-width: 559px) {
	.b26-body {
		--b26-gutter: 20px;
	}
}

@media (max-width: 900px) {
	/* Three lines on mobile, where the same copy wraps further. */
	.b26-hero__sub {
		min-height: 3.6em;
	}

	/*
	 * No min-height on the proof points at this width. Reserving a fourth line
	 * (one Learner point wraps here) aligned the Trustpilot line across the
	 * four heroes, but it did so by leaving invisible slack inside the shorter
	 * lists - so the visible gap above the Trustpilot line came out at 38px on
	 * three pages and 16px on Learner.
	 *
	 * The frames make the same trade the other way: they hold the gap at 27px
	 * and let the Trustpilot line sit within about 24px of the others. An even
	 * gap reads better than an alignment nobody can see, and desktop still
	 * lines up exactly because every list fits three lines there.
	 */

	.b26-hero {
		/*
		 * 56, not 116. The bar is 72 tall and V3 puts the headline 24 below it,
		 * so the headline needs to land 96 from the top; .b26-h1 brings 40 of
		 * that with its own margin, which leaves 56 here. The old 116 dates
		 * from when the bar was a 48px floating pill.
		 */
		padding-top: 56px;
		/* Mobile heroes stack, so they need their own floor. Measured against
		   the longest of the four (the homepage) at 500px wide. */
		--b26-hero-min: 740px;
	}

	.b26-hero__grid {
		grid-template-columns: 1fr;
		gap: 0;
	}

	.b26-hero__title {
		max-width: none;
	}

	/* The standfirst has to clear the photo bleeding in from the right. */
	.b26-hero__sub {
		max-width: 62%;
	}

	/* isolation:isolate is the important bit: the photo carries z-index 2 from
	   the base rules and would otherwise outrank the copy and paint over the
	   CTAs. Isolating the art layer means nothing inside it can come forward. */
	.b26-hero__copy {
		position: relative;
		z-index: 1;
	}

	.b26-hero__art {
		position: absolute;
		inset: 0;
		min-height: 0;
		z-index: 0;
		isolation: isolate;
		pointer-events: none;
	}

	/* Anchored to the right edge rather than positioned as a percentage of
	   the grid, so the bleed is identical at every width. */
	.b26-hero__photo,
	.b26-hero__disc {
		z-index: 0;
	}

	/* The mobile mockup drops the badge: the headline starts at the top of
	   the hero. */
	.b26-hero__badge {
		display: none;
	}

	.b26-hero__art {
		--b26-hero-o: min(52vw, 220px);
	}

	/*
	 * Single-image heroes use the same in-flow row as the multi variant: the
	 * photo and its coloured O sit side by side under the CTAs, touching,
	 * bleeding off both edges.
	 *
	 * They used to be an absolute overlay behind the copy, which put the disc
	 * across the "Download the app" button on every product and legacy page.
	 */
	.b26-hero__photo,
	.b26-hero__disc {
		position: static;
		inset: auto;
		flex: none;
		width: var(--b26-hero-o);
		aspect-ratio: 10 / 9.5;
		max-width: none;
		transform: none;
	}

	.b26-hero__photo {
		order: 1;
	}

	.b26-hero__disc {
		order: 2;
	}

	/*
	 * Hero art on mobile, both variants.
	 *
	 * The art column stops being an absolute overlay and drops into flow under
	 * the copy, then breaks out of the wrap to the viewport edges. The row is
	 * max-content and centred, so with three O-shapes on a phone it overflows
	 * both sides and the hero's own overflow: clip crops it — a carousel
	 * mid-scroll that never moves, which is what the design shows.
	 */
		.b26-hero {
		/* Sized so the row is wider than the viewport: the shapes butt together
		   and run off both edges, which is what makes it read as a carousel
		   mid-scroll. */
		--b26-hero-o: 46vw;
	}

	.b26-hero__art {
		display: flex;
		align-items: center;
		justify-content: center;
		position: static;
		inset: auto;
		min-height: 0;
		margin-top: 30px;
		isolation: auto;
		pointer-events: auto;
		/*
		 * width + min-width are load-bearing. The row inside is max-content and
		 * wider than the phone; without pinning the column, that intrinsic
		 * width propagated up through the grid and stretched the copy with it,
		 * pushing the headline and buttons off the right edge.
		 */
		/*
		 * Full-bleed against the VIEWPORT. Previously this was width: 100% with
		 * negative side margins, so the column's own box was offset from the
		 * viewport and centring the row inside it left the middle O about 100px
		 * off. 100vw plus the 50%/50vw pull makes the column exactly the
		 * viewport, so a centred row is genuinely centred.
		 */
		width: 100vw;
		margin-left: calc(50% - 50vw);
		margin-right: calc(50% - 50vw);
		min-width: 0;
	}

	/*
	 * Centred once, by the flex parent. This used to also carry
	 * left: 50% + translateX(-50%), from before .b26-hero__art was pinned to
	 * 100vw — back then the column was offset from the viewport and flex
	 * centring landed the row off to one side, so the transform corrected it.
	 * With the column now exactly the viewport, both were centring it and the
	 * offsets stacked: at three shapes that put the middle one about 110px
	 * left of centre, which is what surfaced this.
	 */
	.b26-hero__row {
		width: max-content;
	}

	.b26-hero__copy {
		min-width: 0;
	}

	/* No overlapping art to dodge on this variant, so the copy runs full width. */
	.b26-hero__sub {
		max-width: none;
	}

	/*
	 * The Trustpilot badge sits above the headline on desktop and below the
	 * ticked list on mobile, so it is reordered rather than duplicated.
	 */
	.b26-hero__copy {
		display: flex;
		flex-direction: column;
	}

	.b26-hero__badge {
		display: inline-flex;
		order: 4;
		align-self: flex-start;
		/* 38, matching the base rule: see the note there about leading. */
		margin-top: 38px;
	}

	/* 30 on mobile, per the 390 frame. */
	.b26-hero__btns {
		margin-top: 30px;
	}

	.b26-hero__title {
		order: 1;
	}

	.b26-hero__sub {
		order: 2;
	}

	.b26-hero__points {
		order: 3;
	}

	.b26-hero__btns {
		order: 5;
	}

	.b26-hero__btns {
		flex-direction: column;
		align-items: stretch;
	}

	.b26-hero__btns .b26-btn {
		width: 100%;
	}
}

/* -------------------------------------------------------------------------
   9. Trust bar
   ---------------------------------------------------------------------- */

.b26-trust {
	/* V3 mobile: 56 top and bottom, same as every other band. */
	padding: clamp(56px, 3.5vw, 64px) 0;
}

/*
 * The ribbon runs the full width: the pills scroll horizontally, so holding
 * them inside the page gutter cut the row short at both ends and made it read
 * as a truncated list rather than a continuing one.
 */
.b26-trust > .b26-wrap {
	max-width: none;
	padding-left: 0;
	padding-right: 0;
}

.b26-trust__list {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: clamp(12px, 1.4vw, 20px);
}

/*
 * Rating pills. On mobile the row becomes a horizontal scroller rather than
 * wrapping: the design shows them running off the right edge, which also hints
 * there is more to swipe to. Scrollbar hidden, but the track still responds to
 * touch, wheel and keyboard.
 */
/* Nav menu icons: small line marks before each label, inheriting the nav's
   own colour so they flip with the pill on scroll. */
.b26-nav__icon {
	display: inline-flex;
	flex: none;
	margin-right: 7px;
}

.b26-nav__icon svg {
	width: 17px;
	height: 17px;
}

.b26-drawer__link .b26-nav__icon svg {
	width: 20px;
	height: 20px;
}

/* Two-line "14 million drivers / covered by Veygo" pill. */
.b26-trust__drivers {
	display: flex;
	flex-direction: column;
	line-height: 1.2;
	font-size: 18px;
}

.b26-trust__drivers strong {
	font-weight: 700;
}

.b26-trust__icon--shield svg {
	width: 22px;
	height: 22px;
}

/*
 * Store marks are supplied brand artwork, so they render as <img> and keep
 * their own colours. Sized by height with auto width: the Play mark is
 * portrait (960x1060) while the others are square, so a fixed square box would
 * squash it.
 */
.b26-trust__store img {
	height: 17px;
	width: auto;
	display: block;
}

/* Fallback only, for before artwork is supplied. */
.b26-trust__icon--tp svg {
	color: #00b67a;
}

.b26-trust__item--pill {
	background: #fff;
	border-radius: 14px;
	padding: 10px 16px;
	box-shadow: 0 1px 3px rgba(3, 43, 51, 0.1);
	/* Every pill is the same height whatever it holds, so a rating pill and a
	   logo pill sit on one line. */
	min-height: 60px;
	justify-content: center;
}

.b26-trust__rating {
	display: flex;
	align-items: center;
	gap: 10px;
	color: inherit;
	text-decoration: none;
}

.b26-trust__score {
	font-family: var(--b26-display);
	font-size: clamp(22px, 1.7vw, 32px);
	line-height: 1;
	letter-spacing: var(--b26-track-display);
}

.b26-trust__stack {
	display: flex;
	flex-direction: column;
	gap: 2px;
}

.b26-trust__store {
	display: flex;
	align-items: center;
	gap: 5px;
	font-size: 0.9375rem;
	line-height: 1;
	white-space: nowrap;
}

.b26-trust__store svg {
	width: 16px;
	height: 16px;
}

/* The Trustpilot wordmark lockup is no longer used here — the current Figma
   shows a green star plus the word, matching the two app store pills. */

/*
 * Five stars with the top layer clipped to the score. Both layers are the same
 * glyph row, so the partial star cuts exactly where the rating falls.
 */
.b26-stars {
	position: relative;
	display: inline-flex;
	line-height: 1;
}

.b26-stars__base,
.b26-stars__fill {
	display: flex;
	gap: 1px;
}

.b26-stars__base {
	color: var(--b26-green-12);
}

.b26-stars__fill {
	position: absolute;
	inset: 0;
	overflow: hidden;
	/* V3's amber. */
	color: #FFBD00;
}

.b26-stars svg {
	/* V3: 18 everywhere, including the trust bar, where ours were 13. */
	width: 18px;
	height: 18px;
	flex: none;
}

.b26-trust__asof {
	margin: 18px 0 0;
	text-align: center;
	font-size: 1rem;
	color: var(--b26-green-70);
}

.b26-trust__logo--red {
	max-height: 34px;
	width: auto;
}

@media (max-width: 900px) {
	.b26-trust__list {
		flex-wrap: nowrap;
		justify-content: flex-start;
		overflow-x: auto;
		overflow-y: hidden;
		scrollbar-width: none;
		-webkit-overflow-scrolling: touch;
		padding-bottom: 4px;
	}

	.b26-trust__list::-webkit-scrollbar {
		display: none;
	}

	.b26-trust__item {
		flex: none;
	}
}

.b26-trust__item {
	display: flex;
	align-items: center;
	gap: 10px;
	font-size: 1.0625rem;
	color: var(--b26-deep-green);
}

/*
 * Direct children only. This sizes the partner logos (Admiral, RED), which sit
 * straight inside the <li>. The rating pills nest their star and store marks
 * several levels down and set their own much smaller sizes; without the child
 * combinator this rule matched those too — same specificity, declared later,
 * so it won and inflated every pill to 102px against Admiral's 60px.
 */
.b26-trust__item > img,
.b26-trust__item > svg {
	height: 40px;
	width: auto;
}

/* The Admiral and RED SVGs carry hardcoded white fills in an internal <style>
   block, so they vanish on Mint White without this. Direct children only, for
   the same reason as above: the rating pills need their own colours. */
.b26-trust__item > svg,
.b26-trust__item > svg * {
	fill: currentColor !important;
}

.b26-trust__logo {
	max-height: 44px;
	width: auto;
}

.b26-trust__score {
	font-family: var(--b26-display);
}

.b26-trust__tp {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	text-decoration: none;
}

.b26-trust__tp svg {
	height: 20px;
}

/* Visible stand-in for a logo design has not supplied. Meant to look
   unfinished so it does not slip through review. */
.b26-trust__placeholder {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 96px;
	height: 40px;
	padding: 0 12px;
	border: 1.5px dashed var(--b26-green-12);
	border-radius: 8px;
	color: var(--b26-green-70);
	font-size: 0.8125rem;
}

/*
 * Deliberately no column stacking here any more. The original trust bar was a
 * row of logos that read better stacked on a phone; it is now a row of rating
 * pills that scrolls horizontally (see the max-width: 900px block above). This
 * rule sat later in the file and silently won, stacking the pills into a tall
 * column on every phone.
 */

/* -------------------------------------------------------------------------
   10. Cover finder

   V2: a full-bleed Deep Green band, not a contained card on turquoise.
   ---------------------------------------------------------------------- */

/*
 * Heading and standfirst sit on the page ground, left aligned, with only the
 * three columns inside the Deep Green card below them.
 */
.b26-finder__title {
	margin-bottom: var(--b26-gap-title);
	max-width: 16ch;
}

.b26-finder__sub {
	margin: 0 0 var(--b26-gap-block);
	max-width: 62ch;
	/* Full Deep Green. --b26-green-70 is a 70% tint and read as washed out. */
	color: var(--b26-deep-green);
}

.b26-finder--card .b26-finder__cols {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	border-radius: var(--b26-radius-band);
	/* V3 mobile: 46 top and bottom, 20 left and right, inside the panel. */
	padding: clamp(46px, 4vw, 60px) clamp(20px, 3vw, 48px);
}

.b26-finder__cols {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(24px, 3vw, 48px);
}

.b26-finder__col {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
}

/*
 * Mobile runs left aligned with the icon inline beside the heading, and a full
 * width CTA — the columns stack, so a centred layout wastes the width and
 * leaves each item floating.
 */
@media (max-width: 900px) {
	.b26-finder__col {
		align-items: stretch;
		text-align: left;
		display: grid;
		grid-template-columns: auto 1fr;
		/* V3: 8px between the icon and the heading, 20px between rows. */
		column-gap: 8px;
		row-gap: 20px;
	}

	.b26-finder__icon {
		grid-column: 1;
		grid-row: 1;
		align-self: center;
	}

	.b26-finder__col .b26-finder__lead {
		grid-column: 2;
		grid-row: 1;
		align-self: center;
		margin: 0;
	}

	.b26-finder__col > :not(.b26-finder__icon):not(.b26-finder__lead) {
		grid-column: 1 / -1;
	}

	.b26-finder__col .b26-btn {
		width: 100%;
	}

}

/*
 * Two classes deliberately: the base reset `.b26-page img { height: auto }` is
 * (0,1,1) and beats a single-class rule, so a one-class version silently lost
 * its height. The peace-hand asset is portrait (397x537) while the plates are
 * square, so with height:auto it rendered 179px tall against their 132px and
 * shunted its column's heading out of line.
 *
 * object-fit: contain keeps each asset's own aspect inside the fixed box, so
 * the three headings sit on one baseline whatever shape the art is.
 */
.b26-finder__col .b26-finder__icon {
	width: 132px;
	height: 132px;
	object-fit: contain;
	object-position: bottom;
	margin-bottom: 8px;
}

/*
 * Must sit AFTER the rule above, not inside an earlier media block. Both are
 * (0,2,1) and a media query adds no specificity, so the earlier one silently
 * lost and phones kept rendering the full 132px desktop icon.
 *
 * Height comes from the partial per column, because V3 sizes these
 * individually (46, 56 and 64). Width follows the asset's own aspect so the
 * portrait one is not squashed into a square.
 */
@media (max-width: 900px) {
	.b26-finder__col .b26-finder__icon {
		width: var(--b26-finder-icon-w, 56px);
		height: var(--b26-finder-icon-h, 56px);
		object-position: center;
		margin-bottom: 0;
	}
}

.b26-finder__lead {
	font-family: var(--b26-display);
	line-height: 1;
	font-size: 32px;
}

.b26-finder__q {
	font-size: clamp(18px, 1.04vw, 20px);
}

.b26-finder__copy {
	font-size: 18px;
	line-height: 1.2;
	margin-top: 12px;
	flex: 1;
}

.b26-finder__col .b26-btn {
	margin-top: 24px;
}

@media (max-width: 860px) {
	/* Everything in this block stays centred at both breakpoints. */
	.b26-finder__cols {
		grid-template-columns: 1fr;
		/*
		 * V3 leaves 24px between the cards, and each card carries 20px of its
		 * own padding, so content to content is 64px. Our cards have no
		 * padding of their own, so the whole 64px lives in the gap.
		 */
		gap: 64px;
	}
}

/* -------------------------------------------------------------------------
   11. App promo
   ---------------------------------------------------------------------- */

.b26-app__card {
	position: relative;
	max-width: 1160px;
	margin: 0 auto;
	background: #fff;
	border-radius: var(--b26-radius-lg);
	box-shadow: 0 24px 60px rgba(16, 42, 50, 0.06);
	/* Tighter vertically than horizontally: the card is meant to be a shallow
	   band that the phone breaks out of, not a box that contains it. */
	padding: clamp(32px, 3vw, 44px) clamp(40px, 4vw, 64px);
	display: grid;
	grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
	gap: clamp(32px, 4vw, 64px);
	align-items: center;
}

/*
 * Capped near the asset's native 323x600 rather than stretched to fill: the
 * supplied render is 1x, so upscaling it much past this goes soft. A 2x export
 * would allow a larger cap.
 */
.b26-app__art img {
	width: 100%;
	max-width: 340px;
	margin: 0 auto;
}

/*
 * The phone breaks out of the card top and bottom, as the Figma shows.
 *
 * Negative margins were not enough on their own: they shrank the image's
 * contribution to the grid row, but never by more than the card's own padding,
 * so the phone always ended up sitting inside the box. Instead the art column
 * gets a fixed height that the card sizes around, and the phone is taken out
 * of flow and centred on it. At 340px wide the render stands ~630px tall
 * against a 400px column, so it clears the card by a good margin at each end.
 */
@media (min-width: 901px) {
	/*
	 * Room for the overflow. The phone clears the card by roughly 70px at each
	 * end, which is more than --b26-section-y gives at the narrower desktop
	 * widths — at 1024 the render's foot landed on the testimonials band below.
	 * The extra padding is on the section rather than the card, so the card
	 * itself stays shallow.
	 */
	.b26-app {
		padding-block: calc(var(--b26-section-y) + 48px);
	}

	.b26-app__art {
		position: relative;
		height: 400px;
	}

	.b26-app__art img {
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		margin: 0;
	}
}

/*
 * Body paragraphs only. The store rating is also a <p> inside this column, and
 * this rule (0,1,1) was beating the margin: 0 on .b26-app__rating (0,1,0), so
 * it sat 20px lower than the 10px flex gap the Figma gives it, on both devices.
 */
.b26-app__copy p:not(.b26-app__rating) {
	margin-top: var(--b26-gap-title);
	max-width: 42ch;
}

/*
 * Dark card variant. The section keeps the Mint White ground and the card
 * itself goes Deep Green, with the headline in turquoise.
 */
.b26-app--dark .b26-app__card {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	box-shadow: none;
}

.b26-app--dark .b26-app__copy h2 {
	color: var(--b26-turquoise);
}

.b26-app__points {
	display: flex;
	flex-direction: column;
	gap: 12px;
	margin: var(--b26-gap-title) 0 0;
	font-size: 18px;
	line-height: 1.2;
}

.b26-app__points li {
	display: flex;
	align-items: flex-start;
	gap: 10px;
}

.b26-app__points strong {
	font-weight: 700;
}

.b26-app__tick {
	display: inline-flex;
	flex: none;
	margin-top: 2px;
	color: var(--b26-turquoise);
}

.b26-app__tick svg {
	width: 15px;
	height: 15px;
}

.b26-app__badges {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	/*
	 * Adjacent with a 20px gap, read off the V3 spec — not spread across the
	 * card. Stretching them to fill left large gaps between the badge artwork,
	 * because the images are height-constrained and do not grow with their box.
	 */
	justify-content: flex-start;
	gap: 20px;
	margin-top: var(--b26-gap-block);
}

.b26-app__badge {
	flex: 0 0 auto;
}

/* Badge with its store rating stacked underneath. */
.b26-app__badge {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 10px;
}

.b26-app__rating {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
	font-family: var(--b26-display);
	font-size: 1.125rem;
	line-height: 1;
	letter-spacing: var(--b26-track-display);
	color: var(--b26-deep-green);
}

/* Deep Green on the Deep Green card left the scores invisible. */
.b26-app--dark .b26-app__rating {
	color: var(--b26-mint-white);
}

/* V3 draws these at 18, the same as the trust bar's. */
.b26-app__rating .b26-stars svg {
	width: 18px;
	height: 18px;
}

/*
 * Turquoise here, not the trust bar's amber: on the Deep Green card the amber
 * is the only warm colour on the page and reads as a foreign badge. The trust
 * bar keeps amber, which is where V3 uses it.
 */
.b26-app__rating .b26-stars__fill {
	color: var(--b26-turquoise);
}

.b26-app--dark .b26-app__rating .b26-stars__base {
	color: rgb(239 255 252 / 25%);
}

.b26-app__badges img,
.b26-app__badges svg {
	height: 40px;
	width: auto;
}

@media (max-width: 900px) {
	.b26-app__card {
		grid-template-columns: 1fr;
		/* Left aligned on mobile, matching the design. Centred left the ticked
		   list ragged on both edges and hard to scan. */
		text-align: left;
		/* Stacked, the column gap plus the render's own transparent margin
		   left a large hole between the phone and the heading. */
		gap: 8px;
	}

	/*
	 * The card covers roughly the lower half of the phone, as the design shows,
	 * rather than containing it. The art column keeps only half the render's
	 * height, so the card's top edge lands mid-device and the upper half sits
	 * out on the section ground.
	 */
	/*
	 * The card covers the lower half of the phone. The art column keeps only
	 * about half the render's height and the phone is pinned to its bottom, so
	 * the top half overflows upward out of the card rather than downward across
	 * the copy.
	 */
	/* Room for the half that overflows upward, so it does not ride up into the
	   band above. V3 sets this section's top padding to 230px on mobile. */
	.b26-app {
		padding-top: 230px;
	}

	.b26-app__art {
		position: relative;
		height: 230px;
	}

	.b26-app__art img {
		position: absolute;
		bottom: 0;
		left: 50%;
		transform: translateX(-50%);
		margin: 0;
		max-width: 250px;
	}

	.b26-app__copy p {
		margin-left: 0;
		margin-right: 0;
	}

	.b26-app__badges {
		justify-content: flex-start;
		/*
		 * Side by side, not stacked. They wrap by default and at 20px card
		 * padding the pair just fits, so the wrap is switched off rather than
		 * relied on.
		 */
		flex-wrap: nowrap;
	}

	/*
	 * 20px each side, down from 40. The headline was being forced onto three
	 * lines by the wider inset; at 20 it breaks naturally over two.
	 */
	.b26-app__card {
		padding-left: 20px;
		padding-right: 20px;
	}
}

/* -------------------------------------------------------------------------
   12. Two ways to pay
   ---------------------------------------------------------------------- */

.b26-ways__title {
	color: var(--b26-plum);
	margin-bottom: var(--b26-gap-block);
}

.b26-ways__sub {
	font-family: var(--b26-display);
	font-size: clamp(1.25rem, 1.6vw, 1.5rem);
	color: var(--b26-plum);
	/* Sits between the title and the card, so it absorbs the title's block gap. */
	margin: calc(20px - var(--b26-gap-block)) 0 var(--b26-gap-block);
}

/*
 * One card, two columns. Figma: 1100 wide with 56 of padding and 56 between
 * the columns, which is what puts each option's centre line on the quarter
 * points of the card.
 */
.b26-ways__card {
	background: var(--b26-pink);
	color: var(--b26-plum);
	border-radius: var(--b26-radius-lg);
	padding: clamp(32px, 3vw, 56px);
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: clamp(40px, 3vw, 56px);
}

/*
 * Centred on desktop, ranged left on mobile. V3 really does set it both ways:
 * the 1920 frame has the two text nodes in 466 wide boxes at CENTER, and the
 * 390 frame has them at LEFT in a 310 wide column. The mobile override is
 * below, with the card's stacking rule.
 */
.b26-ways__option {
	min-width: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
}

/*
 * Height only: the supplied marks are 50 tall but not all 50 wide (the
 * hourglass is 43), and a fixed width would squash it.
 */
.b26-ways__icon svg {
	width: auto;
	height: 50px;
}

.b26-ways__name {
	font-family: var(--b26-display);
	/* V3: 32/38 desktop, 24/29 mobile. */
	font-size: clamp(1.5rem, 2vw, 2rem);
	line-height: 1.2;
	margin: 28px 0 0;
}

.b26-ways__copy {
	font-size: 20px;
	line-height: 1.2;
	margin: 24px 0 0;
	max-width: 42ch;
}

.b26-ways__cta {
	margin-top: 24px;
}

@media (max-width: 860px) {
	.b26-ways__card {
		grid-template-columns: 1fr;
	}
}

/*
 * Mobile: the icon, heading and copy range left, and the button spans the
 * column with its label centred inside it. V3's 390 frame draws the button as a
 * 310 wide box - the full inner width of the card - against the 241 pill it
 * uses on desktop.
 */
@media (max-width: 900px) {
	.b26-ways__option {
		align-items: flex-start;
		text-align: left;
	}

	.b26-ways__cta {
		align-self: stretch;
		width: 100%;
		justify-content: center;
	}
}

/* -------------------------------------------------------------------------
   13. Testimonial marquee
   ---------------------------------------------------------------------- */

.b26-quotes {
	overflow: hidden;
	overflow: clip;
}

.b26-quotes__title {
	color: var(--b26-plum);
	max-width: 18ch;
	margin-bottom: var(--b26-gap-block);
}

/*
 * V3 rounds these two bands on ONE edge, at both breakpoints: the testimonials
 * band on its top corners and the Veygo Hub on its bottom, so each reads as
 * running into the section it meets rather than closing off. --b26-radius-band
 * is 56px on desktop and 32px on mobile, which is what V3 uses at each.
 *
 * An earlier pass removed these along with the corners that genuinely should
 * not exist (the testimonials' BOTTOM corners, and both of the Easy band's).
 */
.b26-quotes {
	border-radius: var(--b26-radius-band) var(--b26-radius-band) 0 0;
}

/*
 * Both bands are Mint White, as V3 has them. The FAQs were briefly plain white
 * so the hub's rounded bottom would read against them; the 25 August feedback
 * reverted that, since one white section left the rest of the page looking
 * overly green.
 *
 * What now carries that bottom edge is the hub's own gradient: Deep Green
 * fading in over the last tenth of the band, from nothing to 5%. It is subtle
 * by design, and it gives the rounded corners something to be cut against.
 */
/*
 * Only the plain hub. The band modifiers paint their own Deep Green or
 * Turquoise and set a matching text colour, and this rule was overriding the
 * background while leaving the text alone - Mint White type and a Mint White
 * logo on a Mint White ground, which is to say nothing at all.
 */
/*
 * No radius across the top. The banded hub picks up .b26-band's four rounded
 * corners, which cut it away from the section above it; V3 rounds this module
 * on its bottom edge only, so it runs into what follows rather than sitting in
 * the page as a separate slab.
 *
 * Desktop only. Mobile squares every band off, and this rule is two classes
 * deep so it would otherwise outrank that reset and put a radius back.
 */
@media (min-width: 901px) {
	.b26-hub.b26-band {
		border-radius: 0 0 var(--b26-radius-band) var(--b26-radius-band);
	}
}

.b26-hub:not(.b26-section--dark):not(.b26-section--turquoise) {
	background:
		linear-gradient(
			to bottom,
			transparent 90%,
			rgb(3 43 51 / 5%) 100%
		),
		var(--b26-mint-white);
}

.b26-faq {
	background: var(--b26-mint-white);
}

.b26-quotes__rows {
	display: flex;
	flex-direction: column;
	gap: 10px;
}

/*
 * Motion is a stepped jolt, not a continuous scroll: the row eases across a
 * couple of O-shapes, holds, then moves again. Total travel per cycle is still
 * exactly one track plus its trailing gap, so the loop stays seamless — the
 * steps just subdivide that same distance.
 */
.b26-quotes__row {
	display: flex;
	width: max-content;
	gap: 0;
	/*
	 * Zero gap: the O-shapes touch edge to edge, per the circle treatment. The
	 * travel below is one full track, so with no gap the loop stays seamless.
	 */
	--b26-marq: -50%;
	animation: b26-quotes-jolt 22s cubic-bezier(0.5, 0, 0.2, 1) infinite;
}

.b26-quotes__row--reverse {
	margin-left: -140px;
	/* Its own forward animation, not the first one reversed - see the note above. */
	animation-name: b26-quotes-jolt-rtl;
}

/* Deliberately no pause on hover. The section is wide enough that a pointer
   resting anywhere over it stopped the marquee on desktop, which read as
   broken. Reduced-motion still stops it completely, which is the control that
   actually matters for accessibility. Focus still pauses, so anyone tabbing
   through can read a quote. */
.b26-quotes:focus-within .b26-quotes__row {
	animation-play-state: paused;
}

.b26-quotes__track {
	display: flex;
	gap: 0;
	flex: none;
}

/*
 * Six hops rather than four, so each move is roughly two and a half circles
 * instead of nearly four, with a long hold between them to read the quote.
 * The full travel is still exactly one track, which is what keeps the loop
 * seamless once the JS has cloned it.
 *
 * There are two keyframe sets rather than one played backwards. Reversing an
 * animation reverses its TIMING as well as its direction, so the holds landed
 * at mirrored points and the two rows took turns moving. Both now run forward
 * on the same timeline, one travelling left and one right, so they move and
 * pause together.
 */
/*
 * Five hops of exactly three circles, not six of two and a half.
 *
 * The row repeats on a three-cell cycle - photo, quote, blank - so a hop that
 * is a whole multiple of three lands on the same arrangement every time. At two
 * and a half the phase drifted, and some rests showed two quote circles with no
 * photograph between them.
 *
 * The full travel is still one track, which is what keeps the loop seamless
 * once the JS has cloned it, and both rows run forward on the same timeline so
 * they move and pause together.
 */
@keyframes b26-quotes-jolt {
	0%,
	14% {
		transform: translateX(0);
	}
	20%,
	34% {
		transform: translateX(calc(var(--b26-marq) * 0.2));
	}
	40%,
	54% {
		transform: translateX(calc(var(--b26-marq) * 0.4));
	}
	60%,
	74% {
		transform: translateX(calc(var(--b26-marq) * 0.6));
	}
	80%,
	94% {
		transform: translateX(calc(var(--b26-marq) * 0.8));
	}
	100% {
		transform: translateX(var(--b26-marq));
	}
}

/* The same journey travelled the other way, on the same timeline. */
@keyframes b26-quotes-jolt-rtl {
	0%,
	14% {
		transform: translateX(var(--b26-marq));
	}
	20%,
	34% {
		transform: translateX(calc(var(--b26-marq) * 0.8));
	}
	40%,
	54% {
		transform: translateX(calc(var(--b26-marq) * 0.6));
	}
	60%,
	74% {
		transform: translateX(calc(var(--b26-marq) * 0.4));
	}
	80%,
	94% {
		transform: translateX(calc(var(--b26-marq) * 0.2));
	}
	100% {
		transform: translateX(0);
	}
}

.b26-quote {
	flex: none;
	width: 280px;
	aspect-ratio: 10 / 9.5;
	border-radius: 50%;
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 14px;
	padding: 0 44px;
	/* Pink band, plum O-shapes. */
	background: var(--b26-plum);
	color: var(--b26-mint-white);
	overflow: hidden;
}

/*
 * Tighter inside the circle on mobile. The ellipse gives the text less width at
 * top and bottom than the box suggests, so the score line, the quote and the
 * Trustpilot footer are pulled together to keep all three within the curve.
 */
@media (max-width: 900px) {
	.b26-quote {
		gap: 8px;
		padding: 0 26px;
	}

	.b26-quote__score {
		margin-bottom: 2px;
	}
}

.b26-quote p {
	font-size: clamp(16px, 0.94vw, 18px);
	line-height: 1.3;
}

.b26-quote__meta {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 1rem;
}

.b26-quote__meta svg {
	height: 16px;
	width: auto;
}

/* Same forced recolour as the trust bar. */
.b26-quote__meta svg,
.b26-quote__meta svg * {
	fill: currentColor !important;
}

/*
 * The score sits above the words: smaller, lighter and with the stars inline,
 * so it reads as a label on the quote rather than the opening of it.
 */
.b26-quote__score {
	display: flex;
	align-items: center;
	gap: 6px;
	margin: 0 0 8px;
	/* Sized so the row clears the circle's inner width with room to spare. */
	font-size: 0.75rem;
	line-height: 1;
	color: rgb(239 255 252 / 70%);
}

.b26-quote__score .b26-stars svg {
	width: 11px;
	height: 11px;
}

.b26-quote__rule {
	width: 1px;
	height: 17px;
	/*
	 * Takes the meta text's own colour. It was --b26-green-12, a 12% Deep
	 * Green, which on the Dark Plum circle was invisible - V3 has this divider
	 * solid white, the same as the date beside it.
	 */
	background: currentColor;
}

/*
 * The plain circles are spacers in the rhythm, not content, so they sit back
 * at 40% rather than reading as another card.
 */
.b26-quote:not(.b26-quote--photo):empty {
	opacity: 0.4;
}

.b26-quote--photo {
	padding: 0;
	background: var(--b26-green-12);
}

/* The radius is repeated on the image: the row above is animating, and a
   compositor layer does not always honour the parent's overflow clip. */
/*
 * Two classes so this beats the base `.b26-page img { height: auto }` reset,
 * which is (0,1,1) and was winning: the photo kept its natural aspect and
 * stretched its circle into an oval taller than the quote shapes beside it.
 */
.b26-quote--photo .b26-quote__img,
.b26-quote--photo img {
	width: 100%;
	height: 100%;
	aspect-ratio: 10 / 9.5;
	object-fit: cover;
	border-radius: 50%;
}

/* The review CTA takes Plum, not Deep Green — outline and solid alike. */
.b26-quotes .b26-btn--outline-green {
	color: var(--b26-plum);
	border-color: var(--b26-plum);
}

.b26-quotes .b26-btn--outline-green:hover,
.b26-quotes .b26-btn--outline-green:focus {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
}

.b26-quotes .b26-btn--green {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
}

.b26-quotes__cta {
	display: flex;
	justify-content: center;
	margin-top: clamp(40px, 4vw, 72px);
}

@media (max-width: 760px) {
	/*
	 * :not() is load-bearing. This padding is for the quote cells, but it sat
	 * later in the file than .b26-quote--photo { padding: 0 } and so won on
	 * mobile, shrinking the photo's content box from 220px to 156px. The image
	 * then sized by height with width auto and rendered as an oval inside a
	 * correctly shaped circle.
	 */
	.b26-quote:not(.b26-quote--photo) {
		width: 220px;
		/* No fixed height: it overrode aspect-ratio: 10 / 9.5 and made these
		   perfect circles on mobile, which is why the photos read as ovals
		   against the quote shapes beside them. */
		padding: 0 32px;
	}

	.b26-quote--photo {
		width: 220px;
	}

	.b26-quote p {
		font-size: 16px;
	}

	.b26-quotes__title {
		max-width: none;
		text-align: center;
	}
}

/* -------------------------------------------------------------------------
   14. Four simple steps

   V2: Turquoise circles with Deep Green type, separated rather than touching.
   ---------------------------------------------------------------------- */

.b26-steps__title {
	margin-bottom: var(--b26-gap-block);
	text-align: center;
}

/*
 * One pill, four columns. The gradient runs pale mint to full turquoise top to
 * bottom. Fully rounded ends rather than the band radius, so it reads as a
 * lozenge at any height.
 */
.b26-steps__pill {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: clamp(20px, 2.6vw, 40px);
	padding: clamp(24px, 2.6vw, 36px) clamp(28px, 3.2vw, 48px);
	border-radius: 999px;
	background: linear-gradient(180deg, #b6fff2 0%, var(--b26-turquoise) 70%);
	color: var(--b26-deep-green);
}

.b26-step {
	min-width: 0;
}

/* Icon and title share the first line; the copy sits under both. */
.b26-step__head {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 6px;
}

.b26-step__icon {
	display: inline-flex;
	flex: none;
}

.b26-step__icon svg {
	width: 22px;
	height: 22px;
}

.b26-step__name {
	font-family: var(--b26-display);
	font-weight: 700;
	font-size: clamp(1rem, 1.15vw, 1.125rem);
	letter-spacing: var(--b26-track-display);
}

.b26-step__copy {
	font-size: clamp(16px, 0.94vw, 18px);
	line-height: 1.25;
}

/* Below the four-across breakpoint the lozenge would get very tall and thin,
   so it relaxes to the card radius as it wraps. */
@media (max-width: 1024px) {
	.b26-steps__pill {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		border-radius: var(--b26-radius-band);
		gap: clamp(20px, 3vw, 32px);
		padding: clamp(24px, 4vw, 36px);
	}
}

@media (max-width: 640px) {
	.b26-steps__pill {
		grid-template-columns: minmax(0, 1fr);
	}
}

/* -------------------------------------------------------------------------
   14b. Easy as 1, 2, 3

   Dark Plum band, Poppy Pink heading, white card. The only section that pairs
   those two brand colours.
   ---------------------------------------------------------------------- */

/*
 * Three tones, because the 2 September frames give this one component a
 * different treatment on each page group and each is internally consistent -
 * the icons, step text and CTA all follow whichever colour the card is:
 *
 *   Homepage    Dark Plum band, Mint White card, Poppy Pink heading  (base)
 *   Learner,    Mint White band, Dark Plum card                      (--light)
 *   New Driver
 *   Temporary   Mint White band, Poppy Pink card                     (--pink)
 *
 * The base is the homepage's, so a caller that passes no tone gets it.
 */
.b26-easy {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
}

.b26-easy__title {
	color: var(--b26-pink);
	margin-bottom: var(--b26-gap-title);
}

.b26-easy__sub {
	margin: 0 0 var(--b26-gap-block);
	max-width: 52ch;
	/* V3 sets this one larger than the usual 20/24 lead. */
	font-size: 24px;
	line-height: 1.2;
	color: var(--b26-mint-white);
}

.b26-easy__card {
	background: var(--b26-mint-white);
	color: var(--b26-plum);
	border-radius: var(--b26-radius-lg);
	/* V3 mobile: 32 all round. */
	padding: clamp(32px, 3vw, 44px);
}

/* Learner and New Driver: the band and the card swap over. */
.b26-easy--light {
	background: var(--b26-mint-white);
	color: var(--b26-plum);
}

.b26-easy--light .b26-easy__title,
.b26-easy--light .b26-easy__sub {
	color: var(--b26-plum);
}

.b26-easy--light .b26-easy__card {
	background: var(--b26-plum);
	color: var(--b26-mint-white);
}

/* Temporary: same Mint White band, but a Poppy Pink card. */
.b26-easy--pink {
	background: var(--b26-mint-white);
	color: var(--b26-plum);
}

.b26-easy--pink .b26-easy__title,
.b26-easy--pink .b26-easy__sub {
	color: var(--b26-plum);
}

.b26-easy--pink .b26-easy__card {
	background: var(--b26-pink);
	color: var(--b26-plum);
}

.b26-easy__list {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	/* V3 mobile: 36 between steps, and the same again before the button. */
	gap: clamp(36px, 3vw, 44px);
	margin: 0 0 clamp(28px, 3vw, 40px);
}

/*
 * Icon alone in the left column, heading and copy stacked in the right.
 * Previously the copy sat beneath both and ran back under the icon; the Figma
 * keeps it aligned to the heading.
 */
.b26-easy__step {
	min-width: 0;
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	/* V3: 16 between the icon and the step's text. */
	column-gap: 16px;
	align-items: start;
}

.b26-easy__body {
	min-width: 0;
}

.b26-easy__name {
	/* V3: 8 between the step name and its copy. */
	margin-bottom: 8px;
}

/* The icons follow the card: Poppy Pink only where it is the dark one. */
.b26-easy__icon {
	display: inline-flex;
	flex: none;
	color: var(--b26-plum);
}

.b26-easy--light .b26-easy__icon {
	color: var(--b26-pink);
}

/*
 * A square 28px box for all three. The car's artwork is 39 wide against the
 * other two at 28, so sizing on height alone left it noticeably wider than its
 * neighbours. Constraining the box scales it down to fit rather than squashing
 * it - preserveAspectRatio is left at its default, and the exports had the
 * "none" Figma writes stripped on install.
 */
.b26-easy__icon svg,
.b26-easy__icon img {
	width: 28px;
	height: 28px;
	object-fit: contain;
}

.b26-easy__name {
	font-family: var(--b26-display);
	/*
	 * 400, not 700. V3 sets these at regular weight and the display face is
	 * heavy enough already; at 700 the client read them as too bold.
	 */
	font-weight: 400;
	/* V3: 24/24. */
	font-size: 24px;
	line-height: 1;
	letter-spacing: var(--b26-track-display);
}

.b26-easy__copy {
	font-size: 20px;
	line-height: 1.2;
}

.b26-easy__cta {
	/* Centred in the card. .b26-btn is inline-flex, so it sat against the left
	   edge under the three steps. */
	display: flex;
	width: max-content;
	margin-inline: auto;
	/* Dark Plum on the Mint White and Poppy Pink cards; Poppy Pink on the dark one. */
	background: var(--b26-plum);
	color: var(--b26-mint-white);
	border-color: var(--b26-plum);
}

.b26-easy__cta:hover,
.b26-easy__cta:focus {
	background: transparent;
	color: var(--b26-plum);
	border-color: var(--b26-plum);
}

.b26-easy--light .b26-easy__cta {
	background: var(--b26-pink);
	color: var(--b26-plum);
	border-color: var(--b26-pink);
}

.b26-easy--light .b26-easy__cta:hover,
.b26-easy--light .b26-easy__cta:focus {
	background: transparent;
	color: var(--b26-pink);
	border-color: var(--b26-pink);
}

/* Stacked on mobile, with the CTA full width beneath, as the design shows. */
@media (max-width: 900px) {
	.b26-easy__list {
		grid-template-columns: minmax(0, 1fr);
	}

	.b26-easy__cta {
		width: 100%;
	}
}

/* -------------------------------------------------------------------------
   14c. Mobile heading alignment

   Every section heading runs left on mobile in the current design. Several
   partials centre their own titles for desktop, so this straightens them all in
   one place rather than chasing each component.
   ---------------------------------------------------------------------- */

@media (max-width: 900px) {
	.b26-quotes__title,
	.b26-steps__title,
	.b26-finder__title,
	.b26-hub__logo,
	.b26-ways__title,
	.b26-faq__title {
		text-align: left;
	}

	.b26-quotes__title,
	.b26-steps__title,
	.b26-finder__title {
		margin-left: 0;
		margin-right: 0;
	}
}

/* -------------------------------------------------------------------------
   15. Veygo Hub carousel

   V2: a Deep Green band on the Homepage.
   ---------------------------------------------------------------------- */

.b26-hub__logo {
	display: flex;
	justify-content: center;
	margin-bottom: clamp(32px, 3.5vw, 56px);
}

/* The supplied lockup carries an inline
   style="width:100%;height:100%;transform:translate3d(...)" on its root
   <svg>, which has to be neutralised or it fills its parent. */
.b26-hub__mark {
	display: block;
	height: clamp(48px, 4.5vw, 76px);
	aspect-ratio: 1200 / 312;
}

.b26-hub__mark svg {
	width: 100% !important;
	height: 100% !important;
	transform: none !important;
	display: block;
}

/* Two-tone wordmark. The file ships in the OLD brand colours, so both halves
   are forced. Inline fills on the paths are why !important is needed. */
/*
 * The supplied wordmark inherits currentColor, so the band sets it. The
 * #Veygo / #hub rules below only bite on the older media-library fallback,
 * which bakes its own fills in.
 */
.b26-hub__mark {
	color: var(--b26-deep-green);
}

.b26-section--dark .b26-hub__mark {
	color: var(--b26-mint-white);
}

.b26-hub__mark #Veygo path {
	fill: var(--b26-deep-green) !important;
}

.b26-hub__mark #hub path {
	fill: var(--b26-deep-green) !important;
}

.b26-section--dark .b26-hub__mark #Veygo path {
	fill: var(--b26-turquoise) !important;
}

.b26-section--dark .b26-hub__mark #hub path {
	fill: var(--b26-mint-white) !important;
}

.b26-section--turquoise .b26-hub__mark #Veygo path {
	fill: var(--b26-deep-green) !important;
}

.b26-section--turquoise .b26-hub__mark #hub path {
	fill: var(--b26-mint-white) !important;
}

.b26-hub__viewport {
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
	-ms-overflow-style: none;
	/*
	 * Full width of the band. The element sits outside .b26-wrap, so it is not
	 * capped at --b26-max and cards bleed off both edges as the Figma shows.
	 *
	 * Only the gutter is inset. Aligning the first card to the wrapped content
	 * instead was tried and left a 336px dead margin at 1920, which defeats the
	 * point: the carousel is meant to read as edge to edge, not as a centred
	 * column.
	 */
	padding-inline: var(--b26-gutter);
}

.b26-hub__viewport::-webkit-scrollbar {
	display: none;
}

.b26-hub__track {
	display: flex;
	gap: clamp(16px, 1.6vw, 28px);
	width: max-content;
}

.b26-hub__card {
	flex: none;
	/* Widened on request, from clamp(260px, 30vw, 440px). At 1440 this takes a
	   card from ~432px to ~518px, so roughly 2.7 sit in view instead of 3.3,
	   with the next still peeking to signal the scroll. */
	width: clamp(280px, 36vw, 540px);
	scroll-snap-align: center;
	text-decoration: none;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.b26-hub__thumb {
	aspect-ratio: 16 / 10;
	border-radius: 20px;
	overflow: hidden;
	background: var(--b26-green-12);
}

.b26-hub__thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform 0.4s ease;
}

.b26-hub__card:hover .b26-hub__thumb img {
	transform: scale(1.04);
}

.b26-hub__card h3 {
	font-family: var(--b26-display);
	font-size: clamp(20px, 1.3vw, 24px);
	line-height: 1.2;
}

.b26-hub__go {
	/* flex: none — as a flex item in the card column this was shrinking under
	   pressure, which reads as the circle being chopped off at the bottom. */
	flex: none;
	width: 34px;
	height: 34px;
	border-radius: 50%;
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin-top: auto;
}

.b26-hub__go svg {
	width: 18px;
	height: 18px;
	stroke-width: 2;
}

.b26-section--dark .b26-hub__go {
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
}

.b26-hub__dots {
	display: flex;
	justify-content: center;
	gap: 10px;
	margin-top: clamp(28px, 3vw, 44px);
}

.b26-hub__dot {
	width: 12px;
	height: 12px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: var(--b26-green-12);
	cursor: pointer;
	transition: background-color 0.2s ease;
}

.b26-hub__dot[aria-current='true'] {
	background: var(--b26-deep-green);
}

.b26-section--dark .b26-hub__dot {
	background: var(--b26-white-30);
}

.b26-section--dark .b26-hub__dot[aria-current='true'] {
	background: var(--b26-mint-white);
}

.b26-hub__cta {
	display: flex;
	justify-content: center;
	margin-top: clamp(28px, 3vw, 44px);
}

/* -------------------------------------------------------------------------
   16. FAQ
   ---------------------------------------------------------------------- */

.b26-faq__grid {
	display: grid;
	grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
	gap: clamp(32px, 5vw, 96px);
	align-items: start;
}

.b26-faq__title {
	max-width: 10ch;
}

.b26-faq__list {
	display: flex;
	flex-direction: column;
}

.b26-faq__item {
	padding: 22px 0;
}

.b26-faq__item + .b26-faq__item {
	border-top: 1px solid var(--b26-green-12);
}

.b26-faq__q {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 24px;
	width: 100%;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
	text-align: left;
	font-family: var(--b26-display);
	font-size: clamp(20px, 1.35vw, 24px);
	line-height: 1.2;
	color: inherit;
	list-style: none;
}

.b26-faq__q::-webkit-details-marker {
	display: none;
}

.b26-faq__mark {
	flex: none;
	width: 34px;
	height: 34px;
	border-radius: 50%;
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: transform 0.22s ease;
}

.b26-faq__mark svg {
	width: 18px;
	height: 18px;
	stroke-width: 2.25;
}

.b26-faq__item[open] .b26-faq__mark {
	transform: rotate(180deg);
}

.b26-faq__a {
	padding-top: 20px;
	max-width: 62ch;
}

.b26-faq__a > * + * {
	margin-top: 1em;
}

.b26-faq__a p,
.b26-faq__a li {
	font-size: clamp(18px, 1.04vw, 20px);
	line-height: 1.25;
}

.b26-faq__a h2,
.b26-faq__a h3,
.b26-faq__a h4,
.b26-faq__a strong {
	font-family: var(--b26-display);
	font-size: clamp(18px, 1.04vw, 20px);
	font-weight: 400;
}

.b26-faq__a ul,
.b26-faq__a ol {
	padding-left: 1.25em;
	list-style: disc;
}

.b26-faq__a ol {
	list-style: decimal;
}

.b26-faq__a li + li {
	margin-top: 0.4em;
}

.b26-faq__a a {
	text-decoration: underline;
	text-underline-offset: 2px;
}

@media (max-width: 900px) {
	.b26-faq__grid {
		grid-template-columns: 1fr;
		gap: 32px;
	}

	/*
	 * Left, not centred. This rule sits after the block that already left-aligns
	 * every other section heading on mobile, so it was quietly overriding it and
	 * the FAQs were the only centred headline on the page.
	 */
	.b26-faq__title {
		max-width: none;
		text-align: left;
	}
}

/* -------------------------------------------------------------------------
   17. Footer

   V2: the prefooter is a plain Deep Green wordmark on Mint White. The ink
   rounded band from V1 is gone.
   ---------------------------------------------------------------------- */

.b26-footer {
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
	font-family: var(--b26-sans);
}

/*
 * The footer is not held to the 1100 content column. V3 runs it right out to
 * an 80px margin - content from x80 to x1840 at 1920 - which is why it read as
 * a narrow centred block against the rest of the page.
 */
@media (min-width: 901px) {
	.b26-footer .b26-wrap {
		max-width: none;
		padding-inline: 80px;
	}
}

.b26-footer__mark {
	display: flex;
	align-items: center;
	justify-content: center;
	/* 56 top and bottom, evenly. The top used to grow to 112 on desktop. */
	padding: 56px 24px;
	color: var(--b26-deep-green);
}

.b26-footer__mark a {
	display: block;
	/* V3 draws the lockup at its natural 140x87.4 on mobile. */
	width: clamp(140px, 13vw, 210px);
}

.b26-footer__mark svg {
	width: 100%;
	height: auto;
}

/* Belt and braces. b26_inline_asset_svg() already swaps the supplied
   #032B33 for currentColor, but the media-library fallbacks paint their paths
   with an inline style="fill:#005465" that outranks any selector, so
   !important is the only way to recolour those. */
.b26-footer__mark svg,
.b26-footer__mark svg * {
	fill: currentColor !important;
}

/* V3 sets footer nav links at 18/27, looser than the 1.2 used elsewhere. */
.b26-footer__cols a {
	line-height: 1.5;
}

/*
 * Left-packed, content-width columns - not four equal fractions of the row.
 *
 * V3 sets them at x80, 417, 808 and 1120 with widths of 250, 303, 226 and 240,
 * which is each column sized to its own longest link with about 87 between. As
 * equal fractions they spread to the full width and read as a centred block
 * with the links floating apart.
 *
 * minmax(0, max-content) rather than plain max-content so they can still give
 * way and wrap where the row runs out of room.
 */
.b26-footer__cols {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, max-content));
	justify-content: start;
	column-gap: clamp(32px, 4.5vw, 87px);
	row-gap: 40px;
	padding: clamp(32px, 4vw, 64px) 0 0;
}

.b26-footer h2 {
	font-family: var(--b26-display);
	font-weight: 400;
	font-size: 24px;
	margin: 0 0 24px;
}

.b26-footer ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	/* 16px put the links on a ~37px pitch against the Figma's ~43px, which read
	   as cramped at this text size. */
	gap: 22px;
}

/* :where() so this cannot outrank a component that sets its own colour. */
:where(.b26-footer) :where(a) {
	color: inherit;
	text-decoration: none;
}

.b26-footer a:hover {
	text-decoration: underline;
	text-underline-offset: 3px;
}

.b26-footer__note {
	display: block;
	color: var(--b26-green-70);
}

.b26-footer__social {
	padding: clamp(40px, 4vw, 64px) 0 0;
}

.b26-footer__social ul {
	flex-direction: row;
	gap: 12px;
	margin-top: 4px;
}

/* The social SVGs are a single filled disc with the glyph knocked out, so the
   icon IS the circle. No background: fill it Deep Green and the page shows
   through the cut-out. */
.b26-footer__social-link {
	width: 36px;
	height: 36px;
	color: var(--b26-deep-green);
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

/* These files carry inline width/height/transform on the root <svg>. */
.b26-footer__social-link svg {
	width: 100% !important;
	height: 100% !important;
	transform: none !important;
	display: block;
}

.b26-footer__social-link svg,
.b26-footer__social-link svg * {
	fill: currentColor !important;
}

.b26-footer__apps {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	margin-top: 28px;
}

.b26-footer__apps img,
.b26-footer__apps svg {
	height: 46px;
	width: auto;
}

.b26-footer__legal {
	padding: clamp(40px, 4vw, 72px) 0 clamp(40px, 4vw, 64px);
	color: var(--b26-green-70);
	font-size: 1rem;
	line-height: 1.5;
	/*
	 * No measure cap on desktop: V3 runs this line the full 1760 of the footer's
	 * container, and the 100ch cap held it to 1136 and left it looking indented
	 * against the columns above. It is a single line of registration detail, not
	 * body copy, so the long measure is the design's call.
	 */
	max-width: 100ch;
}

@media (min-width: 901px) {
	.b26-footer__legal {
		max-width: none;
	}
}

@media (max-width: 900px) {
	.b26-footer__cols {
		grid-template-columns: 1fr;
		gap: 40px;
	}
}

/* -------------------------------------------------------------------------
   18. Scroll reveal
   ---------------------------------------------------------------------- */

.b26-reveal {
	opacity: 0;
	transform: translateY(24px);
	transition: opacity 0.6s ease, transform 0.6s ease;
}

.b26-reveal.is-in {
	opacity: 1;
	transform: none;
}

@media (prefers-reduced-motion: reduce) {
	.b26-reveal {
		opacity: 1;
		transform: none;
		transition: none;
	}

	.b26-quotes__row {
		animation: none;
	}

	.b26-hub__thumb img,
	.b26-btn,
	.b26-nav__chev,
	.b26-faq__mark,
	.b26-drawer,
	.b26-drawer__mark,
	.b26-nav__link::after,
	.b26-mega__lead svg,
	.b26-mega__links--list svg {
		transition: none;
	}

	/* The mega panel and its contents swap instantly: no fade, no slide. */
	.b26-mega,
	.b26-mega__panel {
		transition: none;
		transform: none;
	}

	/* transform:none above would un-centre the panel, so restore the shift. */
	.b26-mega--centred,
	.b26-mega--centred.is-open {
		transform: translateX(-50%);
	}
}

/* -------------------------------------------------------------------------
   19. Feature split  (partials/b26/feature-split.php)

   Deep Green band, copy plus a white key-points card on the left, a circular
   photo on the right, and a Turquoise disc bleeding in from the top right.
   ---------------------------------------------------------------------- */

.b26-split {
	overflow: hidden;
	overflow: clip;
}

/* The disc sits behind everything and is clipped by the band's own radius,
   which is what produces the scalloped top edge in the mockup. */
.b26-split__disc {
	position: absolute;
	top: -34%;
	right: 6%;
	width: 620px;
	aspect-ratio: 10 / 9.5;
	border-radius: 50%;
	background: var(--b26-turquoise);
	pointer-events: none;
	z-index: 0;
}

/*
 * Tracks, not proportions. Across the 1100 content column V3 gives the copy 771
 * and the art 273, with 56 between - and the media-left variant 273 / 182 / 645.
 * The 1fr / 0.85fr split this used to run handed the art 469 and squeezed the
 * copy to 551, which wrapped the paragraphs an extra two lines and made each of
 * these sections about 230px taller than the frames.
 *
 * The art track is narrower than the circles it holds on purpose: the stack
 * bleeds out of the content column towards the viewport edge, and the band's
 * own overflow: clip crops it. See .b26-split__art below.
 */
.b26-split__grid {
	position: relative;
	z-index: 1;
	display: grid;
	grid-template-columns: minmax(0, 1fr) 273px;
	gap: 56px;
	align-items: center;
}

.b26-split__copy {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	/* This gap owns the heading-to-paragraph spacing, so the title carries no
	   margin-bottom of its own. */
	gap: var(--b26-gap-title);
}

/*
 * Editor HTML inside the split. The hand-authored templates pass discrete
 * paragraphs; legacy blocks pass a WYSIWYG field, so it needs its own rhythm
 * for the tags an editor can produce.
 */
.b26-split__rich > * + * {
	margin-top: 1em;
}

.b26-split__rich ul,
.b26-split__rich ol {
	list-style: revert;
	padding-left: 1.25em;
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.b26-split__rich a {
	text-decoration: underline;
	text-underline-offset: 3px;
}

.b26-split__title {
	color: var(--b26-turquoise);
	max-width: 14ch;
	/* Zero: the copy column is a flex stack whose own gap already provides the
	   20px beneath the heading. A margin here doubles it. */
	margin-bottom: 0;
}

/* On the turquoise band the heading and the decorative disc both flip to Deep
   Green, otherwise each would be turquoise on turquoise. */
.b26-split--turquoise {
	color: var(--b26-deep-green);
}

.b26-split--turquoise .b26-split__title {
	color: var(--b26-deep-green);
}

.b26-split--turquoise .b26-split__disc {
	background: var(--b26-deep-green);
}

.b26-split__copy p {
	max-width: 52ch;
}

.b26-split__card {
	width: 100%;
	/* 618 in V3, holding a 570 list inside 24 of padding. */
	max-width: 618px;
	/*
	 * .b26-split__copy is a flex column whose gap already contributes
	 * --b26-gap-title, so this tops the spacing up to --b26-gap-block instead
	 * of adding a second full block gap on top of it. It used to set the full
	 * 40px, which stacked with the 20px gap and put the card 60px below the
	 * paragraph where V3 asks for 40.
	 */
	margin-top: calc(var(--b26-gap-block) - var(--b26-gap-title));
	padding: 24px 28px;
	background: #fff;
	color: var(--b26-deep-green);
	border-radius: var(--b26-radius-card);
}

.b26-split__card-title {
	font-family: var(--b26-display);
	line-height: 1;
	font-size: 20px;
	margin-bottom: 12px;
}

/*
 * The card's closing caveat: same size as the points but with no tick, so it
 * lines up with the card's own edge rather than with the ticked text.
 */
.b26-split__note {
	margin: 20px 0 0;
	font-size: 18px;
	line-height: 1.2;
}

.b26-split__points {
	display: flex;
	flex-direction: column;
	/* V3: 10 between rows - it sets them 32 apart at 18/21.6. */
	gap: 10px;
}

.b26-split__points li {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	font-size: 18px;
	/* 130%, up from V3's 120%, per the 25 August feedback. */
	line-height: 1.3;
}

/*
 * A bare tick, not a tick in a filled disc. The 25 August feedback moved these
 * "outside of the circles" and the Figma was updated to match: a 12x12 Deep
 * Green vector sitting beside the text, with nothing behind it.
 */
.b26-split__tick {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 12px;
	height: 12px;
	flex: none;
	/* Optically centred on the first line rather than its cap height. */
	margin-top: 6px;
	color: var(--b26-deep-green);
}

.b26-split__tick svg {
	width: 12px;
	height: 12px;
	stroke-width: 3;
}

.b26-split__cta {
	/*
	 * Same top-up as .b26-split__card: the parent's flex gap already supplies
	 * --b26-gap-title, so this adds the remainder to reach --b26-gap-block.
	 * V3 puts 40px between the card and the button, matching the 40px between
	 * the paragraph and the card; this was an arbitrary 6px, giving 26.
	 */
	margin-top: calc(var(--b26-gap-block) - var(--b26-gap-title));
}

/*
 * Media-left variant, used by the homepage's "Why pick Veygo?".
 *
 * Reordered visually rather than in markup: the DOM keeps copy before art, so
 * the heading is still what a screen reader meets first and what stacks first
 * on mobile. Only the desktop grid flips.
 *
 * min-width 901 deliberately mirrors the max-width 900 stacking rule below. At
 * 861 the order swap leaked into the stacked layout and put the photo above the
 * heading on mobile.
 */
@media (min-width: 901px) {
	.b26-split--media-left .b26-split__grid {
		grid-template-columns: 273px minmax(0, 1fr);
		gap: 182px;
	}

	.b26-split--media-left .b26-split__copy {
		order: 2;
	}

	.b26-split--media-left .b26-split__art {
		order: 1;
	}

	.b26-split--media-left .b26-split__photo {
		margin-left: 0;
		margin-right: auto;
	}
}

/*
 * Media-left uses its own O treatment rather than the section-level disc.
 *
 * That disc is absolutely positioned against the <section>, so it cannot line
 * up with the photo: the wrap is centred and capped at --b26-max, meaning the
 * photo's left edge moves with viewport width while the disc's does not. At
 * 1440 it read as a huge shape swallowing the photo instead of touching it.
 *
 * These pseudo-elements hang off the art column itself, so they inherit the
 * photo's exact width and sit flush against its top and bottom edges at every
 * width — the circle treatment's "touch edge to edge, never overlap" rule. The
 * band's own overflow: clip crops them, which is how the Figma shows them.
 */
/*
 * The section-level disc is retired in favour of pseudo-elements on the art
 * column, for BOTH media sides.
 *
 * That disc was absolutely positioned against the <section>, so it could never
 * line up with the photo: the wrap is centred and capped at --b26-max, meaning
 * the photo's edge moves with viewport width while the disc's does not. It
 * overlapped the photo by 181-238px at 1440, which the design team has since
 * ruled out — O-shapes touch at the tip, never overlap.
 *
 * These hang off the art column instead, so they inherit the photo's exact
 * width and sit flush against its top and bottom edges at every width. The
 * band's own overflow: clip crops them, which is how the Figma shows them.
 */
.b26-split__disc {
	display: none;
}

.b26-split__art {
	position: relative;
	z-index: 1;
}

/*
 * 660 wide in a 273 track. V3 pins the stack's inner edge to the content column
 * and lets the rest run out towards the viewport: left edge at the track's left
 * when the art is on the right, and the mirror of that for --media-left.
 */
@media (min-width: 901px) {
	.b26-split__art {
		width: 660px;
		justify-self: start;
	}

	.b26-split--media-left .b26-split__art {
		justify-self: end;
	}
}

/*
 * One O either side of the photo, horizontally, edges touching — the same
 * treatment as the hero's row. They were stacked above and below, which read as
 * a different device from the rest of the page.
 */
.b26-split__art::before,
.b26-split__art::after {
	content: '';
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	width: min(100%, 340px);
	aspect-ratio: 10 / 9.5;
	border-radius: 50%;
	/* Turquoise on the Deep Green band, and vice versa below. Hardcoding Deep
	   Green here made them the band's own colour and they vanished entirely. */
	background: var(--b26-turquoise);
	pointer-events: none;
	/* The trailing O is faded; see below. */
	opacity: 1;
	z-index: -1;
}
/*
 * The second O is drawn at 40%, per the 1 September frames: one solid and one
 * faded, rather than two identical discs.
 *
 * Those frames stack the pair vertically on desktop (faded above the photo,
 * solid below) and horizontally on mobile (solid, photo, faded). Ours are
 * horizontal at both sizes, so the faded one is always the trailing disc - the
 * relationship is right even where the axis is not.
 *
 * Declared AFTER the shared rule above, which sets opacity: 1; both are two
 * selectors deep, so source order decides.
 */
.b26-split__art::after {
	opacity: 0.4;
}


.b26-split--turquoise .b26-split__art::before,
.b26-split--turquoise .b26-split__art::after {
	background: var(--b26-deep-green);
}

/*
 * Mobile: one O either side of the photo, horizontally. The grid is stacked at
 * this width so there is nothing beside the art column to collide with.
 */
.b26-split__art::before {
	right: 100%;
}

.b26-split__art::after {
	left: 100%;
}

/*
 * Desktop: stacked vertically instead, photo in the middle.
 *
 * Must come AFTER the base declarations above — a media query adds no
 * specificity, so an earlier block would simply lose to the mobile values.
 *
 * Sideways O's cannot work here: the columns sit next to each other, so the
 * inner one lands directly on the copy. On "Why choose Veygo?", where the photo
 * is the left column, it covered the paragraph and the key-points card.
 */
@media (min-width: 901px) {
	.b26-split__art::before,
	.b26-split__art::after {
		width: min(100%, 660px);
		top: auto;
		bottom: auto;
		right: auto;
		left: auto;
		transform: none;
	}

	/* Default: photo is right-aligned in its column, so the O's follow it. */
	.b26-split__art::before,
	.b26-split__art::after {
		right: 0;
	}

	/* --media-left: photo is left-aligned, so they pin to the other edge. */
	.b26-split--media-left .b26-split__art::before,
	.b26-split--media-left .b26-split__art::after {
		right: auto;
		left: 0;
	}

	.b26-split__art::before {
		bottom: 100%;
	}

	.b26-split__art::after {
		top: 100%;
	}
}

.b26-split__photo {
	/* 660 in V3, the same as the O's above and below it. */
	width: min(100%, 660px);
	margin-left: auto;
	aspect-ratio: 10 / 9.5;
	border-radius: 50%;
	overflow: hidden;
	background: var(--b26-white-30);
}

.b26-split__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 50%;
}

@media (max-width: 900px) {
	.b26-split__grid {
		grid-template-columns: 1fr;
		gap: 40px;
	}

	.b26-split__title {
		max-width: none;
	}

	.b26-split__card {
		max-width: none;
	}

	/*
	 * The art column is sized to the photo rather than the photo being centred
	 * inside a wider column. The O-shapes are positioned against the column, so
	 * while the photo sat 5px inside it they could never meet the photo's edge -
	 * which is the gap the client spotted. With the two boxes the same, pinning
	 * an O to the column edge puts it exactly on the photo's.
	 */
	.b26-split__art {
		width: min(100%, 340px);
		margin-inline: auto;
	}

	.b26-split__photo {
		margin: 0;
		width: 100%;
	}

	/*
	 * Edges exactly coincident - kissing, not overlapping. The art column is
	 * sized to the photo above, so 100% lands precisely on the photo's edge.
	 */
	.b26-split__art::before {
		right: 100%;
	}

	.b26-split__art::after {
		left: 100%;
	}

	.b26-split__disc {
		top: -14%;
		right: -22%;
		width: 60vw;
		max-width: 320px;
	}
}

/* -------------------------------------------------------------------------
   20. Cross-sell  (partials/b26/cross-sell.php)
   ---------------------------------------------------------------------- */

.b26-cross__card {
	margin: 0 auto;
	border-radius: var(--b26-radius-band);
	padding: clamp(32px, 4vw, 56px) clamp(28px, 4vw, 64px);
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: clamp(24px, 4vw, 64px);
	align-items: center;
}

.b26-cross__card--turquoise {
	background: var(--b26-turquoise);
	color: var(--b26-deep-green);
}

/* Poppy Pink on a Mint White band: the current Figma for all three products. */
/*
 * The 3D mark sits between the copy and the CTAs. It is the only thing in the
 * card that may drop away, so the column is auto and the card falls back to
 * two columns without it.
 */
.b26-cross__mark {
	position: absolute;
	right: 0;
	top: 50%;
	transform: translateY(-50%);
	width: var(--b26-cross-mark);
	height: auto;
}

@media (max-width: 860px) {
	.b26-cross__mark {
		display: none;
	}
}

.b26-cross__card--pink {
	background: var(--b26-pink);
	color: var(--b26-plum);
}

/* Light card on a turquoise band, as used on Temporary. */
.b26-cross__card--cream {
	background: var(--b26-mint-white);
	color: var(--b26-deep-green);
}

/*
 * The copy column carries the 3D mark on its right, so the text is kept clear
 * of it. Without the mark the custom property is 0 and nothing is reserved.
 */
.b26-cross__copy {
	position: relative;
	--b26-cross-mark: clamp(120px, 13vw, 242px);
}

.b26-cross__copy:not(:has(.b26-cross__mark)) {
	--b26-cross-mark: 0px;
}

/*
 * Nothing is held clear of the mark: V3 runs both the headline and the
 * paragraph the full width of the copy column and lets the mark float over the
 * slack at their right, where its artwork is transparent. Reserving room for it
 * forced a third headline line and a four-line paragraph the design does not
 * have.
 */

.b26-cross__title {
	max-width: 12ch;
	margin-bottom: 14px;
}

.b26-cross__sub {
	font-size: clamp(1rem, 1.15vw, 1.125rem);
	line-height: 1.4;
}

.b26-cross__actions {
	display: flex;
	flex-direction: column;
	gap: 12px;
	min-width: 260px;
}

.b26-cross__actions .b26-btn {
	width: 100%;
}

@media (max-width: 860px) {
	.b26-cross__card {
		grid-template-columns: 1fr;
	}

	.b26-cross__title {
		max-width: none;
	}

	.b26-cross__actions {
		min-width: 0;
	}
}

/* -------------------------------------------------------------------------
   21. Eligibility  (partials/b26/eligibility.php) — Temporary
   ---------------------------------------------------------------------- */

.b26-elig__grid {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: clamp(32px, 5vw, 80px);
	align-items: start;
}

.b26-elig__copy {
	display: flex;
	flex-direction: column;
	gap: 18px;
}

.b26-elig__copy p {
	max-width: 44ch;
}

.b26-elig__panels {
	display: flex;
	flex-direction: column;
	gap: 24px;
}

.b26-elig__card {
	background: #fff;
	border-radius: var(--b26-radius-card);
	padding: 24px 28px;
}

.b26-elig__card-title {
	font-family: var(--b26-display);
	font-size: 1.125rem;
	margin-bottom: 12px;
}

.b26-elig__checks {
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.b26-elig__checks li {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	font-size: 1.0625rem;
	line-height: 1.2;
}

.b26-elig__checks b {
	font-weight: 600;
}

.b26-elig__tick {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 20px;
	height: 20px;
	flex: none;
	margin-top: 2px;
	border-radius: 50%;
	background: var(--b26-deep-green);
	color: #fff;
}

.b26-elig__tick svg {
	width: 12px;
	height: 12px;
	stroke-width: 3;
}

.b26-elig__table-wrap {
	background: #fff;
	border-radius: var(--b26-radius-card);
	overflow: hidden;
}

.b26-elig__table {
	width: 100%;
	border-collapse: collapse;
	font-size: 1.0625rem;
}

.b26-elig__table th,
.b26-elig__table td {
	padding: 14px 20px;
	text-align: left;
}

.b26-elig__table thead th {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	font-family: var(--b26-display);
	font-weight: 400;
}

.b26-elig__table tbody th {
	font-weight: 400;
}

.b26-elig__table tbody tr + tr th,
.b26-elig__table tbody tr + tr td {
	border-top: 1px solid var(--b26-green-12);
}

@media (max-width: 900px) {
	.b26-elig__grid {
		grid-template-columns: 1fr;
		gap: 36px;
	}

	.b26-elig__copy p {
		max-width: none;
	}
}

/* -------------------------------------------------------------------------
   22. Cover details  (partials/b26/cover-details.php) — Temporary
   ---------------------------------------------------------------------- */

.b26-cover__title {
	margin-bottom: 28px;
}

.b26-cover__intro {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 24px clamp(32px, 5vw, 72px);
	margin-bottom: clamp(32px, 4vw, 56px);
}

.b26-cover__panels {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: clamp(20px, 2.5vw, 36px);
}

.b26-cover__card {
	background: #fff;
	border: 1px solid var(--b26-green-12);
	border-radius: var(--b26-radius-card);
	padding: 26px 30px;
}

.b26-cover__card-title {
	font-family: var(--b26-display);
	font-size: 1.125rem;
	margin-bottom: 16px;
}

.b26-cover__list {
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.b26-cover__list li {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	font-size: clamp(18px, 1.04vw, 20px);
	line-height: 1.2;
}

.b26-cover__mark {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	flex: none;
	margin-top: 1px;
	border-radius: 50%;
	color: #fff;
}

.b26-cover__mark svg {
	width: 13px;
	height: 13px;
	stroke-width: 3;
}

.b26-cover__list--yes .b26-cover__mark {
	background: var(--b26-deep-green);
}

/* Red is the only place the palette carries a warning colour, and the glyph
   is decorative: the row text carries the meaning. */
.b26-cover__list--no .b26-cover__mark {
	background: var(--b26-danger);
}

.b26-cover__note {
	margin-top: clamp(28px, 3vw, 44px);
	display: flex;
	flex-direction: column;
	gap: 18px;
	align-items: flex-start;
}

.b26-cover__docs {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

.b26-cover__docs svg {
	width: 18px;
	height: 18px;
}

@media (max-width: 860px) {
	.b26-cover__intro,
	.b26-cover__panels {
		grid-template-columns: 1fr;
	}
}

/* With no exclusions copy supplied the covered card renders alone, and a lone
   card in a two-column grid reads as a missing element rather than a choice. */
.b26-cover__panels--single {
	grid-template-columns: minmax(0, 1fr);
	max-width: 640px;
}

/*
 * Mobile section rhythm, measured off the V3 mobile homepage frame.
 *
 * V3 stacks its sections with 56px of padding top and bottom, so the gap
 * between two of them is 112px. Three boundaries did not follow that:
 *
 *   - The hero's art row runs to the very bottom edge of the header frame in
 *     V3, with no padding under it. Ours added 64px, so the circles floated.
 *   - The cover finder carries NO vertical padding of its own in V3; the
 *     spacing either side comes from its neighbours. Ours added the standard
 *     56px on top of theirs, which is what made the gap under the trust bar
 *     look too wide.
 *   - V3 puts the big Veygo wordmark in its own 56px-padded section above the
 *     footer, giving 112px below the FAQs. Ours had it inside the footer with
 *     no padding, so it sat 56px up.
 */
/*
 * Mobile band radii, read off the V3 mobile frame.
 *
 * V3 rounds almost nothing on mobile, and where it does it rounds ONE edge so
 * the band reads as joined to its neighbour. Only three carry a radius, all
 * 32px: the finder's dark panel and the testimonials band on their top corners,
 * and the Veygo Hub on its bottom corners. Everything else is square.
 *
 * Desktop is different and stays as it is: there the turquoise band is rounded
 * on all four corners at 56px, and the finder panel likewise, because both are
 * inset from the page edge rather than running into it.
 */
@media (max-width: 900px) {
	.b26-band {
		border-radius: 0;
	}

	/*
	 * Full bleed on mobile. V3 runs this panel the whole 390 and puts the 20px
	 * inset inside it, where ours inherited .b26-wrap's 20px padding and sat
	 * 350 wide. Only the top corners are rounded: the bottom runs into the
	 * section below rather than closing off.
	 */
	.b26-finder--card .b26-finder__cols {
		width: 100vw;
		margin-left: calc(50% - 50vw);
		margin-right: calc(50% - 50vw);
		border-radius: 32px 32px 0 0;
		padding: 46px 20px;
	}
}

/*
 * The circle row carries its own background in V3: a linear gradient with both
 * stops at exactly 50%, so it reads as a hard split rather than a fade —
 * Turquoise across the top half of the circles, Mint White across the bottom.
 * The band above stays Turquoise and the trust bar below is already Mint White,
 * so the join is invisible and the circles appear to straddle the boundary.
 *
 * .b26-hero__art is exactly the row's box here (same height, full viewport
 * width), so 50% of it is 50% of the circles.
 */
@media (max-width: 900px) {
	.b26-hero--turquoise .b26-hero__art {
		background: linear-gradient(
			to bottom,
			var(--b26-turquoise) 0 50%,
			var(--b26-mint-white) 50% 100%
		);
	}

	/*
	 * Same split on the Deep Green heroes: the hero's own colour across the top
	 * half of the circles and the next section's Mint White across the bottom,
	 * so the row straddles the join. The 1 September frames draw the gradient
	 * bottom-to-top, which puts Deep Green above and Mint White below.
	 */
	.b26-hero--dark .b26-hero__art {
		background: linear-gradient(
			to bottom,
			var(--b26-deep-green) 0 50%,
			var(--b26-mint-white) 50% 100%
		);
	}

	.b26-hero {
		padding-bottom: 0;
	}

	.b26-section.b26-finder {
		padding-top: 0;
		padding-bottom: 0;
	}

	.b26-footer {
		padding-top: var(--b26-section-y);
	}
}

/* -------------------------------------------------------------------------
   Help Centre
   -------------------------------------------------------------------------
   The Help Centre still runs on the pre-refresh Tailwind build, whose classes
   are compiled and cannot be regenerated here. These rules re-brand it from
   the brand26 sheet instead, which loads after it.
   ---------------------------------------------------------------------- */

/*
 * The 2 September icon set. Every one is 24 tall but they run 21-29 wide, so the
 * span is a fixed 32px box and the SVG inside is sized by height only - a shared
 * width would squash the wide ones. Deep Green comes through currentColor, which
 * b26_inline_asset_svg() swaps in for the exported #032B33.
 */
.help-hero__box .help-hero__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 32px;
	width: 32px;
	height: 32px;
	color: var(--b26-deep-green);
}

.help-hero__box .help-hero__icon svg {
	width: auto;
	height: 24px;
}

/* Hero viewport boxes: copy in Deep Green, chevrons as on the cards below. */
.help-hero__box {
	color: var(--b26-deep-green);
	font-family: var(--b26-sans);
}

.help-card__excerpt {
	color: rgb(3 43 51 / 80%);
}

/* Turquoise, per the 25 August feedback. As a fill rather than the text
   colour: #00FFE5 type on a white card is close to unreadable. */
.help-card__more {
	background: var(--b26-turquoise);
	color: var(--b26-deep-green);
	font-weight: 700;
}

/* Deep Green disc with a Mint White chevron, on the cards and the hero boxes. */
.help-card__chevron {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
	box-shadow: none;
}

.help-card__chevron svg,
.help-card__chevron svg * {
	fill: currentColor;
	stroke: currentColor;
}

/*
 * Help articles: brand font and Deep Green throughout. The template still
 * carries the old build's colour utilities (#005465 headings, body-secondary
 * meta), which cannot be recompiled, so they are overridden here.
 */
.help-page .article-wrapper,
.help-page .article-content {
	font-family: var(--b26-sans);
	color: var(--b26-deep-green);
}

.help-page .article-content :where(h1, h2, h3, h4, h5, h6) {
	font-family: var(--b26-display);
	color: var(--b26-deep-green);
}

.help-page .article-content :where(p, li, td, th, span, div) {
	color: var(--b26-deep-green);
}

.help-page .article-content :where(a) {
	color: var(--b26-deep-green);
	text-decoration-color: var(--b26-deep-green);
}

/* Help Centre: the remaining pre-refresh templates. */
.help-card__title {
	color: var(--b26-deep-green);
}

.help-related {
	background: var(--b26-mint-white);
}

.help-related__title {
	color: var(--b26-deep-green);
}

.help-icon {
	background: var(--b26-mint-white);
}

.help-cta__btn {
	background: var(--b26-deep-green);
	color: var(--b26-mint-white);
}
