/*
 * V2: the static nebula backdrop.
 *
 * One fixed layer behind the whole site, carrying the picture. Everything else
 * here exists because the V1 site is light: seventeen opaque bands, dark Ink
 * body copy and a dark header lockup would each have hidden or broken on a dark
 * ground.
 *
 * THE VEIL IS GONE, removed by instruction on 2026-09-04 so the backdrop shows
 * its own colours. It was a flat rgba(0, 18, 20, 0.62) laid over the picture in
 * the same declaration, and it used to be the site's contrast floor: the
 * 6.13:1 tightest pair measured across four pages and 54 text elements at
 * 1280x900 was measured through it.
 *
 * What replaced it as the floor is the backdrop asset itself. Since 2026-09-04
 * technical/generate-site-backdrop.py compresses the source's luminance to a
 * 0.26 cap and verifies that cap on the encoded WebP, so the picture arrives
 * already dark and the veil was darkening an image that no longer needed it.
 * Measured on the shipped asset with no veil at all: Off White body copy holds
 * 4.5:1 across 99.84% of the frame and never drops under the 3:1 large-text
 * floor anywhere in it, and the pixels that do fail are star cores and single
 * nebula filaments rather than any patch wide enough to sit behind a word.
 *
 * WHAT THIS DID COST, and it is not fixed: Light Aqua. It was 4.65:1 at the
 * brightest pixel through the veil and is 1.42:1 without one, failing 4.5:1
 * over 13% of the frame on a plain band and 27% on a glass card. That lands on
 * the fee amounts, which is the tightest pair on the site and is commented
 * where it sits below. Moving those to Off White is the fix and it has not been
 * made, because the accent colour is the client's call. If the veil is ever
 * reinstated, or the 0.26 cap in the generator is raised, re-measure both
 * colours on a glass card as well as on a plain band before shipping.
 *
 * Do not move the backdrop to `background-attachment: fixed` on html. iOS Safari
 * sizes a fixed attachment to the document rather than the viewport, which both
 * breaks the framing and reintroduces the bug this replaced: on a 1543px-tall
 * mobile hero the old cover image magnified 3.95x and showed 14% of the frame,
 * so the lower half of the phone hero was empty sky.
 */

/* scrollbar-gutter reserves the scrollbar's width whether or not a scrollbar
   is drawn. Core locks body scroll when the menu opens, which removed the
   scrollbar and widened the viewport by its width, so the whole page jumped
   sideways on every open and back on every close. Reserving the gutter means
   nothing moves. Overlay scrollbars, which is every iOS device and any
   trackpad Mac, never had the problem and are unaffected. */
html { background: #001416; }

/* Reserve the scrollbar's width so the page cannot shift sideways when core
   locks body scroll to open the menu. Desktop only: phones and tablets draw
   overlay scrollbars that take no width, so there is nothing to reserve, and
   reserving anyway cost 15px of the right gutter on a 390px screen, which is
   what pushed the lockup's strapline up against the edge. */
@media (min-width: 601px) {
  html { scrollbar-gutter: stable; }
}
body { background: transparent !important; color: var(--wp--preset--color--off-white) !important; }

/* One fixed layer carries the nebula, and nothing over it. background-attachment:
   fixed is unreliable on iOS Safari, which sizes it to the document rather than
   the viewport; a position: fixed pseudo-element behaves correctly everywhere.

   The flat rgba(0, 18, 20, 0.62) gradient that used to sit over the image in
   this same declaration was removed on 2026-09-04, so the picture shows its own
   colours. The contrast reasoning is in the file header: the floor now lives in
   the generator's 0.26 luminance cap rather than here. */
body::before {
  content: ""; position: fixed; left: 0; right: 0; z-index: 0; pointer-events: none;
  background:
    /* The ?v= is not decoration. 20i edge-caches static assets under the plain
       path and goes on serving the previous build after the file is replaced
       on disk, so bump this number every time the backdrop is regenerated or
       visitors keep the old picture. v=2 is HeroBg3, the client's 2026-09-03
       source. Do NOT use ?w=, which is a core WordPress query var meaning
       week number and returns a genuine 404. */
    #001416 url('../images/site-nebula-backdrop.webp?v=2') center center / cover no-repeat;
  /* Parallax headroom. The layer is drawn 48vh taller than the viewport and
     hung 24vh above it so motion.js can drift it downwards by 24vh without
     ever pulling an edge into frame. inset:0 plus a translate would show the
     flat #001416 fallback along the top. The travel was doubled on 2026-08-31
     and these two numbers were doubled with it; they must always be twice the
     travel in initBackdropParallax() and the same again in height.

     translate3d, not top/margin: it stays on the compositor, which is what
     keeps a full-viewport layer at 60fps while the whole document scrolls. */
  top: -24vh; height: 148vh;
  transform: translate3d(0, var(--eft-matrix-backdrop-y, 0px), 0);
  will-change: transform;
}

/* A reader who prefers reduced motion gets the layer pinned flat, matching
   the module in motion.js, which creates no tween for them at all. This also
   covers the case where the script never runs. */
@media (prefers-reduced-motion: reduce) {
  body::before {
    top: 0; height: 100%;
    transform: none;
    will-change: auto;
  }
}
.wp-site-blocks { position: relative; z-index: 1; }

/* Bands now only tint for variation. The light bands are fully transparent, so
   the backdrop runs through them at its own strength, as it does behind the
   header. The dark bands and the footer sit at 0.50, and that difference is now
   the whole of the section alternation.

   Since the veil was removed on 2026-09-04 these 0.50 tints are the only thing
   between the picture and the text on a dark band, and the light bands have
   nothing at all. Contrast there rests entirely on the 0.26 luminance cap baked
   into the backdrop asset by technical/generate-site-backdrop.py. Raise that cap
   and the light bands are the first thing to re-measure. */
.wp-block-group.has-off-white-background-color,
.wp-block-group.has-white-background-color,
.wp-block-group.has-pale-mint-background-color,
.wp-block-group.has-soft-mint-background-color { background-color: transparent !important; }
.wp-block-group.has-deep-teal-background-color,
.wp-block-group.has-deepest-teal-background-color { background-color: rgba(0, 16, 18, 0.50) !important; }

/* Header and footer. */
/* The header has no ground of its own: the backdrop runs behind the menu.
   The override is still required, because parts/header.html sets
   backgroundColor "off-white" on this group and would otherwise paint an
   opaque band across the top. The submenu panel below keeps its own solid
   ground, since a dropdown over a picture is unreadable without one. */
/* The selector must outrank the band rule above, not just carry !important.
   This element is <header class="wp-block-group eft-matrix-header
   has-off-white-background-color">, so it also matches
   .wp-block-group.has-off-white-background-color at 0-2-0. A plain
   .eft-matrix-header is 0-1-0 and loses even with !important, which is why
   the header kept painting a band tint after the tint was "removed". */
header.wp-block-group.eft-matrix-header { background-color: transparent !important; }
/* The header logo is the original artwork again, at the client's request on
   2026-08-31. It is dark teal on a dark ground and measures about 2.4:1, so
   the wordmark is hard to read; the recoloured light lockup is still on disk
   at assets/images/eft-matrix-logo-horizontal-light.webp if it is wanted back. */
.eft-matrix-header a:not(.wp-block-button__link) { color: var(--wp--preset--color--off-white) !important; }
/* The header CTA keeps its off-white pill and dark label; the rule above must
   not repaint it, or it becomes off-white on off-white. */
.eft-matrix-header .wp-block-button__link { color: var(--wp--preset--color--ink) !important; }
.eft-matrix-header .wp-block-navigation__submenu-container { background-color: rgba(0,18,20,.96) !important; border-color: rgba(250,252,251,.18) !important; }
/* The footer is TWO nested elements: the template-part wrapper and the
   .eft-matrix-footer group inside it. Veiling both stacked 0.70 over 0.70 for
   roughly 0.91 effective, far darker than intended. Only the inner group is
   painted, and its selector has to outrank
   .wp-block-group.has-deepest-teal-background-color (0-2-0) for the same
   reason the header did. */
footer.wp-block-group.eft-matrix-footer { background-color: rgba(0, 14, 16, 0.50) !important; }

/* Text inversion. */
.has-ink-color, .has-deepest-teal-color, .has-deep-teal-color, .has-muted-color,
h1, h2, h3, h4, p, li, td, th, figcaption, strong, em { color: var(--wp--preset--color--off-white) !important; }

/* Brand gold on every h1 and h2, by instruction on 2026-09-04. #d4af37 is the
   gold this site already uses as a colour rather than as a plate: the strapline
   separators in the header take it, and it is the base the filled buttons are
   drawn from.

   IT NEEDS A DESCENDANT SELECTOR, not a bare h1, h2. Almost every heading on
   the site carries .has-deepest-teal-color from its block attributes, and
   WordPress emits those preset classes with !important, so a 0-0-1 tag selector
   loses on specificity even carrying !important of its own. .wp-site-blocks h1
   is 0-1-1 and clears it. Verified on the rendered page across all ten heading
   shapes rather than assumed, because core block output outranks this
   stylesheet in more than one place.

   CONTRAST, measured on the shipped backdrop with the veil gone. Display
   headings are large text, so the AA threshold is 3:1, and gold holds it across
   98.84% of the frame on a plain band and 96.23% on a glass card. It does not
   reach 4.5:1: it is under that across 11% of a plain band. That is the same
   trade as the button label, accepted for the brand rather than overlooked.

   THE FOOTER IS THE ONE PLACE TO LOOK AT AGAIN. Its 26 headings are 12px, so
   they are NOT large text and 4.5:1 applies to them. They pass anyway, because
   the footer keeps its own 0.50 tint and gold is under 4.5:1 across only 0.06%
   of that ground. They were Light Aqua and are now gold, which is a visible
   change to the footer rather than a contrast problem. Scope this rule out of
   `footer` if that was not wanted. */
.wp-site-blocks h2 { color: #d4af37 !important; }

/* h1 is white, by instruction on 2026-09-04, replacing the #008B89 it carried
   for part of the same day. That value sat inside the backdrop's own luminance
   range, so roughly two fifths of every page title was on ground it could not
   be told apart from; white is the one value that clears 3:1 across 100% of the
   ground behind every h1 on the site, measured rather than assumed.

   It is pure #ffffff rather than the Off White token, so the h1 reads a step
   brighter than the body copy the rule above sets to Off White. Swap in
   var(--wp--preset--color--off-white) if headings and body should match; it
   measures the same 100% coverage, at a worst pixel of 3.95:1 rather than
   4.07:1.

   GOLD SINCE 2026-10-02, by instruction ("all page titles to Gold"). Same
   #d4af37 as the h2 rule above, so the measurement there applies: 3:1 across
   about 99% of the backdrop, which is the threshold for display-size text.
   Titles on the LIGHT heroes (home, contact) cannot take this gold, which is
   1.98:1 on cream; home.css and contact.css give those a deeper gold. To go
   back to white, restore #ffffff here. */
.wp-site-blocks h1 { color: #d4af37 !important; }
.has-primary-teal-color, .has-mid-teal-color { color: var(--wp--preset--color--light-aqua) !important; }

/* The fee amounts were Deep Teal for 8.36:1 on a white card. On the dark ground
   that is 1.5:1, so they move to Light Aqua, which is the accent this theme
   already uses for emphasis on dark grounds (the footer headings).

   THIS IS THE TIGHTEST PAIR ON THE SITE and since the veil came off on
   2026-09-04 it no longer passes. Light Aqua on the glass card over the bare
   backdrop measures 1.29:1 at the brightest pixel and is under 4.5:1 across 27%
   of the frame, so an amount that lands on a bright nebula is hard to read.
   Off White holds 4.5:1 over 99.6% of the same card and is the one line fix:
   swap the token below. It was left as it is because the accent colour is the
   client's call, not a defect to be tidied away. The footer headings use the
   same colour and are fine, because the footer keeps its own 0.50 tint. */
.eft-matrix-fee-amount { color: var(--wp--preset--color--light-aqua) !important; }

/* Cards: glass rather than white slabs. */
/* The two alphas are custom properties so the hover can reach them. Both
   declarations carry !important, which an inline style from GSAP cannot
   outrank; a variable inside the value can be set inline and is resolved at
   computed-value time, so the tween moves the variable rather than the
   property. The defaults here are the resting glass, unchanged. */
.is-style-eft-matrix-card {
  background-color: rgba(250, 252, 251, var(--eft-matrix-card-fill, 0.07)) !important;
  border: 1px solid rgba(250, 252, 251, var(--eft-matrix-card-edge, 0.16)) !important;
  box-shadow: none !important;
}

/* The foil, defined once. The buttons, the outline-button ring and the image
   frames all draw the same treatment, so it lives here rather than being
   repeated three times and drifting apart. */
:root {
	/* The supplied photograph of rough gold leaf, used as the button ground
	   since 2026-08-31. technical/generate-button-texture.py transcodes it,
	   LOSSLESSLY and with no grading at all: the client asked for a 100%
	   match to the image as supplied, and the measured channel delta against
	   the source is 0.

	   WHAT IT COSTS, measured on rendered pixels across 36 buttons at 1440,
	   1280, 768, 390 and 360, with the label hidden so only the plate is
	   sampled: the Ink label reads about 4.9:1 on the median pixel and
	   2.76:1 at worst. For dark text it is the DARKEST pixel that sets
	   contrast, which is the reverse of everywhere else on this site, so the
	   button is UNDER WCAG AA 4.5:1 wherever the grain runs dark, and under
	   the 3:1 large-text floor on most of them.

	   No label colour fixes it. Pure black on the photograph's darkest pixel
	   is 4.06:1, and a lighter label is worse, because the plate's median is
	   0.31 luminance. No crop fixes it either: the dark grain is spread
	   through the image rather than sitting at its edges, so the centre 30%
	   still only reaches 2.93:1.

	   The one thing that does fix it is lifting the photograph's shadows,
	   which the earlier version of this asset did: a 0.32 luminance floor
	   held 4.80:1 everywhere and still read as the same rough gold. That
	   grading was removed by instruction on 2026-08-31. Putting it back is
	   one line in technical/generate-button-texture.py.

	   The synthetic foil below still draws the outline button's ring and the
	   photo frames, where a 2px band would show nothing of a photograph. */
	/* The ?v= is not decoration. 20i edge-caches static assets under the
	   plain path and went on serving a previous build of this file after it
	   had been replaced on disk: measured, the bare URL returned 15,380
	   bytes while the file was 85,190. Bump the number whenever the texture
	   is regenerated, or visitors keep the old one. Do NOT use ?w=, which is
	   a core WordPress query var meaning week number. */
	--eft-foil-image: url("../images/eft-matrix-gold-foil-button-texture.webp?v=2");
	--eft-foil-base: #C9A83F;
	--eft-foil-layers:
		radial-gradient(ellipse 120px 40px at 15% 30%, rgba(232, 217, 138, .55), transparent 70%),
		radial-gradient(ellipse 180px 50px at 45% 70%, rgba(168, 134, 47, .5), transparent 70%),
		radial-gradient(ellipse 140px 45px at 70% 25%, rgba(232, 217, 138, .45), transparent 70%),
		radial-gradient(ellipse 160px 40px at 90% 60%, rgba(168, 134, 47, .45), transparent 70%),
		radial-gradient(ellipse 100px 35px at 30% 85%, rgba(212, 180, 74, .6), transparent 70%),
		repeating-linear-gradient(
			0deg,
			rgba(168, 134, 47, .08) 0 1px,
			transparent 1px 3px,
			rgba(232, 217, 138, .07) 3px 4px,
			transparent 4px 7px
		);
}

/* Filled buttons are a matte gold foil: mottled patches, a horizontal brush
   grain, and a crinkle micro-noise layer in ::after.
 *
 * The label is INK, not Deepest Teal, and that is the one change made to the
 * supplied treatment. This base is darker than the previous gold and the four
 * mottled patches are darker still, so the darkest pixel under the label
 * measured 0.3442 luminance. Against Deepest Teal that is 3.85:1 on rendered
 * pixels, a fail. Ink is one step darker and takes the same worst case to
 * 5.36:1. For dark text the DARKEST pixel sets contrast, which is the reverse
 * of everywhere else on this site, so lightening the label would have made it
 * worse, not better.
 *
 * The ::after carries z-index auto, so it paints above the label as well as
 * the plate. Measured, overlay at 0.35 barely moves dark text (Deepest Teal
 * rendered at 0.0523 against a specified 0.0485), so it is left as authored.
 * The quiet outline button is excluded and keeps its transparent ground. */
.wp-block-button__link:not(.is-style-eft-matrix-quiet .wp-block-button__link) {
	/* The colour is the fallback, not decoration: if the texture fails to
	   load, Ink still reads 6.22:1 on #C9A83F. A button whose contrast
	   depends on an image arriving is not a button. */
	background-color: var(--eft-foil-base) !important;
	background-image: var(--eft-foil-image);
	/* cover, not repeat. The plate is 640x217 against buttons measured from
	   180 to 320px wide, so cover crops rather than scales up, and there is
	   no tile seam to line up across buttons of different widths. */
	background-size: cover;
	background-position: center;
	background-repeat: no-repeat;
	background-blend-mode: normal;
	box-shadow: none;
	position: relative;
	overflow: hidden;
	color: var(--wp--preset--color--ink) !important;
}

/* The crinkle noise layer that used to sit here was removed on 2026-08-31,
   with the texture, and it could not simply be left in place.
   mix-blend-mode: overlay DARKENS every ground pixel below 0.5 luminance,
   and the texture's floor is 0.3028 by design: it is set exactly where Ink
   still clears 4.5:1 and nowhere lower. Multiplying that floor would have
   taken the label under AA on the darkest grain in the photograph. The
   photograph also supplies the grain the layer was faking. */

.is-style-eft-matrix-quiet .wp-block-button__link) {
	background-color: #d4af37 !important;
	background-image:
		radial-gradient(circle at 30% 30%, rgba(255, 245, 195, 0.42) 0%, transparent 60%),
		radial-gradient(circle at 80% 80%, rgba(160, 110, 30, 0.38) 0%, transparent 70%),
		url('data:image/svg+xml;utf8,<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><filter id="noiseFilter"><feTurbulence type="fractalNoise" baseFrequency="0.95" numOctaves="3" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(%23noiseFilter)" opacity="0.80"/></svg>');
	background-blend-mode: overlay;
	box-shadow: inset 0 0 40px rgba(0, 0, 0, 0.05);
	color: var(--wp--preset--color--deepest-teal) !important;
}
.is-style-eft-matrix-quiet .wp-block-button__link { color: var(--wp--preset--color--off-white) !important; border-color: rgba(250,252,251,.5) !important; background: transparent !important; }

/* Hero: the site backdrop serves it, so the baked hero asset is switched
   off. The eyebrow moves to Off White.
   Light Aqua needs a background under 0.0558 luminance for 4.5:1 and the
   exposed nebula sits well above that. */
.eft-matrix-hero { background-color: transparent !important; }
.eft-matrix-hero .wp-block-cover__image-background { opacity: 0 !important; }
.eft-matrix-hero .has-light-aqua-color { color: var(--wp--preset--color--off-white) !important; }

/* ---------------------------------------------------------------------------
 * Light surfaces the band and card selectors above do not reach.
 *
 * Found by scanning all 13 pages for any element with an opaque background
 * over 0.25 luminance, rather than by guessing. Each one had off-white body
 * copy painted onto it by the text rules above, which made the text invisible:
 * the testimonial quotes measured 1.03:1 and the Calendly intro 1.0:1.
 * ------------------------------------------------------------------------- */

/* Testimonial quotes are blockquotes carrying their own white card, so they
   match neither the band selectors nor .is-style-eft-matrix-card. They become
   the same glass as the other cards so the inverted text reads on them. */
.is-style-eft-matrix-testimonial {
	background-color: rgba(250, 252, 251, 0.07) !important;
	border-color: rgba(250, 252, 251, 0.16) !important;
}

.eft-matrix-calendly-intro {
	background-color: rgba(250, 252, 251, 0.07) !important;
	border-color: rgba(250, 252, 251, 0.16) !important;
}

/* Form fields stay light on purpose: a pale input on a dark page is the
   conventional, more usable pairing, and it marks the field as writable. They
   therefore need their OWN dark text, because the inversion above would
   otherwise give them off-white on white. */
.eft-matrix-form input,
.eft-matrix-form textarea,
.eft-matrix-form select,
input[type="text"], input[type="email"], input[type="tel"], textarea, select {
	color: var(--wp--preset--color--ink) !important;
	-webkit-text-fill-color: var(--wp--preset--color--ink) !important;
}

/* The contact form has no card of its own: it sits straight on the band, so
   every colour form.css sets for a light ground is wrong here. Ink and
   Deepest Teal labels measured 1.3:1 and 1.47:1 on the dark band. The fields
   themselves stay light and keep their dark text, set above. */
.eft-matrix-field label,
.eft-matrix-radio label,
.eft-matrix-consent label {
	color: var(--wp--preset--color--off-white) !important;
}

.eft-matrix-hint,
.eft-matrix-optional {
	color: var(--wp--preset--color--soft-mint) !important;
}

.eft-matrix-required {
	color: var(--wp--preset--color--light-aqua) !important;
}

/* The two notice boxes keep their own light grounds, so their text must stay
   dark rather than inherit the inversion. */
.eft-matrix-notice--ok,
.eft-matrix-notice--ok *,
.eft-matrix-notice--error,
.eft-matrix-notice--error * {
	color: var(--wp--preset--color--ink) !important;
}

/* Testimonial attributions are Muted #3F4E4E, chosen to sit quietly under a
   quote on a white card. On the glass card that is 1.81:1. Soft Mint keeps
   them subordinate to the quote while clearing AA. */
.wp-block-quote.is-style-eft-matrix-testimonial cite {
	color: var(--wp--preset--color--soft-mint) !important;
}

/* Content links keep theme.json's Deep Teal, which is 1.84:1 on the dark
   ground and is what took Lighthouse accessibility from 100 to 96. The
   header, footer and button links are handled separately above, so this is
   scoped to links inside content that still carry the element style. */
:where(main, .wp-block-post-content, .wp-site-blocks) p a,
:where(main, .wp-block-post-content, .wp-site-blocks) li a,
:where(main, .wp-block-post-content, .wp-site-blocks) h1 a,
:where(main, .wp-block-post-content, .wp-site-blocks) h2 a,
:where(main, .wp-block-post-content, .wp-site-blocks) h3 a,
:where(main, .wp-block-post-content, .wp-site-blocks) h4 a {
	color: var(--wp--preset--color--light-aqua) !important;
}

:where(main, .wp-block-post-content, .wp-site-blocks) p a:hover,
:where(main, .wp-block-post-content, .wp-site-blocks) li a:hover,
:where(main, .wp-block-post-content, .wp-site-blocks) h1 a:hover,
:where(main, .wp-block-post-content, .wp-site-blocks) h2 a:hover,
:where(main, .wp-block-post-content, .wp-site-blocks) h3 a:hover,
:where(main, .wp-block-post-content, .wp-site-blocks) h4 a:hover {
	color: var(--wp--preset--color--off-white) !important;
}

/* Two the rules above did not reach, both on the contact page.
   The fieldset legend is Deepest Teal and is not a <label>, so the label rule
   missed it: 1.73:1. The Calendly button carries its own Deep Teal ground, so
   the content-link rule painting it Light Aqua gave 3.79:1; it keeps the
   off-white label it had, which is 8.1:1 on that ground. */
.eft-matrix-form legend {
	color: var(--wp--preset--color--off-white) !important;
}

.eft-matrix-calendly-action a.eft-matrix-calendly-button {
	color: var(--wp--preset--color--off-white) !important;
}

/* .wp-site-blocks in the content-link rule above also contains the footer, so
   the inversion repainted the footer Explore list Light Aqua. parts/footer.html
   designs those links Off White with a Light Aqua hover, so that intent is
   restored here rather than by complicating the selector above. */
footer .eft-matrix-footer-list a,
footer a:not(.wp-block-button__link) {
	color: var(--wp--preset--color--off-white) !important;
}

footer .eft-matrix-footer-list a:hover,
footer a:not(.wp-block-button__link):hover {
	color: var(--wp--preset--color--light-aqua) !important;
}

/* ---------------------------------------------------------------------------
 * The foil on the outline button and on the image frames.
 *
 * Both are rings rather than plates, so the foil is drawn on a pseudo-element
 * and masked to the border area with mask-composite. A plain border-image
 * would have been simpler and is wrong here: border-image ignores
 * border-radius, so it would square off the pill button and the 14px photo
 * frame. The ring keeps the radius because the mask follows the box.
 * ------------------------------------------------------------------------- */

/* Outline button: no fill, foil ring. The label stays Off White on the page's
   own dark ground, so its contrast is unchanged by this. The ring itself is
   6.5:1 against that ground, comfortably over the 3:1 that a UI component
   boundary needs.

   THE RING IS DRAWN ON THE .wp-block-button WRAPPER, not on the link, and that
   is the fix for the reported break where the gold did not carry round the
   button. It was on the link's ::before at inset -2px, and the link carries
   overflow:hidden, added further down this file so the hover sheen has
   something to clip against. overflow clips at the PADDING box, and the ring
   occupied exactly the 2px band outside it, over the link's own transparent
   border, so the whole ring was being clipped away. Only the two rounded ends
   survived, because the clip curve and the ring curve do not coincide there,
   which is why the button showed two gold arcs and no straight runs.

   The wrapper is the link's own box with nothing else in it and it has no
   overflow of its own, so the ring lands in the same place and is now
   complete. The link keeps overflow:hidden and the sheen still clips to the
   pill. The radius is stated rather than inherited, because the wrapper does
   not carry the button's own border-radius to inherit from. */
.wp-block-button.is-style-eft-matrix-quiet > .wp-block-button__link {
	/* Still positioned, even though the ring moved off it: the hover sheen is
	   this element's own ::after at inset 0 and needs it as its containing
	   block. */
	position: relative;
	border-color: transparent !important;
	background-color: transparent !important;
	background-image: none !important;
}

.wp-block-button.is-style-eft-matrix-quiet {
	position: relative;
	/* Flex, so the link is a flex item and the wrapper is exactly its box. As
	   a block it gained the inline line gap under the link (66px wrapper round
	   a 57px link on the home page), and the ring sat 9px low. 2026-10-02. */
	display: flex;
}

.wp-block-button.is-style-eft-matrix-quiet::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: 999px;
	padding: 2px;
	background-color: var(--eft-foil-base);
	background-image: var(--eft-foil-layers);
	-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
	mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
	-webkit-mask-composite: xor;
	mask-composite: exclude;
	pointer-events: none;
}

/* The offset photo frame used to be refilled here with a masked foil ring,
   which is what made it read as gold. Removed on 2026-09-04, by instruction:
   no frame on any photograph on any page. block-styles.css now sets
   content:none on the pseudo-element that drew the box, so there is nothing
   left for a fill to land on. Restore both together or neither. */

/* The hero promise list uses the checklist style, whose tick is Primary Teal,
   drawn for a light card. On the hero's dark ground that is 3.35:1, visible
   but muted; Light Aqua reads properly there. */
.eft-matrix-hero-promises li::before {
	border-left-color: var(--wp--preset--color--light-aqua) !important;
	border-bottom-color: var(--wp--preset--color--light-aqua) !important;
}

/* The strapline and the triad moved to the foot of the hero on 2026-08-31.
   The strapline keeps textColor primary-teal as its block attribute, which is
   right on the off-white ground it came from and unreadable on this one:
   #028584 on the hero's deepest teal measures about 1.4:1. Light Aqua is the
   same retint the hero checklist ticks already take, so the two agree.
   The triad inherits the cover's own off-white and needs no rule. */
.eft-matrix-hero .has-primary-teal-color {
	color: var(--wp--preset--color--light-aqua) !important;
}

/* Full-bleed page photographs were capped to the 1160px measure here, set
   2026-08-31 alongside contentSize moving to 1160px. They are now half the
   viewport on desktop instead; the rule that does it is at the foot of
   block-styles.css, which loads after this file. This cap is kept because it
   is still the fallback below the width at which that rule applies, and
   because it is what keeps an alignfull photograph's edges in line with every
   other section. The block keeps alignfull either way, so it stays valid and
   stays editable as a full-width image in wp-admin. */
.wp-block-image.alignfull.is-style-eft-matrix-photo {
	max-width: 1160px;
	margin-left: auto;
	margin-right: auto;
}


/* ---------------------------------------------------------------------------
   Ten stars, added 2026-08-31.

   The nebula in the backdrop image is static. These sit on top of it and
   catch, so the sky reads as alive rather than as wallpaper. Ten is the whole
   point: enough to notice on a slow read, few enough that nothing twinkles in
   the corner of the eye while someone is trying to read a paragraph about
   their own anxiety.

   The layer is built by motion.js and is decorative, so it carries
   aria-hidden and never takes pointer events. It sits above body::before and
   below .wp-site-blocks, which is z-index 1, so a star can never land on top
   of text.

   Each star is a soft radial dot rather than a hard circle: a 1px white disc
   reads as a dead pixel, a gradient reads as light.
   --------------------------------------------------------------------------- */
.eft-matrix-stars {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
}

.eft-matrix-star {
  position: absolute;
  /* 3px with no glow was almost invisible against a nebula that already has
     its own speckle. The disc is bigger, the core is opaque white, and the
     halo does the work: a bare dot reads as a dead pixel, a dot with a glow
     reads as a star catching. */
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff 0%, rgba(226,246,255,0.9) 35%, rgba(160,220,255,0) 72%);
  box-shadow:
    0 0 6px 1px rgba(200,240,255,0.75),
    0 0 14px 3px rgba(120,200,255,0.35);
  /* The resting state is visible, so a reader who never sees a tween still
     gets a sky with stars in it rather than an empty one. */
  opacity: 0.55;
  will-change: opacity, transform;
}

@media (prefers-reduced-motion: reduce) {
  .eft-matrix-star {
    opacity: 0.75;
    will-change: auto;
  }
}


/* ---------------------------------------------------------------------------
   Mobile header cluster, continued.

   These belong with the max-width:600px block in block-styles.css and are
   repeated at the end of the cascade instead, because the desktop contact
   rules are declared LATER in that file than the media query is. Same
   specificity, later source, so the desktop values were winning inside the
   media query and the links came out 49x55 rather than 44x44. Appending here
   is the smallest fix that does not reshuffle a 1300-line stylesheet.
   --------------------------------------------------------------------------- */
@media (max-width: 639.98px) {
  /* The header row is space-between with wrap, so the actions block drops
     onto its own line and is laid out from the left. margin-left:auto pushes
     the whole cluster over to the right gutter, where the burger sat before
     the row wrapped. */
  .eft-matrix-header .eft-matrix-header-actions {
    margin-left: auto;
    justify-content: flex-start;
  }

  .eft-matrix-header .eft-matrix-header-contact a {
    width: 44px;
    height: 44px;
    min-height: 44px;
    padding: 0;
    gap: 0;
    line-height: 0;
    justify-content: center;
    align-items: center;
    border-radius: 8px;
  }

  .eft-matrix-header .eft-matrix-header-contact a::before {
    width: 24px;
    height: 24px;
  }

  .eft-matrix-header .eft-matrix-header-contact p {
    align-items: center;
    line-height: 0;
  }
}


/* ---------------------------------------------------------------------------
   Button hover: a sheen travelling across the foil, added 2026-08-31.

   The gold is a real treatment, not a flat fill, so the hover behaves like
   metal turning in the light rather than like a colour change. A band of warm
   light crosses the plate, the button lifts, and a gold glow appears beneath.

   The sheen is a pseudo-element, which GSAP cannot address, so motion.js moves
   two custom properties and the CSS composes them. --eft-btn-sheen is a plain
   number rather than a percentage because GSAP interpolates unitless values
   without having to parse units back out.

   mix-blend-mode: overlay is the same mechanism the crinkle layer above
   already uses, and the note there records the measurement that makes it safe:
   an overlay at 0.35 moved the dark Ink label by 0.0038 luminance. The sheen
   peaks a little higher, so the label was re-measured on rendered pixels
   mid-sweep before this shipped.

   Filled buttons use ::before, which is free; the quiet outline button's
   ::before is its foil ring, so that one uses ::after, which the filled rule
   excludes it from.
   --------------------------------------------------------------------------- */
.wp-block-button__link:not(.is-style-eft-matrix-quiet .wp-block-button__link)::before,
.wp-block-button.is-style-eft-matrix-quiet > .wp-block-button__link::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
  background-image: linear-gradient(
    100deg,
    transparent 38%,
    rgba(255, 250, 226, 0.95) 50%,
    transparent 62%
  );
  mix-blend-mode: overlay;
  opacity: var(--eft-btn-sheen-o, 0);
  transform: translateX(calc(var(--eft-btn-sheen, -130) * 1%));
}

/* The outline button has no fill to clip the sweep against, so it clips here. */
.wp-block-button.is-style-eft-matrix-quiet > .wp-block-button__link {
  overflow: hidden;
}

/* Reduced-motion gate, neutralised 2026-08-31 with the rest of them. See
   FORCE_MOTION in assets/js/motion.js. The sheen is driven by GSAP, which no
   longer stops on this query, so hiding its pseudo-element here would have
   left the tween running against nothing.

@media (prefers-reduced-motion: reduce) {
  .wp-block-button__link::before,
  .wp-block-button.is-style-eft-matrix-quiet > .wp-block-button__link::after {
    display: none;
  }
}
*/


/* ---------------------------------------------------------------------------
   Areas of Support redesign, 2026-09-29, built as a draft for owner review.

   Every rule below is keyed to a class that only the redesigned page carries
   (eft-matrix-page-hero, eft-matrix-topics, eft-matrix-topic), so shipping this
   file changes nothing on any existing page. The page uses templates/page-hero.html,
   which is page.html without the title band, because the H1 sits in the hero
   beside the photograph rather than in a band of its own.
   --------------------------------------------------------------------------- */

/* Hero. The band is Off White, so the backdrop runs through it at full
   strength, exactly as behind the home hero. */
.wp-block-columns.eft-matrix-page-hero-cols { column-gap: var(--wp--preset--spacing--80); row-gap: var(--wp--preset--spacing--60); }

.eft-matrix-page-hero-eyebrow {
	font-size: 0.8125rem;
	font-weight: 600;
	letter-spacing: 0.14em;
	text-transform: uppercase;
}

/* Same sizing as every other page title, for the same reason: Grey Qo wraps
   here, and "Support" must never be wider than a 360px column. Descendant
   selector so it outranks the xx-large preset (see trap 1 in CLAUDE.md). */
.wp-site-blocks .eft-matrix-page-hero-title {
	font-size: min( 90px, 17vw );
	margin-top: var(--wp--preset--spacing--30);
}

.eft-matrix-page-hero-note { font-size: 0.9375rem; margin-top: var(--wp--preset--spacing--30) !important; }

.eft-matrix-page-hero-explore a {
	color: var(--wp--preset--color--off-white) !important;
	text-decoration: underline;
	text-decoration-color: #d4af37;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.35em;
}

/* The arrow is decoration: the alt after the slash keeps it out of the
   accessible name where supported, and the first declaration is the
   fallback for engines that do not parse the alt syntax. */
.eft-matrix-page-hero-explore a::after {
	content: "\2193";
	content: "\2193" / "";
	display: inline-block;
	margin-left: 0.5em;
	color: #d4af37;
	text-decoration: none;
}

@media (max-width: 599.98px) {
	.eft-matrix-page-hero .wp-block-buttons > .wp-block-button,
	.eft-matrix-page-hero .wp-block-button__link { width: 100%; }
}

/* Topics: introduction beside the panels at desktop, above them below 1100px.
   Core sets flex-wrap nowrap !important from 782px at 0-1-0, so this needs
   two classes and its own !important to win. */
.wp-block-columns.eft-matrix-topics-cols { column-gap: var(--wp--preset--spacing--70); }

@media (max-width: 1099.98px) {
	.wp-block-columns.eft-matrix-topics-cols { flex-wrap: wrap !important; }
	.wp-block-columns.eft-matrix-topics-cols > .wp-block-column { flex-basis: 100% !important; }
}

.eft-matrix-topics-list { counter-reset: eft-topic; }

/* The panels are the site's glass card, drawn at a slightly firmer edge so the
   closed rows still read as separate controls on the backdrop. */
.wp-block-details.eft-matrix-topic {
	counter-increment: eft-topic;
	background-color: rgba(250, 252, 251, 0.05);
	border: 1px solid rgba(250, 252, 251, 0.24);
	border-radius: 10px;
	padding: 0;
}

.eft-matrix-topics-list > .eft-matrix-topic + .eft-matrix-topic { margin-block-start: 12px; }

.wp-block-details.eft-matrix-topic[open] {
	padding-bottom: var(--wp--preset--spacing--50);
}

.wp-block-details.eft-matrix-topic[open]:not(.is-closing) {
	background-color: rgba(250, 252, 251, 0.08);
	border-color: rgba(212, 175, 55, 0.5);
	box-shadow: 0 24px 48px -28px rgba(0, 0, 0, 0.7);
}

.eft-matrix-topic > summary {
	display: flex;
	align-items: center;
	gap: 1rem;
	min-height: 48px;
	padding: 1rem 1.5rem;
	list-style: none;
	cursor: pointer;
	font-family: var(--wp--preset--font-family--heading);
	font-size: clamp( 1.25rem, 1.1rem + 0.5vw, 1.5rem );
	line-height: 1.3;
	color: var(--wp--preset--color--off-white);
	border-radius: 10px;
}

.eft-matrix-topic > summary::-webkit-details-marker { display: none; }

/* 01 to 10. Generated content, so there is nothing in the block for Erica to
   renumber, and the empty alt keeps "zero one" out of the control's name. */
.eft-matrix-topic > summary::before {
	content: counter(eft-topic, decimal-leading-zero);
	content: counter(eft-topic, decimal-leading-zero) / "";
	flex: 0 0 2ch;
	color: #d4af37;
	font-variant-numeric: lining-nums tabular-nums;
}

.eft-matrix-topic > summary::after {
	content: "";
	flex: 0 0 20px;
	height: 20px;
	margin-left: auto;
	background-color: currentColor;
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
	transition: transform 0.2s ease;
}

.eft-matrix-topic[open]:not(.is-closing) > summary::after { transform: rotate(180deg); }

.eft-matrix-topic > summary:hover { background-color: rgba(250, 252, 251, 0.04); }

.eft-matrix-topic > summary:focus-visible {
	outline: 3px solid var(--wp--preset--color--off-white);
	outline-offset: 3px;
}

/* Body copy lines up under the title rather than under the number. */
.eft-matrix-topic > :not(summary) {
	margin-left: calc(1.5rem + 2ch + 1rem);
	margin-right: 1.5rem;
}

.eft-matrix-topic > summary + * { margin-top: var(--wp--preset--spacing--30); }

@media (max-width: 599.98px) {
	.eft-matrix-topic > summary { padding: 0.875rem 1rem; gap: 0.75rem; }
	.eft-matrix-topic > :not(summary) { margin-left: 1rem; margin-right: 1rem; }
}

@media (prefers-reduced-motion: reduce) {
	.eft-matrix-topic > summary::after { transition: none; }
}

/* Print every panel open. Only engines with ::details-content honour this. */
@media print {
	.eft-matrix-topic::details-content { content-visibility: visible; display: block; }
}


/* ---------------------------------------------------------------------------
   Areas of Support: motion and interaction, 2026-09-29 ("premium feel").

   The hero entrance is CSS, not GSAP, because it is above the fold: it runs
   on first paint, so nothing is shown, hidden and shown again while GSAP
   loads at idle. The photograph is never faded, only unveiled from a slight
   inset and eased in scale, so it is painted from the first frame and stays
   eligible as the page's LCP element. Text delays stop at 0.45s.

   Like every other motion on the site this ignores prefers-reduced-motion,
   per FORCE_MOTION in motion.js (client, 2026-08-31). To honour it, wrap the
   `animation` declarations below in @media (prefers-reduced-motion: no-preference).
   --------------------------------------------------------------------------- */
@keyframes eftm-rise {
	from { opacity: 0; transform: translateY(22px); }
	to   { opacity: 1; transform: none; }
}

@keyframes eftm-unveil {
	from { clip-path: inset(6% 6% 6% 6% round 14px); }
	to   { clip-path: inset(0 0 0 0 round 14px); }
}

@keyframes eftm-settle {
	from { transform: scale(1.08); }
	to   { transform: scale(1); }
}

@keyframes eftm-draw {
	from { transform: scaleX(0); }
	to   { transform: scaleX(1); }
}

@keyframes eftm-bob {
	0%, 100% { transform: translateY(0); }
	50%      { transform: translateY(4px); }
}

.eft-matrix-page-hero-cols > .wp-block-column:first-child > * {
	animation: eftm-rise 0.9s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}
.eft-matrix-page-hero-cols > .wp-block-column:first-child > :nth-child(2) { animation-delay: 0.08s; }
.eft-matrix-page-hero-cols > .wp-block-column:first-child > :nth-child(3) { animation-delay: 0.18s; }
.eft-matrix-page-hero-cols > .wp-block-column:first-child > :nth-child(4) { animation-delay: 0.28s; }
.eft-matrix-page-hero-cols > .wp-block-column:first-child > :nth-child(5) { animation-delay: 0.36s; }
.eft-matrix-page-hero-cols > .wp-block-column:first-child > :nth-child(n+6) { animation-delay: 0.45s; }

.eft-matrix-page-hero .wp-block-image {
	animation: eftm-unveil 1.1s cubic-bezier(0.2, 0.7, 0.2, 1) both;
	overflow: hidden;
	border-radius: 14px;
	transform-style: preserve-3d;
	will-change: transform;
}

.eft-matrix-page-hero .wp-block-image img {
	animation: eftm-settle 1.6s cubic-bezier(0.2, 0.7, 0.2, 1) both;
	transition: transform 0.8s cubic-bezier(0.2, 0.7, 0.2, 1);
}

.eft-matrix-page-hero .wp-block-image:hover img { transform: scale(1.035); }

/* A short gold rule draws in under the eyebrow. Decoration only. */
.eft-matrix-page-hero-eyebrow::after {
	content: "";
	display: block;
	width: 48px;
	height: 1px;
	margin-top: 0.9rem;
	background: #d4af37;
	transform-origin: left center;
	animation: eftm-draw 0.9s 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}

/* Explore link: the arrow breathes, the underline thickens on intent. */
.eft-matrix-page-hero-explore a::after { animation: eftm-bob 2.4s 1.2s ease-in-out infinite; }

.eft-matrix-page-hero-explore a {
	transition: text-decoration-thickness 0.25s ease, text-underline-offset 0.25s ease;
}

.eft-matrix-page-hero-explore a:hover,
.eft-matrix-page-hero-explore a:focus-visible {
	text-decoration-thickness: 2px;
	text-underline-offset: 0.45em;
}

/* Panels. The glow is a radial light drawn from custom properties that
   motion.js sets on pointer move and fades with --eft-glow. At rest
   --eft-glow is 0, so the layer is fully transparent and costs nothing. */
.wp-block-details.eft-matrix-topic {
	background-image: radial-gradient(
		380px circle at var(--eft-glow-x, 50%) var(--eft-glow-y, 50%),
		rgba(212, 175, 55, calc(0.10 * var(--eft-glow, 0))),
		transparent 65%
	);
	transition: background-color 0.35s ease, border-color 0.35s ease, box-shadow 0.45s ease;
}

.wp-block-details.eft-matrix-topic:hover { border-color: rgba(250, 252, 251, 0.4); }
.wp-block-details.eft-matrix-topic[open]:not(.is-closing):hover { border-color: rgba(212, 175, 55, 0.7); }

/* The title steps in and the number brightens, so a closed row reads as
   something to press before it is pressed. */
.eft-matrix-topic > summary::before,
.eft-matrix-topic > summary {
	transition: color 0.3s ease, padding-left 0.35s cubic-bezier(0.2, 0.7, 0.2, 1), background-color 0.3s ease;
}

.eft-matrix-topic > summary:hover { padding-left: 1.85rem; }
.eft-matrix-topic > summary:hover::before,
.eft-matrix-topic[open]:not(.is-closing) > summary::before { color: #f0d77a; }

/* The chevron turns gold on hover and when open. The mask clips this box to
   the chevron shape, so the larger box only widens the gap to the title. */
.eft-matrix-topic > summary::after {
	flex-basis: 34px;
	height: 34px;
	border-radius: 50%;
	-webkit-mask-size: 18px;
	mask-size: 18px;
	box-shadow: none;
	transition: transform 0.45s cubic-bezier(0.2, 0.7, 0.2, 1), background-color 0.3s ease;
}

.eft-matrix-topic > summary:hover::after,
.eft-matrix-topic[open]:not(.is-closing) > summary::after { background-color: #d4af37; }

.eft-matrix-topic > summary > * { pointer-events: none; }

@media (max-width: 599.98px) {
	.eft-matrix-topic > summary:hover { padding-left: 1rem; }
}


/* ---------------------------------------------------------------------------
   EFT Tapping redesign, 2026-09-29, built as a draft for owner review.

   Keyed only to classes the redesigned page carries (eft-matrix-explain,
   eft-matrix-session, eft-matrix-support-themes, eft-matrix-more-link), so
   no existing page changes. The hero reuses the Areas of Support hero
   classes above, entrance and all.
   --------------------------------------------------------------------------- */

/* Explanation: heading beside the copy from 1024px, split by a gold hairline;
   stacked below. Two classes and !important for the same reason as the
   topics columns: core's nowrap is !important. */
.wp-block-columns.eft-matrix-explain-cols { column-gap: var(--wp--preset--spacing--80); }
.eft-matrix-explain h2 { margin: 0; }
.eft-matrix-explain-cols > .wp-block-column:last-child > * { max-width: 65ch; }

@media (min-width: 1024px) {
	.eft-matrix-explain-cols > .wp-block-column:last-child {
		border-left: 1px solid rgba(212, 175, 55, 0.45);
		padding-left: var(--wp--preset--spacing--70);
	}
}

@media (max-width: 1023.98px) {
	.wp-block-columns.eft-matrix-explain-cols { flex-wrap: wrap !important; row-gap: var(--wp--preset--spacing--40); }
	.wp-block-columns.eft-matrix-explain-cols > .wp-block-column { flex-basis: 100% !important; }
}

/* Session panel: the same glass card as the topic panels. It is the jump
   link's target, so it clears the header when landed on. */
.eft-matrix-session {
	background-color: rgba(250, 252, 251, 0.05);
	border: 1px solid rgba(250, 252, 251, 0.24);
	border-radius: 14px;
	padding: clamp( 24px, 4vw, 40px );
	scroll-margin-top: 96px;
}

.eft-matrix-session > h2 { margin-top: 0; }

/* Six rows, row-major, two columns from 1024px. A grid rather than CSS
   columns, because columns would read down the first column first. */
.wp-block-list.eft-matrix-session-list {
	display: grid;
	grid-template-columns: 1fr;
	column-gap: var(--wp--preset--spacing--70);
	list-style: none;
	margin: var(--wp--preset--spacing--40) 0 0;
	padding: 0;
}

.eft-matrix-session-list li {
	position: relative;
	display: flex;
	align-items: center;
	min-height: 3.5rem;
	margin: 0;
	padding: 0.85rem 0 0.85rem 2.75rem;
	border-bottom: 1px solid rgba(250, 252, 251, 0.14);
}

.eft-matrix-session-list li:last-child { border-bottom: 0; }

@media (min-width: 1024px) {
	.wp-block-list.eft-matrix-session-list { grid-template-columns: 1fr 1fr; }
	.eft-matrix-session-list li:nth-last-child(2):nth-child(odd) { border-bottom: 0; }
}

/* The ticks: a Light Aqua disc with a Deepest Teal tick for the session
   rows, an outlined ring for the support cells. Pseudo-elements, so they
   stay out of the accessibility tree, and colour comes from tokens. */
.eft-matrix-session-list li::before,
.eft-matrix-support-list li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 50%;
	width: 26px;
	height: 26px;
	margin-top: -13px;
	border-radius: 50%;
	box-sizing: border-box;
}

.eft-matrix-session-list li::before { background-color: var(--wp--preset--color--light-aqua); }

.eft-matrix-session-list li::after,
.eft-matrix-support-list li::after {
	content: "";
	position: absolute;
	top: 50%;
	width: 10px;
	height: 5px;
	margin-top: -4px;
	border-left: 2px solid var(--wp--preset--color--deepest-teal);
	border-bottom: 2px solid var(--wp--preset--color--deepest-teal);
	transform: rotate(-45deg);
}

.eft-matrix-session-list li::after { left: 8px; }

/* Support: eight outlined cells, two columns from 768px, source order kept.
   Not links, so no hover state: a lift here would promise a click. */
.eft-matrix-support-themes { margin-top: var(--wp--preset--spacing--80); }
.eft-matrix-support-themes > h2 { margin-top: 0; }

.wp-block-list.eft-matrix-support-list {
	display: grid;
	grid-template-columns: 1fr;
	gap: 12px 16px;
	list-style: none;
	margin: var(--wp--preset--spacing--40) 0 0;
	padding: 0;
}

@media (min-width: 768px) {
	.wp-block-list.eft-matrix-support-list { grid-template-columns: 1fr 1fr; }
	/* An odd count (Matrix Reimprinting has nine) would strand the last card
	   in the left column; let it take the full row instead. */
	.eft-matrix-support-list li:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

.eft-matrix-support-list li {
	position: relative;
	display: flex;
	align-items: center;
	margin: 0;
	padding: 0.8rem 1rem 0.8rem 3.25rem;
	border: 1px solid rgba(250, 252, 251, 0.3);
	border-radius: 8px;
	background-color: rgba(250, 252, 251, 0.03);
}

.eft-matrix-support-list li::before {
	left: 1rem;
	border: 1.5px solid var(--wp--preset--color--light-aqua);
}

.eft-matrix-support-list li::after {
	left: calc(1rem + 8px);
	border-color: var(--wp--preset--color--light-aqua);
}

/* The Areas of Support link: same treatment as the hero's jump link, with
   the arrow pointing on rather than down, nudging forward on intent. */
.eft-matrix-more-link { margin-top: var(--wp--preset--spacing--50) !important; }

.eft-matrix-more-link a {
	color: var(--wp--preset--color--off-white) !important;
	text-decoration: underline;
	text-decoration-color: #d4af37;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.35em;
	transition: text-decoration-thickness 0.25s ease, text-underline-offset 0.25s ease;
}

.eft-matrix-more-link a::after {
	content: "\2192";
	content: "\2192" / "";
	display: inline-block;
	margin-left: 0.5em;
	color: #d4af37;
	transition: transform 0.35s cubic-bezier(0.2, 0.7, 0.2, 1);
}

.eft-matrix-more-link a:hover,
.eft-matrix-more-link a:focus-visible {
	text-decoration-thickness: 2px;
	text-underline-offset: 0.45em;
}

.eft-matrix-more-link a:hover::after,
.eft-matrix-more-link a:focus-visible::after { transform: translateX(4px); }

/* Tablet: the hero stacks below 1024px, copy and button first, photograph
   after, in DOM order. Side by side at 834 the narrow text column pushed the
   button under the fold. A class of its own so Areas of Support is unmoved. */
@media (max-width: 1023.98px) {
	.wp-block-columns.eft-matrix-hero-stack { flex-wrap: wrap !important; }
	.wp-block-columns.eft-matrix-hero-stack > .wp-block-column { flex-basis: 100% !important; }
}

/* The CRO plan's "large blank area": two stacked band paddings above the
   session panel, and this band's bottom padding on top of the closing CTA's
   own. The band padding is inline, hence !important. */
.eft-matrix-tapping-detail {
	padding-top: var(--wp--preset--spacing--80) !important;
	padding-bottom: 0 !important;
}

/* ---------------------------------------------------------------------------
   Client Experiences redesign (2026-09-29)

   Keyed only to classes that page carries (eft-client-hero, eft-review-*), so
   nothing else moves. The reviews are two stacked columns inside a grid: each
   card keeps its natural height and sits directly under the one above, with
   no row gaps. Below 768px the columns are unwrapped and the order classes put
   the cards back into the original T01 to T11 sequence.
   ------------------------------------------------------------------------- */
.eft-client-hero-note { font-size: 0.9375rem; max-width: 44ch; }

.eft-review-section { padding-top: var(--wp--preset--spacing--70) !important; }

.eft-review-grid {
	display: flex;
	flex-direction: column;
	gap: 20px;
}

/* Flow layout's block gap would add a top margin to the second column and to
   every card after the first, on top of the flex gap. */
.eft-review-grid > *,
.eft-review-grid .eft-review-card { margin: 0 !important; }

.eft-review-column { display: contents; }

/* Anything pasted into the grid without an order class (a plain paragraph,
   or a quote with no eft-review-order-N) would take order 0 and jump to the
   top on mobile. Send it to the end instead. 2026-10-22. */
.eft-review-grid > *,
.eft-review-column > * { order: 99; }
.eft-review-order-1 { order: 1; }
.eft-review-order-2 { order: 2; }
.eft-review-order-3 { order: 3; }
.eft-review-order-4 { order: 4; }
.eft-review-order-5 { order: 5; }
.eft-review-order-6 { order: 6; }
.eft-review-order-7 { order: 7; }
.eft-review-order-8 { order: 8; }
.eft-review-order-9 { order: 9; }
.eft-review-order-10 { order: 10; }
.eft-review-order-11 { order: 11; }
.eft-review-order-12 { order: 12; }
.eft-review-order-13 { order: 13; }
.eft-review-order-14 { order: 14; }
.eft-review-order-15 { order: 15; }
.eft-review-order-16 { order: 16; }
.eft-review-order-17 { order: 17; }
.eft-review-order-18 { order: 18; }
.eft-review-order-19 { order: 19; }
.eft-review-order-20 { order: 20; }

@media (min-width: 768px) {
	.eft-review-grid {
		display: grid;
		grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
		column-gap: 22px;
		align-items: start;
	}

	.eft-review-column {
		display: flex;
		flex-direction: column;
		gap: 22px;
		min-width: 0;
	}
}

@media (min-width: 1024px) {
	.eft-review-grid { column-gap: 28px; }
	.eft-review-column { gap: 26px; }
}

/* The card. The glass ground and border come from the testimonial rule above;
   this sets its size and room for the quote mark, which sits above the text
   on narrow cards and beside it from 1024px. No fixed or minimum height.
   Scoped under the grid because block-styles.css loads after this file and
   its testimonial rules would otherwise win at equal specificity. */
.eft-review-grid .wp-block-quote.eft-review-card {
	position: relative;
	height: auto;
	padding: 3.25rem 22px 24px;
	border: 1px solid;
}

.eft-review-grid .wp-block-quote.eft-review-card::before {
	content: "\201C";
	content: "\201C" / "";
	position: absolute;
	top: 0.6rem;
	left: 20px;
	font-family: var(--wp--preset--font-family--heading);
	font-size: 3.25rem;
	font-style: normal;
	line-height: 1;
	color: var(--wp--preset--color--pale-mint);
	opacity: 0.85;
}

.eft-review-grid .wp-block-quote.eft-review-card p {
	font-size: 1.0625rem;
	line-height: 1.62;
}

.eft-review-grid .wp-block-quote.eft-review-card cite { margin-top: 16px; }

@media (min-width: 768px) {
	.eft-review-grid .wp-block-quote.eft-review-card { padding: 3.25rem 26px 28px; }
}

@media (min-width: 1024px) {
	.eft-review-grid .wp-block-quote.eft-review-card { padding: 30px 32px 30px 76px; }
	.eft-review-grid .wp-block-quote.eft-review-card::before { top: 22px; left: 26px; }
	.eft-review-grid .wp-block-quote.eft-review-card p { font-size: 1.125rem; }
}

.eft-review-disclaimer {
	max-width: 900px !important;
	margin: var(--wp--preset--spacing--60) auto 0 !important;
	text-align: center;
}
