/* ============================================================================
   Keystone Church — /groups/ redesign v1
   ----------------------------------------------------------------------------
   2026-08-19  first pass (hero + prose bands + tile row)
   2026-08-20  three groups only; variant E's picker replaced the tile row
   2026-08-20  DESIGN OVERHAUL — the four stacked prose bands are gone. The page
               middle is now a documentary-editorial spread: asymmetric grids,
               two deliberate overlap events, a video centrepiece, and photos
               worked through the whole middle instead of a wall of text.
               Accent unified on the site's own red #cc5861; the slate blue
               #78a3b9 is retired from this file entirely.
   ----------------------------------------------------------------------------
   ALL redesign styling lives here. The Divi-generated stylesheets are never
   edited — everything below is an override or net-new.

   Specificity note: Divi ships css/et-builder-module-design.css at the END of
   <body>, so it wins source order against this file. The new sections dodge
   that by not using Divi module classes at all (plain <section>/<figure>/<ul>),
   but they still sit inside .entry-content, which styles bare p / ul / h2 / a —
   hence the .et-l--post and #page-container prefixes below.

   Brand tokens (defined in css/et-divi-dynamic.css):
     --gcid-primary-color   #353a42  dark slate
     --gcid-link-color      #cc5861  the Give-button red  ← the page accent
     --gcid-secondary-color #78a3b9  slate blue           ← DELIBERATELY UNUSED

   Breakpoints: 1120 / 980 (Divi tablet) / 940 (picker) / 900 (overlap kill) /
   767 (Divi phone) / 560, listed largest-first in section 7.
   ========================================================================== */

:root {
	/* ---- THE ONE ACCENT -------------------------------------------------
	   #cc5861 is the theme's own red (Divi uses it for the GIVE button and the
	   CTA arrows). It does three jobs on this page and nothing else: section
	   marker numbers, CTAs, and active/focus states in the picker.
	   Change this single line to re-accent the entire page. ------------------ */
	--ks-accent: #cc5861;
	--ks-accent-deep: #b8474f;   /* CTA hover only */
	--ks-picker-accent: var(--ks-accent);  /* kept as an alias: variant E's name */

	/* ---- Surfaces + ink -------------------------------------------------- */
	--ks-bg: #f1f1f1;
	--ks-paper: #ffffff;
	--ks-dark: #353a42;
	--ks-ink: #1c1f26;      /* near-black, never #000 */
	--ks-ink-2: #565c66;    /* body copy */
	/* NOTE 2026-08-24: at 11px this is SMALL text and #8b9098 does not reach
	   4.5:1 on either light ground — 3.21:1 on white, 2.84:1 on #f1f1f1. It is a
	   pre-existing condition, not introduced by the band swap (which nudged it
	   the right way). Left alone; flagged for Jose. #6f757e would clear it. */
	--ks-ink-3: #8b9098;    /* captions, markers */
	--ks-hair: #e2e3e5;     /* hairline rules on light */

	/* ---- Type ------------------------------------------------------------
	   The site's own two faces only. Work Sans is a 100–900 variable, so the
	   contrast comes from the ends of that axis (200 against 800), not from
	   adding a third family. --------------------------------------------- */
	--ks-display: 'Work Sans', Helvetica, Arial, Lucida, sans-serif;
	--ks-body: 'Roboto', Helvetica, Arial, Lucida, sans-serif;

	/* ---- Scrims ----------------------------------------------------------- */
	/* Hero scrim removed per Jose 2026-08-21 — the film runs clean. Previous value:
	   linear-gradient(180deg, rgba(53,58,66,.26) 0%, rgba(53,58,66,.54) 52%, rgba(53,58,66,.86) 100%) */
	--ks-hero-scrim: none;
	--ks-shot-overlay: linear-gradient(180deg, rgba(53, 58, 66, 0.5) 50%, #353a42 100%);
	--ks-film-scrim: linear-gradient(180deg, rgba(24, 27, 32, 0) 34%, rgba(24, 27, 32, 0.78) 100%);
	--ks-film-scrim-quiet: linear-gradient(180deg, rgba(24, 27, 32, 0.34) 0%, rgba(24, 27, 32, 0.88) 100%);
}

/* ============================================================================
   0. SHARED PLUMBING — grid container, section rhythm, type scale, resets
   ----------------------------------------------------------------------------
   Every new section is a bare <section>, so it inherits none of Divi's module
   padding. Vertical rhythm is set per section with --pt / --pb, and the values
   are deliberately unequal down the page: S2 is the spacious one, S5 the tight
   one, and no two neighbours share a height, an alignment, or a background.
   ========================================================================== */

.et-l--post .ks-wrap {
	width: 100%;
	max-width: 1240px;
	margin: 0 auto;
	padding-left: 40px;
	padding-right: 40px;
}

.et-l--post .ks-sec {
	position: relative;
	padding-top: var(--pt);
	padding-bottom: var(--pb);
}

/* Bare-element resets: .entry-content styles p / ul / li / h2 / blockquote.
   The element list is wrapped in :where() so the whole selector weighs exactly
   (0,2,0) — enough to beat Divi's `p{padding-bottom:1em}` and `.entry-content
   ul`, but low enough that every component rule below (also two classes, and
   later in the file) reclaims its own margins without needing !important. */
.et-l--post .ks-sec :where(p, h2, ul, li, figure, figcaption, blockquote),
.et-l--post .ks-hero :where(p, h1) {
	margin: 0;
	padding: 0;
	border: 0;
	list-style: none;
	line-height: inherit;
	background: transparent;
}

#page-container .et-l--post .ks-sec img {
	display: block;
	width: 100%;
	height: auto;
}

/* --- Display type ---------------------------------------------------------
   Weight 800 against Roboto 17px body is a ~3.9x size jump at the top of the
   clamp, which is the point: the contrast is doing the work the extra typeface
   would have done. Long display lines are set sentence-case on purpose — the
   site's uppercase treatment is kept for the short shouts (hero, markers,
   picker title, buttons), where it still reads as Keystone. To put the long
   statements back in caps, add `text-transform: uppercase` to .ks-display.
   ------------------------------------------------------------------------ */
#page-container .et-l--post .ks-display {
	font-family: var(--ks-display);
	font-weight: 800;
	font-style: normal;
	color: var(--ks-ink);
	letter-spacing: -0.017em;
	text-transform: none;
}

#page-container .et-l--post .ks-display--xl {
	font-size: clamp(34px, 4.7vw, 68px);
	line-height: 1.02;
	max-width: 17ch;
}

#page-container .et-l--post .ks-display--l {
	font-size: clamp(30px, 3.7vw, 52px);
	line-height: 1.06;
	max-width: 19ch;
}

#page-container .et-l--post .ks-display--onDark {
	color: #ffffff;
}

/* --- Section marker — the one red element most sections get --------------- */
#page-container .et-l--post .ks-marker {
	display: flex;
	align-items: baseline;
	gap: 0.95em;
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 11px;
	line-height: 1;
	letter-spacing: 0.26em;
	text-transform: uppercase;
	color: var(--ks-ink-3);
	margin-bottom: clamp(22px, 2.4vw, 32px);
}

.et-l--post .ks-marker__no {
	font-weight: 700;
	color: var(--ks-accent);
}

#page-container .et-l--post .ks-marker--onDark {
	color: rgba(255, 255, 255, 0.5);
}

/* --- Body prose — 65–75ch measure ---------------------------------------- */
#page-container .et-l--post .ks-prose p {
	font-family: var(--ks-body);
	font-weight: 400;
	font-size: 17px;
	line-height: 1.75;
	color: var(--ks-ink-2);
	max-width: 68ch;
	margin-bottom: 1.15em;
}

#page-container .et-l--post .ks-prose p:last-child {
	margin-bottom: 0;
}

/* --- Photo captions — small, tracked, documentary -------------------------
   The video's "coming soon" caption is excluded: it is an overlay, not a
   caption under a photo, and it carries its own type. */
#page-container .et-l--post .ks-sec figcaption:not(.ks-video__soon) {
	margin-top: 14px;
	font-family: var(--ks-display);
	font-weight: 500;
	font-size: 11px;
	line-height: 1.5;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--ks-ink-3);
}

/* --- CTA — the accent's other job ---------------------------------------- */
#page-container .et-l--post .ks-cta {
	display: inline-flex;
	align-items: center;
	gap: 0.8em;
	margin-top: clamp(26px, 3vw, 36px);
	padding: 17px 30px;
	border: 0;
	border-radius: 4px;
	background-color: var(--ks-accent);
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 13px;
	line-height: 1;
	letter-spacing: 1.9px;
	text-transform: uppercase;
	text-decoration: none;
	color: #ffffff;
	transition: background-color 0.3s ease;
}

.et-l--post .ks-cta::after {
	content: "";
	width: 7px;
	height: 7px;
	border-top: 2px solid currentColor;
	border-right: 2px solid currentColor;
	transform: rotate(135deg) translate(-1px, -1px);
	transition: transform 0.3s ease;
}

#page-container .et-l--post .ks-cta:hover,
#page-container .et-l--post .ks-cta:focus-visible {
	background-color: var(--ks-accent-deep);
	color: #ffffff;
	text-decoration: none;
}

.et-l--post .ks-cta:hover::after,
.et-l--post .ks-cta:focus-visible::after {
	transform: rotate(135deg) translate(-3px, -3px);
}

#page-container .et-l--post .ks-cta:focus-visible {
	outline: 3px solid var(--ks-ink);
	outline-offset: 3px;
}

/* ============================================================================
   1. S1 — HERO
   ----------------------------------------------------------------------------
   Full first screen under a #353a42 scrim, with the lockup at the bottom-left
   rather than dead-centre — which does two things: it sets the left-aligned
   editorial axis the rest of the page runs on, and it clears the bottom-right
   quadrant for the photo that breaks up out of S2.

   2026-08-20: the background is now a film, with the original photo kept
   underneath it as poster and fallback. See "Background film" below.
   ========================================================================== */

.et-l--post .ks-hero {
	position: relative;
	display: grid;
	align-content: end;
	min-height: 100vh;
	min-height: 100svh;
	padding: 0 0 clamp(52px, 8vh, 104px);
	background-color: var(--ks-dark);
	/* The photo stays the hero's own background even now that a film sits on top
	   of it: it is the frame the film fades up from, and the entire fallback if
	   the film never plays. Deliberately NOT removed. */
	background-image: url(../assets/img/Keystone-Church-Who-We-Are-Current-Weekend.jpg);
	background-repeat: no-repeat;
	background-position: 50% 42%;
	background-size: cover;
}

/* --- Background film (2026-08-20) -----------------------------------------
   Three layers now, bottom to top: photo (the hero's background) → film
   (z-index 0) → scrim (z-index 1) → lockup (z-index 2). The scrim used to be
   the first layer of the background-image stack; it is its own layer now so the
   film can slot between it and the photo, and the recipe is byte-identical.

   The film starts at opacity 0 and is only revealed on the `playing` event, so
   there is never a black frame between poster and playback and any failure just
   leaves the photo hero standing. No src ships in the markup — see index.html.

   .ks-hero sets no z-index, so it creates no stacking context and S2's
   overlapping photo (z-index 3) still paints above all of this, as before.
   ------------------------------------------------------------------------ */
.et-l--post .ks-hero__video {
	position: absolute;
	inset: 0;
	z-index: 0;
	display: block;
	width: 100%;
	height: 100%;
	border: 0;
	object-fit: cover;
	background-color: transparent;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.7s ease;
}

.et-l--post .ks-hero__video.is-ready {
	opacity: 1;
}

.et-l--post .ks-hero::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	background-image: var(--ks-hero-scrim);
	pointer-events: none;
}

.et-l--post .ks-hero__inner {
	position: relative;
	z-index: 2;
	width: 100%;
	max-width: 1240px;
	margin: 0 auto;
	padding: 0 40px;
}

#page-container .et-l--post .ks-hero__meta {
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 11px;
	line-height: 1;
	letter-spacing: 0.26em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.62);
	margin-bottom: clamp(20px, 2.6vw, 32px);
}

.et-l--post .ks-hero__dash {
	margin: 0 0.4em;
	color: var(--ks-accent);
}

#page-container .et-l--post .ks-hero__title {
	font-family: var(--ks-display);
	font-weight: 800;
	font-style: normal;
	font-size: clamp(66px, 13vw, 188px);
	line-height: 0.84;
	letter-spacing: -0.028em;
	text-transform: uppercase;
	color: #ffffff;
}

.et-l--post .ks-hero__rule {
	display: block;
	width: 76px;
	height: 3px;
	margin: clamp(24px, 3vw, 36px) 0 0;
	background-color: var(--ks-accent);
}

#page-container .et-l--post .ks-hero__sub {
	margin-top: clamp(18px, 2.2vw, 26px);
	font-family: var(--ks-display);
	font-weight: 200;
	font-size: clamp(21px, 2.7vw, 36px);
	line-height: 1.2;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.92);
}

/* The page's ONE coordinated motion moment: the hero lockup settles in once, on
   load. Transform + opacity only, ease-out, and nothing else on the page
   animates on scroll. */
@keyframes ks-rise {
	from { opacity: 0; transform: translate3d(0, 16px, 0); }
	to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: no-preference) {
	.et-l--post .ks-hero__meta,
	.et-l--post .ks-hero__title,
	.et-l--post .ks-hero__rule,
	.et-l--post .ks-hero__sub {
		animation: ks-rise 0.8s cubic-bezier(0.2, 0.65, 0.25, 1) both;
	}

	.et-l--post .ks-hero__meta  { animation-delay: 0.05s; }
	.et-l--post .ks-hero__title { animation-delay: 0.14s; }
	.et-l--post .ks-hero__rule  { animation-delay: 0.30s; }
	.et-l--post .ks-hero__sub   { animation-delay: 0.38s; }
}

/* ============================================================================
   2. S2 — WHY GROUPS  (spacious light band, 7/5 text-left)
   ----------------------------------------------------------------------------
   LAYOUT EVENT 1 — the portrait in the right column carries a negative top
   margin of exactly (section padding-top + overlap), so it climbs out of its
   own section and lands on the hero photo's empty bottom-right. Nothing is
   absolutely positioned; the figure stays in flow, so nothing can collide.
   Killed below 900px, where the columns stack.
   ========================================================================== */

/* WHITE since 2026-08-24 — S2 and S3 swapped grounds at Jose's call. Was
   var(--ks-bg) #f1f1f1. Side benefit: the photo caption's --ks-ink-3 grey gains
   a little contrast on white (2.84:1 -> 3.21:1), though see the note on that
   token below. */
.et-l--post .ks-sec--why {
	--pt: clamp(112px, 12vw, 168px);
	--pb: clamp(104px, 11vw, 160px);
	background-color: var(--ks-paper);
}

.et-l--post .ks-why {
	display: grid;
	grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
	column-gap: clamp(36px, 5vw, 76px);
	align-items: start;
}

.et-l--post .ks-why__text .ks-display {
	margin-bottom: clamp(28px, 3.4vw, 46px);
}

.et-l--post .ks-why__fig {
	position: relative;
	z-index: 3;
	margin-top: calc(-1 * (var(--pt) + clamp(56px, 6.6vw, 118px)));
}

/* The source is 900x1350; the column tops out around 460px, so it never renders
   above its own pixels. */
#page-container .et-l--post .ks-why__fig img {
	background-color: var(--ks-dark);
}

/* ============================================================================
   3. S3 — THE VIDEO  (dark band, cinematic)
   ----------------------------------------------------------------------------
   THE FILM IS NOT ON DISK YET.  Drop it at:

        redesign-v1/assets/video/groups-invite.mp4

   …and this section works with no code change. Until then the <source> 404s,
   the inline script in index.html catches it, and the play affordance is
   replaced by a quiet "VIDEO COMING SOON" caption over the poster frame — the
   player itself is never shown broken.

   Poster borrows assets/img/Keystone-Church-Who-We-Are-Current-Weekend.jpg
   (1200x800) at a 1100px-wide frame, i.e. 0.92x its own pixels.
   ========================================================================== */

/* RE-GROUNDED LIGHT 2026-08-24 (Jose). Was var(--ks-dark). Cutting S4 and S5
   left this band running straight into the dark picker; rather than lighten the
   picker (tried and reversed the same day), the seam is solved here. It went
   white first and then swapped with S2 the same day, so S2 is white and this is
   #f1f1f1 — the two only need to differ from each other, and no two identical
   grounds touch anywhere in the page. The film frame, poster, play affordance
   and fallback are untouched — the big dark video frame anchors the section. */
.et-l--post .ks-sec--video {
	--pt: clamp(84px, 8.4vw, 122px);
	--pb: clamp(92px, 9.2vw, 134px);
	background-color: var(--ks-bg);
}

.et-l--post .ks-video__head {
	max-width: 760px;
}

.et-l--post .ks-video__head .ks-display {
	margin-bottom: clamp(18px, 2vw, 24px);
}

#page-container .et-l--post .ks-video__line {
	font-family: var(--ks-body);
	font-weight: 400;
	font-size: 17px;
	line-height: 1.7;
	color: rgba(255, 255, 255, 0.66);
	max-width: 66ch;
}

/* HORIZONTAL SYMMETRY FIX 2026-08-24 (Jose: "make sure left and right padding
   is the same on both sides"). This carried max-width: 1100px with no auto
   margins, so inside the wrap's 1160px content column it sat FLUSH LEFT and
   stopped 60px short on the right at >=1240 (20px at 1200). Every band's wrap
   measured perfectly symmetric; this one element was the whole imbalance, and
   being the largest, darkest object on the page it was the one showing.

   The cap is removed rather than the frame centred: centring would have given
   equal insets but broken the left editorial axis that the hero lockup, the S2
   heading, the S3 head, the picker names and the closing slug all share. Now
   the frame fills the column and lines up on BOTH edges with every other band.

   Consequence: the frame grows 1100 -> 1160 at >=1240. The 1200x800 poster then
   renders at 0.97x its own pixels, still under 1:1, so nothing softens. Nothing
   else about the film changes — the element, its poster, the play affordance
   and the drop-in/fallback logic are untouched. */
.et-l--post .ks-video {
	position: relative;
	width: 100%;
	margin-top: clamp(40px, 5vw, 68px);
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background-color: #22262c;
}

#page-container .et-l--post .ks-video__el {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	background-color: #22262c;
}

/* --- Play affordance: bottom-left over the frame, film-title style --------- */
#page-container .et-l--post .ks-video__play {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: grid;
	grid-auto-flow: column;
	align-content: end;
	align-items: center;
	justify-content: start;
	column-gap: clamp(16px, 1.8vw, 22px);
	width: 100%;
	padding: clamp(22px, 3vw, 40px);
	border: 0;
	background-color: transparent;
	background-image: var(--ks-film-scrim);
	text-align: left;
	cursor: pointer;
	-webkit-appearance: none;
	appearance: none;
}

.et-l--post .ks-video__disc {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: clamp(56px, 5.4vw, 74px);
	height: clamp(56px, 5.4vw, 74px);
	border: 2px solid rgba(255, 255, 255, 0.82);
	border-radius: 50%;
	transition: background-color 0.3s ease, border-color 0.3s ease;
}

.et-l--post .ks-video__disc::after {
	content: "";
	width: 0;
	height: 0;
	margin-left: 5px;
	border-left: 15px solid #ffffff;
	border-top: 9px solid transparent;
	border-bottom: 9px solid transparent;
	transition: border-left-color 0.3s ease;
}

.et-l--post .ks-video__playtext {
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 13px;
	line-height: 1.3;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: #ffffff;
}

#page-container .et-l--post .ks-video__play:hover .ks-video__disc,
#page-container .et-l--post .ks-video__play:focus-visible .ks-video__disc {
	background-color: var(--ks-accent);
	border-color: var(--ks-accent);
}

#page-container .et-l--post .ks-video__play:focus-visible {
	outline: 3px solid var(--ks-accent);
	outline-offset: -3px;
}

/* --- Quiet unavailable state ----------------------------------------------
   Browsers disagree about whether a <video> keeps showing its poster after the
   source 404s, so when the script flags the film missing the figure paints the
   poster itself and the (now empty) media element goes transparent over it.
   Either way there is a real frame under the caption, never a black box. */
.et-l--post .ks-video.is-unavailable {
	/* Poster swapped to the client-delivered thumbnail 2026-08-24 */
	background-image: url(../assets/img/groups-invite-poster.jpg);
	background-repeat: no-repeat;
	background-position: 50% 42%;
	background-size: cover;
}

#page-container .et-l--post .ks-video.is-unavailable .ks-video__el {
	background-color: transparent;
}

#page-container .et-l--post .ks-video .ks-video__soon {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: grid;
	align-content: end;
	justify-items: start;
	gap: 12px;
	margin: 0;
	padding: clamp(22px, 3vw, 40px);
	background-image: var(--ks-film-scrim-quiet);
}

.et-l--post .ks-video__soonhead {
	display: block;
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 13px;
	line-height: 1;
	letter-spacing: 0.26em;
	text-transform: uppercase;
	color: #ffffff;
}

.et-l--post .ks-video__soonsub {
	display: block;
	max-width: 48ch;
	font-family: var(--ks-body);
	font-weight: 400;
	font-size: 15px;
	line-height: 1.6;
	letter-spacing: 0;
	text-transform: none;
	color: rgba(255, 255, 255, 0.64);
}

/* [hidden] has to beat the display:grid above. */
#page-container .et-l--post .ks-video__play[hidden],
#page-container .et-l--post .ks-video__soon[hidden] {
	display: none;
}

/* ============================================================================
   *** SECTION REMOVED 2026-08-24 — RULES BELOW ARE DORMANT ***
   S4 "A week in a group" was cut from index.html (Jose). Its markup is gone;
   these layout rules are not.
   Kept rather than deleted, on purpose: it is a few KB, it keeps the diff
   against ../snapshots/2026-08-24_pre-section-cut/ legible, and putting the
   section back is then a markup-only change. Nothing here matches any element
   on the page as it currently stands.
   ========================================================================== */
/* ============================================================================
   4. S4 — A WEEK IN A GROUP  (white band, image-led, 12-col spread)
   ----------------------------------------------------------------------------
   The 7/5 of S2 flips here: photo left, schedule right.

   REWORKED 2026-08-21 (Jose flagged large dead space). The old arrangement put
   the schedule and the small photo in separate grid rows, which left ~407px of
   dead air under the 8:30 row and a ~365px empty band across the bottom with
   the small photo orphaned at the far right. Measured at 1440, the spread was
   1225px tall and roughly a third of it was white.

   The fix is structural rather than a pile of negative margins:

     · .ks-week__side is ONE grid item holding the schedule AND the photo below
       it, so the photo tucks against the last schedule row by construction. Add
       or remove a schedule row and the tuck still holds — nothing to retune.
     · .ks-week__side spans rows 1-2. That matters: it means the tall right
       column does NOT inflate row 1, so the quote's negative top margin is
       still measured off the main portrait, exactly as before.
     · The small photo is held to 48% of the right column, which brings that
       column level with the quote's foot. That is what makes the section END
       at the cluster rather than running on past it.

   A third photo was briefly added in the bottom-left corner and REMOVED the
   same day (Jose). Nothing of it remains. The corner it would have filled is
   now simply the spread's bottom-left step: the portrait's caption sits in it,
   and below that is white — about 252x160px, which is ordinary editorial air
   at this scale, not the 365px hollow band the rework set out to kill.

   Net at 1440: 1225px -> 902px of spread, and the 407px gap under the 8:30
   row is gone entirely.

   TWO NUMBERS ARE LOAD-BEARING here; change either and the dead space returns.
   They are called out at .ks-quote and .ks-week__fig--small below.

   LAYOUT EVENT 2 SURVIVES — .ks-quote is still a row-2 item with a negative
   top margin, riding up over the bottom of the row-1 portrait and knocking a
   white panel out of it, at its original 46px bleed and its original column-4
   start. The portrait's caption is capped at min(210px, 40%) precisely so the
   panel never lands on it; that pairing is a rule, not a coincidence.
   ========================================================================== */

.et-l--post .ks-sec--week {
	--pt: clamp(96px, 9.4vw, 132px);
	--pb: clamp(84px, 8.4vw, 122px);
	background-color: var(--ks-paper);
}

.et-l--post .ks-week__head {
	max-width: 780px;
}

.et-l--post .ks-week__head .ks-display {
	margin-bottom: clamp(18px, 2vw, 24px);
}

#page-container .et-l--post .ks-week__intro {
	font-family: var(--ks-body);
	font-weight: 400;
	font-size: 17px;
	line-height: 1.7;
	color: var(--ks-ink-2);
	max-width: 66ch;
}

.et-l--post .ks-week__spread {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	column-gap: clamp(20px, 2.5vw, 32px);
	align-items: start;
	margin-top: clamp(42px, 4.8vw, 66px);
}

/* Source 600x900; five of twelve columns tops out near 465px. */
.et-l--post .ks-week__fig--main {
	grid-column: 1 / span 5;
	grid-row: 1;
}

/* Capped so the caption lives in columns 1–3 and the pull-quote panel, whose
   left edge sits just past column 3, can never land on top of it. */
#page-container .et-l--post .ks-week__fig--main figcaption {
	max-width: min(210px, 40%);
}

/* --- The right column ------------------------------------------------------
   Schedule + the photo tucked under it, as a single grid item. It spans rows
   1-2 so its height (which is the tallest thing in the spread) is absorbed by
   row 2 instead of inflating row 1 and dragging the quote's overlap with it.
   align-content:start keeps the stack against the top of that two-row span. */
.et-l--post .ks-week__side {
	grid-column: 7 / span 6;
	grid-row: 1 / span 2;
	display: grid;
	align-content: start;
	row-gap: clamp(28px, 3.2vw, 44px);
}

.et-l--post .ks-sched {
	margin-top: 4px;
}

.et-l--post .ks-sched__row {
	display: grid;
	grid-template-columns: clamp(76px, 8vw, 112px) minmax(0, 1fr);
	align-items: baseline;
	column-gap: clamp(18px, 2vw, 28px);
	padding: clamp(18px, 2vw, 24px) 0;
	border-top: 1px solid var(--ks-hair);
}

.et-l--post .ks-sched__row:last-child {
	border-bottom: 1px solid var(--ks-hair);
}

/* Weight 200 against the 800 of the display type — the far end of the axis. */
.et-l--post .ks-sched__t {
	font-family: var(--ks-display);
	font-weight: 200;
	font-size: clamp(26px, 2.7vw, 38px);
	line-height: 1;
	letter-spacing: -0.01em;
	font-variant-numeric: tabular-nums;
	color: var(--ks-ink);
}

.et-l--post .ks-sched__d {
	font-family: var(--ks-body);
	font-weight: 400;
	font-size: 16px;
	line-height: 1.65;
	color: var(--ks-ink-2);
}

/* Columns 4-8, bleeding LEFT only. Both edges are pinned by something real:

     · it must START at column 4, because the main portrait's caption sits in
       columns 1-3 and the panel is opaque. A column-2 start was tried and
       clipped "MEN'S GROUP, MID-WEEK." behind the panel's left edge (Jose,
       2026-08-21 — measured overlap 133x33px). Column 4 plus the 46px bleed
       starts the panel at x392 against a caption ending at x326: 66px clear.
       That is precisely the clearance the figcaption's min(210px, 40%) cap
       was written to guarantee — keep the two rules in sync.

     · it STOPS at column 8. The card's right edge is the fixed thing that the
       small photo is now positioned against — see LAYOUT EVENT 3 on
       .ks-week__fig--small below. The photo moves; this edge does not.

   An earlier pass extended this card rightward instead, to reach a stationary
   right-flush photo. That was reverted: Jose asked for the photo to move, and
   the photo moving is what the composition is. */
.et-l--post .ks-quote {
	grid-column: 4 / span 5;
	grid-row: 2;
	position: relative;
	z-index: 2;
	margin-top: clamp(-124px, -8.6vw, -78px);
	margin-left: calc(-1 * clamp(28px, 3.4vw, 46px));
	padding: clamp(28px, 3vw, 42px) clamp(28px, 3.4vw, 46px) clamp(24px, 2.6vw, 34px);
	background-color: var(--ks-paper);
}

.et-l--post .ks-quote__rule {
	display: block;
	width: 54px;
	height: 3px;
	margin-bottom: clamp(20px, 2.2vw, 28px);
	background-color: var(--ks-ink);
}

#page-container .et-l--post .ks-quote p {
	font-family: var(--ks-display);
	font-weight: 200;
	font-size: clamp(23px, 2.5vw, 36px);
	line-height: 1.18;
	letter-spacing: -0.005em;
	color: var(--ks-ink);
}

/* Now a child of .ks-week__side rather than a grid item of the spread, so it
   needs no placement — it simply follows the schedule.

   THE 48% IS LOAD-BEARING, not a taste call. It is the width that brings the
   right column's total (schedule + gap + this photo) level with the
   pull-quote's foot, which is what makes the section END at the cluster.
   Widen it much and the right column runs on past the quote, reopening exactly
   the dead air this rework removed.

   It cannot be exact at every width, because the quote's height steps as its
   text rewraps while the photo scales smoothly. Measured mismatch across the
   desktop range is 34px at 1440, 1px at 1280 and 20px at 1024 — all well under
   a line of type, so the two columns read as finishing together. If the
   schedule ever gains or loses a row, re-level: width =
   (quote bottom - schedule bottom - row-gap) / 1.5, the source being 2:3.

   Capped at 270px, which is also roughly where it stays visibly smaller than
   the main portrait. Source 600x900, so it renders at 0.45x its own pixels. */
/* LAYOUT EVENT 3 — the photo tuck (2026-08-21, Jose).
   The photo is pulled INWARD off the right margin by a margin-right of 31% of
   the side column, until its left edge slides under the quote card's right
   edge. The card is on top (z-index 2 + position relative, against this
   column's auto), so the photo reads as sitting a little behind it.

   Why a PERCENTAGE and not a clamp: margin percentages resolve against the
   containing block's inline size, which here IS the side column, so the offset
   scales with the grid exactly the way the card's own edge does. That holds the
   tuck at a near-constant 35-48px (roughly 16-18% of the photo covered, so
   82-84% of it stays visible) from 1024 all the way up, without a vw curve that
   drifts once the 1240px wrap stops growing.

   THIS OPENS WHITE SPACE AT THE RIGHT MARGIN — about 175px wide beside the
   photo at 1440, and that is intended, not an oversight. Jose asked for the
   photo to move and to judge the result visually; it is deliberately not
   compensated for. Do not "fix" it by widening the photo or the card without
   asking — widening the photo breaks the column levelling that ends the
   section (see the 48% note above), and widening the card was tried and
   rejected. */
.et-l--post .ks-week__fig--small {
	justify-self: end;
	width: 48%;
	max-width: 270px;
	margin-right: 31%;
}

/* The caption starts at the photo's left edge, which is now UNDER the card, so
   it steps right or it gets clipped the way the main portrait's caption did.
   26% of the figure is the tuck plus ~22px of clearance, and being a percentage
   of the same box it tracks the tuck at every width. Cancelled below 980. */
#page-container .et-l--post .ks-week__fig--small figcaption {
	margin-left: 26%;
}

/* ============================================================================
   *** SECTION REMOVED 2026-08-24 — RULES BELOW ARE DORMANT ***
   S5 "The ask" was cut from index.html (Jose). Its markup is gone — including
   the .ks-cta that scrolled to the picker, which was the ONLY .ks-cta on the
   page, so the CTA half of brand.css B3 is dormant too.
   Kept rather than deleted, on purpose: it is a few KB, it keeps the diff
   against ../snapshots/2026-08-24_pre-section-cut/ legible, and putting the
   section back is then a markup-only change. Nothing here matches any element
   on the page as it currently stands.
   ========================================================================== */
/* ============================================================================
   5. S5 — THE ASK  (light band, deliberately the tightest on the page)
   ----------------------------------------------------------------------------
   Roughly half S2's vertical padding, no photo, and the body column is indented
   to column 6 so the block staggers instead of sitting square under the display
   line. It runs straight into the picker, which is the point — this is the
   run-up, not a destination.
   ========================================================================== */

.et-l--post .ks-sec--ask {
	--pt: clamp(58px, 5.2vw, 78px);
	--pb: clamp(58px, 5.2vw, 78px);
	background-color: var(--ks-bg);
}

.et-l--post .ks-ask {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	column-gap: clamp(20px, 2.5vw, 32px);
}

.et-l--post .ks-ask__lead {
	grid-column: 1 / span 9;
}

.et-l--post .ks-ask__side {
	grid-column: 6 / span 7;
	margin-top: clamp(26px, 3vw, 40px);
}

#page-container .et-l--post .ks-ask__side p {
	font-family: var(--ks-body);
	font-weight: 400;
	font-size: 17px;
	line-height: 1.75;
	color: var(--ks-ink-2);
	max-width: 68ch;
	margin-bottom: 1.1em;
}

/* ============================================================================
   6. S6 — GROUP PICKER  (variant E, "type list + reveal" — Jose's pick)
   ----------------------------------------------------------------------------
   Engage a name — pointer, keyboard focus or touch — and the stage swaps to
   that group's photo and STAYS there until a different name is engaged. Men's
   is pre-active so the panel is never empty, and below 940px the stage drops
   out in favour of one photo card per name.

   The reveal used to be pure CSS (:hover + :has()). It is now class-driven —
   see "STICKY ACTIVE STATE" below for why, and for the two attributes that
   carry it. The 2026-08-20 overhaul also changed how it sits on the page:

     · wrap 1080 -> 1240px, and horizontal padding moved off the section onto
       the wrap, so the picker lines up with every grid above it;
     · its own accent rule replaced by the shared "05 — CHOOSE" marker, so the
       section furniture matches S1–S5;
     · title moved onto the shared display scale (Work Sans 800, clamped) from
       the old flat 32px;
     · id="find-your-group" added so the S5 CTA can point at it.

   Everything here is variant E's own type — it borrows no Divi module presets.
   ========================================================================== */

/* The light re-ground of 2026-08-24 was reversed the same day — Jose: "it looks
   terrible, go back." Every value below is the original dark-ground one. The
   S3/picker seam that prompted the experiment was solved from the other side
   instead, by making S3 "Watch" light. */
#page-container .et-l--post .ks-picker {
	--pt: clamp(88px, 9vw, 126px);
	--pb: clamp(96px, 9.8vw, 142px);
	padding: var(--pt) 0 var(--pb);
	background: linear-gradient(180deg, #3c424a 0%, var(--ks-dark) 62%);
	color: #ffffff;
	scroll-margin-top: 24px;
}

.et-l--post .ks-picker__wrap {
	max-width: 1240px;
	margin: 0 auto;
	padding: 0 40px;
}

.et-l--post .ks-picker__head {
	max-width: 640px;
	margin: 0 0 clamp(40px, 5vw, 58px);
}

#page-container .et-l--post .ks-picker__title {
	margin: 0;
	padding: 0;
	font-family: var(--ks-display);
	font-weight: 800;
	font-size: clamp(30px, 3.6vw, 50px);
	line-height: 1.04;
	letter-spacing: -0.015em;
	text-transform: uppercase;
	color: #ffffff;
}

#page-container .et-l--post .ks-picker__intro {
	margin: clamp(18px, 2vw, 24px) 0 0;
	padding: 0;
	font-family: var(--ks-body);
	font-size: 16px;
	line-height: 1.65;
	color: rgba(255, 255, 255, 0.62);
	max-width: 54ch;
}

/* --- The two halves -------------------------------------------------------
   Names take the wider column. The stage lands near 470 x 620 — close enough to
   2:3 that all three photos (600x900, 900x1350, 600x900) sit in it essentially
   uncropped, and none renders above its own pixels.
   ------------------------------------------------------------------------ */
.et-l--post .ks-reveal {
	display: grid;
	grid-template-columns: 1.18fr 0.82fr;
	gap: clamp(36px, 4.2vw, 58px);
	align-items: stretch;
	min-height: clamp(520px, 62vh, 660px);
}

/* Divi gives every list in .entry-content discs and a 1em indent. */
#page-container .et-l--post .ks-names {
	display: flex;
	flex-direction: column;
	margin: 0;
	padding: 0;
	list-style: none;
	line-height: inherit;
}

/* Equal-height ruled rows: the names divide the stage's height between them. */
.et-l--post .ks-names__row {
	flex: 1 1 0;
	display: flex;
	align-items: center;
	border-bottom: 1px solid rgba(255, 255, 255, 0.14);
}

.et-l--post .ks-names__row:first-child {
	border-top: 1px solid rgba(255, 255, 255, 0.14);
}

#page-container .et-l--post .ks-name {
	display: flex;
	width: 100%;
	align-items: baseline;
	gap: 22px;
	color: rgba(255, 255, 255, 0.32);
	text-decoration: none;
	transition: color 0.35s ease;
}

.et-l--post .ks-name__no {
	flex: none;
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 12px;
	letter-spacing: 2.4px;
	color: var(--ks-picker-accent);
	opacity: 0.65;
	transition: opacity 0.35s ease;
}

.et-l--post .ks-name__text {
	font-family: var(--ks-display);
	font-weight: 700;
	font-size: clamp(30px, 4.1vw, 58px);
	line-height: 1;
	letter-spacing: -0.005em;
	text-transform: uppercase;
}

/* Chevron on the active name only, parked at the end of the row. */
.et-l--post .ks-name::after {
	content: "";
	flex: none;
	width: 10px;
	height: 10px;
	margin-left: auto;
	align-self: center;
	border-top: 2px solid currentColor;
	border-right: 2px solid currentColor;
	transform: rotate(45deg);
	opacity: 0;
	transition: opacity 0.35s ease, transform 0.35s ease;
}

#page-container .et-l--post .ks-name:focus-visible {
	outline: 3px solid var(--ks-picker-accent);
	outline-offset: 6px;
}

/* --- Stage ---------------------------------------------------------------- */

.et-l--post .ks-stage {
	position: relative;
	overflow: hidden;
	min-height: 420px;
	border-radius: 2px;
	background: var(--ks-dark);
}

/* All three shots are stacked at inset 0, so the last one in the DOM would sit
   on top of the visible one and swallow clicks aimed at its JOIN button — an
   opacity-0 element still takes pointer events. Only the active shot is
   clickable; see the sticky-state block below. */
.et-l--post .ks-shot {
	position: absolute;
	inset: 0;
	margin: 0;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.5s ease;
}

#page-container .et-l--post .ks-shot__img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* Held slightly oversize, released to 1 when its name becomes active. */
	transform: scale(1.03);
	transition: transform 1.1s cubic-bezier(0.2, 0.6, 0.2, 1);
}

.et-l--post .ks-shot::after {
	content: "";
	position: absolute;
	inset: 0;
	/* Overlay removed per Jose 2026-08-21 — the delivered picker photos run clean.
	   Was: background: var(--ks-shot-overlay); */
	background: none;
}

.et-l--post .ks-shot__cap {
	position: absolute;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 2;
	padding: 40px 40px 38px;
}

#page-container .et-l--post .ks-shot__desc {
	margin: 0 0 26px;
	padding: 0;
	font-family: var(--ks-display);
	font-weight: 500;
	font-size: 22px;
	line-height: 1.3;
	letter-spacing: 0.4px;
	color: #ffffff;
}

/* --- Join button ---------------------------------------------------------- */

#page-container .et-l--post .ks-join {
	display: inline-flex;
	align-items: center;
	gap: 0.75em;
	padding: 14px 24px;
	border: 2px solid rgba(255, 255, 255, 0.55);
	border-radius: 4px;
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 13px;
	letter-spacing: 1.9px;
	text-transform: uppercase;
	text-decoration: none;
	color: #ffffff;
	transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
}

.et-l--post .ks-join::after {
	content: "";
	width: 7px;
	height: 7px;
	border-top: 2px solid currentColor;
	border-right: 2px solid currentColor;
	transform: rotate(45deg) translate(-1px, 1px);
	transition: transform 0.3s ease;
}

#page-container .et-l--post .ks-join:hover,
#page-container .et-l--post .ks-join:focus-visible {
	background-color: #ffffff;
	border-color: #ffffff;
	color: var(--ks-dark);
	text-decoration: none;
}

.et-l--post .ks-join:hover::after,
.et-l--post .ks-join:focus-visible::after {
	transform: rotate(45deg) translate(2px, -2px);
}

#page-container .et-l--post .ks-join:focus-visible {
	outline: 3px solid var(--ks-picker-accent);
	outline-offset: 3px;
}

/* --- STICKY ACTIVE STATE --------------------------------------------------
   Was pure :hover + :has(). That had a real bug: the state died the instant the
   pointer left the name rows, so travelling toward the stage's JOIN button
   snapped the panel back to Men's and the button was unreachable by mouse
   (Jose, 2026-08-20).

   Now the selection sticks. `.ks-reveal` carries data-active="1|2|3" and the
   active name's row carries .is-active; both are set by the short script under
   the picker in index.html, on pointer-enter and on focus, and are NEVER
   cleared on leave. Last name engaged wins, so the pointer is free to travel
   into the stage and click JOIN.

   One mechanism for everything: mouse, keyboard focus and touch all end up
   setting the same two attributes, so there is no second :hover path that can
   disagree with the stage. Only opacity and transform change, so switching
   groups shifts no layout.

   The markup ships with data-active="1" and .is-active on the first row, so
   Men's is pre-active before the script runs — and if the script never runs,
   the picker is simply static on Men's with all three names still working as
   ordinary links.
   ------------------------------------------------------------------------ */

.et-l--post .ks-reveal[data-active="1"] .ks-shot--1,
.et-l--post .ks-reveal[data-active="2"] .ks-shot--2,
.et-l--post .ks-reveal[data-active="3"] .ks-shot--3 {
	opacity: 1;
	/* the whole point of the fix: the visible shot's JOIN button is clickable */
	pointer-events: auto;
}

.et-l--post .ks-reveal[data-active="1"] .ks-shot--1 .ks-shot__img,
.et-l--post .ks-reveal[data-active="2"] .ks-shot--2 .ks-shot__img,
.et-l--post .ks-reveal[data-active="3"] .ks-shot--3 .ks-shot__img {
	transform: scale(1);
}

#page-container .et-l--post .ks-names__row.is-active .ks-name {
	color: #ffffff;
	text-decoration: none;
}

.et-l--post .ks-names__row.is-active .ks-name__no {
	opacity: 1;
}

.et-l--post .ks-names__row.is-active .ks-name::after {
	opacity: 1;
	transform: rotate(45deg) translate(3px, -3px);
}

/* --- Phone cards ---------------------------------------------------------- */
/* Hidden until the layout drops the stage at 940px — see section 7. */

.et-l--post .ks-card {
	display: none;
}

/* ============================================================================
   6b. COUPLES PHOTO — interim stand-in
   ----------------------------------------------------------------------------
   No couples photo exists yet, so both the couples shot and its phone card
   borrow the Young Adult photo (Jose, 2026-08-20). IT IS NOT A PHOTO OF
   COUPLES — swap the two `src`s in index.html, fix the alt text, and drop the
   ks-shot--placeholder / ks-card--placeholder classes once a real one lands.
   The hand-drawn assets/img/couples-placeholder.svg stays on disk; the variants
   still use it.

   The same file is ALSO the small second photo in S4 — that one is a plain
   swappable placeholder, not a stand-in for anything. See the swap map in
   ../HANDOFF.md.
   ========================================================================== */

/* ============================================================================
   6c. S7 — CLOSING BAND  (added 2026-08-20)
   ----------------------------------------------------------------------------
   The picker's #353a42 runs straight into the Divi footer, which paints
   bg-img.jpg full-bleed with !important — two dark surfaces with nothing
   between them. This band is the separation: white, so the sequence reads
   dark -> WHITE -> dark and the footer stops looking like more page.

   It is deliberately a colophon rather than another content section — a
   marginal slug in columns 1-3 (echoing the hero's slug, so the feature opens
   and closes on the same line) against one closing statement in columns 4-11,
   finished with a printed end-mark. That marginal-slug arrangement appears
   nowhere else on the page, and its height sits between S5's tight band and
   S6's tall one, so it breaks the rhythm as well as the tone.

   The end-mark is this section's single accent element. The Divi footer's own
   markup and CSS are untouched.
   ========================================================================== */

.et-l--post .ks-sec--close {
	--pt: clamp(74px, 7vw, 106px);
	--pb: clamp(74px, 7vw, 106px);
	background-color: var(--ks-paper);
}

.et-l--post .ks-close {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	column-gap: clamp(20px, 2.5vw, 32px);
	align-items: start;
}

#page-container .et-l--post .ks-close__slug {
	grid-column: 1 / span 3;
	/* nudged down onto the cap height of the big line beside it */
	padding-top: 0.62em;
	font-family: var(--ks-display);
	font-weight: 600;
	font-size: 11px;
	line-height: 1.6;
	letter-spacing: 0.26em;
	text-transform: uppercase;
	color: var(--ks-ink-3);
}

.et-l--post .ks-close__dash {
	margin: 0 0.4em;
}

#page-container .et-l--post .ks-close__line {
	grid-column: 4 / span 8;
	max-width: 22ch;
	font-family: var(--ks-display);
	font-weight: 200;
	font-size: clamp(26px, 3.2vw, 46px);
	line-height: 1.12;
	letter-spacing: -0.01em;
	color: var(--ks-ink);
}

/* The end-of-article mark. Sized in em so it tracks the line it closes. */
.et-l--post .ks-close__mark {
	display: inline-block;
	width: 0.34em;
	height: 0.34em;
	margin-left: 0.42em;
	vertical-align: 0.06em;
	background-color: var(--ks-accent);
}

/* ============================================================================
   7. RESPONSIVE
   ----------------------------------------------------------------------------
   Six widths, largest-first:
     1120  picker columns tighten
      980  Divi tablet — S4's 12-col spread flattens, S5 and S7 stop staggering
      940  picker: stage out, one photo card per name (variant E's own)
      900  the two overlap events switch off; S2 stacks
      767  Divi phone
      560  small phones
   ========================================================================== */

/* --- 1120 ----------------------------------------------------------------- */
@media only screen and (max-width: 1120px) {
	#page-container .et-l--post .ks-name {
		gap: 16px;
	}
}

/* NOTE 2026-08-24: the .ks-week__*, .ks-sched, .ks-quote and .ks-ask__* rules
   inside the media queries below are dormant — see the section 4 and 5 headers. */

/* --- 980: Divi tablet ----------------------------------------------------- */
@media only screen and (max-width: 980px) {
	.et-l--post .ks-wrap,
	.et-l--post .ks-hero__inner,
	.et-l--post .ks-picker__wrap {
		padding-left: 32px;
		padding-right: 32px;
	}

	/* S4's spread flattens: photo, list, quote, second photo — in that order,
	   with the quote still stepping in from the left so the rhythm survives. */
	.et-l--post .ks-week__spread {
		grid-template-columns: minmax(0, 1fr);
		row-gap: clamp(34px, 4.4vw, 48px);
	}

	/* The right column stops being a column: display:contents dissolves the
	   wrapper so the schedule and the photo under it become grid items of the
	   spread again and stack with everything else. Source order decides the
	   flow — portrait, schedule, small photo, quote. */
	.et-l--post .ks-week__side {
		display: contents;
	}

	.et-l--post .ks-week__fig--main,
	.et-l--post .ks-sched,
	.et-l--post .ks-quote,
	.et-l--post .ks-week__fig--small {
		grid-column: 1 / -1;
		grid-row: auto;
		margin-top: 0;
	}

	.et-l--post .ks-week__fig--main {
		max-width: 460px;
	}

	#page-container .et-l--post .ks-week__fig--main figcaption {
		max-width: none;
	}

	.et-l--post .ks-quote {
		padding: 0;
		margin-left: clamp(0px, 6vw, 64px);
	}

	/* LAYOUT EVENT 3 off: the spread is stacked here, so the photo goes back to
	   its own row at the right margin and nothing overlaps anything. */
	#page-container .et-l--post .ks-week__fig--small figcaption {
		margin-left: 0;
	}

	/* Undo the desktop sizing AND the Layout Event 3 inward pull before the
	   stacked rules take over. */
	.et-l--post .ks-week__fig--small {
		justify-self: stretch;
		width: auto;
		max-width: 300px;
		margin-left: auto;
		margin-right: 0;
	}

	/* S5 stops staggering and simply stacks. */
	.et-l--post .ks-ask__lead,
	.et-l--post .ks-ask__side {
		grid-column: 1 / -1;
	}

	/* S7's marginal slug moves above the closing line. */
	#page-container .et-l--post .ks-close__slug,
	#page-container .et-l--post .ks-close__line {
		grid-column: 1 / -1;
	}

	#page-container .et-l--post .ks-close__slug {
		padding-top: 0;
		margin-bottom: clamp(20px, 2.6vw, 28px);
	}
}

/* --- 940: picker stage out, one photo card per name ----------------------- */
@media only screen and (max-width: 940px) {
	#page-container .et-l--post .ks-picker {
		--pt: clamp(64px, 8vw, 88px);
		--pb: clamp(72px, 9vw, 96px);
	}

	.et-l--post .ks-reveal {
		grid-template-columns: minmax(0, 1fr);
		gap: 0;
		min-height: 0;
	}

	.et-l--post .ks-stage {
		display: none;
	}

	.et-l--post .ks-names__row,
	.et-l--post .ks-names__row:first-child {
		display: block;
		flex: none;
		margin-bottom: 24px;
		border: 0;
	}

	/* There is no stage to reveal here, so the sticky selection has nothing to
	   indicate: every name is drawn in the active colour. The second selector
	   matches the active row's specificity so .is-active can't win it back. */
	#page-container .et-l--post .ks-name,
	#page-container .et-l--post .ks-names__row.is-active .ks-name {
		display: flex;
		padding: 0 0 16px;
		color: #ffffff;
	}

	.et-l--post .ks-name::after {
		display: none;
	}

	.et-l--post .ks-name__no {
		opacity: 1;
	}

	.et-l--post .ks-name__text {
		font-size: 30px;
	}

	.et-l--post .ks-card {
		display: block;
		position: relative;
		overflow: hidden;
		height: 300px;
		border-radius: 2px;
		background: var(--ks-dark);
	}

	#page-container .et-l--post .ks-card img {
		position: absolute;
		inset: 0;
		width: 100%;
		height: 100%;
		object-fit: cover;
	}

	.et-l--post .ks-card::after {
		content: "";
		position: absolute;
		inset: 0;
		/* Overlay removed per Jose 2026-08-21 — matches the stage shots above. */
		background: none;
	}

	.et-l--post .ks-card__cap {
		position: absolute;
		right: 0;
		bottom: 0;
		left: 0;
		z-index: 2;
		padding: 26px 24px;
	}

	#page-container .et-l--post .ks-card__cap p {
		margin: 0 0 18px;
		padding: 0;
		font-family: var(--ks-display);
		font-weight: 500;
		font-size: 17px;
		line-height: 1.3;
		color: #ffffff;
	}
}

/* --- 900: the overlap events switch off ----------------------------------- */
@media only screen and (max-width: 900px) {
	.et-l--post .ks-why {
		grid-template-columns: minmax(0, 1fr);
		row-gap: clamp(34px, 5vw, 48px);
	}

	/* LAYOUT EVENT 1 off: the photo drops back into flow, below the text. */
	.et-l--post .ks-why__fig {
		margin-top: 0;
		max-width: 460px;
	}

	.et-l--post .ks-sec--why {
		--pt: clamp(72px, 9vw, 104px);
		--pb: clamp(72px, 9vw, 104px);
	}
}

/* --- 767: Divi phone ------------------------------------------------------ */
@media only screen and (max-width: 767px) {
	.et-l--post .ks-wrap,
	.et-l--post .ks-hero__inner,
	.et-l--post .ks-picker__wrap {
		padding-left: 24px;
		padding-right: 24px;
	}

	#page-container .et-l--post .ks-hero__title {
		letter-spacing: -0.02em;
	}

	#page-container .et-l--post .ks-hero__sub {
		letter-spacing: 0.07em;
	}

	.et-l--post .ks-sec--video {
		--pt: clamp(64px, 9vw, 84px);
		--pb: clamp(68px, 9vw, 92px);
	}

	.et-l--post .ks-sec--week {
		--pt: clamp(70px, 9vw, 96px);
		--pb: clamp(64px, 8vw, 84px);
	}

	/* The play lockup goes vertical so the label never squeezes. */
	#page-container .et-l--post .ks-video__play {
		grid-auto-flow: row;
		justify-items: start;
		row-gap: 16px;
	}

	.et-l--post .ks-sched__row {
		grid-template-columns: minmax(0, 1fr);
		row-gap: 6px;
	}

	.et-l--post .ks-quote {
		margin-left: 0;
	}

	.et-l--post .ks-week__fig--small {
		max-width: 240px;
		margin-left: 0;
	}

	#page-container .et-l--post .ks-cta {
		width: 100%;
		justify-content: space-between;
	}
}

/* --- 560: small phones ---------------------------------------------------- */
@media only screen and (max-width: 560px) {
	.et-l--post .ks-name__text {
		font-size: 26px;
		letter-spacing: 0.5px;
	}

	.et-l--post .ks-card {
		height: 260px;
	}

	#page-container .et-l--post .ks-join {
		font-size: 12px;
		padding: 12px 18px;
	}

	.et-l--post .ks-video__playtext,
	.et-l--post .ks-video__soonhead {
		font-size: 12px;
		letter-spacing: 0.18em;
	}
}

/* --- Reduced motion: nothing moves but state colour -----------------------
   The hero film is belt-and-braces here: the script already refuses to assign a
   src under prefers-reduced-motion, so this rule only matters if the class was
   somehow applied — either way the hero falls back to the photo. */
@media (prefers-reduced-motion: reduce) {
	.et-l--post .ks-hero__video {
		display: none;
	}

	.et-l--post .ks-shot__img,
	.et-l--post .ks-shot,
	.et-l--post .ks-name,
	.et-l--post .ks-name::after,
	.et-l--post .ks-join,
	.et-l--post .ks-join::after,
	.et-l--post .ks-cta,
	.et-l--post .ks-cta::after,
	.et-l--post .ks-video__disc {
		transition-duration: 0.01ms;
	}

	#page-container .et-l--post .ks-shot__img {
		transform: none;
	}
}
