/*
 * Lucky Wolf — the only stylesheet.
 *
 * Serves both the front end and the block editor (add_editor_style in
 * functions.php), so a pattern cannot look right in one and wrong in the other.
 *
 * The scheme is light editorial: a bone page, deep forest ink, the logo's green
 * as the accent, brass for emphasis. The ONLY dark ground on the site is the
 * footer. Contrast is measured, not eyeballed — run `node tools/contrast.mjs`.
 *
 * THREE RULES THAT ARE NOT STYLISTIC:
 *
 *   1. NO large block of hero text is ever opacity-animated — not the <h1>,
 *      not the lede. Chrome records LCP at the element's first non-zero-
 *      opacity paint, and you do not get to choose which element it picks:
 *      on a 390px viewport it picked the lede, and fading that in cost 3.5
 *      seconds of LCP.
 *
 *   2. .lw-reveal has NO hidden state here. assets/js/motion.js applies the
 *      start state imperatively and only to elements below the fold, so a
 *      blocked script leaves a complete, readable page.
 *
 *   3. `gold` (#B8862B) is 3.10:1 on the page ground. That is fine for a 40px
 *      metric and illegal for a paragraph. Body-size brass uses `gold-ink`.
 *      In the footer, `accent` is 3.24:1 — use `accent-light` there.
 */

/* --------------------------------------------------------------------------
 * Spacing scale — this block is NOT optional
 *
 * theme.json declares a spacing scale, but core's `default` origin ships slugs
 * 20-80 from its own scale and wins the merge on every colliding slug. The
 * emitted CSS therefore carries core's values, not ours, and every section
 * renders at roughly a third of its designed padding. Re-declaring at :root
 * wins on source order. Keep these in sync with theme.json.
 * ----------------------------------------------------------------------- */
:root {
	--wp--preset--spacing--10: 0.5rem;
	--wp--preset--spacing--20: 1rem;
	--wp--preset--spacing--30: 1.5rem;
	--wp--preset--spacing--40: 2.5rem;
	--wp--preset--spacing--50: clamp(3rem, 5vw, 4.5rem);
	--wp--preset--spacing--60: clamp(4.5rem, 8vw, 7rem);
	--wp--preset--spacing--70: clamp(6rem, 11vw, 10rem);

	--lw-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
	--lw-radius: 4px;
	--lw-radius-lg: 8px;
	--lw-header-h: 76px;
	--lw-header-h-stuck: 60px;
	--lw-rule: 1px solid var(--wp--preset--color--line);
}

/* --------------------------------------------------------------------------
 * Base
 * ----------------------------------------------------------------------- */

*,
*::before,
*::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
	margin: 0;
	background: var(--wp--preset--color--page);
	color: var(--wp--preset--color--ink);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	min-height: 100vh;
}

img,
svg,
video,
iframe { max-width: 100%; height: auto; }

img, svg, video { display: block; }

.screen-reader-text {
	position: absolute !important;
	width: 1px; height: 1px;
	padding: 0; margin: -1px;
	overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%);
	white-space: nowrap; border: 0;
}

.skip-link:focus {
	position: fixed; top: 0.75rem; left: 0.75rem; z-index: 999;
	padding: 0.75rem 1.25rem;
	background: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--on-dark);
	border-radius: var(--lw-radius);
	font-weight: 600;
}

/* Suppressed for pointer input only, never for keyboard. The attribute is set
   by motion.js; if that never runs, everyone keeps a ring. */
:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 3px;
	border-radius: 2px;
}
[data-input='pointer'] a:focus:not(:focus-visible),
[data-input='pointer'] button:focus:not(:focus-visible),
[data-input='pointer'] summary:focus:not(:focus-visible) { outline: none; }

::selection {
	background: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--page);
}

/* --------------------------------------------------------------------------
 * Editorial furniture
 *
 * The rhythm of this site is a hairline, a mono kicker, then a very large
 * heading. That repetition is the identity — not colour, not shadows.
 * ----------------------------------------------------------------------- */

.lw-main { position: relative; }

.lw-section { padding-block: var(--wp--preset--spacing--50); }

/* A rule across the top of a section, with the kicker sitting on it. */
.lw-section--ruled { border-top: var(--lw-rule); padding-top: var(--wp--preset--spacing--40); }

/*
 * No width or margin rules here — the eyebrow is an ordinary child of whatever
 * layout contains it, and WordPress sizes it like everything else in that
 * column.
 *
 * An earlier version forced `max-width: none !important; margin-inline: 0
 * !important` to stop the Services eyebrow being centred. That diagnosis was
 * wrong: the culprit was `.lw-prose p { max-width: 68ch }`, which at 13px made
 * the eyebrow narrower than its column so core's auto margins centred the
 * difference. The override "fixed" Services and broke every post page, because
 * wp:post-date and wp:post-terms carry this class too — they spanned the full
 * 1344px while the title sat in a 760px column.
 *
 * Core's constrained-layout rule is `:where(.is-layout-constrained) > :where(…)`,
 * which has ZERO specificity. Any class selector already beats it, so reaching
 * for !important against the layout system is never the answer here.
 */
.lw-eyebrow {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 500;
	text-transform: uppercase;
	letter-spacing: 0.14em;
	color: var(--wp--preset--color--ink-muted);
	margin: 0 0 0.9rem;
	display: flex;
	align-items: center;
	gap: 0.7rem;
}

/* The short brass tick before a kicker. Decorative, so it is hidden from AT. */
.lw-eyebrow::before {
	content: '';
	width: 26px;
	height: 2px;
	background: var(--wp--preset--color--gold);
	flex: 0 0 auto;
}

.lw-section__head { max-width: 22ch; }
.lw-section__head h2 { margin: 0; }

.lw-lede {
	font-size: var(--wp--preset--font-size--lg);
	color: var(--wp--preset--color--ink-muted);
	max-width: 58ch;
}

/* --------------------------------------------------------------------------
 * Header — logo left, nav centre, CTA right
 * ----------------------------------------------------------------------- */

.lw-header-sentinel { position: absolute; top: 0; height: 1px; width: 1px; }

.lw-header {
	position: sticky;
	top: 0;
	z-index: 100;
	background: var(--wp--preset--color--page);
	border-bottom: 1px solid transparent;
	transition: border-color 220ms var(--lw-ease-out), box-shadow 220ms var(--lw-ease-out);
}

.lw-header.is-stuck {
	border-bottom-color: var(--wp--preset--color--line);
	box-shadow: var(--wp--preset--shadow--bar);
}

/*
 * A wp:shortcode block wraps its output in a <p>, and that paragraph's
 * default margins were offsetting the brand against the CTA button —
 * visible on mobile as a logo sitting a dozen pixels too high.
 * `display: contents` makes the <a> itself the grid item.
 */
.lw-header__inner > p,
.lw-footer p:has(> .lw-footer__cols) { display: contents; }

.lw-header__inner {
	display: grid;
	/* Three real columns, so the nav is centred on the PAGE rather than in
	   whatever space the logo and button happen to leave over. */
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: 1.5rem;
	min-height: var(--lw-header-h);
	transition: min-height 220ms var(--lw-ease-out);
}

.lw-header.is-stuck .lw-header__inner { min-height: var(--lw-header-h-stuck); }

.lw-brand {
	display: inline-flex;
	align-items: center;
	gap: 0.7rem;
	text-decoration: none;
	color: var(--wp--preset--color--ink);
	justify-self: start;
}

.lw-brand:hover { color: var(--wp--preset--color--ink); text-decoration: none; }

.lw-brand__mark {
	width: 48px;
	height: 48px;
	flex: 0 0 auto;
	transition: width 220ms var(--lw-ease-out), height 220ms var(--lw-ease-out);
}

.lw-header.is-stuck .lw-brand__mark { width: 38px; height: 38px; }

.lw-brand__text {
	font-family: var(--wp--preset--font-family--display);
	font-size: 1.0625rem;
	font-weight: 800;
	letter-spacing: -0.02em;
	line-height: 1.05;
}

.lw-brand__text small {
	display: block;
	font-family: var(--wp--preset--font-family--mono);
	font-size: 0.5625rem;
	font-weight: 500;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: var(--wp--preset--color--ink-muted);
	margin-top: 2px;
}

.lw-header__cta { justify-self: end; }
.lw-header__cta .wp-block-button__link { white-space: nowrap; }

/* --------------------------------------------------------------------------
 * Navigation
 * ----------------------------------------------------------------------- */

.lw-nav { justify-self: center; }

.lw-nav .wp-block-navigation__container { gap: clamp(1rem, 1.8vw, 1.9rem); }

.lw-nav .wp-block-navigation-item__content {
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	color: var(--wp--preset--color--ink);
	text-decoration: none;
	padding-block: 0.35rem;
	position: relative;
}

.lw-nav .wp-block-navigation-item__content:hover,
.lw-nav .current-menu-item > .wp-block-navigation-item__content {
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}

/* Grows from the centre. transform only — no layout, no repaint. */
.lw-nav .wp-block-navigation-item__content::after {
	content: '';
	position: absolute;
	left: 0; right: 0; bottom: 0;
	height: 2px;
	background: var(--wp--preset--color--gold);
	transform: scaleX(0);
	transition: transform 220ms var(--lw-ease-out);
}
.lw-nav .wp-block-navigation-item__content:hover::after,
.lw-nav .current-menu-item > .wp-block-navigation-item__content::after { transform: scaleX(1); }

.wp-block-navigation__responsive-container.is-menu-open {
	background: var(--wp--preset--color--page) !important;
	padding: clamp(2rem, 8vw, 4rem);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--xl);
	font-weight: 700;
	color: var(--wp--preset--color--ink);
}

@media (max-width: 900px) {
	.lw-header__inner { grid-template-columns: 1fr auto auto; }
	.lw-nav { justify-self: end; }
}

@media (max-width: 599px) {
	.lw-header__inner { gap: 0.6rem; }
	.lw-brand__mark { width: 40px; height: 40px; }
	.lw-brand__text { font-size: 0.9375rem; }
	.lw-brand__text small { display: none; }
	.lw-header__cta .wp-block-button__link {
		padding-inline: 0.95rem;
		font-size: var(--wp--preset--font-size--xs);
	}
}

/* --------------------------------------------------------------------------
 * Hero
 * ----------------------------------------------------------------------- */

.lw-hero { padding-block: clamp(3rem, 7vw, 6rem) var(--wp--preset--spacing--50); }

.lw-hero__grid {
	display: grid;
	/* Asymmetric on purpose: the copy is the subject, the mark is the seal. */
	grid-template-columns: 1.25fr 0.75fr;
	align-items: center;
	gap: clamp(2rem, 5vw, 4.5rem);
}

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

/* Never animated. See rule 1 in the file header. */
.lw-hero__title {
	margin: 0;
	max-width: 13ch;
	text-wrap: balance;
	text-transform: uppercase;
}

.lw-hero__title em {
	display: block;
	font-style: normal;
	color: var(--wp--preset--color--accent);
}

/* The brass rule under the headline is the single most identifying mark on
   the page, so it gets a real size rather than a hairline. */
.lw-hero__rule {
	width: 96px;
	height: 4px;
	background: var(--wp--preset--color--gold);
	margin: var(--wp--preset--spacing--30) 0;
	border: 0;
}

.lw-hero__lede {
	font-size: var(--wp--preset--font-size--lg);
	color: var(--wp--preset--color--ink-muted);
	max-width: 46ch;
	margin: 0 0 var(--wp--preset--spacing--30);
}

.lw-hero__actions { display: flex; flex-wrap: wrap; gap: 0.85rem; align-items: center; }

.lw-hero__art {
	position: relative;
	display: grid;
	place-items: center;
	/* Room for the portrait, which hangs off the bottom-left of the mark. */
	padding-bottom: clamp(1rem, 3vw, 2.5rem);
	padding-left: clamp(2rem, 6vw, 4.5rem);
}

.lw-hero__mark { width: min(100%, 340px); height: auto; }

/*
 * Jeremy, overlapping the mark. He is the face of the business and the client
 * roster is relationship-led, so the hero says who you would actually be
 * dealing with rather than only showing a badge.
 */
.lw-hero__portrait {
	position: absolute;
	left: 0;
	bottom: 0;
	width: clamp(108px, 14vw, 158px);
	aspect-ratio: 1;
	object-fit: cover;
	object-position: center 18%;
	border-radius: 50%;
	background: var(--wp--preset--color--card);
	border: 4px solid var(--wp--preset--color--page);
	box-shadow: var(--wp--preset--shadow--lg);
}

/*
 * Entrance. NO HERO TEXT IS ANIMATED — not the h1, not the lede.
 *
 * Rule 1 in the file header says the h1 is never opacity-animated because
 * Chrome records LCP at first non-zero-opacity paint. The lede was animated
 * anyway, and on a 390px viewport the lede — not the h1, not the logo — is
 * what Chrome picks as the LCP element. `backwards` fill held it at opacity 0
 * before the animation even started, and LCP measured 5.0s against 1.5s for
 * the previous build.
 *
 * So the rule is not "don't animate the h1". It is: do not opacity-animate
 * any large block of hero text, because you do not get to choose which one
 * Chrome measures.
 */
@media (prefers-reduced-motion: no-preference) {
	.lw-hero__eyebrow,
	.lw-hero__rule,
	.lw-hero__actions,
	.lw-hero__art {
		animation: lw-rise 0.7s var(--lw-ease-out) backwards;
	}
	.lw-hero__eyebrow { animation-delay: 0.02s; }
	.lw-hero__rule    { animation-delay: 0.10s; }
	.lw-hero__actions { animation-delay: 0.20s; }
	.lw-hero__art     { animation-delay: 0.06s; }
}

@keyframes lw-rise {
	from { opacity: 0; transform: translate3d(0, 14px, 0); }
	to   { opacity: 1; transform: none; }
}

@media (max-width: 860px) {
	.lw-hero__grid { grid-template-columns: 1fr; }
	/*
	 * Keep the desktop composition rather than stacking two loose shapes.
	 * The art becomes a single lockup — mark with the portrait overlapping
	 * its lower right — sized to the column, left aligned with the copy, and
	 * sitting directly above the eyebrow instead of floating in its own band.
	 */
	.lw-hero__art {
		order: -1;
		justify-items: start;
		justify-content: start;
		padding: 0;
		width: min(78%, 300px);
		margin-bottom: var(--wp--preset--spacing--30);
	}
	.lw-hero__mark { width: 100%; }
	.lw-hero__portrait {
		left: auto;
		right: -6%;
		bottom: 4%;
		width: 42%;
		border-width: 3px;
	}
	.lw-hero__title { max-width: 16ch; }
}

/* --------------------------------------------------------------------------
 * Client logo wall — white tiles
 *
 * Tiles rather than bare logos. The roster is nine transparent PNGs and a
 * JPEG, at wildly different aspect ratios and ink densities; on a bone page
 * the dark ones shout and the light ones vanish. A white tile with a hairline
 * gives every client the same frame, which is also the honest way to present
 * someone else's mark.
 * ----------------------------------------------------------------------- */

.lw-logos { overflow: hidden; }

.lw-logos__track {
	display: flex;
	align-items: stretch;
	gap: 1rem;
	margin: 0;
	padding: 0;
	list-style: none;
	width: max-content;
}

@media (prefers-reduced-motion: no-preference) {
	.lw-logos__track { animation: lw-marquee 60s linear infinite; }
	.lw-logos:hover .lw-logos__track,
	.lw-logos:focus-within .lw-logos__track { animation-play-state: paused; }
}

/* The track holds the roster twice, so -50% lands exactly on the seam. */
@keyframes lw-marquee {
	from { transform: translate3d(0, 0, 0); }
	to   { transform: translate3d(-50%, 0, 0); }
}

.lw-logos--static .lw-logos__track {
	animation: none;
	flex-wrap: wrap;
	justify-content: center;
	width: auto;
}

.lw-logo { flex: 0 0 auto; }

.lw-logo a {
	display: flex;
	align-items: center;
	justify-content: center;
	width: clamp(150px, 17vw, 190px);
	height: clamp(88px, 10vw, 104px);
	padding: 0.85rem 1rem;
	background: var(--wp--preset--color--card);
	border: var(--lw-rule);
	border-radius: var(--lw-radius-lg);
	/* Backstop. The caps on the image below should make this unnecessary, but
	   a client can replace their logo at any time and a tile that leaks is
	   worse than one that crops. */
	overflow: hidden;
	transition: border-color 220ms var(--lw-ease-out), box-shadow 220ms var(--lw-ease-out);
}

.lw-logo a:hover,
.lw-logo a:focus-visible {
	border-color: var(--wp--preset--color--line-strong);
	box-shadow: var(--wp--preset--shadow--md);
}

.lw-logo__img {
	border-radius: 4px;
	/* Explicit pixel caps, not max-height: 100%.
	   These are replaced elements carrying their own width/height attributes
	   inside a fixed-height flex line, and a percentage max-height did not
	   constrain them — BONK, Klooz, Taco Alibi and Indiana Bar Service all
	   spilled out over the tile border. Pixels are deterministic. */
	/* Capped on both axes. Height is the usual binding constraint, so it is
	   set close to the tile's inner height — a near-square logo capped at a
	   conservative height reads much smaller than a wide one beside it. */
	max-height: clamp(54px, 7vw, 72px);
	max-width: clamp(118px, 14vw, 152px);
	width: auto;
	height: auto;
	object-fit: contain;
}

.lw-logo__fallback {
	font-family: var(--wp--preset--font-family--display);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--ink-muted);
	text-align: center;
}

/* --------------------------------------------------------------------------
 * Cards
 * ----------------------------------------------------------------------- */

.lw-card,
.lw-proof__card,
.lw-member {
	background: var(--wp--preset--color--card);
	border: var(--lw-rule);
	border-radius: var(--lw-radius-lg);
	padding: clamp(1.4rem, 2.5vw, 2rem);
	transition: transform 300ms var(--lw-ease-out), border-color 300ms var(--lw-ease-out), box-shadow 300ms var(--lw-ease-out);
}

@media (prefers-reduced-motion: no-preference) {
	.lw-card:hover,
	.lw-proof__card:hover,
	.lw-member:hover {
		transform: translateY(-3px);
		border-color: var(--wp--preset--color--line-strong);
		box-shadow: var(--wp--preset--shadow--lg);
	}
}

/* --------------------------------------------------------------------------
 * Value propositions — numbered, editorial
 * ----------------------------------------------------------------------- */

.lw-props {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
	gap: 0;
	border-top: var(--lw-rule);
}

/* Rules between, not boxes around. Cheaper visually and much more editorial
   than three floating cards. */
.lw-prop {
	padding: var(--wp--preset--spacing--40) clamp(0rem, 2vw, 2rem) var(--wp--preset--spacing--30) 0;
	border-bottom: var(--lw-rule);
}

@media (min-width: 860px) {
	.lw-prop + .lw-prop {
		padding-left: clamp(1.5rem, 3vw, 3rem);
		border-left: var(--lw-rule);
	}
}

.lw-prop__num {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: 0.14em;
	color: var(--wp--preset--color--gold-ink);
	display: block;
	margin-bottom: 0.8rem;
}

.lw-prop__title { margin: 0 0 0.6rem; font-size: var(--wp--preset--font-size--xl); }
.lw-prop__body { margin: 0; color: var(--wp--preset--color--ink-muted); }

/* --------------------------------------------------------------------------
 * PROOF
 * ----------------------------------------------------------------------- */

.lw-proof {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
	gap: clamp(1rem, 2vw, 1.5rem);
}

/* There are four case studies. An auto-fit grid puts three on the top row and
   orphans the fourth, which reads as a mistake. */
@media (min-width: 900px) {
	.lw-proof { grid-template-columns: repeat(2, 1fr); }
}

.lw-proof__card { display: flex; flex-direction: column; }

/* No tile here. The card is already white, so a white tile on it reads as a
   stray box — and the client logo does not need a second frame to belong. */
.lw-proof__logo-wrap {
	display: flex;
	align-items: center;
	height: 60px;
	margin-bottom: 1.25rem;
}

.lw-proof__logo {
	/* Several marks are solid-ground squares — Back Room Cigars especially —
	   and a hard corner beside rounded cards looks like a mistake. Harmless
	   on the transparent ones. */
	border-radius: 6px;
	max-height: 56px;
	max-width: 168px;
	width: auto;
	height: auto;
	object-fit: contain;
}

.lw-proof__title {
	margin: 0 0 1rem;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 500;
	text-transform: uppercase;
	letter-spacing: 0.14em;
	color: var(--wp--preset--color--ink-muted);
}

.lw-proof__metric { margin: 0 0 1rem; display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.6rem; }

.lw-metric__value {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--3xl);
	font-weight: 900;
	line-height: 0.95;
	letter-spacing: -0.03em;
	/* gold is 3.10:1 on this ground — legal here ONLY because this is display
	   size. Never use it for body copy; that is what gold-ink is for. */
	color: var(--wp--preset--color--gold);
	/* The counter rewrites this text every frame; tabular figures stop the
	   line jittering as digit widths change. */
	font-variant-numeric: tabular-nums;
}

.lw-metric__label { font-size: var(--wp--preset--font-size--sm); color: var(--wp--preset--color--ink-muted); }

.lw-proof__headline {
	margin: 0 0 0.6rem;
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 700;
	letter-spacing: -0.02em;
}

.lw-proof__body { color: var(--wp--preset--color--ink-muted); }
.lw-proof__body p:last-child { margin-bottom: 0; }

.lw-proof__more {
	margin-top: auto;
	padding-top: 1.25rem;
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	text-decoration: none;
}
.lw-proof__more:hover { text-decoration: underline; }
.lw-proof__more::after { content: ' \2192'; }

/* --------------------------------------------------------------------------
 * Team
 * ----------------------------------------------------------------------- */

.lw-team {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
	gap: clamp(1rem, 2vw, 1.5rem);
}

.lw-member { text-align: left; }

/* Portraits are squared with a hairline rather than circles with a glow. The
   circles were the single most ztat-looking thing on the page. */
.lw-member__frame {
	aspect-ratio: 4 / 5;
	margin: 0 0 1.1rem;
	overflow: hidden;
	border-radius: var(--lw-radius);
	background: var(--wp--preset--color--card-sunk);
	border: var(--lw-rule);
}

.lw-member__photo {
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* The headshots come from eight different sources and eight different
	   cameras. A shared, very light warm grade stops the grid looking like a
	   scrapbook without making anyone look odd. */
	filter: saturate(0.94) contrast(1.02);
}

.lw-member__name { margin: 0 0 0.2rem; font-size: var(--wp--preset--font-size--lg); }

.lw-member__role {
	margin: 0 0 0.7rem;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	text-transform: uppercase;
	letter-spacing: 0.12em;
	color: var(--wp--preset--color--gold-ink);
}

.lw-member__bio { color: var(--wp--preset--color--ink-muted); font-size: var(--wp--preset--font-size--sm); }
.lw-member__bio p:last-child { margin-bottom: 0; }

.lw-member__link { font-size: var(--wp--preset--font-size--sm); font-weight: 600; text-decoration: none; }
.lw-member__link:hover { text-decoration: underline; }

.lw-team--compact .lw-member__bio { display: none; }

/* --------------------------------------------------------------------------
 * Video
 * ----------------------------------------------------------------------- */

.lw-videos__list { list-style: none; margin: 0; padding: 0; }

.lw-videos--grid .lw-videos__list {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 176px), 1fr));
	gap: clamp(0.75rem, 1.5vw, 1.1rem);
}

.lw-videos--wide .lw-videos__list { grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr)); }

/* The rail is a plain horizontal scroller by default. GSAP upgrades it to a
   pinned scrub on desktop; on touch it stays a scroller, because hijacking
   vertical scroll to move something sideways is disorienting and a thumb can
   already swipe this directly. */
.lw-videos--rail { overflow: hidden; }

.lw-videos--rail .lw-videos__list {
	display: flex;
	gap: clamp(0.75rem, 1.5vw, 1.1rem);
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	-webkit-overflow-scrolling: touch;
	padding-bottom: 0.75rem;
}

.lw-videos--rail .lw-video { flex: 0 0 clamp(150px, 38vw, 200px); scroll-snap-align: start; }

/* Once GSAP drives the offset, native scrolling has to stop or the two fight
   each other. The class name is historical — the rail is no longer pinned. */
.lw-videos--rail.is-pinned .lw-videos__list {
	overflow-x: visible;
	scroll-snap-type: none;
	width: max-content;
}

.lw-video { position: relative; min-width: 0; }

.lw-video__btn {
	display: block;
	position: relative;
	width: 100%;
	padding: 0;
	border: var(--lw-rule);
	border-radius: var(--lw-radius-lg);
	overflow: hidden;
	background: var(--wp--preset--color--card-sunk);
	cursor: pointer;
	transition: transform 300ms var(--lw-ease-out), border-color 300ms var(--lw-ease-out), box-shadow 300ms var(--lw-ease-out);
}

@media (prefers-reduced-motion: no-preference) {
	.lw-video__btn:hover { transform: translateY(-3px); box-shadow: var(--wp--preset--shadow--lg); }
}
.lw-video__btn:hover { border-color: var(--wp--preset--color--line-strong); }

.lw-video--short .lw-video__btn { aspect-ratio: 9 / 16; }
.lw-video--wide .lw-video__btn { aspect-ratio: 16 / 9; }

.lw-video__poster { width: 100%; height: 100%; object-fit: cover; }
.lw-video__poster--missing { display: block; width: 100%; height: 100%; background: var(--wp--preset--color--card-sunk); }

.lw-video__play {
	position: absolute;
	inset: 0;
	margin: auto;
	width: 50px; height: 50px;
	border-radius: 50%;
	background: var(--wp--preset--color--page);
	box-shadow: var(--wp--preset--shadow--lg);
	transition: background-color 220ms var(--lw-ease-out), transform 220ms var(--lw-ease-out);
}

/* The triangle, drawn with a border so it needs no asset. */
.lw-video__play::after {
	content: '';
	position: absolute;
	inset: 0;
	margin: auto;
	width: 0; height: 0;
	border-style: solid;
	border-width: 8px 0 8px 14px;
	border-color: transparent transparent transparent var(--wp--preset--color--ink);
	transform: translateX(2px);
}

.lw-video__btn:hover .lw-video__play { background: var(--wp--preset--color--accent); transform: scale(1.06); }
.lw-video__btn:hover .lw-video__play::after { border-left-color: var(--wp--preset--color--on-accent); }

.lw-video__title {
	margin: 0.6rem 0 0;
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.4;
	color: var(--wp--preset--color--ink);
	display: -webkit-box;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.lw-video__frame { width: 100%; aspect-ratio: 16 / 9; border: 0; border-radius: var(--lw-radius-lg); display: block; }

.lw-videos__empty { font-weight: 600; }

/* The Videos page carries 115 Shorts. They all ship in the markup and all
   lazy-load, so revealing the rest costs no request — but a 115-item wall is
   a bad first impression, so everything past the first 24 starts hidden. */
.lw-videos--paged .lw-video[data-lw-overflow] { display: none; }
.lw-videos--paged.is-expanded .lw-video[data-lw-overflow] { display: block; }

.lw-videos__more { margin-top: var(--wp--preset--spacing--30); text-align: center; }
.lw-videos--paged.is-expanded .lw-videos__more { display: none; }

/* Shorts modal */
.lw-video-dialog { border: 0; padding: 0; background: transparent; max-width: 100vw; max-height: 100vh; overflow: visible; }
.lw-video-dialog::backdrop { background: rgba(18, 36, 28, 0.82); }

.lw-video-dialog__stage {
	width: min(92vw, calc((100vh - 6rem) * 9 / 16));
	aspect-ratio: 9 / 16;
	max-height: calc(100vh - 6rem);
	border-radius: var(--lw-radius-lg);
	overflow: hidden;
	background: #000;
}

.lw-video-dialog__stage .lw-video__frame { width: 100%; height: 100%; aspect-ratio: auto; border-radius: 0; }

.lw-video-dialog__close {
	position: absolute;
	top: -2.9rem; right: 0;
	width: 40px; height: 40px;
	font-size: 24px; line-height: 1;
	color: var(--wp--preset--color--ink);
	background: var(--wp--preset--color--page);
	border: var(--lw-rule);
	border-radius: 50%;
	cursor: pointer;
}
.lw-video-dialog__close:hover { background: var(--wp--preset--color--accent); color: var(--wp--preset--color--on-accent); }

/* --------------------------------------------------------------------------
 * Blog and prose
 * ----------------------------------------------------------------------- */

.lw-card-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
	gap: clamp(1rem, 2vw, 1.5rem);
}

.lw-card-grid .wp-block-post-title { font-size: var(--wp--preset--font-size--xl); margin-block: 0.4rem 0.6rem; }
.lw-card-grid .wp-block-post-title a { color: var(--wp--preset--color--ink); text-decoration: none; }
.lw-card-grid .wp-block-post-title a:hover { color: var(--wp--preset--color--accent); }
.lw-card-grid .wp-block-post-date {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--ink-muted);
}
.lw-card-grid .wp-block-post-excerpt__excerpt { color: var(--wp--preset--color--ink-muted); }

.lw-prose > * + * { margin-top: 1.15em; }
.lw-prose h2 { margin-top: 2em; }
.lw-prose h3 { margin-top: 1.6em; }
/*
 * No max-width on prose paragraphs. The column IS the measure.
 *
 * There used to be a 68ch cap here for readability. Measured, the content
 * column is 760px and 68ch at 18px Inter is 748px — so the cap bought 12px of
 * line length and cost the alignment: core centres a child narrower than its
 * container, leaving every paragraph 6px right of the heading above it. The
 * column is already ~69ch, which is the measure the cap was reaching for.
 *
 * If a narrower measure is ever wanted, change the container's contentSize in
 * theme.json rather than capping the children — that keeps one source of
 * truth and nothing to re-centre.
 */

/* --------------------------------------------------------------------------
 * CTA band — the one dark band on a light page
 *
 * Inverted from the previous scheme, and for the same reason it worked there:
 * it is the largest value contrast anywhere on the page, so it reads as the
 * end of the argument.
 *
 * Neither `accent` nor `ink-muted` is legible here — 3.24:1 and 2.87:1. Use
 * accent-light and on-dark.
 * ----------------------------------------------------------------------- */

.lw-cta-band { color: var(--wp--preset--color--on-dark); }
.lw-cta-band :where(h1, h2, h3, h4) { color: var(--wp--preset--color--on-dark); }
.lw-cta-band .lw-eyebrow { color: var(--wp--preset--color--on-dark); opacity: 0.75; }
.lw-cta-band .lw-eyebrow::before { background: var(--wp--preset--color--gold); }
.lw-cta-band :where(a):not(.wp-element-button) { color: var(--wp--preset--color--accent-light); }
.lw-cta-band :where(a):not(.wp-element-button):hover { color: var(--wp--preset--color--gold); }

.lw-cta-band .wp-element-button {
	background: var(--wp--preset--color--page);
	border-color: var(--wp--preset--color--page);
	color: var(--wp--preset--color--ink);
}
.lw-cta-band .wp-element-button:hover {
	background: var(--wp--preset--color--gold);
	border-color: var(--wp--preset--color--gold);
	color: var(--wp--preset--color--ink);
}

/* --------------------------------------------------------------------------
 * Footer — the other dark band
 * ----------------------------------------------------------------------- */

.lw-footer {
	background: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--on-dark);
	padding-block: var(--wp--preset--spacing--50) var(--wp--preset--spacing--30);
}

.lw-footer .lw-brand { color: var(--wp--preset--color--on-dark); }
.lw-footer .lw-brand:hover { color: var(--wp--preset--color--on-dark); }
.lw-footer .lw-brand__text small { color: var(--wp--preset--color--accent-light); }

.lw-footer__cols {
	display: grid;
	grid-template-columns: 1fr;
	gap: clamp(1.5rem, 4vw, 3rem);
}

@media (min-width: 620px) {
	.lw-footer__cols { grid-template-columns: repeat(3, 1fr); }
	.lw-footer__cols > :first-child { grid-column: 1 / -1; }
}

@media (min-width: 900px) {
	.lw-footer__cols { grid-template-columns: 1.6fr repeat(3, 1fr); }
	.lw-footer__cols > :first-child { grid-column: auto; }
}

.lw-footer__blurb {
	margin: 1.1rem 0 0;
	max-width: 34ch;
	color: var(--wp--preset--color--on-dark);
	opacity: 0.78;
	font-size: var(--wp--preset--font-size--sm);
}

.lw-footer h2 {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 500;
	text-transform: uppercase;
	letter-spacing: 0.14em;
	color: var(--wp--preset--color--accent-light);
	margin: 0 0 0.9rem;
}

.lw-footer ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.55rem; }
.lw-footer a {
	color: var(--wp--preset--color--on-dark);
	text-decoration: none;
	font-size: var(--wp--preset--font-size--sm);
}
.lw-footer a:hover { color: var(--wp--preset--color--gold); text-decoration: underline; }

.lw-footer__legal {
	margin-top: var(--wp--preset--spacing--40);
	padding-top: var(--wp--preset--spacing--20);
	border-top: 1px solid rgba(242, 247, 243, 0.14);
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 0.75rem;
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--on-dark);
	opacity: 0.7;
}

/* --------------------------------------------------------------------------
 * Gravity Forms
 *
 * GF 3.x ships its "Orbital" theme, which assumes a light background — so on
 * this scheme most of the work is restraint rather than override.
 * ----------------------------------------------------------------------- */

.gform_wrapper .gfield_label {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs) !important;
	font-weight: 500 !important;
	text-transform: uppercase;
	letter-spacing: 0.12em;
	color: var(--wp--preset--color--ink-muted) !important;
	margin-bottom: 0.45rem !important;
}

.gform_wrapper .gfield_required { color: var(--wp--preset--color--accent); }

.gform_wrapper input[type='text'],
.gform_wrapper input[type='email'],
.gform_wrapper input[type='tel'],
.gform_wrapper input[type='url'],
.gform_wrapper input[type='number'],
.gform_wrapper select,
.gform_wrapper textarea {
	width: 100%;
	padding: 0.85rem 1rem !important;
	background: var(--wp--preset--color--card) !important;
	border: 1px solid var(--wp--preset--color--line-strong) !important;
	border-radius: var(--lw-radius) !important;
	color: var(--wp--preset--color--ink) !important;
	font-family: var(--wp--preset--font-family--body) !important;
	/* 16px minimum, or iOS Safari zooms the viewport on focus. */
	font-size: 1rem !important;
	transition: border-color 180ms var(--lw-ease-out), box-shadow 180ms var(--lw-ease-out);
}

.gform_wrapper ::placeholder { color: var(--wp--preset--color--ink-muted); opacity: 1; }

.gform_wrapper input:focus,
.gform_wrapper select:focus,
.gform_wrapper textarea:focus {
	outline: none;
	border-color: var(--wp--preset--color--accent) !important;
	box-shadow: 0 0 0 3px rgba(46, 125, 91, 0.15) !important;
}

.gform_wrapper textarea { min-height: 150px; resize: vertical; }

/* intl-tel-input from gp-advanced-phone-field overlays a flag dropdown inside
   the field, so the input needs left padding to clear it. */
.gform_wrapper .iti { width: 100%; display: block; }
.gform_wrapper .iti--allow-dropdown input[type='tel'] { padding-left: 62px !important; }
.gform_wrapper .iti__country-container { max-height: 56px; }

.gform_wrapper .gform_footer input[type='submit'],
.gform_wrapper .gform_button {
	background: var(--wp--preset--color--accent) !important;
	color: var(--wp--preset--color--on-accent) !important;
	border: 1px solid var(--wp--preset--color--accent) !important;
	border-radius: var(--lw-radius) !important;
	padding: 0.95rem 2rem !important;
	font-family: var(--wp--preset--font-family--body) !important;
	font-size: var(--wp--preset--font-size--sm) !important;
	font-weight: 600 !important;
	cursor: pointer;
	transition: background-color 180ms var(--lw-ease-out);
}

.gform_wrapper .gform_footer input[type='submit']:hover { background: var(--wp--preset--color--accent-deep) !important; }

.gform_wrapper .gfield_description,
.gform_wrapper .gform_validation_errors,
.gform_wrapper .validation_message { font-size: var(--wp--preset--font-size--sm); }

/* Measured at 4.83:1 on the card ground. */
.gform_wrapper .validation_message,
.gform_wrapper .gfield_error .gfield_label { color: #A32B18 !important; }
.gform_wrapper .gfield_error input,
.gform_wrapper .gfield_error textarea { border-color: #A32B18 !important; }
.gform_wrapper .gform_validation_errors {
	background: rgba(163, 43, 24, 0.06) !important;
	border: 1px solid rgba(163, 43, 24, 0.35) !important;
	border-radius: var(--lw-radius);
	color: var(--wp--preset--color--ink) !important;
	box-shadow: none !important;
}

.gform_confirmation_message {
	padding: 1.25rem 1.5rem;
	background: var(--wp--preset--color--card);
	border: 1px solid var(--wp--preset--color--accent);
	border-radius: var(--lw-radius-lg);
}

/*
 * Hiding the reCAPTCHA badge is only permitted by Google's terms when the form
 * carries the branding text instead. That text is injected by
 * lw_recaptcha_branding() in inc/integrations.php, which detects GF's
 * `ginput_recaptcha` class — GF does not emit Google's own `g-recaptcha`.
 * If either goes, the other goes in the same commit.
 */
.grecaptcha-badge { visibility: hidden !important; }

.lw-recaptcha-notice {
	margin-top: 0.85rem;
	font-size: var(--wp--preset--font-size--xs);
	color: var(--wp--preset--color--ink-muted);
}
.lw-recaptcha-notice a { color: var(--wp--preset--color--ink-muted); }

/* --------------------------------------------------------------------------
 * Reveal
 *
 * No hidden state. motion.js applies the start state imperatively and only to
 * elements below the fold. See rule 2 in the file header.
 * ----------------------------------------------------------------------- */

.lw-reveal { will-change: auto; }

.lw-word { display: inline-block; will-change: transform; }
[data-lw-split] { overflow: hidden; }

/* --------------------------------------------------------------------------
 * Post meta, post navigation, related posts
 * ----------------------------------------------------------------------- */

/*
 * The byline shares one eyebrow with the category, so the post header carries
 * two brass ticks (date, then meta) rather than three. No width or margin
 * rules here for the same reason they are absent from .lw-eyebrow above —
 * see the note at the top of that rule.
 */
.lw-meta__sep {
	color: var(--wp--preset--color--line-strong);
}

.lw-meta a {
	color: inherit;
	text-decoration: none;
	border-bottom: 1px solid transparent;
}

.lw-meta a:hover {
	color: var(--wp--preset--color--accent);
	border-bottom-color: currentColor;
}

.lw-postend {
	border-top: var(--lw-rule);
}

.lw-postnav {
	gap: 1rem;
	margin-bottom: var(--wp--preset--spacing--40);
}

.lw-postnav .post-navigation-link {
	max-width: 48%;
	font-size: var(--wp--preset--font-size--sm);
}

.lw-postnav .post-navigation-link-next {
	margin-left: auto;
	text-align: right;
}

.lw-postnav a {
	color: var(--wp--preset--color--ink);
	text-decoration: none;
}

.lw-postnav a:hover {
	color: var(--wp--preset--color--accent);
}

.lw-related__list {
	list-style: none;
	margin: 0.9rem 0 0;
	padding: 0;
}

.lw-related__date {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--ink-muted);
	margin: 0 0 0.4rem;
}

.lw-related__link {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 700;
	line-height: 1.2;
	color: var(--wp--preset--color--ink);
	text-decoration: none;
}

.lw-related__link:hover {
	color: var(--wp--preset--color--accent);
}

/* --------------------------------------------------------------------------
 * Reduced motion
 * ----------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
	html { scroll-behavior: auto; }

	*,
	*::before,
	*::after {
		animation-duration: 0.001ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.001ms !important;
		scroll-behavior: auto !important;
	}

	.lw-logos__track {
		animation: none !important;
		transform: none !important;
		flex-wrap: wrap;
		justify-content: center;
		width: auto;
	}
}

/* --------------------------------------------------------------------------
 * Print
 * ----------------------------------------------------------------------- */

@media print {
	.lw-header, .lw-footer, .lw-videos, .lw-logos { display: none; }
	body { background: #fff; color: #000; }
}

/* --------------------------------------------------------------------------
 * Case study single
 * ----------------------------------------------------------------------- */

.lw-study { margin-top: 1.2rem; }

.lw-study__metric {
	font-family: var(--wp--preset--font-family--display);
	font-weight: 900;
	font-size: clamp(2.6rem, 6vw, 4rem);
	line-height: 1;
	letter-spacing: -0.04em;
	color: var(--wp--preset--color--gold);
	margin: 0 0 0.3rem;
}

.lw-study__metric-label {
	display: block;
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	letter-spacing: 0;
	color: var(--wp--preset--color--ink-muted);
	margin-top: 0.6rem;
}

.lw-study__headline {
	font-size: var(--wp--preset--font-size--lg);
	color: var(--wp--preset--color--ink-muted);
	max-width: 46ch;
}

.lw-study__client a,
.lw-study__back a { color: var(--wp--preset--color--accent); }

/* --------------------------------------------------------------------------
 * FAQ
 * ----------------------------------------------------------------------- */

.lw-faq { margin-top: var(--wp--preset--spacing--50); }

.lw-faq__list {
	display: grid;
	gap: clamp(1.2rem, 2.5vw, 1.8rem);
	margin-top: 1.4rem;
}

.lw-faq__item {
	border-top: var(--lw-rule);
	padding-top: clamp(1rem, 2vw, 1.4rem);
}

.lw-faq__q {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--lg);
	font-weight: 700;
	line-height: 1.25;
	margin: 0 0 0.5rem;
	color: var(--wp--preset--color--ink);
}

.lw-faq__a {
	margin: 0;
	color: var(--wp--preset--color--ink-muted);
	max-width: 62ch;
}
