/*
Theme Name: Genthe
Theme URI: https://genthelaw.com/
Author: Genthe Law Firm
Author URI: https://genthelaw.com/
Description: Bespoke block theme for the Genthe Law Firm — a Dallas personal injury litigation practice. Implements the firm's Brand Guide v2.0: Verdict Navy carries the weight, Advocate Gold means "act", Saira set heavy and uppercase for every headline, label and button, and Lora for every sentence of prose. Built for WP Engine: self-hosted fonts, no page builder, no external requests.
Version: 1.0.0
Requires at least: 6.5
Tested up to: 6.8
Requires PHP: 8.0
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: genthe
Tags: block-theme, full-site-editing, one-column, custom-colors, custom-menu, accessibility-ready
*/

/* ==========================================================================
   Design tokens live in theme.json. This file holds the component and utility
   layer that block supports alone cannot express.
   ========================================================================== */

:root {
	--gl-gutter: var( --wp--custom--gutter, clamp( 1.25rem, 4vw, 2.5rem ) );
	--gl-radius: var( --wp--custom--radius, 10px );
	--gl-ease: 180ms ease;
	--gl-header-h: 5.25rem;

	/*
	 * The one measure the whole site is laid out on. The header, the masthead,
	 * the recoveries ledger, the CTA, the footer and the body column all take
	 * this number, so every left edge on the page is the same left edge. It was
	 * a literal `1400px` in five places and `1120px` in the body column, which
	 * is how the two drifted apart in the first place.
	 */
	--gl-frame: 1400px;
}

html {
	scroll-behavior: smooth;
	scroll-padding-top: calc( var( --gl-header-h ) + 1rem );
}

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

	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
	}
}

body {
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;

	/*
	 * `clip`, not `hidden`. overflow-x: hidden on body propagates to the
	 * viewport and turns it into a scroll container, which silently kills the
	 * position: sticky article rail. `clip` contains stray overflow without
	 * creating a scroll box.
	 */
	overflow-x: clip;
}

/* Headlines are set in caps, so they wrap on balance rather than on width. */
h1,
h2,
h3,
h4,
.gl-display,
.wp-block-post-title,
.wp-block-site-title {
	text-wrap: balance;
}

p,
li {
	text-wrap: pretty;
}

/* --------------------------------------------------------------------------
   Accessibility
   -------------------------------------------------------------------------- */

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

.gl-skip-link {
	background: var( --wp--preset--color--ink );
	color: #fff;
	font-weight: 600;
	left: 0;
	padding: 0.875rem 1.5rem;
	position: absolute;
	top: -100px;
	transition: top var( --gl-ease );
	z-index: 999;
}

.gl-skip-link:focus {
	/*
	 * `.screen-reader-text` clips the link to a 1px box. Moving it to `top: 0`
	 * is not enough on its own — without restoring the box it arrives on
	 * screen as an invisible sliver, which is the one state a skip link must
	 * not have. Undo the clip here rather than dropping the SR class, so the
	 * link stays out of the layout until it is focused.
	 */
	clip-path: none;
	height: auto;
	margin: 0;
	overflow: visible;
	top: 0;
	width: auto;
}

/*
 * A two-tone ring, because no single colour clears 3:1 on both grounds: gold
 * measures 2.45:1 on bone and 2.69:1 on paper, and gold-dark drops to 2.67:1
 * on ink. So the outline carries the light bands (gold-dark, 5.47:1 on paper)
 * and the paper ring inside it carries the dark ones (14.63:1 on ink). One of
 * the two always has the contrast, whatever the focused element is sitting on.
 */
:where( a, button, input, select, textarea, summary, [tabindex] ):focus-visible {
	box-shadow: 0 0 0 2px var( --wp--preset--color--paper );
	outline: 3px solid var( --wp--preset--color--gold-dark );
	outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   Layout helpers
   -------------------------------------------------------------------------- */

/*
 * Header, main and footer are the three children of the root layout, so the
 * global blockGap was printing a strip of page background under the header and
 * above the footer on every template. The bands are meant to butt up against
 * both.
 */
.wp-site-blocks > * + * {
	margin-block-start: 0;
}

/*
 * The hero and CTA covers use a left-to-right navy scrim. On a narrow screen a
 * horizontal gradient leaves the text sitting on the light end of the photo, so
 * the overlay turns vertical instead.
 */
@media ( max-width: 781px ) {
	.wp-block-cover .wp-block-cover__background.has-background-gradient {
		background: linear-gradient(
			180deg,
			rgba( 15, 42, 68, 0.92 ) 0%,
			rgba( 10, 24, 38, 0.84 ) 100%
		) !important;
	}
}

/* --------------------------------------------------------------------------
   Type utilities ported from the brand guide
   -------------------------------------------------------------------------- */

.gl-eyebrow {
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.75rem;
	font-weight: 800;
	letter-spacing: 0.18em;
	line-height: 1.4;
	margin-bottom: 0;
	text-transform: uppercase;
}

/* Category links inside an eyebrow read as a label, not as body-copy links. */
.gl-eyebrow a {
	color: inherit;
	text-decoration: none;
}

.gl-eyebrow a:hover {
	text-decoration: underline;
}

/*
 * The interface face.
 *
 * Body copy is now the serif, and everything below used to say nothing about
 * its family because it did not need to: the old body font was the sans, so a
 * button that declared only a size inherited the right face by accident. That
 * accident inverted the moment Lora took the body slot — the hero's own call
 * to action came back set in the serif, in sentence case, reading as a
 * paragraph with a box drawn round it.
 *
 * So the rule the reference states plainly — no button, label or nav item is
 * ever set in the serif — is declared here once, for every affordance on the
 * site, rather than left to whatever each component happens to inherit.
 *
 * Prose deliberately not in this list: `__body`, `__note`, `__label` under a
 * figure, and the pillar paragraphs. Those are sentences and captions, and the
 * reference sets sentences in Lora.
 */
:is(
	button,
	input,
	select,
	textarea,
	label,
	.wp-element-button,
	.wp-block-button__link,
	.gl-btn,
	.glh-btn,
	.gl-rail-cta__btn,
	.gl-rail-cta__link,
	.gl-callbar a,
	.gl-card__more,
	.gl-skip-link,
	.glh-arrowlink,
	.glh-textlink,
	.glh-docket__arrow,
	.gl-breadcrumbs,
	.gl-chip,
	.gl-chips__label,
	.gl-review__meta,
	.gl-header__phone,
	.gl-footer a,
	.gl-footer__heading,
	.gl-form__req,
	.glh-btn__label,
	.glh-quotes__meta,
	.glh-terms__label,
	.glh-ledger__label,
	.glh-portrait__role,
	.glh-dateline,
	.glh-hub__label,
	.glh-tiles__no
) {
	font-family: var( --wp--preset--font-family--display );
}

/*
 * Buttons carry the reference's button treatment: the full weight, uppercase,
 * and the 1px of tracking that stops caps at this size from setting solid.
 */
:is(
	.wp-element-button,
	.wp-block-button__link,
	.gl-btn,
	.glh-btn,
	.gl-rail-cta__btn,
	.gl-callbar a,
	.gl-form__submit,
	input[type="submit"]
) {
	font-weight: 800;
	letter-spacing: 0.0625em;
	text-transform: uppercase;
}

/* A form is read, not scanned, so its controls keep sentence case. */
:is( input, select, textarea ) {
	font-size: 0.875rem;
	letter-spacing: 0.03em;
}

.gl-serif {
	font-family: var( --wp--preset--font-family--body );
	font-weight: 400;
}

.gl-pull-quote {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--body );
	font-size: clamp( 1.375rem, 1.1rem + 1.2vw, 1.75rem );
	font-style: italic;
	font-weight: 400;
	line-height: 1.4;
}

/*
 * A margin quote standing alone in a column, rather than one item among
 * several. Four lines of quote against six paragraphs of prose leaves the
 * bottom two-thirds of the column empty, which reads as a panel that failed to
 * load — the same thing the rail was given a conversion card to avoid. Sticky
 * is the cheapest honest answer: the quote travels with the argument it is
 * pulled from instead of scrolling out of the section at its first paragraph.
 *
 * `.wp-block-column` stretches to the row height by default, so the column is
 * tall enough for this to have somewhere to travel. Below the breakpoint the
 * columns stack and a sticky quote would pin itself over the prose, so it
 * stands down there.
 */
.gl-pull-quote--sticky {
	position: sticky;
	top: calc( var( --gl-header-h ) + 3rem );
}

@media ( max-width: 781px ) {
	.gl-pull-quote--sticky {
		position: static;
	}
}

.gl-rule-gold::after {
	background-color: var( --wp--preset--color--gold );
	content: "";
	display: block;
	height: 3px;
	margin-top: 1.25rem;
	width: 3.5rem;
}

/*
 * Constrained layout centres every child narrower than the container, using
 * `margin-inline: auto !important`. Measure-limited prose and headline
 * max-widths are meant to hang off the left edge, so anything carrying its own
 * max-width opts back out — which takes !important to win.
 */
.is-layout-constrained > [style*="max-width"],
.wp-block-cover__inner-container > [style*="max-width"],
.wp-block-column > [style*="max-width"],
.is-layout-constrained > .gl-measure,
.gl-measure {
	margin-left: 0 !important;
	margin-right: auto !important;
}

/*
 * The prose measure.
 *
 * `ch` is the width of a "0", and in both of these faces the average letter is
 * a good deal narrower than that, so a `68ch` column does not hold 68
 * characters — it held about 86, which is past the top of the comfortable range
 * whatever you take the range to be. It went unnoticed while the band was
 * 1120px and the columns inside it were doing the limiting; widening the band to
 * the frame made this the constraint that actually bites, and the intro came out
 * at 86 characters a line.
 *
 * 56ch measures at about 70. The unit stays `ch` rather than becoming a pixel
 * value so the column still tracks the font size.
 */
.gl-measure {
	max-width: 56ch;
}

/*
 * The reading column on long-form pages. One centred wrapper rather than a
 * constrained layout, so every child shares the same left edge — which is what
 * the sidebar rail on practice pages lines up against.
 *
 * It is the frame, not an inset column inside it. This used to be 1120px against
 * the frame's 1400, on the argument that both were centred so the inset was
 * symmetric and therefore not a misalignment. That is true of the geometry and
 * false of what you see: the H1 started at 200 and the first paragraph of the
 * page started at 340, and once a window is wide enough to hold both edges in
 * view at once the eye reads the 140px step as something broken. The earlier
 * attempt to fix it moved the column's left edge to the frame and left the slack
 * on the right, which is why it was reverted — that trades a symmetric inset for
 * a lopsided one. Making the two the same number is the fix that has neither.
 *
 * Line length is not what this controls, and that is why widening it is safe:
 * `.gl-measure` caps prose at 68ch, the ledgers cap theirs at 62ch, and the rail
 * sections are columns. What the extra 280px widens is the rules, the grids and
 * the ledgers — the things that are supposed to span.
 */
.gl-band {
	margin-inline: auto !important;
	max-width: var( --gl-frame ) !important;
	width: 100%;
}

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

.gl-card {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.05 );
}

/*
 * The card is a flex item inside the stretched <li> wrapper, so it needs to be
 * told to fill it. Without `flex: 1` the anchor shrink-wraps its longest line
 * and the grid columns come out ragged — every link grid on the site did this.
 */
.gl-card--link {
	/*
	 * `width: 100%` below plus 1.5rem of padding and the 1px border from
	 * .gl-card overflows its grid track by exactly 50px without this. There is
	 * no global border-box reset in this stylesheet, and adding one now would
	 * shift components that were built around its absence — so the box is set
	 * on the component that needs it. Showed up on templates/404.html, where
	 * the cards are grid items directly rather than inside the usual <li>.
	 */
	box-sizing: border-box;
	display: flex;
	flex: 1;
	flex-direction: column;
	gap: 0;
	justify-content: flex-start;
	padding: 1.5rem;
	text-decoration: none;
	transition: border-color var( --gl-ease ), box-shadow var( --gl-ease ), transform var( --gl-ease );
	width: 100%;
}

.gl-card--link:hover,
.gl-card--link:focus-visible {
	border-color: var( --wp--preset--color--gold );
	box-shadow: 0 8px 24px rgba( 15, 42, 68, 0.1 );
	transform: translateY( -2px );
}

.gl-card--link .gl-card__title {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.25rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	line-height: 1.15;
	margin: 0;
}

.gl-card--link .gl-card__more {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.5;
	margin: 0.625rem 0 0;
	transition: color var( --gl-ease );
}

.gl-card--link:hover .gl-card__more,
.gl-card--link:focus-visible .gl-card__more {
	color: var( --wp--preset--color--gold-dark );
}

/* Cards on the navy ground */
.gl-card--dark {
	background: rgba( 255, 255, 255, 0.04 );
	border: 1px solid rgba( 255, 255, 255, 0.12 );
	border-radius: var( --gl-radius );
	box-shadow: none;
}

.gl-card--dark :is( h2, h3, h4 ) {
	color: #fff;
}

/* --------------------------------------------------------------------------
   Grids
   -------------------------------------------------------------------------- */

.gl-grid {
	align-items: stretch;
	display: grid;
	gap: 1rem;
	list-style: none;
	margin-inline: 0;
	padding: 0;
}

.gl-grid > * {
	margin: 0;
}

/* Link cards live inside a bare <li>; making that wrapper a flex box lets the
   anchor fill the stretched row without a percentage height. */
.gl-grid > li:not( [class] ) {
	display: flex;
}

/*
 * Explicit column counts rather than auto-fit: these grids appear both at the
 * full 1400px band width and inside a ~790px column, and auto-fit gives five
 * columns in one place and two in the other for the same class.
 */
.gl-grid--2 {
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
}

.gl-grid--3 {
	gap: 1.5rem;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
}

.gl-grid--4 {
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
}

.gl-grid--5 {
	grid-template-columns: repeat( 5, minmax( 0, 1fr ) );
}

@media ( max-width: 1100px ) {
	.gl-grid--4,
	.gl-grid--5 {
		grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	}
}

@media ( max-width: 860px ) {
	.gl-grid--3,
	.gl-grid--4,
	.gl-grid--5 {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}
}

@media ( max-width: 600px ) {
	.gl-grid--2,
	.gl-grid--3,
	.gl-grid--4,
	.gl-grid--5 {
		grid-template-columns: 1fr;
	}
}

/* --------------------------------------------------------------------------
   Article rail — jump list + conversion card beside long practice pages
   -------------------------------------------------------------------------- */

/*
 * The rail is a fixed object, not a proportion. Its column is 42% of the band,
 * which was 470px and is now 588 — and a jump list and a conversion card do not
 * get better at 588, they just get loose: the card's heading starts wrapping
 * late, its button runs half a foot wide, and the whole thing starts competing
 * with the prose it is meant to sit beside. Capped and pushed to the outer edge
 * of its column, so it lines up with the right edge of the frame and the extra
 * width falls into the gutter between the two columns, where it reads as air.
 */
.gl-rail {
	display: grid;
	gap: 1rem;
	margin-left: auto;
	max-width: 26rem;
	position: sticky;
	top: calc( var( --gl-header-h ) + 1.5rem );
	width: 100%;
}

/* Stacked, the rail is the full width of the page rather than an object beside
   the prose, so the cap and the push to the outer edge both come off — kept, they
   would inset it about 44px from the left margin everything else lines up on. */
@media ( max-width: 781px ) {
	.gl-rail {
		margin-left: 0;
		max-width: none;
		position: static;
	}
}

.gl-jump {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	padding: 1.5rem;
}

.gl-jump ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

.gl-jump li + li {
	border-top: 1px solid var( --wp--preset--color--rule );
}

.gl-jump a {
	color: var( --wp--preset--color--ink );
	display: block;
	font-size: 0.9375rem;
	font-weight: 500;
	padding: 0.625rem 0;
	text-decoration: none;
}

.gl-jump a:hover {
	color: var( --wp--preset--color--gold-dark );
	text-decoration: underline;
}

.gl-rail-cta {
	background: var( --wp--preset--color--ink );
	border-radius: var( --gl-radius );
	color: var( --wp--preset--color--ink-muted );
	padding: 1.75rem;
}

.gl-rail-cta__head {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.375rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	line-height: 1.2;
	margin: 0.75rem 0 0;
}

.gl-rail-cta__body {
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.75rem 0 0;
}

.gl-rail-cta__btn {
	align-items: center;
	background: var( --wp--preset--color--gold );
	border-radius: 6px;
	color: var( --wp--preset--color--ink-soft );
	display: flex;
	font-weight: 600;
	justify-content: center;
	margin-top: 1.25rem;
	min-height: 3rem;
	text-decoration: none;
	transition: background-color var( --gl-ease );
}

.gl-rail-cta__btn:hover {
	background: var( --wp--preset--color--gold-dark );
	color: #fff;
}

.gl-rail-cta__link {
	color: var( --wp--preset--color--gold );
	display: block;
	font-size: 0.9375rem;
	font-weight: 600;
	margin-top: 1rem;
	text-decoration: none;
}

.gl-rail-cta__link:hover {
	text-decoration: underline;
}

/* --------------------------------------------------------------------------
   Numbered procedure — the ordered counterpart to the docket

   Used by /injured-what-to-do/, whose content is a sequence: eight things to
   do, in order, in the week after a crash. It was rendering as eight
   full-width alternating bands, one H2 and one paragraph each, which makes
   eight equal claims on the page, says nothing about the order, and runs to
   six screens. A ruled ledger says it in one.

   The number is a column rather than a marker so that the second and third
   paragraphs of a step hang under the text and not under the figure.
   -------------------------------------------------------------------------- */

/*
 * The ledger is capped rather than run to the full 1120px band. The steps are
 * one paragraph each, so at band width the hairlines would run half a screen
 * past where the text stops and the empty right half would read as a column
 * that failed to load rather than as margin.
 */
/*
 * The top margin is set here rather than left to the group's blockGap. The
 * `margin` shorthand this rule needs for the inline axis also zeroes
 * margin-block-start, and it out-specifies the `:where()`-wrapped flow-layout
 * gap, so the first step was butting straight into the paragraph above it.
 */
.gl-steps {
	list-style: none;
	margin: clamp( 2rem, 3.5vw, 3rem ) 0 0;
	max-width: 54rem;
	padding: 0;
}

.gl-steps > li {
	border-top: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 0 clamp( 1.25rem, 3vw, 2.5rem );
	grid-template-columns: auto minmax( 0, 1fr );
	padding-block: clamp( 1.5rem, 3vw, 2.25rem );
}

.gl-steps > li:first-child {
	border-top: 0;
	padding-top: 0;
}

.gl-steps > li:last-child {
	padding-bottom: 0;
}

/*
 * Tabular figures and a fixed width, so 01 through 08 sit on one axis and the
 * headings all start at the same place.
 */
.gl-steps__no {
	color: var( --wp--preset--color--gold-dark );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 1.5rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	line-height: 1.15;
	width: 2.5ch;
}

.gl-steps__body h3 {
	font-size: var( --wp--preset--font-size--subhead );
	line-height: 1.25;
	margin: 0;
}

.gl-steps__body p {
	color: var( --wp--preset--color--slate );
	margin: 0.75rem 0 0;
	max-width: 62ch;
}

/* Below the phone breakpoint the number moves above the heading rather than
   squeezing the measure to about forty characters. */
@media ( max-width: 560px ) {
	.gl-steps > li {
		grid-template-columns: minmax( 0, 1fr );
		gap: 0.5rem;
	}

	.gl-steps__no {
		font-size: 1.25rem;
	}
}

/*
 * The wide ledger — a sequence set on the same axis as `.gl-index`.
 *
 * The 54rem cap above is right for `/injured-what-to-do/`, where a step is a
 * heading and one short line and a band-width hairline would run half a screen
 * past the text. It is wrong on a practice page that alternates the two
 * ledgers: `/dallas-car-accident-attorneys/` runs index, steps, index, steps
 * down a single 1120px band, so the rules changed width four times and the two
 * step sections read as a column that had failed to reach the right edge —
 * which is the same fault the card grid was replaced to fix.
 *
 * So the modifier gives `steps` the index's proportions: the numeral and the
 * heading together in the left column, the prose in the right, hairlines across
 * the band. All four sections then share one left edge and one measure, and the
 * numeral is what says this set is ordered and the other is not. The prose
 * keeps its own 62ch limit, exactly as `.gl-index__body` does — a band-width
 * rule over a measure-width paragraph is the page's established rhythm.
 *
 * It is a modifier rather than a change to the default because the page it
 * would otherwise turn over is a finished one.
 */
.gl-steps--wide {
	max-width: none;
}

/*
 * The row pays for the figure above out of its own padding. Seven steps of one
 * or two lines each were running 148px a row on 44px of padding top and bottom
 * — a sequence you scroll rather than scan. The numeral adds about 50px of ink
 * to the left cell, so the padding comes down to keep the row where it was.
 */
.gl-steps--wide > li {
	align-items: start;
	gap: 0.75rem clamp( 2rem, 5vw, 4rem );
	grid-template-columns: minmax( 0, 0.85fr ) minmax( 0, 1.15fr );
	padding-block: clamp( 1.375rem, 2.4vw, 1.875rem );
	scroll-margin-top: calc( var( --gl-header-h ) + 1.5rem );
}

/* Sticky for the reason the index name and the roster name are: the step stays
   beside its own prose while a long entry scrolls past. */
/* The figure hangs beside the title on its baseline rather than stacking over
   it, so the step reads as one line — and so the prose in the right column,
   which top-aligns to the row, lands level with the title it belongs to
   instead of level with the numeral above it. */
.gl-steps--wide .gl-steps__name {
	align-items: baseline;
	column-gap: clamp( 0.75rem, 1.2vw, 1.25rem );
	display: grid;
	grid-template-columns: auto minmax( 0, 1fr );
	position: sticky;
	top: calc( var( --gl-header-h ) + 1.5rem );
}

/*
 * Out of the numeral column and above the heading — and set as a figure rather
 * than a label.
 *
 * At eyebrow scale it was solving the wrong problem. The reasoning was that a
 * 1.5rem numeral competes with the title beside it, which is true of the narrow
 * ledger where the two share a line; stacked above the title in a column of its
 * own, nothing is beside it to compete with. What is actually beside it is 460px
 * of empty band: these steps are imperatives — "Call 911", "Do not admit fault"
 * — so the name fills a fifth of a column sized for the index's sentence-long
 * topics, and every row of the sequence had a hole in it.
 *
 * A figure at display size fills that column, and it is the right thing to fill
 * it with: this is the one ledger on the page that is ordered, the numerals are
 * the order, and at 40px they can be scanned down the band in the way the
 * recoveries figures are. Gold, tabular, on the same optical size as the
 * amounts.
 */
.gl-steps--wide .gl-steps__no {
	color: var( --wp--preset--color--gold-dark );
	display: block;
	font-size: clamp( 1.75rem, 1.2rem + 1.4vw, 2.5rem );
	letter-spacing: 0.02em;
	line-height: 1;
	margin-bottom: 0;
	width: auto;
}

.gl-steps--wide .gl-steps__name h3 {
	font-size: var( --wp--preset--font-size--title );
	line-height: 1.15;
	margin: 0;
}

.gl-steps--wide .gl-steps__body > * {
	margin: 0;
	max-width: 66ch;
}

.gl-steps--wide .gl-steps__body > * + * {
	margin-top: 0.875rem;
}

/* Matches `.gl-index`'s own collapse point, so the two ledgers go to one column
   together rather than 200px apart. A sticky element in a single-column row
   would pin the step number to the top of the viewport while its own prose
   scrolled underneath it. */
@media ( max-width: 781px ) {
	.gl-steps--wide > li {
		grid-template-columns: minmax( 0, 1fr );
	}

	.gl-steps--wide .gl-steps__name {
		position: static;
	}
}

/* --------------------------------------------------------------------------
   Index — the unordered counterpart to the ledger above

   Practice pages carry a shape the `.gl-` layer had no component for: a set of
   named topics, each one a heading and two or three paragraphs. Every one of
   them was converted as a three-up `.gl-card` grid, which is the wrong
   instrument for four entries of wildly unequal length — the row is as tall as
   its longest card, a fourth entry sits alone on a second row, and the empty
   half of a short card reads as content that failed to load rather than as
   margin.

   It began as `.gl-steps` with the numeral column replaced by the entry's own
   name — a 0.85/1.15 split, name on the left, prose on the right. That is the
   wrong composition for this content and was rebuilt:

   **A three-word label was being given 568px of the frame.** "Spine and
   pelvis" is one line of type in a column as wide as the prose beside it, so
   every entry spent about 500 × 100px on nothing, the eye had to cross 450px
   of empty paper to get from a heading to the sentence it introduces, and the
   hole was *interior* — between two content columns, which is the one place
   white space cannot read as margin. Sticky positioning and hoisting the note
   into the gap were both attempts to give that column something to do; the
   honest answer is that it should not have been a column.

   **And the band is 1400px wide, which is more than one measure.** A single
   stack of 66ch entries leaves half the frame empty for the length of the
   section, which is what the whole page was rebuilt to stop doing.

   So the entries flow in **two columns**, each holding one comfortable
   measure, name set over its own prose and the note under that. Five to eight
   named topics land on one screen instead of 1,400px of scroll, which is what
   the component is for: the reader is looking for the one entry that is about
   them, and cannot scan what is not on the screen.

   Multi-column rather than a grid, because a grid would align rows and these
   entries are of wildly unequal length — the row-as-tall-as-its-longest-card
   fault that this component was written to escape in the first place. Columns
   flow; nothing waits for a neighbour.

   Unordered still, because nothing about hit-and-run claims comes after drunk
   driving wrecks.
   -------------------------------------------------------------------------- */

.gl-index {
	list-style: none;
	margin: clamp( 2rem, 3.5vw, 3rem ) 0 0;
	padding: 0;
}

@media ( min-width: 1080px ) {
	.gl-index {
		column-gap: clamp( 2.5rem, 4.5vw, 4rem );

		/* The hairline down the middle of a printed brief. It is what tells the
		   reader these are two columns of one list rather than two lists. */
		column-rule: 1px solid var( --wp--preset--color--rule );
		columns: 2;
	}
}

.gl-index > li {
	border-top: 1px solid var( --wp--preset--color--rule );

	/* An entry split across the column break would put a heading at the foot of
	   one column and its own prose at the head of the next. */
	break-inside: avoid;
	padding-block: clamp( 1.5rem, 2.5vw, 2rem );
	scroll-margin-top: calc( var( --gl-header-h ) + 1.5rem );
}

/*
 * Every entry keeps its rule, including the first — in two columns the first
 * entry of the second column has one whatever `:first-child` says, so removing
 * it from the first would leave the two columns starting differently. Level
 * across the top, they read as the head of the ledger.
 */
.gl-index > li:last-child {
	padding-bottom: 0;
}

.gl-index__name h3 {
	font-size: var( --wp--preset--font-size--subhead );
	line-height: 1.2;
	margin: 0;
	text-wrap: balance;
}

/*
 * Links inside a ledger heading, in both ledgers.
 *
 * The heading is the entry, so a link inside it keeps the heading's colour and
 * earns gold on hover. A whole H3 arriving in underlined link gold — which is
 * what the converted practice-page cards did — reads as a heading that broke
 * rather than as a heading you can follow.
 *
 * It still has to say it is a link, though, and a serif heading has no other
 * tell. The gold hairline underneath is the one `.glh-textlink` carries on the
 * home page: faint until you are on it, then solid.
 *
 * It is a real underline rather than a `border-bottom`, for the reason the hero
 * title already documents. A border paints at the bottom of each line box, and
 * these headings wrap — "Trucking & commercial / vehicle accidents", "Drunk &
 * distracted / driving wrecks", "Texas is a “modified / comparative fault”
 * state" — so the rule was being drawn straight through the descender of every
 * g, y and p on the page. `skip-ink` is the only thing that clears them:
 * `.glh-textlink` gets away with a border because it is an `inline-flex` box
 * with its own bottom padding and never wraps, and neither is true here.
 * The colour fades rather than the rule moving, since `text-decoration-color`
 * is animatable and geometry is not.
 */
.gl-index__name h3 a,
.gl-steps__name h3 a,
.gl-steps__body h3 a {
	color: inherit;
	text-decoration-color: var( --glh-gold-hair );
	text-decoration-line: underline;
	text-decoration-skip-ink: auto;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.16em;
	transition: color var( --gl-ease ), text-decoration-color var( --gl-ease );
}

.gl-index__name h3 a:hover,
.gl-index__name h3 a:focus-visible,
.gl-steps__name h3 a:hover,
.gl-steps__name h3 a:focus-visible,
.gl-steps__body h3 a:hover,
.gl-steps__body h3 a:focus-visible {
	color: var( --wp--preset--color--gold-dark );
	text-decoration-color: var( --wp--preset--color--gold );
}

.gl-index__body {
	margin-top: 0.625rem;
}

.gl-index__body > * {
	margin: 0;

	/* A 640px column at 17px is about 74 characters, which is past the top of
	   the comfortable range; the cap brings the long entries back inside it and
	   leaves the short ones alone. */
	max-width: 62ch;
}

.gl-index__body > * + * {
	margin-top: 0.875rem;
}

/* The aside inside an entry — the worked example under the comparative-fault
   rule, the exceptions under the filing deadline. */
.gl-index__note {
	border-left: 2px solid var( --wp--preset--color--gold );
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	padding-left: 1rem;
}

/*
 * The note stays in the flow, under the prose it qualifies.
 *
 * It spent two revisions being hoisted into the name column, which was the
 * only way to give that column something to carry. There is no name column
 * now, so there is nothing to fill and nothing to hoist: the note reads where
 * it was written, after the paragraph it is an aside to, which is also the
 * order `blocks.index()` emits it in and the order a screen reader gets.
 */
.gl-index > li > .gl-index__note {
	margin-bottom: 0;
	margin-top: 0.875rem;

	/* The note is a sibling of the body rather than a child of it, so the
	   body's 62ch does not reach it. 70ch of 15px lands on roughly the same
	   right edge as 62ch of 17px, which is what stops the aside running wider
	   than the paragraph it is an aside to. */
	max-width: 70ch;
}

/*
 * The same aside inside a step ledger.
 *
 * `blocks.steps()` understands the ("note", …) block now, because the two
 * ledgers alternate down the trucking pages and a block that means an aside in
 * one of them cannot mean literal text in the other. It emits the same class:
 * the rule above that draws the gold hairline is unscoped, so the treatment
 * comes for free and only the position needs saying.
 *
 * Here the note is a child of `.gl-steps__body` rather than a sibling of it,
 * so it inherits the body's own measure and does not need the 70ch the index
 * version pays for. It only needs the gap, and it needs the last-child case
 * zeroed so an entry ending on an aside does not sit deeper than one ending on
 * a paragraph — which is what draws the hairline between steps crooked.
 */
.gl-steps__body > .gl-index__note {
	margin-top: 0.875rem;
}

.gl-steps__body > .gl-index__note:last-child {
	margin-bottom: 0;
}

/* --------------------------------------------------------------------------
   Team — the roster on /about/our-team/

   This replaces `.gl-roster`, a two-column ruled list, and the reason is the
   one `.gl-index` already carries a few hundred lines up: a name in a column
   of its own is a column of mostly nothing. The roster gave each of ten
   members 0.72fr of the 1400px frame — 568px — to hold a name, a role and a
   208px portrait, and set a three-to-six line biography in the 1.28fr column
   beside it, capped at 62ch. Measured on the frame that is about 440px of
   width and 250px of height empty in every row, and 4,600px of page for ten
   people, more than half of it paper.

   Four across at the frame gives a 320px card. That is a portrait worth
   printing rather than a thumbnail, the ten land in three rows, and the band
   comes in at about a third of the height.

   The grid is grouped by the stage of a claim — see `roster_grid` in
   blocks.py for why. Each group is a `<section>` with its own head, so the
   stage label is a real heading in the outline and not a styled paragraph.

   **The entries are bounded cards, and that is the current revision.** The
   grid version of this component drew nothing at all: a portrait, a name and
   a paragraph, set loose on the band with a gap between them. Biographies
   here run from three lines to eight, so a row of four ended at four
   different heights and the shortest of them left 300px of white hanging
   under it with no edge anywhere to say the entry had finished. Read down the
   band it did not scan as ten people; it scanned as four ragged columns of
   prose that happened to have faces on top.

   A card fixes it by having a bottom. The cell stretches to the tallest entry
   in its row, the surface fills to the card's own edge, and the difference
   between a three-line biography and an eight-line one becomes air inside a
   drawn box rather than a hole in the page. Bone on the band's white, one
   hairline, the portrait bled to the top edge so the face is the card's own
   material and not a picture placed on it.
   -------------------------------------------------------------------------- */

.gl-team {
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
}

.gl-team__group + .gl-team__group {
	margin-top: clamp( 3rem, 5vw, 4.5rem );
}

/*
 * The group head is the stage label with its description hanging off the
 * right, on the hairline that opens the group. Two columns rather than a
 * stack because the label is two words and a stack would put 40px of air
 * between it and a sentence that belongs to it.
 */
.gl-team__grouphead {
	align-items: baseline;
	border-top: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 0.5rem clamp( 2rem, 5vw, 4rem );
	grid-template-columns: minmax( 0, 0.34fr ) minmax( 0, 0.66fr );
	padding-top: clamp( 1rem, 2vw, 1.5rem );
	position: relative;
}

/* The stage label carries the gold at the head of its own group. The band
   above it is a rule the width of the frame and reads as a divider; this is
   2.25rem of gold sitting on the label, and it is what makes the three
   groups read as three sections rather than as one list ruled in thirds. */
.gl-team__grouphead::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 2px;
	left: 0;
	position: absolute;
	top: -1px;
	width: 2.25rem;
}

.gl-team__grouptitle {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.375rem, 2vw, 1.75rem );
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1.1;
	margin: 0;
}

.gl-team__groupnote {
	/* slate-muted, not ink-muted. ink-muted is #cfd9e4 — the pale blue-grey for
	   text on the navy, and it lands at about 1.4:1 on this band's white. */
	color: var( --wp--preset--color--slate-muted );
	margin: 0;
	max-width: 62ch;
}

/*
 * Cards have edges now, so the gutter between them no longer has to do the
 * separating and can close up: 2.75rem of white between two drawn objects is
 * a gap, not a margin. The row gap stays the larger of the two because a card
 * is taller than it is wide and the rows need to be told apart.
 */
.gl-team__grid {
	display: grid;
	gap: clamp( 1.25rem, 2vw, 1.75rem ) clamp( 1rem, 1.5vw, 1.375rem );
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
	list-style: none;
	margin: clamp( 1.75rem, 3vw, 2.5rem ) 0 0;
	padding: 0;
}

/*
 * The card. `stretch` is the default on a grid row and it is the whole point
 * of this component: every card in a row is the height of the tallest, the
 * body flexes to fill whatever is left, and a short biography ends on bone
 * inside the card instead of on white outside it.
 */
.gl-team__card {
	background: var( --wp--preset--color--bone );
	border-radius: var( --gl-radius );
	box-shadow: inset 0 0 0 1px var( --wp--preset--color--rule );
	display: flex;
	flex-direction: column;
	margin: 0;
	overflow: hidden;
	transition:
		box-shadow 0.35s ease,
		transform 0.35s cubic-bezier( 0.2, 0.7, 0.2, 1 );
	/* Anchored from the site map and from search results, so the sticky header
	   must not land on top of the portrait. */
	scroll-margin-top: calc( var( --gl-header-h ) + 1.5rem );
}

/*
 * Lifting the card is the only hover on the roster that has to carry both
 * states at once — that the entry is a single object, and that the object is
 * anchorable. A tight shadow cast close under the edge does it. Nothing here
 * blurs outward from the card as a halo; the offset is four times the blur's
 * spread and the colour is the firm's navy at a fifth.
 */
@media ( hover: hover ) {
	.gl-team__card:hover {
		box-shadow:
			inset 0 0 0 1px var( --wp--preset--color--rule ),
			0 14px 26px -18px rgba( 15, 42, 68, 0.55 );
		transform: translateY( -3px );
	}
}

/*
 * The portrait. 4:5, the same box the founder's card and the About page's
 * portrait use, and the same faint desaturation — the firm shot its team over
 * two sessions in different rooms, and a hair of grey off both pulls the two
 * sets onto one page. The sources are already cropped to 4:5 around the face
 * (tools/crop_portraits.py), so `object-fit` here has nothing left to trim and
 * is only a guard against a replacement image of another shape.
 *
 * It is bled to the card's edge rather than set inside the padding: a
 * photograph inset on a bone card reads as a picture pinned to a card, and
 * eleven of them read as a noticeboard. Flush to three edges it is the card's
 * own top, which is what a portrait on a roster should be.
 */
.gl-team__shot {
	aspect-ratio: 4 / 5;
	background-color: var( --wp--preset--color--ink );
	/* The plate below pads itself by 1rem, and on a content-box that padding
	   lands outside the 4:5 ratio — a plate 32px taller than the photograph
	   in the cell beside it, which drops that card's name a line below its
	   row. It only shows where one group holds both, which is why it went
	   unseen while every plate on the page sat in an all-plate row. */
	box-sizing: border-box;
	overflow: hidden;
	position: relative;
	width: 100%;
}

.gl-team__shot img {
	display: block;
	filter: grayscale( 0.12 ) contrast( 1.03 );
	height: 100%;
	object-fit: cover;
	object-position: center;
	transition: filter 0.4s ease, transform 0.6s cubic-bezier( 0.2, 0.7, 0.2, 1 );
	width: 100%;
}

/*
 * A scrim over the foot of the photograph, and it is doing a job the crops
 * cannot. These eleven portraits were shot against whatever was behind the
 * person: two are cut out on near-white, three are against a bright window,
 * the rest against a dark room. Laid out four to a row that difference is the
 * loudest thing in the band — the row reads as light, light, dark, light
 * before it reads as four people. A wash of the firm's navy over the bottom
 * two fifths, heaviest where the photograph meets the name, pulls all of them
 * onto one floor and gives the keyline under it something to sit on.
 */
.gl-team__shot:not( .gl-team__shot--plate )::after {
	background: linear-gradient(
		to top,
		rgba( 15, 42, 68, 0.38 ) 0%,
		rgba( 15, 42, 68, 0.14 ) 22%,
		transparent 46%
	);
	bottom: 0;
	content: "";
	left: 0;
	pointer-events: none;
	position: absolute;
	right: 0;
	top: 0;
}

.gl-team__card:hover .gl-team__shot img {
	filter: grayscale( 0 ) contrast( 1.03 );
	transform: scale( 1.04 );
}

/*
 * Two of the eleven have no photograph. A grid where nine cells carry a face
 * and two carry nothing reads as a page that failed to load, so those two get
 * a plate cut to the same 4:5 box.
 *
 * It carries the first name, not a monogram. The monogram version collided —
 * Alicia Garcia and Aaliyah Gomez are both "AG" and sat in adjacent rows,
 * which reads as one tile printed twice. It is `aria-hidden`; the name follows
 * immediately in the <h4> under it.
 *
 * **The plate is the firm's navy, and that is the third revision of it.** It
 * was navy, then bone, and it is navy again for a reason that changed
 * underneath it. Bone was the right answer when all four plates fell in one
 * group and the roster opened on an unbroken pale block the width of the
 * frame. There are two plates now, in different rows, and the card they sit
 * on is itself bone — so a bone plate on a bone card is a card with its top
 * third missing, which is the failure the plate exists to prevent. On the
 * navy, with the masthead's hairline texture and the name in the display
 * serif reversed out of it, the tile has the same weight as the photographs
 * beside it and reads as a nameplate that was set on purpose.
 */
.gl-team__shot--plate {
	align-items: center;
	background-color: var( --wp--preset--color--ink );
	background-image:
		repeating-linear-gradient( 90deg, rgba( 255, 255, 255, 0.045 ) 0 1px, transparent 1px 34px ),
		radial-gradient( 120% 90% at 50% 15%, rgba( 53, 97, 142, 0.55 ) 0%, transparent 65% );
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 1rem;
}

/* The gold keyline over the name is what stops the plate reading as an empty
   box: it gives the tile a mark of its own at the size a portrait would have
   had a face. */
.gl-team__shot--plate::before {
	background: var( --wp--preset--color--gold );
	content: "";
	display: block;
	height: 2px;
	margin: 0 auto 1rem;
	width: 2.25rem;
}

.gl-team__shot--plate span {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.5rem, 2.4vw, 2rem );
	font-weight: 800;
	hyphens: none;
	letter-spacing: 0;
	line-height: 1.1;
	overflow-wrap: anywhere;
	text-align: center;
}

/*
 * Everything set in type, in one padded box under the portrait.
 *
 * The keyline across its top is on every card, not only the attorney's, and
 * that is the fix for a misalignment the gold rule used to cause on its own.
 * It was `border-top` plus `padding-top` applied to one card in a row of
 * four, so Jamie Armstrong's name sat 14px below Akhil Manda's, Kristen
 * Jennings's and Mia Osburne's — a row of four names on four different lines,
 * which is the first thing the eye finds in that group and the last thing it
 * should be finding. Every card reserves the rule; the attorney's is gold and
 * the rest are the band's own hairline, so the distinction is a colour and
 * costs no height.
 */
.gl-team__body {
	border-top: 2px solid var( --wp--preset--color--rule );
	display: flex;
	flex: 1;
	flex-direction: column;
	padding: clamp( 1rem, 1.4vw, 1.25rem ) clamp( 1rem, 1.4vw, 1.25rem ) clamp( 1.25rem, 1.8vw, 1.5rem );
}

/*
 * Which of the eleven people on this page are lawyers is the first thing a
 * caller wants to know, and it is the one distinction a job title set at 11px
 * does not make loudly enough to be seen from the top of the band.
 */
.gl-team__card--attorney .gl-team__body {
	border-top-color: var( --wp--preset--color--gold );
}

.gl-team__name {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.25rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	line-height: 1.2;
	margin: 0;
}

.gl-team__role {
	color: var( --wp--preset--color--gold-dark );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.14em;
	line-height: 1.5;
	margin: 0.4375rem 0 0;
	text-transform: uppercase;
}

/*
 * The biography grows into whatever the row's tallest card leaves over, which
 * is what makes a three-line entry and an eight-line one the same object. The
 * hairline above it separates the two registers inside the card — the name
 * and role are labels, the biography is prose — at no cost in height.
 */
.gl-team__bio {
	border-top: 1px solid var( --wp--preset--color--rule );
	flex: 1;
	margin-top: 0.875rem;
	padding-top: 0.875rem;
}

.gl-team__bio p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.62;
	margin: 0;
}

.gl-team__bio p + p {
	margin-top: 0.75rem;
}

/*
 * A group whose count does not divide by four ends on a card alone in the
 * first column with three empty ones beside it. At the frame that is a 400px
 * portrait against 1,000px of white, and it reads as a row that failed to
 * load rather than as a group that happens to hold five people.
 *
 * The stranded card takes the whole row as a card laid on its side: portrait
 * at 15rem on the left, the name in a column of its own, the biography in the
 * third. **The third column is the part that is new.** The previous version
 * of this rule ran the same two-column narrow-viewport layout across the
 * frame and capped the prose at 62ch, which spent 450px of a 1,400px row on
 * nothing — the hole it was written to close, moved to the right-hand end of
 * the same row. Splitting the label off the prose fills the width with the
 * card's own content and echoes the group head directly above it, which is
 * set to the same two measures.
 *
 * Only the single stranded card is worth this. Two or three across a row read
 * as a short row, which is ordinary; one reads as a mistake.
 */
@media ( min-width: 1201px ) {
	.gl-team__card:nth-child( 4n + 1 ):last-child {
		display: grid;
		grid-column: 1 / -1;
		grid-template-columns: 15rem minmax( 0, 1fr );
	}

	/* Flush to the card's left edge and full height rather than 4:5: the row
	   is as tall as its prose, and a portrait held to its ratio inside it
	   would leave bone above or below the only picture in the row. */
	.gl-team__card:nth-child( 4n + 1 ):last-child .gl-team__shot {
		aspect-ratio: auto;
		height: 100%;
		min-height: 13rem;
	}

	.gl-team__card:nth-child( 4n + 1 ):last-child .gl-team__body {
		border-left: 2px solid var( --wp--preset--color--rule );
		border-top: 0;
		align-content: center;
		column-gap: clamp( 2rem, 4vw, 3.5rem );
		display: grid;
		grid-template-columns: minmax( 0, 0.3fr ) minmax( 0, 0.7fr );
		padding: clamp( 1.5rem, 2.2vw, 2rem );
	}

	.gl-team__card--attorney:nth-child( 4n + 1 ):last-child .gl-team__body {
		border-left-color: var( --wp--preset--color--gold );
	}

	/* Beside the name rather than under it, so the rule that separates label
	   from prose is the vertical gutter between the two columns. */
	.gl-team__card:nth-child( 4n + 1 ):last-child .gl-team__bio {
		border-top: 0;
		margin-top: 0;
		max-width: 68ch;
		padding-top: 0;
	}

	/* The plate's name is set to fill a 320px tile; in a 15rem column at the
	   height of three lines of prose it wants to be smaller. */
	.gl-team__card:nth-child( 4n + 1 ):last-child .gl-team__shot--plate span {
		font-size: 1.375rem;
	}
}

/*
 * The trailing card in the last group. The records desk is one person, so a
 * four-column grid would end the band on most of a row of white, and the thing
 * that belongs in it is the one answer a roster cannot give in a biography:
 * that you do not have to know which of these names is yours in order to ring
 * up and ask.
 *
 * **It is on the navy, and it stretches.** It used to be a bone panel set to
 * the top of its row, which put a 250px card beside a 560px one and finished
 * the whole band on a 300px shelf of white — the last thing on the page. On
 * the firm's navy, filling its row, it closes the roster the way the fact
 * band opens it, and the phone number is the largest thing in the band, which
 * is the right thing for it to be on a page whose heading is a promise about
 * who answers the telephone.
 */
.gl-team__ask {
	background: var( --wp--preset--color--ink );
	background-image:
		repeating-linear-gradient( 90deg, rgba( 255, 255, 255, 0.04 ) 0 1px, transparent 1px 42px ),
		radial-gradient( 90% 120% at 88% 8%, rgba( 53, 97, 142, 0.5 ) 0%, transparent 62% );
	border-radius: var( --gl-radius );
	box-shadow: inset 0 0 0 1px rgba( 255, 255, 255, 0.08 );
	display: flex;
	flex-direction: column;
	grid-column: span 2;
	justify-content: center;
	margin: 0;
	padding: clamp( 1.75rem, 3vw, 2.75rem );
}

/*
 * The ask card is sized to finish the last group's row. That group used to be
 * two people, so a two-column card completed the four. It is one person now,
 * and the same card leaves a column of white at the foot of the whole band —
 * the last thing on the page and the most visible empty cell on it. Where the
 * group is a single member the card takes the three columns instead; its
 * content is a paragraph and a phone number rather than a biography, and it
 * reads no worse wide than narrow.
 *
 * Guarded to the four-column layout on purpose. Below 1200px the grid is two
 * columns and `span 3` would open an implicit third, which is the fault this
 * rule exists to remove.
 */
@media ( min-width: 1201px ) {
	.gl-team__grid:has( > .gl-team__ask:nth-child( 2 ) ) .gl-team__ask {
		grid-column: span 3;
	}

	/*
	 * Three columns wide is 1,040px, and the ask stacked in it set a 52ch
	 * paragraph and a phone number down the left and left the other half of
	 * the card empty — the same fault as the roster this component replaced,
	 * in the one card that closes it.
	 *
	 * The number moves into a column of its own, on a hairline, vertically
	 * centred against the sentence that sets it up. It is the largest thing
	 * in the band and it now sits where the eye lands crossing a card this
	 * wide, which on a page headed "who you will actually speak to" is the
	 * right place for the telephone number.
	 */
	.gl-team__grid:has( > .gl-team__ask:nth-child( 2 ) ) .gl-team__ask {
		align-content: center;
		column-gap: clamp( 2.5rem, 5vw, 4.5rem );
		display: grid;
		grid-template-columns: minmax( 0, 1fr ) minmax( 0, 0.85fr );
	}

	.gl-team__grid:has( > .gl-team__ask:nth-child( 2 ) ) .gl-team__ask .gl-eyebrow {
		grid-area: 1 / 1;
	}

	.gl-team__grid:has( > .gl-team__ask:nth-child( 2 ) ) .gl-team__ask p + p {
		grid-area: 2 / 1;
		max-width: none;
	}

	.gl-team__grid:has( > .gl-team__ask:nth-child( 2 ) ) .gl-team__asklink {
		align-self: center;
		border-left: 1px solid rgba( 255, 255, 255, 0.16 );
		grid-area: 1 / 2 / span 2;
		margin-top: 0;
		padding-left: clamp( 2.5rem, 5vw, 4.5rem );
	}
}

.gl-team__ask .gl-eyebrow {
	color: var( --wp--preset--color--gold );
}

.gl-team__ask p + p {
	color: var( --wp--preset--color--ink-muted );
	margin: 1rem 0 0;
	max-width: 52ch;
}

.gl-team__asklink {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.75rem, 3vw, 2.5rem );
	font-weight: 800;
	letter-spacing: 0.005em;
	margin-top: clamp( 1.5rem, 2.5vw, 2rem );
	text-decoration: none;
	text-underline-offset: 0.2em;
	width: fit-content;
}

.gl-team__asklink:hover,
.gl-team__asklink:focus-visible {
	color: var( --wp--preset--color--gold );
	text-decoration: underline;
}

/*
 * One reveal per card, on the scroll timeline the rest of the site already
 * uses. Each card enters the viewport in its own range, so a row of four
 * rises together and the three rows follow one another down the band without
 * a single hand-written delay. Progressively enhanced and inside the
 * no-preference query, the same as `.glh-reveal`.
 */
@supports ( animation-timeline: view() ) {
	@media ( prefers-reduced-motion: no-preference ) {
		.gl-team__card,
		.gl-team__ask {
			animation: glh-rise linear both;
			animation-range: entry 4% cover 16%;
			animation-timeline: view();
		}
	}
}

/*
 * Below the frame the grid goes to two columns, not three, and the card turns
 * on its side — portrait on the left, name and biography beside it.
 *
 * Three columns is the obvious step down and it is the wrong one, because
 * every group here is four people or five. Four into three leaves one card
 * alone on a second row with two thirds of it empty, which is the exact fault
 * this component was rebuilt to close. Two divides the group sizes better and
 * gives the sideways card a column wide enough to hold prose beside a face.
 *
 * The upright card does not survive two columns on its own: at a 1000px window
 * that is a 490px column, and a 4:5 portrait in it is 612px tall — a face and
 * a half per screen before a word of the biography. Laid on its side the
 * portrait is 11rem, the prose sits beside it, and the entry is about 240px
 * whatever the window is doing.
 *
 * The photograph keeps its 4:5 and its own radius here rather than bleeding
 * to the card's edge. Bled, it would have to stretch to the height of the
 * prose beside it, and a 4:5 source in a 176 × 380 box crops to a nose.
 */
@media ( max-width: 1200px ) {
	.gl-team__grid {
		gap: 1.5rem clamp( 1.25rem, 2.5vw, 1.75rem );
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}

	.gl-team__card {
		column-gap: 1.25rem;
		display: grid;
		grid-template-columns: 11rem minmax( 0, 1fr );
		padding: clamp( 1rem, 2vw, 1.375rem );
	}

	.gl-team__card:hover {
		transform: none;
	}

	.gl-team__shot {
		align-self: start;
		border-radius: calc( var( --gl-radius ) - 3px );
	}

	.gl-team__body {
		border-top: 0;
		padding: 0;
	}

	/* The gold has to go somewhere once the body loses its top rule, and
	   beside the name is where it reads: a bar the height of the block it
	   marks rather than a line over the top of it. */
	.gl-team__card--attorney {
		box-shadow:
			inset 0 0 0 1px var( --wp--preset--color--rule ),
			inset 3px 0 0 0 var( --wp--preset--color--gold );
	}

	.gl-team__shot--plate span {
		font-size: 1.25rem;
	}

	.gl-team__shot--plate::before {
		margin-bottom: 0.75rem;
		width: 1.75rem;
	}

	.gl-team__grouphead {
		grid-template-columns: minmax( 0, 1fr );
	}

	.gl-team__ask {
		grid-column: span 2;
	}
}

@media ( max-width: 860px ) {
	.gl-team__grid {
		grid-template-columns: minmax( 0, 1fr );
	}

	.gl-team__ask {
		grid-column: span 1;
	}
}

@media ( max-width: 560px ) {
	.gl-team__card {
		column-gap: 1rem;
		grid-template-columns: 7.5rem minmax( 0, 1fr );
	}

	.gl-team__shot--plate span {
		font-size: 1rem;
	}
}


/* --------------------------------------------------------------------------
   Founder credentials and profile chips

   Both live in the left column of the founder band. The chips replace a
   `gl-dash-list`, which draws its hairline the full width of its column: three
   rules 568px wide under "LinkedIn", "Texas Bar" and "YouTube", 500px of each
   one running on past the last letter, and five lines spent on three links.
   -------------------------------------------------------------------------- */

.gl-creds {
	border-top: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 0;
	margin: clamp( 1.75rem, 3vw, 2.25rem ) 0 0;
	max-width: 34rem;
}

.gl-cred {
	border-bottom: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 0.25rem 1.5rem;
	grid-template-columns: minmax( 0, 8.5rem ) minmax( 0, 1fr );
	padding: 0.8125rem 0;
}

.gl-cred dt {
	color: var( --wp--preset--color--gold-dark );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.14em;
	line-height: 1.7;
	text-transform: uppercase;
}

.gl-cred dd {
	color: var( --wp--preset--color--ink );
	margin: 0;
}

.gl-chips {
	align-items: center;
	display: flex;
	flex-wrap: wrap;
	gap: 0.625rem;
	margin-top: clamp( 1.5rem, 2.5vw, 2rem );
}

.gl-chips__label {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.14em;
	margin-right: 0.25rem;
	text-transform: uppercase;
}

.gl-chip {
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 999px;
	color: var( --wp--preset--color--ink );
	display: inline-block;
	font-size: 0.875rem;
	line-height: 1;
	padding: 0.5625rem 0.9375rem;
	text-decoration: none;
	transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.gl-chip:hover,
.gl-chip:focus-visible {
	background-color: var( --wp--preset--color--ink );
	border-color: var( --wp--preset--color--ink );
	color: #fff;
}

/* --------------------------------------------------------------------------
   Fact row — a ruled row of figures for a navy band

   Not `.gl-stat`, which is the home page's recoveries rail and is a column of
   money. This is horizontal, and it exists to give a page with two light bands
   in a row something between them other than a colour change that does not
   happen.
   -------------------------------------------------------------------------- */

.gl-facts__lead {
	color: var( --wp--preset--color--bone );
	font-family: var( --wp--preset--font-family--body );
	font-size: clamp( 1.125rem, 1.8vw, 1.4375rem );
	line-height: 1.45;
	margin: 0 0 clamp( 2rem, 3.5vw, 2.75rem );
	max-width: 44ch;
}

.gl-facts__list {
	display: grid;
	gap: 1.5rem clamp( 1.5rem, 3vw, 2.5rem );
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
	list-style: none;
	margin: 0;
	padding: 0;
}

.gl-facts__item {
	border-top: 1px solid rgba( 255, 255, 255, 0.18 );
	padding-top: 1rem;
}

.gl-facts__figure {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	font-size: clamp( 2rem, 3.6vw, 2.875rem );
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1;
}

.gl-facts__label {
	/* On the navy, so this one really is ink-muted. */
	color: var( --wp--preset--color--ink-muted );
	display: block;
	font-size: 0.9375rem;
	line-height: 1.5;
	margin-top: 0.625rem;
	max-width: 22ch;
}

@media ( max-width: 781px ) {
	.gl-facts__list {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}
}

/* --------------------------------------------------------------------------
   Recent recoveries / stat rail
   -------------------------------------------------------------------------- */

.gl-stats {
	display: grid;
	gap: 1.5rem;
	grid-template-columns: repeat( auto-fit, minmax( 11rem, 1fr ) );
	list-style: none;
	margin: 0;
	padding: 0;
}

.gl-stat {
	border-left: 2px solid var( --wp--preset--color--gold );
	padding-left: 1rem;
}

.gl-stat__amount {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	font-size: 1.5rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	line-height: 1.1;
}

.gl-stat__label {
	color: var( --wp--preset--color--ink-muted );
	display: block;
	font-size: 0.9375rem;
	margin-top: 0.25rem;
}

/*
 * Numbered step / cause tiles. Both sit inside .gl-card, which is paper, so
 * they take the darkened gold — plain gold on white is 2.69:1.
 */
.gl-step__num {
	color: var( --wp--preset--color--gold-dark );
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
}

.gl-numeral {
	color: var( --wp--preset--color--gold-dark );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	font-size: 1.875rem;
	font-weight: 800;
	line-height: 1;
}

/* Dash list used for injuries / case areas */
.gl-dash-list {
	list-style: none;
	margin: 0;
	padding: 0;
}

/*
 * The rule marker is absolutely positioned rather than a flex sibling: a flex
 * list item turns every inline <a> and <strong> inside it into its own flex
 * item, which shreds sentences into columns.
 */
.gl-dash-list li {
	border-bottom: 1px solid var( --wp--preset--color--rule );
	padding: 0.75rem 0 0.75rem 1.75rem;
	position: relative;
}

.gl-dash-list li:last-child {
	border-bottom: 0;
}

.gl-dash-list li::before {
	color: var( --wp--preset--color--gold );
	content: "—";
	left: 0;
	position: absolute;
	top: 0.75rem;
}

/* --------------------------------------------------------------------------
   Site header
   -------------------------------------------------------------------------- */

.gl-header {
	background: var( --wp--preset--color--paper );
	border-bottom: 1px solid var( --wp--preset--color--rule );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.06 );
	position: sticky;
	top: 0;
	z-index: 100;
}

.admin-bar .gl-header {
	top: 32px;
}

@media screen and ( max-width: 782px ) {
	.admin-bar .gl-header {
		top: 46px;
	}
}

.gl-header__inner {
	align-items: stretch;
	display: flex;
	justify-content: space-between;
	margin-inline: auto;
	max-width: var( --gl-frame );
}

.gl-brand {
	/* The logo is a replaced element, so without this the column stretches it
	   to the full width of .gl-header__left. */
	align-items: flex-start;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 0.875rem var( --gl-gutter );
	text-decoration: none;
}

/*
 * The wordmark is a bitmap, not type: the lettering is distressed, so it can
 * be neither set in the display face nor drawn as a vector, and the texture is
 * carried in the alpha channel. Height is the only control — width follows the
 * lockup's 2.75:1. The ceiling is 2.75rem because the masthead is 5.25rem tall
 * and the city line and the 0.875rem padding take the rest.
 *
 * This is the ink-navy export (see patterns/brand-header.php); the header sits
 * on --paper and the white master would be invisible here.
 */
/*
 * The ceiling is 3.5rem because the logo is now the only thing in the lockup:
 * 56px of art plus the 0.875rem padding above and below comes out at exactly
 * --gl-header-h, which every sticky offset and scroll-anchor calc() in this
 * file is written against. Raising it past 3.5rem means raising that variable
 * too. A "Dallas, Texas" line used to sit under the logo and cost it 25px of
 * that budget; it was removed on request.
 */
.gl-brand__logo {
	display: block;
	height: clamp( 2.75rem, 5vw, 3.5rem );
	width: auto;
}

.gl-header__phone {
	border-left: 1px solid var( --wp--preset--color--rule );
	display: none;
	flex-direction: column;
	justify-content: center;
	padding: 0.875rem 1.75rem;
	text-decoration: none;
	transition: background-color var( --gl-ease );
}

.gl-header__phone:hover {
	background: var( --wp--preset--color--rule );
}

.gl-header__phone .gl-eyebrow {
	color: var( --wp--preset--color--gold-dark );
}

.gl-header__phone strong {
	color: var( --wp--preset--color--ink );
	display: block;
	font-size: 1.25rem;
	font-weight: 600;
	line-height: 1;
	margin-top: 0.25rem;
}

@media ( min-width: 900px ) {
	.gl-header__phone {
		display: flex;
	}
}

/*
 * 1240px is where the bar actually fits. The wordmark, the phone block and the
 * six menu items need ~1190px of content between them; below that the header
 * overflowed and the menu ran off the right edge. Every nav breakpoint in this
 * file is on this number — change one and change them all.
 *
 * The masthead's gold "Free Case Review" button (.gl-header__cta) was removed
 * on request. It used to be the third group in this bar's `space-between`, so
 * with it gone there are two, and the leftover space collects in the middle:
 * measured on the frame, 552px of wordmark and phone against 638px of menu
 * leaves a ~210px gap that grows with the window. That gap is invisible at
 * 1440 and below, where the frame is nearly the whole window — it only shows
 * up at 1600–1900. If the masthead needs closing up again, that is the space
 * to account for, and the intake route is now the phone block and the Contact
 * item rather than a button.
 */

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

   The menu is parts/navigation.html — one global template part, pulled into
   the header. The vocabulary is lifted from the homepage docket
   (.glh-docket): hairline rules, a gold underline that wipes in from the
   left, a gold arrow that slides in on hover. The nav should read as the same
   instrument as the rest of the site rather than as a bolted-on widget.

   Several rules here carry more class selectors than they look like they
   need. core/navigation ships its own stylesheet whose submenu rules run to
   five and six classes deep, so anything that overrides padding, colour or
   flex direction inside a submenu has to out-specify it.
   -------------------------------------------------------------------------- */

/* core/template-part always emits a wrapper element, so this div sits between
   .gl-header__inner and the nav and has to pass the stretch through. */
.gl-header__nav {
	align-items: stretch;
	display: flex;
	min-width: 0;
}

.gl-nav.wp-block-navigation {
	align-items: stretch;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
}

.gl-nav .wp-block-navigation-item__content {
	color: var( --wp--preset--color--ink );
	font-size: 1rem;
	font-weight: 500;
	text-decoration: none;
	transition: color var( --gl-ease );
}

.gl-nav .wp-block-navigation__submenu-icon {
	color: var( --wp--preset--color--gold-dark );
}

.gl-nav .wp-block-navigation__submenu-icon svg {
	transition: transform 220ms var( --glh-ease-out );
}

/* --- Desktop bar (see the note on 1240px above) -------------------------- */

@media ( min-width: 1240px ) {

	/*
	 * Stretch core's whole wrapper chain — nav > responsive-container >
	 * dialog > content > ul — so a menu item's hit area is the full height of
	 * the header and its underline can sit down on the header's bottom rule.
	 */
	.gl-nav .wp-block-navigation__responsive-close,
	.gl-nav .wp-block-navigation__responsive-dialog,
	.gl-nav .wp-block-navigation__responsive-container-content {
		align-items: stretch;
		display: flex;
	}

	/*
	 * core sets this one to display:block from
	 * `:not(.hidden-by-default):not(.is-menu-open)` (three classes), so the
	 * override has to carry four or the whole chain stops stretching here.
	 */
	.gl-nav.wp-block-navigation .wp-block-navigation__responsive-container:not( .is-menu-open ) {
		align-items: stretch;
		display: flex;
	}

	.gl-nav .wp-block-navigation__container {
		align-items: stretch;
		gap: 0;
		padding-inline-end: calc( var( --gl-gutter ) - 0.875rem );
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item {
		align-items: stretch;
		display: flex;
		position: relative;
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:hover,
	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:focus-within {
		background-color: var( --wp--preset--color--bone );
	}

	/*
	 * The gold rule wipes in from the left — the same gesture as
	 * .glh-docket a::before on the home page. Drawn as a background rather
	 * than a positioned ::after so the <li> does not have to establish a
	 * containing block; .gl-nav__mega below needs to escape it.
	 */
	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item {
		background-image: linear-gradient(
			var( --wp--preset--color--gold ),
			var( --wp--preset--color--gold )
		);
		background-position: left bottom;
		background-repeat: no-repeat;
		background-size: 0 2px;
		transition: background-size 260ms var( --glh-ease-out ),
			background-color var( --gl-ease );
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:hover,
	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:focus-within,
	.gl-nav .wp-block-navigation__container > .current-menu-item,
	.gl-nav .wp-block-navigation__container > .current-menu-ancestor {
		background-size: 100% 2px;
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
		align-items: center;
		display: flex;
		font-size: 0.9375rem;
		letter-spacing: 0.005em;
		padding: 0 0.875rem;
		white-space: nowrap;
	}

	/* On a submenu parent the label and the chevron button are siblings, so
	   the label gives up its right padding and the button carries it. */
	.gl-nav .wp-block-navigation__container > .has-child > .wp-block-navigation-item__content {
		padding-right: 0.1875rem;
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation__submenu-icon {
		align-items: center;
		display: flex;
		padding: 0 0.875rem 0 0;
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:hover > .wp-block-navigation-item__content,
	.gl-nav .wp-block-navigation__container > .current-menu-item > .wp-block-navigation-item__content,
	.gl-nav .wp-block-navigation__container > .current-menu-ancestor > .wp-block-navigation-item__content {
		color: var( --wp--preset--color--gold-dark );
	}

	.gl-nav .wp-block-navigation__container > .current-menu-item > .wp-block-navigation-item__content,
	.gl-nav .wp-block-navigation__container > .current-menu-ancestor > .wp-block-navigation-item__content {
		font-weight: 600;
	}

	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:hover > .wp-block-navigation__submenu-icon svg,
	.gl-nav .wp-block-navigation__container > .wp-block-navigation-item:focus-within > .wp-block-navigation__submenu-icon svg {
		transform: rotate( 180deg );
	}

	/* The call link is for the mobile overlay; the header already shows the
	   number at this width. */
	.gl-nav.wp-block-navigation .wp-block-navigation__container > .gl-nav__call {
		display: none;
	}

	/* --- Dropdown panels --- */

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container {
		/*
		 * !important is load-bearing. overlayBackgroundColor is what paints
		 * the mobile overlay navy, but WordPress stamps the resulting
		 * .has-ink-background-color — which it generates WITH !important —
		 * onto every submenu container as well, not just the overlay. Without
		 * this the desktop dropdowns are navy text on a navy panel.
		 */
		background: var( --wp--preset--color--paper ) !important;
		border: 1px solid var( --wp--preset--color--rule );
		border-radius: 0 0 2px 2px;
		border-top: 2px solid var( --wp--preset--color--gold );
		box-shadow:
			0 1px 1px rgba( 15, 42, 68, 0.04 ),
			0 10px 20px -6px rgba( 15, 42, 68, 0.10 ),
			0 28px 56px -16px rgba( 15, 42, 68, 0.20 );
		box-sizing: border-box;
		min-width: 20rem;
		padding: 0 1.25rem 0.75rem;
		top: 100%;
		transform: translateY( -0.5rem );
		/*
		 * The delay is hover intent: sweeping the cursor across the bar on the
		 * way somewhere else no longer flashes three panels open behind it.
		 */
		transition:
			opacity 200ms var( --glh-ease-out ) 90ms,
			transform 260ms var( --glh-ease-out ) 90ms;
	}

	.gl-nav.wp-block-navigation .has-child:hover > .wp-block-navigation__submenu-container,
	.gl-nav.wp-block-navigation .has-child:focus-within > .wp-block-navigation__submenu-container,
	.gl-nav.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded="true"] ~ .wp-block-navigation__submenu-container {
		transform: translateY( 0 );
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item {
		border-bottom: 1px solid var( --wp--preset--color--rule );
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content {
		align-items: baseline;
		color: var( --wp--preset--color--ink );
		display: flex;
		font-size: 0.9375rem;
		gap: 1rem;
		justify-content: space-between;
		line-height: 1.35;
		padding: 0.8125rem 0;
		position: relative;
		white-space: normal;
	}

	/* Hairline wipe under each row. */
	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content::before {
		background: var( --wp--preset--color--gold );
		bottom: -1px;
		content: "";
		height: 1px;
		left: 0;
		position: absolute;
		right: 0;
		transform: scaleX( 0 );
		transform-origin: left center;
		transition: transform 260ms var( --glh-ease-out );
	}

	/* Arrow, held back until the row is live. */
	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content::after {
		color: var( --wp--preset--color--gold );
		content: "\2192";
		flex: none;
		opacity: 0;
		transform: translateX( -0.375rem );
		transition: opacity var( --gl-ease ), transform var( --gl-ease );
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover,
	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:focus-visible {
		color: var( --wp--preset--color--gold-dark );
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover::before,
	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:focus-visible::before {
		transform: scaleX( 1 );
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover::after,
	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:focus-visible::after {
		opacity: 1;
		transform: none;
	}

	/* --- The "All …" row reads as the panel's masthead --- */

	.gl-nav .gl-nav__all {
		grid-column: 1 / -1;
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .gl-nav__all > .wp-block-navigation-item__content {
		color: var( --wp--preset--color--gold-dark );
		font-size: 0.75rem;
		font-weight: 700;
		letter-spacing: 0.18em;
		padding-top: 1.125rem;
		text-transform: uppercase;
	}

	/* --- Practice Areas: the docket, in the header --- */

	.gl-nav .wp-block-navigation__container > .gl-nav__mega {
		position: static;
	}

	.gl-nav.wp-block-navigation .wp-block-navigation__container .gl-nav__mega > .wp-block-navigation__submenu-container {
		display: grid;
		gap: 0 3rem;
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
		max-width: calc( 100vw - 2 * var( --gl-gutter ) );
		padding-inline: 1.75rem;
		/* flush with the right edge of the last menu item */
		right: calc( var( --gl-gutter ) - 0.875rem );
		width: 44rem;
	}

	/* --- Conversion row at the foot of the panel --- */

	.gl-nav .gl-nav__panelcta {
		border-bottom: 0;
		grid-column: 1 / -1;
		margin-top: 1.25rem;
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .gl-nav__panelcta > .wp-block-navigation-item__content {
		background: var( --wp--preset--color--ink );
		color: var( --wp--preset--color--paper );
		font-weight: 600;
		justify-content: center;
		padding: 0.875rem 1.25rem;
		transition: background-color var( --gl-ease ), color var( --gl-ease );
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .gl-nav__panelcta > .wp-block-navigation-item__content::before {
		content: none;
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .gl-nav__panelcta > .wp-block-navigation-item__content::after {
		color: currentColor;
		opacity: 1;
		transform: none;
	}

	.gl-nav.wp-block-navigation .has-child > .wp-block-navigation__submenu-container > .gl-nav__panelcta > .wp-block-navigation-item__content:hover {
		background: var( --wp--preset--color--gold );
		color: var( --wp--preset--color--ink-soft );
	}
}

/* --- Hamburger ---------------------------------------------------------- */

.gl-nav .wp-block-navigation__responsive-container-open {
	align-items: center;
	border-left: 1px solid var( --wp--preset--color--rule );
	color: var( --wp--preset--color--ink );
	gap: 0.5rem;
	padding-inline: 1.25rem;
	transition: background-color var( --gl-ease );
}

.gl-nav .wp-block-navigation__responsive-container-open:hover {
	background: var( --wp--preset--color--bone );
}

/* An unlabelled hamburger is a guess for a good share of this audience. */
.gl-nav .wp-block-navigation__responsive-container-open::after {
	content: "Menu";
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
}

@media ( max-width: 420px ) {
	.gl-nav .wp-block-navigation__responsive-container-open {
		padding-inline: 0.875rem;
	}

	.gl-nav .wp-block-navigation__responsive-container-open::after {
		display: none;
	}
}

@media ( max-width: 1239.98px ) {
	.gl-nav .wp-block-navigation__responsive-container-open:not( .always-shown ) {
		display: flex;
	}

	.gl-nav .wp-block-navigation__responsive-container:not( .is-menu-open ) {
		background-color: inherit;
		display: none;
	}
}

@media ( min-width: 1240px ) {
	.gl-nav .wp-block-navigation__responsive-container-open {
		display: none;
	}
}

/* --- Mobile overlay -----------------------------------------------------

   Nearly every rule below is anchored on
   `.wp-block-navigation__responsive-container.is-menu-open` rather than the
   shorter `.is-menu-open`. core's overlay rules sit at three to five classes
   and use :where() (which contributes nothing), so a three-class selector here
   only ties them and loses on source order.
   ------------------------------------------------------------------------ */

.gl-nav .wp-block-navigation__responsive-container.is-menu-open {
	padding: clamp( 1.25rem, 5vw, 2.5rem );
}

/*
 * The bar is right-justified, and core drives the overlay's alignment from the
 * same custom properties — which it also re-declares on the <ul>, because the
 * nav's classes are copied onto it. Reset them in both places or the overlay
 * comes out right-aligned.
 */
.gl-nav .wp-block-navigation__responsive-container.is-menu-open,
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	--navigation-layout-align: flex-start;
	--navigation-layout-justification-setting: flex-start;
	--navigation-layout-justify: flex-start;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-dialog,
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-close,
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	gap: 0;
	width: 100%;
}

.gl-nav .wp-block-navigation__responsive-container-close {
	color: var( --wp--preset--color--paper );
	padding: 0.25rem;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item {
	animation: gl-nav-in 420ms var( --glh-ease-out ) backwards;
	border-top: 1px solid rgba( 255, 255, 255, 0.14 );
	padding-bottom: 0.5rem;
	width: 100%;
}

.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 1 ) { animation-delay: 40ms; }
.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 2 ) { animation-delay: 85ms; }
.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 3 ) { animation-delay: 130ms; }
.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 4 ) { animation-delay: 175ms; }
.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 5 ) { animation-delay: 220ms; }
.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 6 ) { animation-delay: 265ms; }
.gl-nav .is-menu-open .wp-block-navigation__container > .wp-block-navigation-item:nth-child( 7 ) { animation-delay: 310ms; }

@keyframes gl-nav-in {
	from {
		opacity: 0;
		transform: translateY( 0.75rem );
	}
}

/* Section heading — the serif carries the voice, as it does on the page. */
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
	color: var( --wp--preset--color--paper );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.3125rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	padding: 0.8125rem 0 0.5rem;
}

/* Lead with the phone. Someone opening this menu at 2am wants a person. */
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .gl-nav__call {
	border-top: 0;
	margin-bottom: 1.5rem;
	padding-bottom: 0;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .gl-nav__call > .wp-block-navigation-item__content {
	background: var( --wp--preset--color--gold );
	box-sizing: border-box;
	color: var( --wp--preset--color--ink-soft );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.0625rem;
	font-weight: 800;
	letter-spacing: 0.01em;
	padding: 0.9375rem 1.25rem;
	text-align: center;
	width: 100%;
}

/* Children run as a two-up index under each heading. */
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child > .wp-block-navigation__submenu-container {
	background: transparent;
	border: 0;
	box-shadow: none;
	box-sizing: border-box;
	display: grid;
	gap: 0 1.5rem;
	grid-template-columns: repeat( auto-fit, minmax( 10.5rem, 1fr ) );
	padding: 0 0 0.5rem;
	width: 100%;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item {
	align-items: stretch;
	width: 100%;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content {
	color: var( --wp--preset--color--ink-muted );
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.9375rem;
	font-weight: 400;
	line-height: 1.35;
	padding: 0.4375rem 0;
	width: 100%;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child > .wp-block-navigation__submenu-container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover {
	color: var( --wp--preset--color--gold );
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child > .wp-block-navigation__submenu-container > .gl-nav__all {
	grid-column: 1 / -1;
}

.gl-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child > .wp-block-navigation__submenu-container > .gl-nav__all > .wp-block-navigation-item__content {
	color: var( --wp--preset--color--gold );
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	padding-bottom: 0.625rem;
	text-transform: uppercase;
}

/* The call block at the top of the overlay already carries this. */
.gl-nav .wp-block-navigation__responsive-container.is-menu-open .gl-nav__panelcta {
	display: none;
}


/* --------------------------------------------------------------------------
   Buttons
   -------------------------------------------------------------------------- */

.wp-block-button__link {
	align-items: center;
	display: inline-flex;
	justify-content: center;
	min-height: 3.25rem;
	transition: background-color var( --gl-ease ), color var( --gl-ease ), border-color var( --gl-ease ),
		transform var( --gl-ease );
}

.wp-block-button__link:active {
	transform: translateY( 1px );
}

/* Ghost button for navy grounds */
.is-style-gl-ghost-light .wp-block-button__link,
.wp-block-button.is-style-gl-ghost-light .wp-block-button__link {
	background: transparent;
	border: 2px solid rgba( 255, 255, 255, 0.55 );
	color: #fff;
}

.is-style-gl-ghost-light .wp-block-button__link:hover,
.wp-block-button.is-style-gl-ghost-light .wp-block-button__link:hover {
	background: rgba( 255, 255, 255, 0.1 );
	border-color: rgba( 255, 255, 255, 0.9 );
	color: #fff;
}

/* Outline button for light grounds */
.is-style-gl-outline-navy .wp-block-button__link,
.wp-block-button.is-style-gl-outline-navy .wp-block-button__link {
	background: transparent;
	border: 2px solid var( --wp--preset--color--ink );
	color: var( --wp--preset--color--ink );
}

.is-style-gl-outline-navy .wp-block-button__link:hover,
.wp-block-button.is-style-gl-outline-navy .wp-block-button__link:hover {
	background: var( --wp--preset--color--rule );
	color: var( --wp--preset--color--ink );
}

/* --------------------------------------------------------------------------
   Sections on navy — force legible text
   -------------------------------------------------------------------------- */

.has-ink-background-color,
.has-ink-soft-background-color,
.gl-on-dark {
	color: var( --wp--preset--color--ink-muted );
}

.has-ink-background-color :is( h1, h2, h3, h4, h5 ),
.has-ink-soft-background-color :is( h1, h2, h3, h4, h5 ),
.gl-on-dark :is( h1, h2, h3, h4, h5 ) {
	color: #fff;
}

.has-ink-background-color a:not( .wp-block-button__link ),
.has-ink-soft-background-color a:not( .wp-block-button__link ),
.gl-on-dark a:not( .wp-block-button__link ) {
	color: var( --wp--preset--color--gold );
}

/* --------------------------------------------------------------------------
   Breadcrumbs
   -------------------------------------------------------------------------- */

.gl-breadcrumbs {
	font-size: 0.875rem;
	margin: 0;
}

.gl-breadcrumbs ol {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
	list-style: none;
	margin: 0;
	padding: 0;
}

.gl-breadcrumbs li::after {
	content: "/";
	opacity: 0.5;
	padding-left: 0.5rem;
}

.gl-breadcrumbs li:last-child::after {
	content: "";
}

.gl-breadcrumbs a {
	text-decoration: none;
}

/*
 * On a dark cover the crumb link inherits the page's gold-dark, which is
 * 2.67:1 against the navy and reads as the dimmest thing in a bar of white
 * text — the one word there that is actually a link. The hub template already
 * corrected this on its own wrapper; keying off .is-dark, which WordPress puts
 * on every dark cover, covers the practice-area head and anything added later.
 */
.wp-block-cover.is-dark .gl-breadcrumbs a {
	color: var( --wp--preset--color--gold );
}

.gl-breadcrumbs a:hover {
	text-decoration: underline;
}

/* --------------------------------------------------------------------------
   FAQ — every answer on the page

   This was a `details`/`summary` accordion, and the markup change that ended
   that is documented at `genthe_faq_as_list()` in functions.php. What the CSS
   has to do is make eight or seventeen open answers a section rather than a
   wall, and the two things that do it are the measure and the column count.

   At full band width an answer of two lines is a 1400px line of 14px type,
   which nothing will read. Two columns halve it, and a question and its answer
   together come to about 110px, so the whole set of eight is four rows deep
   instead of the sixteen it would be down one column — smaller on the page
   open than the accordion was closed with its 22px questions and its 44px of
   padding a row.

   Balanced by default, so the two columns end level. `break-inside: avoid`
   keeps a question with its answer.
   -------------------------------------------------------------------------- */

.gl-faq {
	column-gap: clamp( 2rem, 4vw, 4rem );
	columns: 2;
}

@media ( max-width: 860px ) {
	.gl-faq {
		columns: 1;
	}
}

/*
 * Rules on the top edge rather than the bottom. Down a single column the two
 * are the same thing, but in columns a bottom rule draws under the last item
 * of each column and hangs there with nothing below it.
 */
.gl-faq__item {
	border-top: 1px solid var( --wp--preset--color--rule );
	break-inside: avoid;
	padding-block: 1.125rem 1.375rem;
}

.gl-faq__q {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.0625rem;
	font-weight: 800;
	letter-spacing: 0.01em;
	line-height: 1.3;
	margin: 0;

	/* Questions are sentences and most of them run to two lines in half a
	   band; balanced, the second line is not one word long. */
	text-wrap: balance;
}

.gl-faq__a {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin-top: 0.4375rem;
	max-width: 56ch;
}

.gl-faq__a p {
	margin: 0;
}

.gl-faq__a p + p {
	margin-top: 0.625rem;
}

/* --------------------------------------------------------------------------
   Reviews
   -------------------------------------------------------------------------- */

.gl-review {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	border-top: 4px solid var( --wp--preset--color--gold );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.05 );
	display: flex;
	flex-direction: column;
	padding: 1.75rem;
}

.gl-review__stars {
	color: var( --wp--preset--color--gold );
	letter-spacing: 0.1em;
	margin: 0;
}

.gl-review__quote {
	border: 0;
	flex: 1;
	font-family: var( --wp--preset--font-family--body );
	font-size: 1.125rem;
	line-height: 1.6;
	margin: 1.25rem 0 0;
	padding: 0;
}

.gl-review__name {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.125rem;
	font-weight: 800;
	margin: 1.5rem 0 0;
}

.gl-review__meta {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.875rem;
	margin: 0.25rem 0 0;
}

/* --------------------------------------------------------------------------
   Attorney figure
   -------------------------------------------------------------------------- */

.gl-figure {
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	margin: 0;
	overflow: hidden;
}

.gl-figure img {
	aspect-ratio: 4 / 5;
	display: block;
	height: auto;
	object-fit: cover;
	object-position: center top;
	width: 100%;
}

.gl-figure figcaption,
.gl-figure__caption {
	background: var( --wp--preset--color--ink );
	color: var( --wp--preset--color--ink-muted );
	padding: 1.75rem;
	text-align: left;
}

.gl-figure__name {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.5rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	margin: 0;
}

/* --------------------------------------------------------------------------
   Post / prose content
   -------------------------------------------------------------------------- */

.gl-prose > * + * {
	margin-top: 1.25rem;
}

.gl-prose > :is( h2, h3, h4 ) {
	margin-top: 2.5rem;
}

.gl-prose img {
	border-radius: var( --gl-radius );
	height: auto;
	max-width: 100%;
}

/*
 * core/post-template wraps every card in <li class="wp-block-post">, so the
 * card is a grandchild of the grid: the <li> stretched to the row height and
 * the card inside it did not. Three cards in a row therefore ended at three
 * different depths and their dates — which are ruled off along the bottom
 * edge — stopped lining up. The bare-<li> rule above cannot catch this one
 * because the wrapper carries a class.
 */
.gl-grid > li.wp-block-post {
	display: flex;
}

.gl-grid > li.wp-block-post > .gl-post-card {
	width: 100%;
}

.gl-post-card {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	display: flex;
	flex-direction: column;
	padding: 1.75rem;
	transition: border-color var( --gl-ease ), transform var( --gl-ease );
}

.gl-post-card:hover {
	border-color: var( --wp--preset--color--gold );
	transform: translateY( -2px );
}

.gl-post-card .wp-block-post-title {
	font-size: 1.5rem;
	line-height: 1.25;
	margin: 0.75rem 0 0;
}

.gl-post-card .wp-block-post-title a {
	color: var( --wp--preset--color--ink );
	text-decoration: none;
}

.gl-post-card .wp-block-post-excerpt {
	color: var( --wp--preset--color--slate-muted );
	flex: 1;
	margin-top: 1rem;
}

.gl-post-card .wp-block-post-date,
.gl-post-card > time {
	border-top: 1px solid var( --wp--preset--color--rule );
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.875rem;
	margin-top: 1.5rem;
	padding-top: 1rem;
}

/*
 * The cards in `[genthe_related]` are hand-built rather than emitted by a
 * query block, because the related row is filtered on the current post's own
 * categories and no core query can express that. They carry the same classes
 * so they are the same object, and these three rules cover the two places the
 * hand-built markup is a plain element where the block was a wrapper: the
 * excerpt is a <p> rather than a <div><p>, and the date is a bare <time>.
 */
.gl-post-card > .wp-block-post-excerpt {
	color: var( --wp--preset--color--slate-muted );
	flex: 1;
	font-size: 0.9375rem;
	margin: 1rem 0 0;
}

.gl-post-card__terms {
	color: var( --wp--preset--color--gold-dark );
	margin: 0;
}

.gl-post-card__terms a {
	color: inherit;
	text-decoration: none;
}

.gl-post-card__terms a:hover {
	text-decoration: underline;
}

/* --------------------------------------------------------------------------
   Topics — the blog's category rail

   339 posts, fifteen categories, twenty-nine pages of pagination and, before
   this, no way at all to reach "Truck Accidents" except by finding a card that
   happened to fall on the page you were looking at. A blog index that can only
   be read in reverse-chronological order is a feed, not an index.

   Lines rather than cards, for the reason `.glh-citylinks` is: a card on this
   site is a claim, and a filter is furniture. What the cards could not carry
   and these must is the count — the corpus is extremely lopsided (140 posts
   under DFW News against one under Injuries) and the number is both the most
   useful thing on the row and the only warning that a link leads to a single
   article.
   -------------------------------------------------------------------------- */

.gl-topics {
	border-bottom: 1px solid var( --wp--preset--color--rule );
	border-top: 1px solid var( --wp--preset--color--rule );
	margin-bottom: clamp( 2.5rem, 4vw, 3.5rem );
	padding-block: 1.25rem;
}

.gl-topics__label {
	color: var( --wp--preset--color--gold-dark );
	margin: 0 0 0.875rem;
}

.gl-topics__list {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem 0.375rem;
	list-style: none;
	margin: 0;
	padding: 0;
}

/*
 * A hairline box rather than a filled pill. Fifteen filled pills in the gold
 * would be the loudest object on a page whose actual content is below them,
 * and the one that has to be loud is the current one.
 */
.gl-topics__link {
	align-items: baseline;
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 999px;
	color: var( --wp--preset--color--ink );
	display: inline-flex;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.8125rem;
	font-weight: 600;
	gap: 0.5rem;
	line-height: 1;
	padding: 0.5rem 0.875rem;
	text-decoration: none;
	transition: border-color var( --gl-ease ), background-color var( --gl-ease ), color var( --gl-ease );
	white-space: nowrap;
}

.gl-topics__link:hover,
.gl-topics__link:focus-visible {
	border-color: var( --wp--preset--color--gold );
	color: var( --wp--preset--color--gold-dark );
}

.gl-topics__link.is-current {
	background: var( --wp--preset--color--ink );
	border-color: var( --wp--preset--color--ink );
	color: #fff;
}

/* Tabular, so the counts down a wrapped rail sit on one rhythm rather than
   jittering between 1 and 140. */
.gl-topics__count {
	color: var( --wp--preset--color--slate-muted );
	font-feature-settings: "tnum" 1;
	font-size: 0.75rem;
	font-variant-numeric: tabular-nums;
	font-weight: 500;
}

.gl-topics__link.is-current .gl-topics__count {
	color: var( --wp--preset--color--gold );
}

/* On the bone band at the foot of an article the rail is a footer, not a
   control strip: it has already been read past once. */
.has-bone-background-color .gl-topics {
	border-bottom: 0;
	margin-block: clamp( 2.5rem, 4vw, 3.5rem ) 0;
	padding-bottom: 0;
}

/* --------------------------------------------------------------------------
   Blog search field
   -------------------------------------------------------------------------- */

.gl-search {
	margin-bottom: clamp( 1.75rem, 3vw, 2.5rem );
	max-width: 34rem;
}

.gl-search .wp-block-search__inside-wrapper {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	padding: 0.25rem 0.25rem 0.25rem 0.25rem;
}

.gl-search .wp-block-search__input {
	background: transparent;
	border: 0;
	color: var( --wp--preset--color--ink );
	padding: 0.625rem 0.875rem;
}

.gl-search .wp-block-search__input:focus {
	outline: 0;
}

.gl-search .wp-block-search__inside-wrapper:focus-within {
	border-color: var( --wp--preset--color--gold );
}

.gl-search .wp-block-search__button {
	background: var( --wp--preset--color--ink );
	border: 0;
	border-radius: calc( var( --gl-radius ) - 2px );
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.8125rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	padding: 0.625rem 1.25rem;
	text-transform: uppercase;
}

.gl-search .wp-block-search__button:hover {
	background: var( --wp--preset--color--gold-dark );
}

/* --------------------------------------------------------------------------
   Query pagination

   Centred, and the numbers read as one control. It was `space-between` with
   the previous link absent on page one, which put "1 2 3 … 29" hard against
   the left margin and "Next Page" hard against the right with 1,200px of
   nothing between them — two unrelated objects rather than one pager.
   -------------------------------------------------------------------------- */

.gl-pagination {
	border-top: 1px solid var( --wp--preset--color--rule );
	gap: 0.375rem;
	padding-top: clamp( 1.75rem, 3vw, 2.5rem );
}

.gl-pagination .wp-block-query-pagination-numbers {
	display: flex;
	gap: 0.375rem;
}

.gl-pagination a,
.gl-pagination .page-numbers {
	align-items: center;
	border: 1px solid transparent;
	border-radius: var( --gl-radius );
	color: var( --wp--preset--color--slate );
	display: inline-flex;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.875rem;
	font-weight: 600;
	justify-content: center;
	min-width: 2.5rem;
	padding: 0.5rem 0.75rem;
	text-decoration: none;
}

.gl-pagination a:hover {
	border-color: var( --wp--preset--color--gold );
	color: var( --wp--preset--color--gold-dark );
}

.gl-pagination .page-numbers.current {
	background: var( --wp--preset--color--ink );
	color: #fff;
}

/* --------------------------------------------------------------------------
   Post dateline — published, revised, and how long it runs

   The revision date is the one a reader of a law blog wants. A good part of
   this archive is about filing deadlines and statutory minimums, and a 2021
   article revised last month is worth more than its publication date says —
   but only if the revision is on the page. See `genthe_post_meta_shortcode()`,
   which prints it only where the two dates are more than a day apart.
   -------------------------------------------------------------------------- */

.gl-dateline {
	color: var( --glh-ink-muted, rgba( 255, 255, 255, 0.62 ) );
	font-size: 0.875rem;
	margin: 1.25rem 0 0;
}

.gl-dateline time {
	color: inherit;
}

/* --------------------------------------------------------------------------
   Article layout — prose beside a rail, as everywhere else on the site

   A post was a single centred column with both margins empty for its whole
   length, and the longest of them runs to nearly 12,000px. The only call to
   action on it was below the footer of the article. Every page template on
   this site puts a sticky rail beside the prose; the 339 pages that convert
   worst were the ones without it.
   -------------------------------------------------------------------------- */

.gl-article {
	gap: clamp( 2.5rem, 5vw, 4.5rem );
}

/* The prose keeps its own measure inside the wider column, so the line length
   is the one the rest of the site reads at and the column is only what holds
   the rail off it. */
.gl-article .gl-prose > * {
	max-width: 68ch;
}

.gl-article .gl-prose > .wp-block-image,
.gl-article .gl-prose > .wp-block-table,
.gl-article .gl-prose > .wp-block-embed {
	max-width: none;
}

@media ( max-width: 781px ) {
	.gl-article {
		gap: clamp( 2rem, 6vw, 3rem );
	}
}

/* --------------------------------------------------------------------------
   Sticky mobile call bar
   -------------------------------------------------------------------------- */

.gl-callbar {
	background: var( --wp--preset--color--gold );
	bottom: 0;
	box-shadow: 0 -2px 12px rgba( 15, 42, 68, 0.2 );
	display: grid;
	grid-template-columns: 1fr 1fr;
	left: 0;
	position: fixed;
	right: 0;
	z-index: 90;
}

@media ( min-width: 900px ) {
	.gl-callbar {
		display: none;
	}
}

/*
 * The inset goes on the links rather than on the bar, so each half keeps its
 * own background (gold, then navy) all the way to the screen edge while the
 * label and the tap centre sit above the home indicator. Putting it on the bar
 * would have printed a gold strip under the navy half.
 */
.gl-callbar a {
	color: var( --wp--preset--color--ink-soft );
	font-weight: 600;
	padding: 0.9375rem 1rem;
	padding-bottom: calc( 0.9375rem + env( safe-area-inset-bottom ) );
	text-align: center;
	text-decoration: none;
}

.gl-callbar a + a {
	background: var( --wp--preset--color--ink );
	color: #fff;
}

body {
	padding-bottom: env( safe-area-inset-bottom );
}

/*
 * .gl-has-callbar is a body class, so it out-specifies the `body` rule above
 * rather than adding to it — the inset has to be repeated here or the last of
 * the footer ends up under the bar on a phone with a home indicator.
 */
@media ( max-width: 899px ) {
	.gl-has-callbar {
		padding-bottom: calc( 3.5rem + env( safe-area-inset-bottom ) );
	}
}

/* --------------------------------------------------------------------------
   Footer
   -------------------------------------------------------------------------- */

.gl-footer a {
	color: var( --wp--preset--color--ink-muted );
	text-decoration: none;
}

.gl-footer a:hover {
	color: var( --wp--preset--color--gold );
	text-decoration: underline;
}

.gl-footer__cols {
	display: grid;
	gap: 2.5rem;
	grid-template-columns: repeat( auto-fit, minmax( 13rem, 1fr ) );
}

/* Still an <h2> — it replaced the "Genthe Law Firm, P.C." heading and holds
   that place in the document outline. The margin below is the old heading's;
   the group's blockGap does not reach a raw wp:html child. */
.gl-footer__brand {
	margin: 0 0 1.25rem;
}

.gl-footer__logo {
	display: block;
	height: 3.25rem;
	width: auto;
}

.gl-footer__heading {
	color: #fff;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	margin: 0 0 1rem;
	text-transform: uppercase;
}

.gl-footer ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

.gl-footer li + li {
	margin-top: 0.625rem;
}

.gl-footer__legal {
	border-top: 1px solid rgba( 255, 255, 255, 0.12 );
	color: rgba( 207, 217, 228, 0.75 );
	font-size: 0.8125rem;
	line-height: 1.6;
	margin-top: 3rem;
	padding-top: 1.75rem;
}

/* ==========================================================================
   HOME — the editorial layer
   --------------------------------------------------------------------------
   The home page is set as a legal broadsheet: hairline rules instead of card
   borders, ruled indexes instead of box grids, Saira run heavy and uppercase
   against Lora prose, and gold used only where it means "act".

   Everything here is namespaced `.glh-`. It was written for the six home
   patterns; /practice-areas/ renders in it too, because it is the page the
   home docket links to and it was a visible downgrade in the `.gl-` layer.
   Every other interior page renders in the shared `.gl-` layer above, and
   nothing in this block touches it.
   ========================================================================== */

:root {
	--glh-max: 1400px;
	--glh-hair-light: rgba( 255, 255, 255, 0.16 );
	--glh-hair-dark: rgba( 15, 42, 68, 0.14 );
	--glh-gold-hair: rgba( 200, 149, 47, 0.45 );
	--glh-ease-out: cubic-bezier( 0.2, 0.7, 0.3, 1 );
}

/* Shared band shell — every home section is a full-bleed band with a centred
   1400px measure and section-scale padding. */
.glh-band {
	padding-block: clamp( 4.5rem, 7vw, 7.5rem );
	position: relative;
}

/*
 * The bands butt up against each other. Post content is a flow layout, so the
 * root blockGap would otherwise leave a strip of page background between every
 * two of them; two class selectors beat the `:where()`-wrapped layout rule
 * whatever order the stylesheets land in.
 */
.alignfull.glh-band,
.alignfull.glh-ledger,
.alignfull.glh-cta {
	margin-block: 0;
}

/*
 * The same problem one level up. The masthead group and wp:post-content are
 * siblings inside <main>, which is also a constrained layout, so the root
 * blockGap printed a strip of page background between the head of the page and
 * the first band of its body. It is invisible wherever that first band is bone
 * — the page colour — and a hairline of bone above white everywhere else,
 * which is why it survived on the About page for as long as it did.
 */
.alignfull.wp-block-post-content {
	margin-block-start: 0;
}

.glh-band__inner {
	margin-inline: auto;
	max-width: var( --glh-max );
	position: relative;
	width: 100%;
	z-index: 1;
}

/*
 * Navy texture. A hairline column grid plus a corner wash, drawn in CSS so the
 * dark bands carry depth without shipping another image request.
 */
.glh-texture::before {
	background-image:
		repeating-linear-gradient( 90deg, rgba( 255, 255, 255, 0.04 ) 0 1px, transparent 1px 92px ),
		radial-gradient( 110% 75% at 82% 0%, rgba( 53, 97, 142, 0.38 ) 0%, transparent 62% );
	content: "";
	inset: 0;
	pointer-events: none;
	position: absolute;
	z-index: 0;
}

/* Eyebrow with a leading gold tick — the section marker used band to band. */
.glh-eyebrow {
	align-items: center;
	display: flex;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.6875rem;
	font-weight: 800;
	gap: 0.75rem;
	letter-spacing: 0.22em;
	line-height: 1.5;
	margin: 0;
	text-transform: uppercase;
}

.glh-eyebrow::before {
	background: var( --wp--preset--color--gold );
	content: "";
	flex: none;
	height: 1px;
	width: 2.25rem;
}

.glh-eyebrow--gold {
	color: var( --wp--preset--color--gold );
}

.glh-eyebrow--dark {
	color: var( --wp--preset--color--gold-dark );
}

/* Section headline — Saira at 800, uppercase, with italic accent words in
   gold. */
.glh-head {
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.625rem, 1.2rem + 1.8vw, 2.25rem );
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1.1;
	margin: 1.5rem 0 0;
	max-width: 24ch;
	text-wrap: balance;
}

/*
 * gold-dark, not gold. These accents are the site's signature — the italic
 * half of every section heading — and on paper they measured 2.69:1, on bone
 * 2.45:1, against the 3:1 large text needs. gold-dark is 5.47:1 and 4.98:1 on
 * the same two grounds.
 *
 * The bright gold is not lost: it stays on .glh-hero__title em and on the
 * --light variant below, both of which sit on navy, where gold is 5.43:1 and
 * gold-dark would be the unreadable one. Same rule as everywhere else in this
 * stylesheet — gold for dark grounds, gold-dark for light.
 */
.glh-head em {
	color: var( --wp--preset--color--gold-dark );
	font-style: italic;
}

.glh-head--light em {
	color: var( --wp--preset--color--gold );
}

.glh-head--light {
	color: #fff;
}

.glh-deck {
	color: var( --wp--preset--color--slate-muted );
	font-size: var( --wp--preset--font-size--lead );
	line-height: 1.6;
	margin: 1.25rem 0 0;
	max-width: 46ch;
}

.glh-deck--light {
	color: var( --wp--preset--color--ink-muted );
}

/* --------------------------------------------------------------------------
   Motion — one orchestrated load, then scroll reveals.
   Both are pure CSS. `animation-timeline: view()` is progressively enhanced,
   so browsers without it simply render everything in place, and the global
   prefers-reduced-motion rule collapses every duration above.
   -------------------------------------------------------------------------- */

@keyframes glh-rise {
	from {
		opacity: 0;
		transform: translate3d( 0, 1.25rem, 0 );
	}

	to {
		opacity: 1;
		transform: none;
	}
}

@keyframes glh-wipe {
	from {
		transform: scaleX( 0 );
	}

	to {
		transform: scaleX( 1 );
	}
}

/*
 * Inside a no-preference query rather than relying on the global reduce rule:
 * that one collapses durations but not delays, which would still blank the
 * hero for four tenths of a second.
 */
@media ( prefers-reduced-motion: no-preference ) {
	.glh-load > * {
		animation: glh-rise 0.8s var( --glh-ease-out ) backwards;
	}

	.glh-load > :nth-child( 1 ) {
		animation-delay: 0.05s;
	}

	.glh-load > :nth-child( 2 ) {
		animation-delay: 0.14s;
	}

	.glh-load > :nth-child( 3 ) {
		animation-delay: 0.23s;
	}

	.glh-load > :nth-child( 4 ) {
		animation-delay: 0.32s;
	}

	.glh-load > :nth-child( 5 ) {
		animation-delay: 0.41s;
	}
}

@supports ( animation-timeline: view() ) {
	@media ( prefers-reduced-motion: no-preference ) {
		.glh-reveal {
			animation: glh-rise linear both;
			animation-range: entry 8% cover 26%;
			animation-timeline: view();
		}
	}
}

/* --------------------------------------------------------------------------
   Hero — masthead left, matted photograph right
   -------------------------------------------------------------------------- */

.glh-hero {
	background-color: var( --wp--preset--color--ink );
	isolation: isolate;
	overflow: hidden;
	padding-block: 0;
}

.glh-hero > .wp-block-group__inner-container,
.glh-hero > * {
	position: relative;
	z-index: 2;
}

/*
 * Full-bleed photograph behind the whole masthead. The image ships as an <img>
 * rather than a CSS background so it stays the LCP element the preloader can
 * find — fetchpriority on a background-image is not a thing.
 */
/*
 * The band is a constrained layout, so WordPress caps every direct child at the
 * 1400px measure and centres it — which applies to an absolutely positioned box
 * just the same and left the photograph boxed in the middle of the navy. Two
 * class selectors to beat the `:where()`-wrapped layout rule.
 */
.glh-hero > .glh-hero__bg {
	inset: 0;
	margin: 0;
	max-width: none;
	position: absolute;
	width: 100%;
	z-index: 0;
}

/*
 * Pushed most of the way to a press photograph. The firm spends its only chroma
 * on gold, so a near-monochrome frame keeps the eye on the headline and the
 * button rather than fighting them. Grayscale eased off a little now that the
 * right of the frame is the only thing standing in that half: at 0.72 under
 * four scrim layers the picture had gone to grey weather, which is a texture,
 * not a photograph. Subject sits at 72% so it lands in the open half.
 */
.glh-hero__bg img {
	display: block;
	filter: grayscale( 0.55 ) contrast( 1.1 ) brightness( 0.96 );
	height: 100%;
	object-fit: cover;
	object-position: 72% 28%;
	width: 100%;
}

/*
 * Scrim, in two passes.
 *
 * The first holds the left column at near-solid navy so the display type is
 * crisp, then falls off through the gutter and keeps falling — the right of the
 * band is now the photograph's own half and nothing is set over it, so it does
 * not need protecting. The second is a foot fade that hands the band off to the
 * recoveries ledger.
 *
 * There were two more: a radial darkener at 68%/78% and a gold key-light at
 * 78%/38%, both aimed at the corner the contingency plate used to sit in. With
 * the plate gone they were shading a subject that had nothing on top of it, and
 * between them they were most of the murk.
 */
.glh-hero__bg::after {
	background:
		linear-gradient( 90deg,
			rgba( 9, 24, 40, 0.96 ) 0%,
			rgba( 9, 24, 40, 0.92 ) 32%,
			rgba( 9, 24, 40, 0.68 ) 50%,
			rgba( 9, 24, 40, 0.3 ) 72%,
			rgba( 9, 24, 40, 0.18 ) 100% ),
		linear-gradient( 0deg, rgba( 9, 24, 40, 0.9 ) 0%, transparent 26% );
	content: "";
	inset: 0;
	position: absolute;
}

@media ( max-width: 900px ) {
	.glh-hero__bg::after {
		background:
			linear-gradient( 180deg, rgba( 9, 24, 40, 0.9 ) 0%, rgba( 9, 24, 40, 0.84 ) 55%, rgba( 9, 24, 40, 0.94 ) 100% ),
			radial-gradient( 90% 40% at 70% 12%, rgba( 200, 149, 47, 0.12 ) 0%, transparent 70% );
	}
}

/*
 * Press-grain only. A tiled turbulence plate, drawn rather than fetched, that
 * stops a near-monochrome photograph under a flat navy wash from looking
 * digital.
 *
 * The shared `.glh-texture` column grid — a white hairline every 92px — is
 * suppressed here. Ruled over a photograph it is not a grid the eye can read as
 * structure, only fifteen vertical lines laid across a picture, and this band
 * already carries hairlines that mean something.
 */
.glh-hero.glh-texture::before {
	background-image:
		url( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E" );
	background-repeat: repeat;
	background-size: 160px 160px;
	mix-blend-mode: soft-light;
	opacity: 0.32;
	z-index: 1;
}

/* Dateline — the rule of type that runs under the header. */
.glh-dateline {
	border-bottom: 1px solid var( --glh-hair-light );
	margin-inline: auto;
	max-width: var( --glh-max );
	padding-block: 0.9375rem;
}

.glh-dateline ul {
	align-items: center;
	color: rgba( 207, 217, 228, 0.85 );
	display: flex;
	flex-wrap: wrap;
	font-size: 0.6875rem;
	font-weight: 600;
	gap: 0.5rem 1.25rem;
	letter-spacing: 0.2em;
	list-style: none;
	margin: 0;
	padding: 0;
	text-transform: uppercase;
}

.glh-dateline > ul li {
	align-items: center;
	display: flex;
	gap: 1.25rem;
}

.glh-dateline > ul li::after {
	background: var( --wp--preset--color--gold );
	border-radius: 50%;
	content: "";
	height: 3px;
	opacity: 0.8;
	width: 3px;
}

.glh-dateline > ul li:last-child::after {
	display: none;
}

.glh-dateline > ul li:last-child {
	color: var( --wp--preset--color--gold );
}

/* The signal lamp on "Answering 24/7" and its `glh-signal` keyframes went with
   the hero's dateline. The class survives on the breadcrumb rule the interior
   templates set in this same type, which has no live claim to mark. */

/*
 * One column of type, held at a measure, standing in the left half of a
 * full-bleed photograph. There is no second column: the right of the frame is
 * the picture, and the space is the composition rather than a gap waiting to be
 * filled. Type is centred in the band's height so the open half reads as
 * deliberate rather than as a hole under the headline.
 */
.glh-hero__grid {
	--glh-hero-pb: clamp( 2rem, 3.4vw, 3rem );

	display: flex;
	flex-direction: column;
	justify-content: center;
	margin-inline: auto;
	max-width: var( --glh-max );
	min-height: clamp( 26rem, 52vh, 34rem );
	padding-block: clamp( 3.25rem, 6vw, 5.25rem ) var( --glh-hero-pb );
}

/*
 * The home band used to close on a ruled credentials strip that stood outside
 * this column and gave the photograph another 150px of height to stand in. With
 * the strip gone the column is the whole band, so it takes that height back —
 * otherwise the press photograph is cropped to a letterbox and the masthead
 * reads as a strip rather than a front page. Scoped to the home hero: the hubs
 * share `.glh-hero__grid` and never had the strip to lose.
 */
.glh-hero--home .glh-hero__grid {
	min-height: clamp( 30rem, 62vh, 40rem );
	padding-block: clamp( 3.5rem, 6.5vw, 5.75rem ) clamp( 3.5rem, 6.5vw, 5.75rem );
}

/*
 * Nothing in this column needs a measure imposed on it: the headline is
 * hard-broken to three lines and sets to its own width, and the deck carries a
 * 44ch measure of its own. The cap is only a backstop, and it is deliberately
 * wider than the widest thing in the column — a viewport-relative cap sized to
 * the type instead clipped the button row at the mid widths, where it fell a
 * few pixels short of `Start your free case review` beside `Call (214)
 * 957-0898` and dropped the phone button onto a second line.
 */
.glh-hero__lede {
	max-width: min( 100%, 46rem );
}

/*
 * The contingency seal.
 *
 * Set as a bordered plate rather than an eyebrow because it is a promise, not a
 * label — the tracked-caps eyebrow that used to hold this slot reads as
 * furniture, and the eye skips furniture. The figure is display caps at 20px
 * against terms at 13px inside the same plate, so "NO FEE" carries at a glance
 * and the qualifier is there for the second look; the gold is the border and the
 * mark, with the fill kept to a wash so the plate does not compete with the
 * button, which is the only solid gold in the band.
 */
/*
 * Square, not a pill. It was a 999px capsule until the button below it became a
 * hard-cut plate, at which point it was the only rounded thing left in a band
 * of hairlines and ruled ledgers — and a capsule is the most anonymous shape on
 * the web besides. Cut to the plate's own 2px it stops being a badge and starts
 * being what it should have been: something stamped on a document.
 */
.glh-hero__promise {
	align-items: center;
	background: rgba( 200, 149, 47, 0.12 );
	border: 1px solid rgba( 200, 149, 47, 0.55 );
	border-radius: 2px;
	color: var( --wp--preset--color--ink-muted );
	display: inline-flex;
	flex-wrap: wrap;
	font-size: 0.8125rem;
	gap: 0.125rem 0.75rem;
	line-height: 1.35;
	margin: 0;
	padding: 0.625rem 1.125rem;
}

/*
 * And the terms are cut off from the figure by a gold hairline — the same
 * joinery the plate below uses to divide its label from its arrow, and the
 * header above uses three times to divide the wordmark from the phone from the
 * navigation. Three elements, one rule, and the masthead reads as one object.
 */
.glh-hero__promise span {
	border-left: 1px solid rgba( 200, 149, 47, 0.4 );
	padding-left: 0.75rem;
}

.glh-hero__promise-mark {
	color: var( --wp--preset--color--gold );
	flex: none;
}

.glh-hero__promise strong {
	color: var( --wp--preset--color--gold );
	font-family: var( --wp--preset--font-family--display );
	font-size: 1.25rem;
	font-weight: 800;
	letter-spacing: 0.02em;
	line-height: 1;
	text-transform: uppercase;
}

/*
 * On a phone measure the terms wrap under the figure, and a vertical rule
 * dividing two stacked lines divides nothing — it becomes a tick hanging off
 * the left of the second one. The rule goes and the plate fills the column.
 */
@media ( max-width: 480px ) {
	.glh-hero__promise {
		display: flex;
		padding: 0.75rem 1rem;
	}

	.glh-hero__promise span {
		border-left: 0;
		padding-left: 0;
	}
}

/*
 * Three claims, three lines, hard-broken in the markup — the measure used to
 * decide where they fell and it spent four lines to say them. Line height just
 * over 1 to leave the accent rules somewhere to sit.
 */
.glh-hero__title {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	/*
	 * 32px → 64px. Caps set ~12% wider than sentence case, so an 78px ceiling
	 * would push the headline to four lines; the 58px it was held to instead
	 * was sized for a masthead that had a second column of type to balance
	 * against, and looked underweight once the photograph took that half. The
	 * longest line clears 570px at the ceiling, inside the 704px measure.
	 */
	font-size: clamp( 2rem, 1.15rem + 3.4vw, 4rem );
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1.1;
	margin: 1.5rem 0 0;
}

/*
 * The claim that carries the offer gets a rule under it, the way a broadsheet
 * ranks a standfirst. It is a real underline rather than a positioned bar
 * because `skip-ink` is the only thing that clears the descenders of "Bigger
 * Payouts" — every offset that missed the g and the y landed on the caps of the
 * line below instead. Fades up rather than wiping, since a decoration cannot be
 * scaled: `text-decoration-color` is animatable, geometry is not.
 */
.glh-hero__title em {
	color: var( --wp--preset--color--gold );
	font-style: italic;
	text-decoration-color: rgba( 200, 149, 47, 0.9 );
	text-decoration-line: underline;
	text-decoration-skip-ink: auto;
	text-decoration-thickness: 2px;
	text-underline-offset: 0.15em;
}

@keyframes glh-rule-in {
	from {
		text-decoration-color: rgba( 200, 149, 47, 0 );
	}

	to {
		text-decoration-color: rgba( 200, 149, 47, 0.9 );
	}
}

@media ( prefers-reduced-motion: no-preference ) {
	.glh-hero__title em {
		animation: glh-rule-in 0.7s var( --glh-ease-out ) 0.52s backwards;
	}
}

.glh-hero__lede p.glh-deck {
	margin-top: 1.625rem;
	max-width: 44ch;
	text-wrap: pretty;
}

.glh-hero__actions {
	display: flex;
	flex-wrap: wrap;
	gap: 0.875rem;
	margin-top: 2rem;
}

/*
 * The home masthead's action row is a button and a link, not two buttons, so it
 * baselines them against each other rather than stacking two equal slabs.
 */
.glh-hero--home .glh-hero__actions {
	align-items: center;
	column-gap: 1.75rem;
	margin-top: 2.25rem;
}

.glh-btn {
	align-items: center;
	border-radius: 6px;
	display: inline-flex;
	font-weight: 600;
	justify-content: center;
	min-height: 3.5rem;
	padding-inline: 1.875rem;
	text-decoration: none;
	transition: background-color var( --gl-ease ), border-color var( --gl-ease ), box-shadow var( --gl-ease ),
		color var( --gl-ease ), transform var( --gl-ease );
}

.glh-btn:active {
	transform: translateY( 1px );
}

.glh-btn--gold {
	background: var( --wp--preset--color--gold );
	box-shadow: 0 12px 30px -14px rgba( 200, 149, 47, 0.85 );
	color: var( --wp--preset--color--ink-soft );
}

.glh-btn--gold:hover {
	background: var( --wp--preset--color--gold-dark );
	box-shadow: 0 18px 36px -14px rgba( 200, 149, 47, 0.9 );
	color: #fff;
	transform: translateY( -1px );
}

.glh-btn--gold:active {
	transform: translateY( 1px );
}

/*
 * The lead button — a foil-stamped plate, not a coloured rectangle.
 *
 * What was here before was `--gold` at 6px radius with a blurred gold halo
 * under it, and the first attempt at fixing it made that 68px tall, which only
 * bought more of the thing that was wrong. Three faults, none of them size:
 *
 * 1. Flat `#c8952f` over a large area is not gold, it is mustard. Gold is a
 *    material and materials take light — it needs a top edge that catches and a
 *    foot that deepens.
 * 2. The halo. A blurred glow softens the one edge the button has, and a
 *    diffuse object is the opposite of a pressable one. It also read as generic
 *    in a way nothing else in this design does.
 * 3. A 6px radius on a page whose entire vocabulary is hairlines, ruled ledgers
 *    and hard-cut header cells.
 *
 * And the strategic fault under all three: it was trying to win the band on
 * gold, against a 64px gold headline eight inches above it. It cannot. So it
 * wins on a different axis instead — it is the only opaque, hard-edged, lit
 * object in a band that is otherwise entirely translucent type over a
 * photograph. Figure against ground. That is what makes a thing look pressable,
 * and it is why this version is 62px rather than 68px: the plate does the work
 * that area was failing to do.
 */
.glh-btn--lead {
	/*
	 * Gilding, lit from above — held to a narrow range on purpose. A wide
	 * light-to-dark sweep is gloss, and gloss is a 2008 button; this is a metal
	 * that happens to be under a light. The brand gold sits at the 46% stop so
	 * it stays the plate's true colour, with the stops either side of it barely
	 * a shade off. The lit top edge is the bevel below doing it in one pixel,
	 * which is how a real edge catches light.
	 */
	background:
		linear-gradient( 180deg,
			#d5a344 0%,
			#c8952f 46%,
			#c08c26 78%,
			#b4801d 100% );
	border-radius: 2px;
	box-shadow:
		/* the gilt bevel */
		inset 0 1px 0 rgba( 255, 246, 224, 0.42 ),
		inset 0 -1px 0 rgba( 61, 41, 4, 0.32 ),
		/* the plate's own thickness — hard, no blur */
		0 3px 0 #7c5710,
		/* and one real cast shadow on the navy, not a halo */
		0 12px 22px -12px rgba( 4, 12, 22, 0.9 );
	color: #10243a;
	font-family: var( --wp--preset--font-family--display );
	font-size: 1rem;
	font-weight: 800;
	gap: 0;
	letter-spacing: 0.08em;
	isolation: isolate;
	min-height: 3.875rem;
	padding-inline: 0;
	position: relative;
	text-transform: uppercase;
}

/*
 * The lit state is a second gilding faded in over the first, rather than a
 * swapped `background`: gradients do not interpolate, so setting one on hover
 * snaps the whole face in a frame while the shadow and the lift underneath it
 * are still easing. Two layers and an opacity is the only way the plate turns
 * toward the light at the same speed it rises.
 */
.glh-btn--lead::before {
	background:
		linear-gradient( 180deg,
			#e3b355 0%,
			#d5a33c 46%,
			#cd9a33 78%,
			#c08c26 100% );
	border-radius: inherit;
	content: "";
	inset: 0;
	opacity: 0;
	position: absolute;
	transition: opacity var( --gl-ease );
	z-index: -1;
}

.glh-btn--lead:hover::before,
.glh-btn--lead:focus-visible::before {
	opacity: 1;
}

/*
 * The plate is cut in two by a hairline — label, then travel.
 *
 * This is the joinery the site header uses three times directly above it:
 * wordmark, rule, phone, rule, navigation. Repeating it here is what makes the
 * button read as part of the masthead rather than as something dropped on top
 * of it, and it gives the plate internal structure so it is not a blank field.
 */
.glh-btn__text {
	padding-inline: 2rem;
}

.glh-btn__go {
	align-self: stretch;
	align-items: center;
	border-left: 1px solid rgba( 34, 22, 2, 0.26 );
	box-shadow: inset 1px 0 0 rgba( 255, 246, 224, 0.28 );
	display: flex;
	flex: none;
	justify-content: center;
	width: 3.5rem;
}

.glh-btn__go svg {
	transition: transform var( --gl-ease );
}

/*
 * Hover lifts the plate a pixel and the gilding brightens, as a raised surface
 * turned toward the light would. The arrow crosses its own compartment.
 */
.glh-btn--lead:hover {
	box-shadow:
		inset 0 1px 0 rgba( 255, 250, 236, 0.65 ),
		inset 0 -1px 0 rgba( 61, 41, 4, 0.32 ),
		0 4px 0 #7c5710,
		0 16px 26px -12px rgba( 4, 12, 22, 0.95 );
	color: #0a1826;
	transform: translateY( -1px );
}

.glh-btn--lead:hover .glh-btn__go svg {
	transform: translateX( 5px );
}

/*
 * And it presses: the plate travels down into its own thickness until there is
 * none left, which is the whole of the interaction and needs no other cue.
 */
.glh-btn--lead:active {
	box-shadow:
		inset 0 1px 0 rgba( 255, 246, 224, 0.4 ),
		inset 0 -1px 0 rgba( 61, 41, 4, 0.32 ),
		0 0 0 0 #7c5710,
		0 6px 14px -10px rgba( 4, 12, 22, 0.9 );
	transform: translateY( 3px );
}

.glh-btn--lead:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 3px;
}

/*
 * The phone, demoted.
 *
 * At these widths the header is thirty pixels above with the same number set in
 * gold display type, so a matched outlined button here was a duplicate competing
 * with the primary action for the same glance. As a link it is still a tap
 * target — 3.5rem of line box, the full string underlined on hover — and it no
 * longer reads as a second choice of equal weight.
 */
.glh-hero__call {
	align-items: center;
	color: #fff;
	display: inline-flex;
	flex-wrap: wrap;
	font-family: var( --wp--preset--font-family--display );
	font-size: 1.0625rem;
	font-variant-numeric: tabular-nums;
	font-weight: 700;
	gap: 0.5rem;
	letter-spacing: 0.01em;
	min-height: 3rem;
	text-decoration: none;
	text-underline-offset: 0.35em;
	transition: color var( --gl-ease );
}

.glh-hero__call span {
	color: rgba( 207, 217, 228, 0.7 );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
}

/*
 * The number carries a gold hairline of its own, standing rather than appearing
 * on hover — the plate beside it is unmistakably a control, so this one has to
 * say it is live without borrowing any of the plate's weight to do it. A rule
 * under type is how the rest of the page marks something as load-bearing; the
 * headline's own accent line is the same gesture at forty times the scale.
 */
.glh-hero__call em {
	border-bottom: 1px solid rgba( 200, 149, 47, 0.5 );
	font-style: normal;
	padding-bottom: 0.25rem;
	transition: border-color var( --gl-ease ), color var( --gl-ease );
}

.glh-hero__call:hover em {
	border-bottom-color: var( --wp--preset--color--gold );
	color: var( --wp--preset--color--gold );
}

/*
 * It stays a link below 900px too, rather than taking a button's body back for
 * the narrow widths. That was the plan until the phone screenshot showed what
 * is actually pinned to the bottom of it: `.gl-callbar`, a fixed gold bar
 * carrying CALL and FREE CASE REVIEW, which appears at exactly the width where
 * the header's number disappears. An outlined call button in the masthead would
 * have been the third offer of the same call inside one phone screen — the
 * clutter this pass exists to remove, on the screen with the least room for it.
 *
 * Wrapped to its own line, with the tap target the line box already gives it.
 */
@media ( max-width: 620px ) {
	.glh-hero__call {
		flex: 1 1 100%;
		margin-top: 0.25rem;
	}
}

/*
 * The friction line. Sits under the button because that is where the hesitation
 * is — quiet enough that it is read after the button, not instead of it.
 */
.glh-hero__note {
	color: rgba( 207, 217, 228, 0.78 );
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.1em;
	margin: 1.125rem 0 0;
	text-transform: uppercase;
}

/*
 * The ghost button sits over the photograph rather than over flat navy, so it
 * carries its own smoked pane. A 1px border alone left the label competing with
 * whatever happened to be behind it.
 */
.glh-btn--ghost {
	backdrop-filter: blur( 6px );
	background: rgba( 9, 24, 40, 0.42 );
	border: 1px solid rgba( 255, 255, 255, 0.42 );
	color: #fff;
	font-variant-numeric: tabular-nums;
	gap: 0.625rem;
}

.glh-btn--ghost:hover {
	background: rgba( 9, 24, 40, 0.62 );
	border-color: var( --wp--preset--color--gold );
	color: #fff;
}

.glh-btn--ghost span {
	color: var( --wp--preset--color--gold );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
}

/*
 * The word CALL in front of a number, on a button of any tone. The ghost
 * rules above only ever reached the one in the home masthead, so the gold
 * call buttons had been carrying it as three inline styles apiece — and
 * whichever of the two the tone was, the gap between the label and the
 * number came from the ghost's own `gap` and nothing else set it.
 */
.glh-btn__label {
	color: currentColor;
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	margin-right: 0.625rem;
	opacity: 0.72;
	text-transform: uppercase;
}

/*
 * The right column is gone. `.glh-hero__art` held a contingency standfirst — a
 * gold eyebrow, a 24px display heading and a paragraph, hung off a gutter rule
 * halfway across the photograph. It was a second headline at the same height as
 * the first, saying what the credentials rule below it says in four words, and
 * it needed a text-shadow to hold its own ground. Removing it is what gives the
 * band a single thing to look at.
 */

/*
 * `.glh-hero__proof` is gone with it — a ruled strip of three credentials
 * across the foot of the band, NO FEE / 24/7 / SINCE 2015, set at 13px directly
 * under the call to action. It put the strongest thing the firm has to say in
 * the quietest type on the page, and put three more things to read in the one
 * spot where the eye should have nowhere to go but the button. The fee is now
 * the seal at the head of the column, the answering claim is the line under the
 * button, and the founding year gave way to the recoveries ledger below.
 *
 * The band is one column at every width, so the narrow end has nothing left to
 * rearrange — the vertical scrim takes over from the horizontal one at 900px
 * and the column simply gets narrower.
 */

/* --------------------------------------------------------------------------
   Recoveries ledger
   -------------------------------------------------------------------------- */

/*
 * The ledger is proof, not a chapter — six figures read at a glance between the
 * masthead and the page proper. It was carrying a section's worth of height for
 * that: a 3.75rem band, 1.5rem cells and a 2.5rem figure ran it to 492px, taller
 * than the copy it was vouching for. Everything here is scaled back about a
 * fifth. The figures stay the loudest thing in the band, just less of it.
 */
.glh-ledger {
	background: var( --wp--preset--color--ink-soft );
	border-top: 1px solid var( --glh-hair-light );
	padding-block: clamp( 2rem, 3vw, 2.75rem );
}

.glh-ledger__brow {
	margin-bottom: 1.25rem;
}

/* Footnote. Sits under the figures at the size a footnote is set, on one line
   at the full measure, which is where a prior-results notice belongs and how a
   reader is used to meeting one. */
.glh-ledger__note {
	color: rgba( 207, 217, 228, 0.5 );
	font-size: 0.6875rem;
	letter-spacing: 0.02em;
	line-height: 1.5;
	margin: 1.375rem 0 0;
}

/*
 * Seven figures on one line, under one rule.
 *
 * This was a 3 × 2 grid of ruled cells — the rules drawn by a 1px grid-gap over
 * a hairline ground, which took a pull-out margin and two `!important`s to keep
 * the first cell's padding from pushing it off the page's left edge. It drew
 * seven lines and stood 330px tall directly under the masthead, and it read as
 * a spreadsheet the reader had to work through rather than proof they could
 * take in at a glance.
 *
 * One row needs no rules at all: seven figures at the same size on the same
 * baseline are their own grid, and the strip closes at about 130px. The
 * cell-padding goes with the rules, which is what lets the list sit at the
 * plain measure and line its first figure up with the eyebrow — the layout's
 * own centring now does the work the pull-out maths was doing.
 */
.glh-ledger__list {
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 1.5rem;
	grid-template-columns: repeat( 7, minmax( 0, 1fr ) );
	list-style: none;
	margin: 0;
	padding: 1.375rem 0 0;
}

/*
 * Seven across holds down to about 1180px — below that the figures start
 * setting narrower than "$1,750,000" and the descriptors run to four lines.
 * Four, three and two are the fallbacks, and all are far lighter than the old
 * 3 × 2 was, because what made that block heavy was the ruling rather than the
 * count. Seven is prime, so every fallback leaves a short last row; a ledger
 * ending ragged reads as a list that stopped, which is what it is.
 */
@media ( max-width: 1180px ) {
	.glh-ledger__list {
		grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
		gap: 1.75rem 1.5rem;
	}
}

@media ( max-width: 860px ) {
	.glh-ledger__list {
		grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	}
}

@media ( max-width: 560px ) {
	.glh-ledger__list {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}
}

/*
 * Seven of these run in a line directly under the masthead, so the ceiling
 * matters more than any one figure does. At 32px they were within a few points
 * of the display headline above them and the band read as a second hero. The
 * eye takes a $2,000,000 at 26px perfectly well, and at that size the seven of
 * them fit a single row of the measure.
 */
.glh-amount {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	font-feature-settings: "tnum" 1;
	font-size: clamp( 1.25rem, 0.7rem + 0.95vw, 1.625rem );
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1;
}

.glh-ledger__label {
	color: rgba( 207, 217, 228, 0.72 );
	display: block;
	font-size: 0.75rem;
	line-height: 1.45;
	margin-top: 0.4375rem;
}

/* `.glh-ledger__type` — the tracked-out practice-area line each figure led
   with — went with the third line of the cell. See `recoveries.php`. */

/* --------------------------------------------------------------------------
   About — copy left, portrait breaking the band edge
   -------------------------------------------------------------------------- */

.glh-about {
	background: var( --wp--preset--color--paper );
}

.glh-about__grid {
	display: grid;
	gap: clamp( 2.5rem, 5vw, 5rem );
	grid-template-columns: minmax( 0, 1.15fr ) minmax( 0, 1fr );
}

@media ( max-width: 900px ) {
	.glh-about__grid {
		grid-template-columns: 1fr;
	}
}

/* Prose only. Core stamps `wp-block-paragraph` onto every paragraph, so the
   opt-in class is what separates body copy from the eyebrow and the deck. */
.glh-prose {
	color: var( --wp--preset--color--slate-muted );
	font-family: var( --wp--preset--font-family--body );
	font-size: var( --wp--preset--font-size--lead );
	line-height: 1.65;
	margin: 1.5rem 0 0;
	max-width: 60ch;
}

/*
 * 1.5rem is the gap between two paragraphs of the same argument. A paragraph
 * that opens a section under its own section head is not that, and at 1.5rem
 * it reads as the deck's third line. This is the gap the pillars already take
 * from a section head above them.
 */
.glh-prose--lede {
	margin-top: clamp( 2.5rem, 4vw, 3.25rem );
}

/*
 * Every other `.glh-prose` on the site sits inside one of a band's own grids —
 * `.glh-about__copy`, `.glh-standard__grid` — and never meets this. A paragraph
 * that is a *direct* child of the band does, because core's constrained layout
 * emits
 *
 *   .wp-container-… > :where(:not(.alignleft):not(.alignright):not(.alignfull))
 *   { max-width: 1400px; margin-left: auto !important; margin-right: auto !important }
 *
 * and against this class's own 60ch measure those auto margins centre the
 * paragraph in the 1400px band. The section head above it and the section foot
 * below it are full-width grids, so they are unaffected and stay flush left,
 * and the eco page came out with two paragraphs indented by 370px against
 * everything around them. Core's selector is one class and an `!important`,
 * which `:where()` contributes nothing to; this is two and one, so it wins
 * wherever the two sheets happen to land relative to each other.
 */
.is-layout-constrained > .glh-prose {
	margin-inline: 0 !important;
}

/* Editorial pull quote — oversized opening mark, gold rule, italic. */
.glh-quote {
	border-left: 2px solid var( --wp--preset--color--gold );
	margin: 2.5rem 0 0;
	padding-left: 1.75rem;
	position: relative;
}

.glh-quote p {
	color: var( --wp--preset--color--ink ) !important;
	font-family: var( --wp--preset--font-family--body );
	font-size: clamp( 1.375rem, 1rem + 1.5vw, 1.875rem ) !important;
	font-style: italic;
	line-height: 1.35;
	margin: 0 !important;
	max-width: 26ch;
}

/*
 * The quote's 26ch measure is set for the About page, where it sits inside a
 * column that is already about that wide. Standing on its own in a 1400px band
 * — the eco page's one visual anchor — 26ch runs it to five short lines and it
 * reads as a stack rather than a statement. It also has to pay its own bottom
 * margin there, because the paragraph that follows only brings 1.5rem.
 */
.glh-quote--solo {
	margin-block: clamp( 2.75rem, 4.5vw, 3.75rem );
}

.glh-quote--solo p {
	max-width: 34ch;
}

.glh-quote cite {
	color: var( --wp--preset--color--slate-muted );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.6875rem;
	font-style: normal;
	font-weight: 800;
	letter-spacing: 0.2em;
	margin-top: 1.25rem;
	text-transform: uppercase;
}

/* Pillars — ruled, numbered, no boxes. */
.glh-pillars {
	display: grid;
	gap: 0;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	list-style: none;
	margin: 3.25rem 0 0;
	padding: 0;
}

@media ( max-width: 720px ) {
	.glh-pillars {
		grid-template-columns: 1fr;
	}
}

.glh-pillars li {
	border-top: 1px solid var( --wp--preset--color--rule );
	padding: 1.5rem 1.5rem 0 0;
}

.glh-pillars li:last-child {
	padding-right: 0;
}

.glh-pillars__no {
	color: var( --wp--preset--color--gold-dark );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 0.875rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0.06em;
}

/*
 * The numerals default to gold-dark because the page background is bone and
 * most pillar rows run on bone or paper, where plain gold is 2.45:1. On a dark
 * ground that reverses — gold-dark falls to 2.67:1 and gold is 5.43:1 — so the
 * brighter one comes back on the modifier that already turns the heading white
 * and the body text to ink-muted. Keyed off --light rather than the band so it
 * still holds if a row is dropped into a cover instead.
 */
.glh-pillars--light .glh-pillars__no {
	color: var( --wp--preset--color--gold );
}

.glh-pillars h3 {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.25rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	margin: 0.625rem 0 0;
}

.glh-pillars p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.625rem 0 0;
}

/*
 * Portrait — pulled up over the ledger band above it. The pull is the band's own
 * top padding plus a small overlap; the overlap stays under the ledger's bottom
 * padding so the figure never lands on a recovery figure.
 */
.glh-portrait {
	align-self: start;
	margin: calc( -1 * clamp( 4.5rem, 7vw, 7.5rem ) - clamp( 1.5rem, 2.5vw, 3rem ) ) 0 0;
	position: relative;
	z-index: 2;
}

@media ( max-width: 900px ) {
	.glh-portrait {
		margin-top: 0;
	}
}

.glh-portrait figure {
	margin: 0;
	position: relative;
}

.glh-portrait img {
	aspect-ratio: 3 / 4;
	display: block;
	filter: grayscale( 0.12 ) contrast( 1.03 );
	height: auto;
	object-fit: cover;
	object-position: center top;
	width: 100%;
}

.glh-portrait figcaption {
	background: var( --wp--preset--color--ink );
	color: var( --wp--preset--color--ink-muted );
	padding: 1.75rem;
}

.glh-portrait__name {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.5rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	margin: 0;
}

.glh-portrait__role {
	color: var( --wp--preset--color--gold );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.2em;
	margin: 0.5rem 0 0;
	text-transform: uppercase;
}

.glh-portrait__bio {
	border-top: 1px solid var( --glh-hair-light );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 1.25rem 0 0;
	padding-top: 1.25rem;
}

/*
 * The landscape counterpart to the portrait: a photograph with a navy plate
 * under it carrying a quote rather than a name. It exists because the practice
 * pages have no photography at all below the masthead, and because a 60ch
 * column of prose standing alone in a 1400px band leaves 700px of nothing
 * beside it — the thing `.glh-portrait` is solving on the About page, with the
 * only image these pages have to solve it with.
 *
 * 4/3 rather than the portrait's 3/4. `courtroom.jpg` is 1920 by 912, and
 * cropping a wide press photograph to a tall frame throws away the half of it
 * that says what the room is.
 */
.glh-plate {
	align-self: start;
	position: relative;
}

.glh-plate figure {
	margin: 0;
}

.glh-plate img {
	aspect-ratio: 4 / 3;
	display: block;
	filter: grayscale( 0.12 ) contrast( 1.03 );
	height: auto;
	object-fit: cover;
	object-position: center 40%;
	width: 100%;
}

.glh-plate figcaption {
	background: var( --wp--preset--color--ink );
	border-top: 2px solid var( --wp--preset--color--gold );
	padding: clamp( 1.5rem, 2.4vw, 2.25rem );
}

.glh-plate blockquote {
	border: 0;
	margin: 0;
	padding: 0;
}

.glh-plate blockquote p {
	color: #fff;
	font-family: var( --wp--preset--font-family--body );
	font-size: clamp( 1.125rem, 0.85rem + 0.85vw, 1.4375rem );
	font-style: italic;
	line-height: 1.4;
	margin: 0;
}

.glh-plate cite {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.6875rem;
	font-style: normal;
	font-weight: 800;
	letter-spacing: 0.2em;
	margin-top: 1.25rem;
	text-transform: uppercase;
}

/* The About grid used as a section rather than as the whole band: it has to
   pay the gap a section head's content owes it, which on that page came from
   the band's own padding. */
.glh-about__grid--section {
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
}

/* --------------------------------------------------------------------------
   The plate band — prose and pillars in one column against a spanning plate
   -------------------------------------------------------------------------- */

/*
 * "Why you need a lawyer" is four objects stacked in the band: a section head,
 * a two-column row of prose against the courtroom plate, a row of three
 * pillars, and a foot. Stacked, the second object does not work. The plate is
 * an image with a quote under it and runs 669px; the prose beside it runs 354.
 * The other 315 is nothing at all — a hole the depth of a paragraph block
 * sitting directly under the first thing the section says, with the pillars
 * marooned below the plate where they read as a separate section rather than
 * as the reasons the prose just gave.
 *
 * So the band becomes the grid instead of holding one. The about grid goes
 * `display: contents` and hands its two children up, the plate spans the prose
 * row and the pillar row, and the pillars stack into the column under the
 * prose — which is what fills the hole, and what puts the three reasons beside
 * the photograph of the room they are about.
 *
 * Stacked, the pillars are also better than they were across: each one is a
 * numeral, a claim and two lines of argument, which is a ledger row, and the
 * rule each already carries on its top edge draws the ledger for free.
 *
 * Both `:has()` conditions are needed. The About page runs `.glh-about__grid`
 * without the `--section` modifier and the home page runs pillars with no
 * grid, and neither should pick this up; the band that has both is this one.
 */
.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) {
	align-items: start;
	column-gap: clamp( 2.5rem, 5vw, 5rem );
	display: grid;
	grid-template-columns: minmax( 0, 1.15fr ) minmax( 0, 1fr );
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-sechead {
	grid-column: 1 / -1;
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-about__grid--section {
	display: contents;
}

/*
 * `display: contents` drops the grid's own top margin with the box, so the gap
 * under the section head is paid by the two children that took its place.
 */
.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-about__copy,
.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-plate {
	grid-row: 2;
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-about__copy {
	grid-column: 1;
}

/*
 * The plate is shorter than the column it stands against — 669px of photograph
 * and quote beside prose and three pillars — and the difference grows as the
 * window narrows: 191px at 1440, 306 at 1200. Rather than leave that as a hole
 * under the picture, the plate takes the whole of its two-row area and the
 * figure inside it sticks, so the courtroom stays in view for as long as the
 * column beside it is still making the argument about going there.
 */
.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-plate {
	align-self: stretch;
	grid-column: 2;
	grid-row: 2 / span 2;
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-plate figure {
	position: sticky;
	top: calc( var( --gl-header-h ) + 1.5rem );
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-pillars {
	grid-column: 1;
	grid-row: 3;
	grid-template-columns: minmax( 0, 1fr );
	margin-top: 2.75rem;
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-pillars li {
	padding: 1.25rem 0 0;
}

.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-pillars li + li {
	margin-top: 1.25rem;
}

/*
 * Across the band a pillar's argument was a third of 1400px. Down the column it
 * is all of 706, which at 15px is around 95 characters — the one thing the
 * stack costs, and 62ch is what buys it back.
 */
.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-pillars p {
	max-width: 62ch;
}

/*
 * The foot spans both columns. It is the only full-width object below the
 * head, so the rule it already carries is what tells the reader the two
 * columns have ended.
 */
.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-sectionfoot {
	grid-column: 1 / -1;
	grid-row: 4;
}

/*
 * One column again, and earlier than the about grid's own 900. Down the column
 * the pillars are three ledger rows rather than three cells, so the left side
 * outruns the plate by more the narrower the window gets — 410px at 1000 —
 * and below about 1100 the two-up has nothing left to be. Stacked, the objects
 * fall back into source order: head, prose, plate, pillars, foot.
 */
@media ( max-width: 1100px ) {
	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) {
		grid-template-columns: minmax( 0, 1fr );
	}

	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-about__copy,
	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-plate,
	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-pillars,
	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) > .glh-sectionfoot {
		grid-column: 1;
		grid-row: auto;
	}

	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-plate {
		align-self: start;
		margin-top: 2.5rem;
	}

	.gl-band:has( > .glh-about__grid--section ):has( > .glh-pillars ) .glh-plate figure {
		position: static;
	}
}

.glh-arrowlink {
	align-items: center;
	color: var( --wp--preset--color--gold );
	display: inline-flex;
	font-size: 0.9375rem;
	font-weight: 600;
	gap: 0.5rem;
	margin-top: 1.25rem;
	text-decoration: none;
}

.glh-arrowlink::after {
	content: "\2192";
	transition: transform var( --gl-ease );
}

.glh-arrowlink:hover::after {
	transform: translateX( 0.25rem );
}

/* --------------------------------------------------------------------------
   Practice areas — the docket index
   -------------------------------------------------------------------------- */

.glh-docket-band {
	background: var( --wp--preset--color--bone );
}

.glh-sechead {
	align-items: end;
	display: grid;
	gap: 1.5rem clamp( 2rem, 5vw, 4rem );
	grid-template-columns: minmax( 0, 1.2fr ) minmax( 0, 1fr );
}

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

/*
 * Cards, not an index. Each entry is its own object on the ground — paper
 * face, hairline edge, a gold rule that wipes across the top on hover —
 * rather than a row on a shared rule. The numeral is the one piece of the
 * docket vocabulary worth carrying over, but it sits above the name instead
 * of in a gutter beside it: inside a 20rem card there is nothing to spend an
 * empty column on.
 *
 * The grid fills itself, so the same component holds fourteen practice areas
 * on the home page, twelve on the hub and four cities without being told how
 * many rows it has.
 */
.glh-docket {
	display: grid;
	gap: clamp( 0.875rem, 1.4vw, 1.25rem );
	grid-template-columns: repeat( auto-fill, minmax( min( 100%, 20rem ), 1fr ) );
	list-style: none;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	padding: 0;
}

/*
 * The row-count modifiers are inert. They are kept because the saved page
 * content emits --rows-6, --rows-4 and --rows-2, and a class that resolves to
 * nothing is better than a rule that fights the auto-fill columns above.
 */
.glh-docket--rows-6,
.glh-docket--rows-4,
.glh-docket--rows-2 {
	grid-auto-flow: row;
}

.glh-docket li {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.05 );
	display: flex;
	flex-direction: column;
	min-width: 0;
	overflow: hidden;
	position: relative;
	transition: border-color var( --gl-ease ), box-shadow var( --gl-ease ),
		transform var( --gl-ease );
}

/* A white card on the white band would read as nothing at all, so on paper
   grounds the card takes the bone tone instead. */
.glh-band--paper .glh-docket li {
	background: var( --wp--preset--color--bone );
}

/* The gold wipe the docket used along the bottom rule, moved to the card's
   top edge. `overflow: hidden` on the card keeps it inside the radius. */
.glh-docket li::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 2px;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	transform: scaleX( 0 );
	transform-origin: left center;
	transition: transform 260ms var( --glh-ease-out );
	z-index: 1;
}

/* `focus-within`, not `focus-visible` on the anchor alone: hub entries carry
   child links in a footer inside the same card, and tabbing into one of those
   should light the card it belongs to. */
.glh-docket li:hover,
.glh-docket li:focus-within {
	border-color: var( --wp--preset--color--gold );
	box-shadow: 0 8px 24px rgba( 15, 42, 68, 0.1 );
	transform: translateY( -2px );
}

.glh-docket li:hover::before,
.glh-docket li:focus-within::before {
	transform: scaleX( 1 );
}

/* Child combinator, not a descendant selector: hub entries carry a row of
   child-page links inside the same <li>, and a bare `.glh-docket a` would lay
   each of those out as a card face too. */
/* The arrow rides in the second column beside the numeral rather than at the
   foot of the card. Cards in a row are all as tall as the tallest one in it —
   the hub entries with a footer of child links set that height — so a
   bottom-anchored arrow lands at a different height in every card of the row.
   Against the top edge they line up across the whole grid. */
.glh-docket > li > a {
	align-content: start;
	color: inherit;
	display: grid;
	flex: 1;
	gap: 0;
	grid-template-columns: minmax( 0, 1fr ) 1.25rem;
	padding: clamp( 1.25rem, 2vw, 1.5rem );
	text-decoration: none;
}

.glh-docket__no {
	color: var( --wp--preset--color--gold-dark );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 0.75rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	grid-column: 1;
	grid-row: 1;
	letter-spacing: 0.12em;
	line-height: 1;
}

.glh-docket__name {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.125rem, 1rem + 0.3vw, 1.3125rem );
	font-weight: 800;
	grid-column: 1 / -1;
	grid-row: 2;
	letter-spacing: 0.005em;
	line-height: 1.15;
	margin-top: 0.75rem;

	/*
	 * Four cards to a row is 335px each, which is a line and a half of this
	 * face for most of these names, so the break was landing wherever the width
	 * ran out — "Rear-end, T-bone & / intersection" left one word under three.
	 * Balanced, the two lines carry about the same weight. It does not choose
	 * where the break falls, so the names that hang on an ampersand still hang
	 * on one; that is a non-breaking space in the content, not a style.
	 */
	text-wrap: balance;
	transition: color var( --gl-ease );
}

.glh-docket__desc {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.875rem;
	grid-column: 1 / -1;
	grid-row: 3;
	line-height: 1.5;
	margin-top: 0.4375rem;
}

/* Held faint rather than hidden outright: on a card the arrow is the only mark
   that says the whole face is a link, and on a touch screen the hover that used
   to reveal it never comes. */
.glh-docket__arrow {
	color: var( --wp--preset--color--gold );
	font-size: 1rem;
	grid-column: 2;
	grid-row: 1;
	justify-self: end;
	line-height: 1;
	opacity: 0.4;
	transform: translateX( -0.25rem );
	transition: opacity var( --gl-ease ), transform var( --gl-ease );
}

.glh-docket li:hover .glh-docket__arrow,
.glh-docket > li > a:focus-visible .glh-docket__arrow {
	opacity: 1;
	transform: none;
}

.glh-docket li:hover .glh-docket__name,
.glh-docket > li > a:focus-visible .glh-docket__name {
	color: var( --wp--preset--color--gold-dark );
}

@media ( prefers-reduced-motion: reduce ) {
	.glh-docket li,
	.glh-docket li::before {
		transition: none;
	}

	.glh-docket li:hover,
	.glh-docket li:focus-within {
		transform: none;
	}
}

/*
 * Entries with pages beneath them. The child links sit outside the entry's own
 * anchor — an <a> cannot contain another <a> — so they become the card's
 * footer, divided off by a hairline and padded to the same measure as the face
 * above them.
 */
.glh-docket__subs {
	border-top: 1px solid var( --wp--preset--color--rule );
	display: flex;
	flex-wrap: wrap;
	gap: 0.375rem 1.25rem;
	margin: 0;
	padding: 0.875rem clamp( 1.25rem, 2vw, 1.5rem ) 1.0625rem;
}

/* `nowrap`, or each link becomes a shrinkable flex item and a three-word label
   folds into a one-word column. */
.glh-docket__subs a {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.8125rem;
	line-height: 1.4;
	padding-left: 0.75rem;
	position: relative;
	text-decoration: none;
	transition: color var( --gl-ease );
	white-space: nowrap;
}

.glh-docket__subs a::before {
	color: var( --wp--preset--color--gold-dark );
	content: "\203A";
	left: 0;
	position: absolute;
}

.glh-docket__subs a:hover,
.glh-docket__subs a:focus-visible {
	color: var( --wp--preset--color--gold-dark );
	text-decoration: underline;
	text-underline-offset: 0.15em;
}

/* --------------------------------------------------------------------------
   Group label — a divider inside a band

   The nearby band on a city page carries two runs: the other claims we take,
   and the other cities with a page. They used to be one docket numbered 01 to
   06, under a heading that said "claims", which put Arlington on the grid as
   claim 06 with a line under it admitting it was a city in another county.

   A second `.glh-sechead` is not the answer — these are not two sections, and
   two headlines that size would say they were. The label is the eyebrow's
   vocabulary at the eyebrow's size, with the rule moved behind the words: an
   eyebrow opens, a group label divides, and the direction the hairline runs is
   what tells them apart from across the page.
   -------------------------------------------------------------------------- */

.glh-grouplabel {
	align-items: center;
	color: var( --wp--preset--color--gold-dark );
	display: flex;
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.6875rem;
	font-weight: 800;
	gap: 1rem;
	letter-spacing: 0.22em;
	line-height: 1.5;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	text-transform: uppercase;
}

.glh-grouplabel::after {
	background: var( --wp--preset--color--rule );
	content: "";
	flex: 1;
	height: 1px;
}

/* The docket sets its own top margin for the case where it follows a section
   head directly. Behind a label it is already spaced, and the two together
   opened a gap wide enough to read as a missing element. */
.glh-grouplabel + .glh-docket,
.glh-grouplabel + .glh-citylinks,
.glh-grouplabel + .gl-steps {
	margin-top: 1.5rem;
}

/* One ordered ledger broken into runs — see `steps(start=...)`.
 *
 * A run's first row drops its top rule and its top padding, because the label
 * above it is already a rule; its last row drops its bottom padding, because
 * the next label brings its own margin. Both are the plain `.gl-steps` rules
 * doing exactly the right thing by accident, and the only thing missing is
 * that the label then sits 3.5rem below type it is meant to divide from and
 * 1.5rem above type it is meant to introduce — so it reads as belonging to the
 * run above rather than the one below. Half the top margin back fixes the
 * association without closing the gap.
 */
.gl-steps + .glh-grouplabel {
	margin-top: clamp( 2rem, 3.2vw, 2.75rem );
}

/* --------------------------------------------------------------------------
   City links — the same band's second run

   Lines, not cards, and that is the whole point of the component: the cards
   above are claims, these are places, and a reader should be able to see the
   subject change before reading a word of either. So this one drops every
   card property except the gold wipe — no fill, no box, no numeral, and one
   hairline to hang from.
   -------------------------------------------------------------------------- */

.glh-citylinks {
	display: grid;
	gap: 0 clamp( 1.5rem, 3vw, 3rem );
	grid-template-columns: repeat( auto-fit, minmax( min( 100%, 22rem ), 1fr ) );
	list-style: none;
	margin: 0;
	padding: 0;
}

.glh-citylinks__item {
	border-top: 1px solid var( --wp--preset--color--rule );
	min-width: 0;
	position: relative;
	transition: border-color var( --gl-ease );
}

/* The card grid's gold wipe, on the only edge this component has. */
.glh-citylinks__item::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 2px;
	left: 0;
	position: absolute;
	right: 0;
	top: -1px;
	transform: scaleX( 0 );
	transform-origin: left center;
	transition: transform 260ms var( --glh-ease-out );
}

.glh-citylinks__item:hover::before,
.glh-citylinks__item:focus-within::before {
	transform: scaleX( 1 );
}

.glh-citylinks__link {
	color: inherit;
	display: grid;
	gap: 0.3125rem 1rem;
	grid-template-columns: minmax( 0, 1fr ) 1.25rem;
	padding: 1.125rem 0 1.25rem;
	text-decoration: none;
}

.glh-citylinks__city {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.25rem, 1.1rem + 0.4vw, 1.5rem );
	font-weight: 800;
	grid-column: 1;
	grid-row: 1;
	letter-spacing: 0.005em;
	line-height: 1.2;
	transition: color var( --gl-ease );
}

.glh-citylinks__note {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.875rem;
	grid-column: 1 / -1;
	grid-row: 2;
	line-height: 1.5;
}

.glh-citylinks__arrow {
	color: var( --wp--preset--color--gold );
	font-size: 1rem;
	grid-column: 2;
	grid-row: 1;
	justify-self: end;
	line-height: 1.2;
	opacity: 0.4;
	transform: translateX( -0.25rem );
	transition: opacity var( --gl-ease ), transform var( --gl-ease );
}

/* No border-colour change to go with the wipe. On a card the border runs all
   four sides and the wipe is the extra mark along the top; here the border is
   the top edge, so turning it gold and then wiping gold across it is the same
   move twice, and the instant half of it eats the animated half. */
.glh-citylinks__item:hover .glh-citylinks__city,
.glh-citylinks__link:focus-visible .glh-citylinks__city {
	color: var( --wp--preset--color--gold-dark );
}

.glh-citylinks__item:hover .glh-citylinks__arrow,
.glh-citylinks__link:focus-visible .glh-citylinks__arrow {
	opacity: 1;
	transform: none;
}

@media ( prefers-reduced-motion: reduce ) {
	.glh-citylinks__item,
	.glh-citylinks__item::before,
	.glh-citylinks__arrow {
		transition: none;
	}
}

/*
 * Every band on a practice page ends the same way: a line of consequence on the
 * left and the link it argues for on the right. What none of them had was an
 * edge. The foot floated a paragraph's width under whatever the section was —
 * a ledger, a card grid, an accordion — with nothing to say the section had
 * closed, so the two lines read as a stray paragraph belonging to the object
 * above rather than as the band signing off. The rule is the sign-off, and
 * running it on all ten of them is what makes it read as one.
 */
.glh-sectionfoot {
	align-items: center;
	border-top: 1px solid var( --wp--preset--color--rule );
	display: flex;
	flex-wrap: wrap;
	gap: 1rem 2rem;
	justify-content: space-between;
	margin-top: clamp( 2.25rem, 3.5vw, 3rem );
	padding-top: 1.5rem;
}

/*
 * The foot with its note removed.
 *
 * The depth pass in build_pages.py drops the sentence in front of the link —
 * the link says the same thing in four words — which leaves this flex row with
 * one child. `space-between` then parks it hard left under the rule, reading as
 * a stray link rather than as the close of the section, so the bare variant
 * pushes it back to the right edge where the note used to leave it.
 */
.glh-sectionfoot--bare {
	justify-content: flex-end;
}

.glh-sectionfoot p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	margin: 0;
	/*
	 * 56ch, not 52. The notes run two to four lines, and at 52 the case-types
	 * one broke to a fourth line carrying two words — "it is." alone under a
	 * full measure. Four more characters fold it back up and take a line off
	 * two of the other nine as well; at 15px this is still a note, not prose.
	 */
	max-width: 56ch;
	text-wrap: pretty;
}

.glh-textlink {
	align-items: center;
	border-bottom: 1px solid var( --glh-gold-hair );
	color: var( --wp--preset--color--gold-dark );
	display: inline-flex;
	font-weight: 600;
	gap: 0.5rem;
	padding-bottom: 0.25rem;
	text-decoration: none;
	transition: border-color var( --gl-ease );
	white-space: nowrap;
}

.glh-textlink::after {
	content: "\2192";
	transition: transform var( --gl-ease );
}

.glh-textlink:hover {
	border-bottom-color: var( --wp--preset--color--gold );
}

.glh-textlink:hover::after {
	transform: translateX( 0.25rem );
}

/*
 * The section foot on a navy ground. Its prose is slate-muted and its link is
 * gold-dark — both set against bone, and both close to unreadable on ink. The
 * home page never met this because the one navy section it has, the process
 * band, carries no foot; the practice pages put a foot under every band.
 */
.glh-sectionfoot--light {
	border-top-color: var( --glh-hair-light );
}

/*
 * The FAQ used to end on a rule of its own — an accordion row carried a
 * hairline under it and the last one drew it across the band, so the foot's
 * rule landed 50px under an identical line. The list draws its rules on the
 * top edge instead, which leaves the bottom of the section open and gives the
 * foot's rule its job back.
 */

.glh-sectionfoot--light p {
	color: var( --wp--preset--color--ink-muted );
}

.glh-sectionfoot--light .glh-textlink {
	color: var( --wp--preset--color--gold );
}

/* --------------------------------------------------------------------------
   Process — a ruled timeline on navy
   -------------------------------------------------------------------------- */

.glh-process {
	background: var( --wp--preset--color--ink );
}

.glh-steps {
	display: grid;
	gap: clamp( 2rem, 3vw, 2.5rem );
	grid-template-columns: repeat( 5, minmax( 0, 1fr ) );
	list-style: none;
	margin: clamp( 3rem, 5vw, 4.5rem ) 0 0;
	padding: 0;
	position: relative;
}

.glh-steps::before {
	background: linear-gradient( 90deg, var( --wp--preset--color--gold ) 0%, rgba( 200, 149, 47, 0.18 ) 100% );
	content: "";
	height: 1px;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
}

@media ( max-width: 1100px ) {
	.glh-steps {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}
}

@media ( max-width: 620px ) {
	.glh-steps {
		grid-template-columns: 1fr;
	}
}

.glh-steps li {
	padding-top: 2.25rem;
	position: relative;
}

/* The tick that sits on the rail. Items below the first row get their own
   short rule so the rhythm holds when the grid wraps. */
.glh-steps li::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 7px;
	left: 0;
	position: absolute;
	top: -3px;
	transform: rotate( 45deg );
	width: 7px;
}

@media ( max-width: 1100px ) {
	.glh-steps li {
		border-top: 1px solid var( --glh-hair-light );
	}

	.glh-steps li:nth-child( -n + 2 ) {
		border-top: 0;
	}
}

@media ( max-width: 620px ) {
	.glh-steps li:nth-child( 2 ) {
		border-top: 1px solid var( --glh-hair-light );
	}
}

.glh-steps__no {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 2.25rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1;
	opacity: 0.9;
}

.glh-steps h3 {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.25rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	margin: 1rem 0 0;
}

.glh-steps p {
	color: var( --wp--preset--color--ink-muted );
	font-size: 0.9375rem;
	line-height: 1.65;
	margin: 0.625rem 0 0;
}

/* --------------------------------------------------------------------------
   Reviews — ruled columns, no cards
   -------------------------------------------------------------------------- */

/*
 * `--band`, because `.glh-reviews` is also the client-reviews page's masonry
 * list of every review — see the `columns: 3` rule further down this file.
 * Two components had the same class name, the list's rule came second, and so
 * the home page's whole review band was being laid out as a three-column CSS
 * multi-column box: the section head, the quote grid and the section foot were
 * all flowed through 553px columns and printed on top of one another. It is
 * `.glh-docket` / `.glh-docket-band` everywhere else in this file for exactly
 * this reason.
 */
.glh-reviews-band {
	background: var( --wp--preset--color--paper );
}

.glh-quotes {
	border-top: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 0;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	list-style: none;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	padding: 0;
}

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

.glh-quotes li {
	border-right: 1px solid var( --wp--preset--color--rule );
	display: flex;
	flex-direction: column;
	padding: 2.25rem clamp( 1.5rem, 2.5vw, 2.25rem ) 0;
	position: relative;
}

.glh-quotes li:first-child {
	padding-left: 0;
}

.glh-quotes li:last-child {
	border-right: 0;
	padding-right: 0;
}

@media ( max-width: 860px ) {
	.glh-quotes li {
		border-bottom: 1px solid var( --wp--preset--color--rule );
		border-right: 0;
		padding: 2rem 0;
	}

	.glh-quotes li:last-child {
		border-bottom: 0;
	}
}

.glh-quotes__stars {
	color: var( --wp--preset--color--gold-dark );
	font-size: 0.875rem;
	letter-spacing: 0.24em;
	margin: 0;
}

.glh-quotes blockquote {
	border: 0;
	color: var( --wp--preset--color--ink );
	flex: 1;
	font-family: var( --wp--preset--font-family--body );
	font-size: 1.1875rem;
	line-height: 1.55;
	margin: 1.25rem 0 0;
	padding: 0;
}

.glh-quotes__by {
	border-top: 1px solid var( --wp--preset--color--rule );
	margin-top: 1.75rem;
	padding-top: 1.125rem;
}

.glh-quotes__name {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.0625rem;
	font-weight: 800;
	margin: 0;
}

.glh-quotes__meta {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.75rem;
	letter-spacing: 0.14em;
	margin: 0.3125rem 0 0;
	text-transform: uppercase;
}

/* --------------------------------------------------------------------------
   Closing CTA
   -------------------------------------------------------------------------- */

/* The courtroom photograph is a core/cover, so the scrim comes from the block.
   A hairline of gold along the top edge ties the band to the rest of the page. */
.glh-cta {
	border-top: 3px solid var( --wp--preset--color--gold );
}

/*
 * A cover constrains its inner container but never picks up the root padding an
 * alignfull group gets, so on viewports under ~1480px the band would sit 40px
 * wider than every other one. Widening the cap by the gutter and paying it back
 * as padding lines the CTA up with the docket above it at every width.
 *
 * `.glh-practicehead` is the photographic masthead on templates/page-practice-
 * area.html, and it is the same cover with the same fault: core leaves a bare
 * cover at `padding: 1em`, so the template's top/bottom padding overrode only
 * two sides and the twenty practice-page mastheads were inset 17px against a
 * 40px gutter everywhere else on the page.
 */
/*
 * Zeroing the cover's own inline padding is the other half of it. Core ships a
 * bare cover at `padding: 1em`, and both templates set only the block axis, so
 * the gutter below was landing on top of a 17px inset the cover already had:
 * the band came out at 57px against everyone else's 40. Paying the gutter once,
 * on the inner container, is what lines the two up.
 */
.glh-cta,
.glh-practicehead {
	padding-inline: 0;
}

/*
 * `box-sizing` is the half of that trick it does not work without. Core leaves
 * the inner container at `content-box`, so "cap plus two gutters, paid back as
 * padding" was not paying anything back — the cap applied to the content box
 * and the padding was added outside it, leaving a 1480px column inside a 1400px
 * frame. Everything in the masthead hid it, because a constrained layout centres
 * a child narrower than its container: the breadcrumb, the eyebrow, the H1 and
 * the buttons all cap at the frame's 1400 and were being centred back onto the
 * frame's left edge, 40px in. The lede is the one child that opts out of that
 * centring (`.gl-measure`, above), so it alone sat at the container's true left
 * edge and hung 40px out past the rest of the masthead.
 */
.glh-cta > .wp-block-cover__inner-container,
.glh-practicehead > .wp-block-cover__inner-container {
	box-sizing: border-box;
	max-width: calc( var( --glh-max ) + 2 * var( --gl-gutter ) );
	padding-inline: var( --gl-gutter );
}

/*
 * The intake form is the tallest thing in this band by 250-350px, and stretching
 * the copy against it is what made the CTA look lopsided: the copy stacked from
 * the top of the row and stopped where it ran out, leaving a quarter of the left
 * half as bare navy under the address while the form card ran on to the floor.
 *
 * Centring the two against each other is the balance, rather than spreading the
 * copy's own blocks apart to reach the bottom — that only moves the same slack
 * into two holes inside the column, and the eyebrow, headline and deck read as
 * one typographic unit that should not be pulled open to fill a form's height.
 * The slack sits evenly above and below the copy instead, where it is air.
 */
.glh-cta__grid {
	align-items: center;
	display: grid;
	gap: clamp( 2.5rem, 5vw, 4.5rem );
	grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1.05fr );
}

@media ( max-width: 900px ) {
	.glh-cta__grid {
		grid-template-columns: 1fr;
	}
}

.glh-cta__copy .glh-deck {
	max-width: 44ch;
}

/*
 * The label that introduces the reading list where the closing band carries a
 * docket above it. It replaces a second section head, so it needs the air a
 * heading would have had above it without the weight of one.
 */
.glh-subhead {
	border-top: 1px solid var( --glh-hair-dark );
	margin-top: clamp( 2.75rem, 4vw, 4rem );
	padding-top: clamp( 1.75rem, 2.5vw, 2.5rem );
}

/*
 * The statute-of-limitations line on the pages that override the deck with a
 * closing address of their own. Set below the deck rather than beside it: it is
 * the small print of the offer, not the offer.
 */
.glh-cta__note {
	color: var( --wp--preset--color--ink-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin-top: 1.25rem;
	max-width: 48ch;
}

.glh-nextsteps {
	border-top: 1px solid var( --glh-hair-light );
	list-style: none;
	margin: 2.5rem 0 0;
	padding: 0;
}

.glh-nextsteps li {
	align-items: baseline;
	border-bottom: 1px solid var( --glh-hair-light );
	color: var( --wp--preset--color--ink-muted );
	display: grid;
	font-size: 0.9375rem;
	gap: 1rem;
	grid-template-columns: 2rem 1fr;
	padding: 1.125rem 0;
}

/* The contact block below closes the list with its own rule, so the last row
   drops the one it would otherwise draw 2.5rem above it. */
.glh-nextsteps li:last-child {
	border-bottom: 0;
}

.glh-nextsteps span {
	color: var( --wp--preset--color--gold );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 0.8125rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0.08em;
}

/*
 * The foot of the copy column: the phone number and the address, taken together.
 *
 * They sit side by side rather than stacked so the block spans the column the
 * way the numbered steps above it do — stacked, they held about half its width
 * and the address trailed off into the middle of the band. The hairline is the
 * same one the steps carry, so the column closes on the rule it opened on.
 */
.glh-cta__reach {
	align-items: center;
	border-top: 1px solid var( --glh-hair-light );
	column-gap: clamp( 1.75rem, 3vw, 3rem );
	display: flex;
	flex-wrap: wrap;
	margin-top: 0;
	padding-top: 2.5rem;
	row-gap: 1.5rem;
}

.glh-nap {
	color: rgba( 207, 217, 228, 0.85 );
	font-size: 0.9375rem;
	line-height: 1.75;
	margin: 2rem 0 0;
}

/* Inside the reach block the two are laid out by its own gaps. */
.glh-cta__reach .glh-hero__actions,
.glh-cta__reach .glh-nap {
	margin-top: 0;
}

.glh-nap a {
	color: var( --wp--preset--color--gold );
	text-decoration: none;
}

.glh-nap a:hover {
	text-decoration: underline;
}

.glh-cta__form {
	background: var( --wp--preset--color--paper );
	border-top: 3px solid var( --wp--preset--color--gold );
	box-shadow: 0 24px 64px rgba( 5, 14, 24, 0.4 );
}

.glh-cta__form .gl-form {
	border-radius: 0;
}

/* --------------------------------------------------------------------------
   Practice-areas hub — /practice-areas/

   The one interior page rendered in this layer rather than the `gl-` one. It
   is what the home page's docket links to, so it carries the same masthead,
   the same numbered index and the same section heads — the fuller version of
   that section rather than a different component.
   -------------------------------------------------------------------------- */

/* Band tones, so a page body can alternate grounds the way the home page does. */
.glh-band--bone {
	background: var( --wp--preset--color--bone );
}

.glh-band--paper {
	background: var( --wp--preset--color--paper );
}

/* The navy tone the About page's standard band runs on. */
.glh-band--ink {
	background: var( --wp--preset--color--ink );
}

.glh-band--bone > .wp-block-group__inner-container,
.glh-band--paper > .wp-block-group__inner-container,
.glh-band--ink > .wp-block-group__inner-container {
	margin-inline: auto;
	max-width: var( --glh-max );
	position: relative;
	width: 100%;
	z-index: 1;
}

/*
 * Breadcrumbs take the dateline's place on the hub masthead. They carry no
 * colour of their own — on the default page template they inherited it from
 * the navy group block, and here they have to be told.
 */
.glh-hub__crumbs .gl-breadcrumbs {
	color: rgba( 207, 217, 228, 0.85 );
	margin: 0;
}

.glh-hub__crumbs .gl-breadcrumbs a {
	color: var( --wp--preset--color--gold );
}

/*
 * The title comes from wp:post-title, so the headline cannot carry an <em>
 * accent the way the home hero's hand-written one does. It runs a step tighter
 * instead, and the gold lives in the eyebrow, the rules and the ledger.
 */
.glh-hub__title {
	/* Held at the same 58px ceiling as the home hero — a hub masthead is the
	   same rank of headline, and in caps the old 68px ran past its own column. */
	font-size: clamp( 2.25rem, 1.4rem + 2.6vw, 3.625rem );
	max-width: 18ch;
}

.glh-hub__deck p {
	margin: 0;
}

/*
 * The hub masthead is the two-column version of the home one.
 *
 * `.glh-hero__grid` is a single centred column, because on the home page the
 * right of the frame is the photograph and the flex column is what holds the
 * type in the open left half. The hubs have no photograph and do have a second
 * element, so under that rule the ledger fell below the lede and centred itself
 * across the measure — a panel floating in the middle of the band with an empty
 * half beside it. It gets a real grid back here, scoped to the hubs.
 *
 * Type takes the wider column: the headline is a post title set in display caps
 * and has to break somewhere sensible, while the ledger is three figures and a
 * gloss and reads at any width down to about 30rem.
 */
/*
 * The split is 1.12/0.88 rather than even, and the gutter is narrower than the
 * home hero's, because both columns have a floor. The type column has to hold
 * the button row on one line — 586px of `Start your free case review` beside
 * `Call (214) 957-0898`, the same pair the lede's own measure was widened for —
 * and the ledger has to hold a seven-figure display number beside its tracked
 * caps without the two meeting. Below about 1180px they cannot both have it, so
 * that is where the second column goes under.
 */
.glh-hub .glh-hero__grid {
	align-items: center;
	display: grid;
	gap: clamp( 2rem, 3.2vw, 4.5rem );
	grid-template-columns: minmax( 0, 1.12fr ) minmax( 0, 0.88fr );
}

/*
 * Stacked, the ledger keeps the lede's left edge and a measure of its own. It
 * is the centring that was the fault, not the stacking.
 */
@media ( max-width: 1180px ) {
	.glh-hub .glh-hero__grid {
		gap: clamp( 2.5rem, 5vw, 3.5rem );
		grid-template-columns: minmax( 0, 1fr );
	}
}

/*
 * The proof panel. The home hero puts a matted photograph here; four
 * photographs carry the whole site and three of them are already on this
 * page's children, so the hub earns its right-hand column with the ledger
 * instead — which is also the thing a visitor choosing a practice area is
 * actually weighing.
 */
.glh-hub__ledger {
	align-self: center;
	justify-self: stretch;
	border: 1px solid var( --glh-hair-light );
	padding: clamp( 1.5rem, 2.5vw, 2.25rem );
	position: relative;
}

/*
 * The ledger is outside `.glh-load` — it is the second column, not the fifth
 * line of the first — so it carries its own delay, landing between the button
 * row and the credentials rule rather than standing there fully drawn while the
 * headline is still arriving.
 */
@media ( prefers-reduced-motion: no-preference ) {
	.glh-hub__ledger {
		animation: glh-rise 0.8s var( --glh-ease-out ) 0.38s backwards;
	}
}

.glh-hub__ledger::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 3px;
	left: -1px;
	position: absolute;
	top: -1px;
	width: 4.5rem;
}

.glh-hub__ledger-list {
	list-style: none;
	margin: 1.75rem 0 0;
	padding: 0;
}

.glh-hub__ledger-list li {
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 0 1.25rem;
	grid-template-columns: minmax( 0, 1fr ) auto;
	padding: 1.125rem 0;
}

.glh-hub__ledger-list li:first-child {
	border-top: 0;
	padding-top: 0;
}

.glh-hub__ledger-list li:last-child {
	padding-bottom: 0;
}

.glh-hub__amount {
	color: var( --wp--preset--color--gold );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	font-feature-settings: "tnum" 1;
	font-size: clamp( 1.625rem, 1.2rem + 1.1vw, 2.125rem );
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1;
}

.glh-hub__type {
	align-self: center;
	color: rgba( 207, 217, 228, 0.75 );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.16em;
	text-align: right;
	text-transform: uppercase;
}

.glh-hub__label {
	color: rgba( 207, 217, 228, 0.9 );
	font-size: 0.875rem;
	grid-column: 1 / -1;
	line-height: 1.5;
	margin-top: 0.5rem;
}

.glh-hub__note {
	border-top: 1px solid var( --glh-hair-light );
	color: rgba( 207, 217, 228, 0.6 );
	font-size: 0.75rem;
	line-height: 1.5;
	margin: 1.5rem 0 0;
	padding-top: 1.25rem;
}

/*
 * Stacked it runs the full measure rather than holding the 34rem column it had
 * beside the lede. A ledger is a rule of figures — set wide it reads as one,
 * with the amount and its class at either end of the line, and it gives the
 * foot of the band something to stand on instead of half a panel and an empty
 * right.
 */
@media ( max-width: 1180px ) {
	.glh-hub__ledger {
		max-width: none;
	}
}

/* The Spanish pages, on a hairline under the city index. */
.glh-hub__espanol {
	align-items: start;
	border-top: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 1rem clamp( 2rem, 5vw, 4rem );
	grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1.4fr );
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
	padding-top: clamp( 1.75rem, 3vw, 2.5rem );
}

.glh-hub__espanol-text p + p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.875rem 0 0;
	max-width: 40ch;
}

.glh-hub__espanol ul {
	display: flex;
	flex-direction: column;
	gap: 0.875rem;
	list-style: none;
	margin: 0;
	padding: 0;
}

.glh-hub__espanol li {
	display: flex;
}

/* Three of them stacked, so a step down from the single-CTA default. */
.glh-hub__espanol .glh-textlink {
	font-size: 0.9375rem;
	white-space: normal;
}

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

/* --------------------------------------------------------------------------
   Service Areas — /services-areas/

   The third interior page promoted into this layer, and the one with the
   clearest case for it. The hub's cities band and this page carry the same
   four city links, but the band rendered them as the docket and the page —
   the destination that band points at — rendered them as plain link cards
   under a heading identical to the band's own. The page you were sent to was
   a quieter copy of the section that sent you.

   `.glh-places` is the directory the page exists for: every location the firm
   serves, one card each, the city large and the state small beneath it.
   Twenty-eight of them, taken from the live page's own list — which was an
   unordered run of bare `<li>`s carrying labels like "Car Accident Lawyer
   Azle", with McKinney and Mesquite each listed twice, Denton and Irving
   dropped into the middle of the alphabet, and the whole thing sorted almost
   but not quite.

   Two kinds of card, one face. Thirteen locations have somewhere on this site
   to send you and carry an arrow; the rest are places the firm files in and
   travels to, and are static. The card answers "do they cover where I live"
   either way, so they read as one directory rather than as two lists — and
   the arrow, not a different colour or weight, is what says this one also
   goes somewhere.
   -------------------------------------------------------------------------- */

.glh-places {
	display: grid;
	gap: clamp( 0.75rem, 1.2vw, 1rem );
	grid-template-columns: repeat( auto-fill, minmax( min( 100%, 11.5rem ), 1fr ) );
	list-style: none;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	padding: 0;
}

.glh-places__item {
	display: flex;
	min-width: 0;
}

/*
 * The same paper-on-bone face the docket cards use, at a smaller scale —
 * twenty-eight of these sit on one screen where the docket carries four.
 * `flex: 1` so the cards in a row are the same size whether the city is
 * "Azle" or "North Richland Hills".
 */
.glh-places__card {
	align-content: center;
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.05 );
	display: grid;
	flex: 1;
	grid-template-columns: minmax( 0, 1fr ) auto;
	min-width: 0;
	overflow: hidden;
	padding: clamp( 0.9375rem, 1.4vw, 1.125rem ) clamp( 1rem, 1.5vw, 1.25rem );
	position: relative;
	text-decoration: none;
	transition: border-color var( --gl-ease ), box-shadow var( --gl-ease ),
		transform var( --gl-ease );
}

/* A white card on a white band reads as nothing at all. */
.glh-band--paper .glh-places__card {
	background: var( --wp--preset--color--bone );
}

.glh-places__city {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1rem, 0.95rem + 0.2vw, 1.125rem );
	font-weight: 800;
	grid-column: 1;
	grid-row: 1;
	letter-spacing: 0.01em;
	line-height: 1.2;
	transition: color var( --gl-ease );
}

.glh-places__state {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.6875rem;
	font-weight: 700;
	grid-column: 1;
	grid-row: 2;
	letter-spacing: 0.14em;
	line-height: 1.4;
	margin-top: 0.25rem;
	text-transform: uppercase;
}

/*
 * Pinned to the top-right rather than trailing the city: the cards in a row
 * are as tall as the tallest, and a name that wraps to two lines would carry
 * its arrow down with it and leave the row's arrows at three heights.
 */
.glh-places__arrow {
	color: var( --wp--preset--color--gold-dark );
	grid-column: 2;
	grid-row: 1 / -1;
	line-height: 1;
	opacity: 0.55;
	padding-left: 0.75rem;
	transition: opacity var( --gl-ease ), transform var( --gl-ease );
}

/* The gold wipe the docket cards carry, on the ones that go somewhere. */
a.glh-places__card::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 2px;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	transform: scaleX( 0 );
	transform-origin: left center;
	transition: transform 260ms var( --glh-ease-out );
}

a.glh-places__card:hover,
a.glh-places__card:focus-visible {
	border-color: var( --wp--preset--color--gold );
	box-shadow: 0 8px 24px rgba( 15, 42, 68, 0.1 );
	transform: translateY( -2px );
}

a.glh-places__card:hover::before,
a.glh-places__card:focus-visible::before {
	transform: scaleX( 1 );
}

a.glh-places__card:hover .glh-places__arrow,
a.glh-places__card:focus-visible .glh-places__arrow {
	opacity: 1;
	transform: translateX( 3px );
}

/* --------------------------------------------------------------------------
   Contact — /contact-us/

   The page the site converts on, and the one page whose masthead the form has
   to be visible from. It used to close the page instead — the site-wide CTA
   band, four screens down on a desktop and nine on a phone, reached by a jump
   link from a button promising it.

   It does not follow that the form belongs *in* the masthead. Six fields and a
   consent notice make a panel eleven hundred pixels tall; set beside a
   headline and a number it left half the band as empty navy, and a masthead
   that is mostly hole reads as a mistake however good the thing beside it is.

   So the form gets the band under the masthead — its own ground, sized to
   itself, first thing after the fold rather than last thing before the footer.
   The masthead goes back to what the other three in this layer do: copy left,
   panel right, both short. The panel is the number and the hours, because
   "a lawyer answers at any hour" is the one claim no competitor's contact page
   can match; the address is not in it, and is left to the visit card down at
   `#finding-us` where the map can stand behind it.
   -------------------------------------------------------------------------- */

/*
 * The masthead panel. It borrows the hub ledger's frame and gold corner tick
 * and fills it with the two things worth ringing about.
 */
.glh-reach__no {
	margin: 1.5rem 0 0;
}

.glh-reach__no a {
	color: var( --wp--preset--color--gold );
	display: inline-block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: clamp( 1.75rem, 1.3rem + 1.5vw, 2.375rem );
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1.05;
	text-decoration: none;
	transition: color var( --gl-ease );
}

.glh-reach__no a:hover,
.glh-reach__no a:focus-visible {
	color: #fff;
	text-decoration: underline;
	text-underline-offset: 0.14em;
}

.glh-reach__note {
	color: rgba( 207, 217, 228, 0.85 );
	font-size: 0.9375rem;
	line-height: 1.55;
	margin: 0.75rem 0 0;
}

/*
 * Three labelled rows on hairlines, the same shape the ledger uses for its
 * recoveries — a contact panel and a schedule of figures want the same thing
 * from a reader, which is to be scanned rather than read.
 */
.glh-reach__rows {
	margin: 1.5rem 0 0;
}

.glh-reach__rows > div {
	align-items: baseline;
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 0 1.25rem;
	grid-template-columns: 7.5rem minmax( 0, 1fr );
	padding: 0.875rem 0;
}

.glh-reach__rows > div:last-child {
	padding-bottom: 0;
}

.glh-reach__rows dt {
	color: var( --wp--preset--color--gold );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.16em;
	text-transform: uppercase;
}

.glh-reach__rows dd {
	color: rgba( 207, 217, 228, 0.9 );
	font-size: 0.9375rem;
	line-height: 1.5;
	margin: 0;
	overflow-wrap: anywhere;
}

.glh-reach__rows dd a {
	color: inherit;
	text-underline-offset: 0.2em;
}

.glh-reach__rows dd a:hover,
.glh-reach__rows dd a:focus-visible {
	color: var( --wp--preset--color--gold );
}

@media ( max-width: 520px ) {
	.glh-reach__rows > div {
		grid-template-columns: 1fr;
		gap: 0.25rem;
	}
}

/* --------------------------------------------------------------------------
   Free case review — the band under the masthead

   The site-wide CTA's layout, moved to the front of the page and turned the
   right way up: copy and expectations on the left, the form on the right, the
   whole band as tall as the form and no taller. Paper rather than the CTA's
   photographed navy, so the two dark bands at the head and foot of the page do
   not run into one another through it, and so the band alternates against the
   bone one under it.

   `glh-intake`, not `glh-review`: `.glh-review` is a single testimonial on the
   client-reviews page, and a band wearing it inherited that component's paper
   ground — which is why this band came out white on a `--bone` class and took
   a computed-style probe to explain.
   -------------------------------------------------------------------------- */

.glh-intake__grid {
	align-items: start;
	display: grid;
	gap: clamp( 2.5rem, 5vw, 4.5rem );
	grid-template-columns: minmax( 0, 1fr ) minmax( 0, 1.08fr );
}

@media ( max-width: 900px ) {
	.glh-intake__grid {
		grid-template-columns: 1fr;
	}
}

/*
 * The copy column stays with the form as it is filled in — six fields is a
 * long scroll on a laptop, and the three steps are what someone wants in
 * front of them while they decide how much to write.
 */
@media ( min-width: 901px ) {
	.glh-intake__copy {
		position: sticky;
		top: clamp( 2rem, 5vh, 4rem );
	}
}

.glh-intake__copy .glh-deck {
	margin-top: 1.5rem;
	max-width: 46ch;
}

/*
 * The steps, on hairlines. Shared with nothing else on the page: the reach-us
 * cards are choices and the before-you-call tiles are a checklist, and this is
 * neither — it is a sequence, and a rule between each pair is what says so.
 */
.glh-next__list {
	list-style: none;
	margin: clamp( 2rem, 3.5vw, 2.75rem ) 0 0;
	max-width: 46ch;
	padding: 0;
}

.glh-next__list li {
	align-items: baseline;
	color: var( --wp--preset--color--slate-muted );
	display: grid;
	font-size: 0.9375rem;
	gap: 0 1.125rem;
	grid-template-columns: auto minmax( 0, 1fr );
	line-height: 1.6;
}

.glh-next__list li + li {
	border-top: 1px solid var( --wp--preset--color--rule );
	margin-top: 1rem;
	padding-top: 1rem;
}

.glh-next__list span {
	color: var( --wp--preset--color--gold-dark );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 0.875rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0.06em;
}

/*
 * The one case where the form is the wrong channel, said next to the form
 * rather than after it. Gold rule at the left edge: it is an aside to the
 * three steps above, not a fourth one.
 */
.glh-intake__urgent {
	border-left: 2px solid var( --wp--preset--color--gold );
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: clamp( 2rem, 3.5vw, 2.75rem ) 0 0;
	max-width: 44ch;
	padding-left: 1.25rem;
}

.glh-intake__urgent a {
	color: var( --wp--preset--color--gold-dark );
	font-weight: 600;
	text-underline-offset: 0.2em;
}

/*
 * `.gl-form` draws itself as a paper card. On bone it needs the edge and the
 * shadow the CTA's navy gave it for free, or it reads as a lighter patch of
 * the band rather than as a panel sitting on it.
 */
.glh-intake__form {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	border-top: 3px solid var( --wp--preset--color--gold );
	box-shadow: 0 18px 44px -24px rgba( 15, 42, 68, 0.45 );
	overflow: hidden;
}

.glh-intake__form .gl-form,
.glh-intake__form .gl-form__success {
	border-radius: 0;
}

/*
 * The number, the mailbox, the address — the one line in each reach-us card
 * that is the thing itself rather than a description of it. Display face, so
 * all three can be picked out of the row without reading the bodies under
 * them, and held at fixed height so the growing body below stays the part
 * that absorbs the difference between the three cards.
 */
.glh-cards__lede {
	margin: 0.875rem 0 0;
}

.glh-cards .glh-cards__lede {
	flex-grow: 0;
}

.glh-cards__lede a {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 1.1875rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0.01em;
	line-height: 1.3;
	overflow-wrap: anywhere;
	text-decoration: none;
	text-underline-offset: 0.16em;
	transition: color var( --gl-ease );
}

.glh-cards__lede a:hover,
.glh-cards__lede a:focus-visible {
	color: var( --wp--preset--color--gold-dark );
	text-decoration: underline;
}

/*
 * `.glh-pillars` is a three-column ruled grid, and `li:last-child` is what
 * drops the gutter at the right edge. At six items the right edge is the
 * third and the sixth, so the third keeps a gutter nothing sits in and its
 * rule stops short of the ones above and below it.
 */
.glh-pillars--six li:nth-child( 3n ) {
	padding-right: 0;
}

@media ( max-width: 720px ) {
	.glh-pillars--six li:nth-child( 3n ) {
		padding-right: 1.5rem;
	}
}

/*
 * The map. `aspect-ratio` rather than the iframe's own height attribute, so
 * the space is reserved before the frame loads and a lazily-loaded map cannot
 * shove the footer down as it arrives.
 */
.glh-map {
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
	overflow: hidden;
}

.glh-map iframe {
	aspect-ratio: 21 / 9;
	border: 0;
	display: block;
	height: auto;
	width: 100%;
}

@media ( max-width: 781px ) {
	.glh-map iframe {
		aspect-ratio: 4 / 3;
	}
}

/* --------------------------------------------------------------------------
   Contact cards

   The site states its lists as ruled columns and no boxes — `.glh-pillars`,
   the same shape on every interior page. This page is the exception it is
   worth making: each item here is something you act on rather than something
   you read, and an edge is what tells you so. The cards below carry an
   action apiece; the ruled columns never could.

   Three treatments, deliberately unalike, so two carded sections in one
   scroll do not read as the same section printed twice:

     `.glh-cards`  paper, raised, one action apiece — the ways to reach us
     `.glh-tiles`  bone, flat, compact — the six things worth having to hand
     `.glh-visit`  navy, beside the map — hours and how to get here

   Paper cards land on the bone band and bone tiles on the paper band, so a
   surface always separates from its ground without a heavier border. Same
   trick as `.glh-band--paper .glh-places__card` above, taken further.
   -------------------------------------------------------------------------- */

.glh-cards {
	display: grid;
	gap: 1.25rem;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	list-style: none;
	margin: 3.25rem 0 0;
	padding: 0;
}

/*
 * One column, not two: three cards do not halve, and the odd one left on its
 * own row is wider than the pair above it and reads as a fourth thing.
 */
@media ( max-width: 900px ) {
	.glh-cards {
		grid-template-columns: 1fr;
	}
}

/*
 * Flex column so the action can be pushed to the bottom edge. The three
 * bodies are not the same length and the row is as tall as the tallest, so
 * without it the links sit at three different heights.
 */
.glh-cards li {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.05 );
	display: flex;
	flex-direction: column;
	overflow: hidden;
	padding: 1.75rem;
	position: relative;
	transition: border-color var( --gl-ease ), box-shadow var( --gl-ease ),
		transform var( --gl-ease );
}

.glh-band--paper .glh-cards li {
	background: var( --wp--preset--color--bone );
}

/* The gold edge the pillars carried as a rule above the number. */
.glh-cards li::before {
	background: var( --wp--preset--color--gold );
	content: "";
	height: 3px;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
}

/*
 * `:focus-within` as well as `:hover` — the action inside is a link, and a
 * card that lifts under the mouse but not under the keyboard leaves someone
 * tabbing through with no idea which of the three they are in.
 */
.glh-cards li:hover,
.glh-cards li:focus-within {
	border-color: var( --glh-gold-hair );
	box-shadow: 0 8px 24px rgba( 15, 42, 68, 0.1 );
}

@media ( prefers-reduced-motion: no-preference ) {
	.glh-cards li:hover,
	.glh-cards li:focus-within {
		transform: translateY( -2px );
	}
}

.glh-cards__no {
	/*
	 * gold-dark, not gold: this numeral only ever sits on paper or bone (see
	 * .glh-band--paper .glh-cards li below), where gold measures 2.69:1 and
	 * gold-dark 5.47:1. At 14px it needs 4.5:1, and a step number nobody can
	 * read is not worth the brighter tone.
	 */
	color: var( --wp--preset--color--gold-dark );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 0.875rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0.06em;
}

.glh-cards h3 {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.25rem;
	font-weight: 800;
	letter-spacing: 0.005em;
	margin: 0.625rem 0 0;
}

.glh-cards p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.625rem 0 0;
}

/*
 * The body grows and the action keeps a fixed margin, rather than the action
 * taking `margin-top: auto`: an auto margin collapses to nothing in the
 * tallest card of the row, which is exactly the one where the rule would
 * then sit hard against the last line of prose.
 */
.glh-cards li > p:not( .glh-cards__act ) {
	flex-grow: 1;
}

/* The hairline is what stops the link reading as one more line of the body. */
.glh-cards .glh-cards__act {
	border-top: 1px solid var( --wp--preset--color--rule );
	flex-grow: 0;
	margin-top: 1.5rem;
	padding-top: 1rem;
}

/* --------------------------------------------------------------------------
   Tiles — the six things worth having to hand
   -------------------------------------------------------------------------- */

.glh-tiles {
	display: grid;
	gap: 0.875rem;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	list-style: none;
	margin: 3.25rem 0 0;
	padding: 0;
}

@media ( max-width: 900px ) {
	.glh-tiles {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}
}

@media ( max-width: 620px ) {
	.glh-tiles {
		grid-template-columns: 1fr;
	}
}

/*
 * Flat and quiet on purpose. These six are a checklist, not six choices —
 * giving them the lift and the gold edge of the cards above would ask for a
 * decision the section is not making.
 */
.glh-tiles li {
	background: var( --wp--preset--color--bone );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --wp--custom--radius-sm, 6px );
	display: grid;
	gap: 0 0.875rem;
	grid-template-columns: auto minmax( 0, 1fr );
	padding: 1.25rem;
}

/*
 * A chip rather than the bare numeral the pillars use: at this size the
 * number sits beside the heading instead of above it, and it needs an edge
 * of its own to stay a label and not the first word of the line.
 */
.glh-tiles__no {
	align-items: center;
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --glh-gold-hair );
	border-radius: 999px;
	color: var( --wp--preset--color--gold-dark );
	display: inline-flex;
	font-feature-settings: "tnum" 1;
	font-size: 0.6875rem;
	font-variant-numeric: tabular-nums;
	font-weight: 700;
	grid-column: 1;
	grid-row: 1;
	height: 1.625rem;
	justify-content: center;
	letter-spacing: 0.04em;
	width: 1.625rem;
}

.glh-tiles h3 {
	align-self: center;
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.0625rem;
	font-weight: 800;
	grid-column: 2;
	grid-row: 1;
	letter-spacing: 0.01em;
	line-height: 1.3;
	margin: 0;
}

.glh-tiles p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.875rem;
	grid-column: 2;
	grid-row: 2;
	line-height: 1.6;
	margin: 0.5rem 0 0;
}

/* The chip's column collapses under the heading's on a phone. */
@media ( max-width: 480px ) {
	.glh-tiles p {
		grid-column: 1 / -1;
	}
}

/* --------------------------------------------------------------------------
   Visit — the map, and a card beside it
   -------------------------------------------------------------------------- */

.glh-visit {
	align-items: stretch;
	display: grid;
	gap: 1.25rem;
	grid-template-columns: minmax( 0, 1.6fr ) minmax( 0, 1fr );
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
}

@media ( max-width: 900px ) {
	.glh-visit {
		grid-template-columns: 1fr;
	}
}

/* The map keeps its frame, and gives up the top margin the grid now sets. */
.glh-visit .glh-map {
	margin-top: 0;
}

/*
 * 21:9 is right for a map running the full measure. In a column two-thirds
 * that wide it is a letterbox with nothing in it but road, and it leaves the
 * card beside it half a screen taller.
 */
.glh-visit .glh-map iframe {
	aspect-ratio: 16 / 10;
}

/*
 * Navy, where the two above are paper and bone — and the only navy surface
 * between the masthead and the closing band, which is what makes it read as
 * the page's other panel rather than a third card. It is where the office
 * block from the old masthead ended up: the hours, the two map links and the
 * standing offer to come to you, none of which the reach-us card above has
 * room to say properly.
 */
.glh-visit__card {
	background: var( --wp--preset--color--ink );
	border-radius: var( --gl-radius );
	display: flex;
	flex-direction: column;
	padding: clamp( 1.5rem, 2vw, 1.875rem );
}

/*
 * Grows so the two map links settle on the card's bottom edge rather than
 * leaving a hand's width of empty navy under them: the card is as tall as
 * the map beside it, and the rows never fill it on their own.
 */
.glh-visit__rows {
	flex-grow: 1;
	margin: 1.5rem 0 0;
}

.glh-visit__rows > div + div {
	border-top: 1px solid var( --glh-hair-light );
	margin-top: 1rem;
	padding-top: 1rem;
}

.glh-visit__rows dt {
	color: var( --wp--preset--color--gold );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.16em;
	text-transform: uppercase;
}

.glh-visit__rows dd {
	color: var( --wp--preset--color--ink-muted );
	font-size: 0.9375rem;
	line-height: 1.55;
	margin: 0.375rem 0 0;
}

/*
 * The phone and email in these rows are bare <a>s, so they were taking the
 * global gold-dark — 2.67:1 on this navy, the dimmest thing in a panel of
 * ink-muted text, and the only part of it that is actually a link. Gold is
 * 5.43:1 here. Same correction as .wp-block-cover.is-dark .gl-breadcrumbs a,
 * for the same reason: gold-dark is the light-ground variant.
 */
.glh-visit__rows dd a {
	color: var( --wp--preset--color--gold );
}

/* Same two deep links as the masthead panel, for the same reason. */
.glh-visit__go {
	border-top: 1px solid var( --glh-hair-light );
	display: flex;
	flex-direction: column;
	gap: 0.625rem;
	margin: 1.5rem 0 0;
	padding-top: 1.25rem;
}

.glh-visit__go a {
	color: var( --wp--preset--color--paper );
	font-size: 0.8125rem;
	font-weight: 600;
	letter-spacing: 0.02em;
	text-decoration: none;
	width: fit-content;
}

.glh-visit__go a::after {
	color: var( --wp--preset--color--gold );
	content: " \2192";
}

.glh-visit__go a:hover,
.glh-visit__go a:focus-visible {
	color: var( --wp--preset--color--gold );
}

/* --------------------------------------------------------------------------
   Closing band — this page's stand-in for the CTA pattern

   Every other page closes on `genthe/cta-free-case-review`: the courtroom
   photograph, the two-year deadline on the left, the intake form on the
   right. The form is in this page's masthead and its fields carry fixed ids,
   so the pattern cannot run here without emitting every one of them a second
   time — and a page with two `#genthe-name` inputs is a page where half the
   labels point at the wrong field.

   What is left is the half worth keeping: the deadline, and two ways to act
   on it. Set in one centred column rather than the pattern's two, so the band
   reads as a close and not as a thinner second copy of the top of the page.
   -------------------------------------------------------------------------- */

.glh-close {
	background:
		linear-gradient(
			96deg,
			rgba( 10, 24, 38, 0.97 ) 0%,
			rgba( 15, 42, 68, 0.9 ) 48%,
			rgba( 15, 42, 68, 0.74 ) 100%
		),
		url( "assets/img/courtroom.webp" ) center / cover no-repeat;
	/* The gold edge `.glh-cta` carries, so the close reads the same site-wide. */
	border-top: 3px solid var( --wp--preset--color--gold );
	padding-block: clamp( 4.5rem, 7vw, 7rem );

	/*
	 * The gutter, stated. `useRootPaddingAwareAlignments` pays it back to
	 * alignfull *blocks*; this band is a raw section inside a wp:html and
	 * core has nothing to hand it, so on a phone the deck ran into both
	 * edges of the screen.
	 */
	padding-inline: var( --wp--custom--gutter );
}

/* The bands butt up against each other; same rule as `.alignfull.glh-band`. */
.alignfull.glh-close {
	margin-block: 0;
}

.glh-close__inner {
	margin-inline: auto;
	max-width: 48rem;
	text-align: center;
}

/*
 * The eyebrow's gold tick is a flex child and the headline's measure is
 * capped at 20ch, so neither centres on the text-align alone.
 */
.glh-close__inner .glh-eyebrow {
	justify-content: center;
}

.glh-close__inner .glh-head {
	margin-inline: auto;
}

.glh-close__inner .glh-deck {
	margin-inline: auto;
	max-width: 56ch;
}

.glh-close__inner .glh-hero__actions {
	justify-content: center;
	margin-top: 2.5rem;
}

/*
 * The three steps, read across under a rule. Left-aligned inside their
 * columns while everything above them is centred: they are three separate
 * statements in sequence, and centring each one would have left three ragged
 * blocks with no shared edge to follow.
 */
.glh-close__steps {
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 1.5rem clamp( 1.5rem, 3vw, 2.5rem );
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	list-style: none;
	margin: clamp( 2.5rem, 4vw, 3.25rem ) 0 0;
	padding: clamp( 1.75rem, 3vw, 2.25rem ) 0 0;
	text-align: left;
}

@media ( max-width: 700px ) {
	.glh-close__steps {
		grid-template-columns: 1fr;
	}
}

.glh-close__steps li {
	color: rgba( 207, 217, 228, 0.9 );
	font-size: 0.875rem;
	line-height: 1.6;
}

.glh-close__steps span {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 0.875rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0.06em;
	margin-bottom: 0.5rem;
}

/* --------------------------------------------------------------------------
   Client Reviews — /client-reviews/

   The reviews were anonymous. Twenty-four quotes, no name, no date, no source,
   and five gold stars stamped on each of them by the builder rather than read
   off anything. The stars were right — all 132 reviews on the firm's Google
   profile are five-star — but that was luck, not sourcing, and an unattributed
   testimonial is the weakest form of the thing this page exists to be.
   `scrape_reviews.py` now reads the name, the date and the star count off the
   live page, and `.glh-review` prints all three.

   Laid out in CSS columns rather than a grid. Testimonials run from four words
   to four hundred, and a grid row is as tall as its tallest card — twenty-four
   of them left the short ones sitting in a column of white. Columns pack them
   against each other and the page loses about a third of its height.

   `break-inside: avoid` is what keeps a review from being split across the
   column break, and it is the whole reason this works.
   -------------------------------------------------------------------------- */

.glh-reviews {
	column-gap: clamp( 0.875rem, 1.4vw, 1.25rem );
	columns: 3;
	list-style: none;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	padding: 0;
}

@media ( max-width: 1000px ) {
	.glh-reviews {
		columns: 2;
	}
}

@media ( max-width: 640px ) {
	.glh-reviews {
		columns: 1;
	}
}

.glh-review {
	background: var( --wp--preset--color--paper );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	box-shadow: 0 1px 2px rgba( 15, 42, 68, 0.05 );
	break-inside: avoid;
	margin-bottom: clamp( 0.875rem, 1.4vw, 1.25rem );
	padding: clamp( 1.25rem, 2vw, 1.5rem );
}

.glh-band--paper .glh-review {
	background: var( --wp--preset--color--bone );
}

/*
 * The glyphs are `aria-hidden` with the rating in text beside them. An
 * `aria-label` on the paragraph — which is what this was — is a name on an
 * element that does not take one, so most screen readers ignore it and read
 * five stars as five words.
 */
.glh-review__stars {
	/*
	 * gold-dark, matching .glh-quotes__stars, which already made this call for
	 * the home page testimonials. The card ground is paper or bone, where gold
	 * is 2.69:1 and 2.45:1 — under the 3:1 that WCAG 1.4.11 asks of a graphic
	 * you have to read to get the meaning, which a star rating is. gold-dark
	 * is 5.47:1 and 4.98:1 and still reads as amber.
	 */
	color: var( --wp--preset--color--gold-dark );
	font-size: 0.875rem;
	letter-spacing: 0.14em;
	line-height: 1;
	margin: 0;
}

.glh-review__quote {
	border: 0;
	color: var( --wp--preset--color--slate );
	font-size: 0.9375rem;
	line-height: 1.65;
	margin: 0.875rem 0 0;
	padding: 0;
	quotes: none;
}

.glh-review__quote p {
	margin: 0;
}

/*
 * The attribution is the point of the rewrite, so it gets a rule of its own
 * rather than trailing the quote as another line of body copy.
 */
.glh-review__by {
	align-items: baseline;
	border-top: 1px solid var( --wp--preset--color--rule );
	display: flex;
	flex-wrap: wrap;
	gap: 0 0.5rem;
	margin: 1.125rem 0 0;
	padding-top: 0.875rem;
}

.glh-review__name {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 0.9375rem;
	font-weight: 800;
	font-style: normal;
}

.glh-review__date {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.75rem;
	letter-spacing: 0.02em;
}

/*
 * The video the live page opens with and this one did not have at all.
 * `youtube-nocookie.com` rather than `youtube.com`: the same player, without
 * the tracking cookie being set before anyone presses play. `aspect-ratio`
 * reserves the space, so a lazily-loaded frame cannot shove the page down as
 * it arrives.
 */
.glh-video {
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	margin-top: clamp( 2.5rem, 4vw, 3.5rem );
	overflow: hidden;
}

.glh-video iframe {
	aspect-ratio: 16 / 9;
	border: 0;
	display: block;
	height: auto;
	width: 100%;
}

/* --------------------------------------------------------------------------
   About — /about/

   The second interior page rendered in this layer rather than the `gl-` one,
   on the same argument as the hub: the home page already carries a "not a
   settlement mill" section with a pull quote, three ruled pillars and the
   founder's portrait, and the page it sends people to was rendering as a flat
   navy title bar over converted prose. It is the fuller version of that
   section, so it is built from the same components.

   Almost everything here is reuse. The masthead is the hub's, down to the
   ledger panel — a dossier row and a recovery row are the same object, a
   figure with a label under it, so the About panel carries the hub's classes
   rather than a parallel copy of sixty lines. What is new is the standard
   band, the light variants the navy ground needs, and the opener's drop cap.
   -------------------------------------------------------------------------- */

/* The masthead title, like the hub's, comes from wp:post-title and so cannot
   carry an <em> accent. "About" is one word — it wants the room. */
.glh-about-hero__title {
	font-size: clamp( 2.75rem, 1.5rem + 4.4vw, 5rem );
	max-width: 12ch;
}

/*
 * The home page's portrait is pulled up over the ledger band above it. Here
 * the band above is the masthead, whose bottom edge the eye reads as the end
 * of the header — a portrait breaking it looks like a rendering fault rather
 * than a composition. It sits in its own column instead.
 */
.glh-about__grid--page .glh-portrait {
	margin-top: 0;
}

/* The opening paragraph of the founder's section takes a printed drop cap.
   `initial-letter` is not in Firefox, so the float is the implementation and
   the property is left out entirely rather than declared twice. */
.glh-prose--opener::first-letter {
	color: var( --wp--preset--color--ink );
	float: left;
	font-family: var( --wp--preset--font-family--body );
	font-size: 3.9em;
	font-weight: 600;
	line-height: 0.78;
	margin: 0.08em 0.1em 0 0;
}

/* Prose and pillars on the navy ground. */
.glh-prose--light {
	color: var( --wp--preset--color--ink-muted );
}

.glh-pillars--light li {
	border-top-color: var( --glh-hair-light );
}

.glh-pillars--light h3 {
	color: #fff;
}

.glh-pillars--light p {
	color: var( --wp--preset--color--ink-muted );
}

/*
 * Seven eco commitments read as a ledger, not as a three-up card row: two
 * columns of numbered rules, four and three. Below the pillars' own
 * single-column breakpoint this collapses with them.
 */
.glh-pillars--two {
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
}

/* The three-up rule only clears the gutter on its last cell; at two columns
   every right-hand cell is one. */
.glh-pillars--two li:nth-child( 2n ) {
	padding-right: 0;
}

@media ( max-width: 720px ) {
	.glh-pillars--two {
		grid-template-columns: 1fr;
	}
}

/*
 * The standard band. The heading holds the left column on its own — the
 * claim is the section — and the argument runs down the right, which is why
 * this grid is the reverse weighting of the founder's.
 */
.glh-standard__grid {
	display: grid;
	gap: clamp( 2.5rem, 5vw, 5.5rem );
	grid-template-columns: minmax( 0, 0.78fr ) minmax( 0, 1.22fr );
}

@media ( max-width: 900px ) {
	.glh-standard__grid {
		grid-template-columns: 1fr;
	}
}

.glh-standard__head {
	align-self: start;
}

.glh-standard__head .glh-head {
	max-width: 14ch;
}

/* --------------------------------------------------------------------------
   Interior masthead — templates/page.html and page-utility.html

   The third and last page head in this layer, and the one that carries every
   remaining page: Service Areas, Client Reviews, FAQ, Injured? What To Do,
   Eco-Friendly Initiative, Contact, Our Team and the legal pages.

   It exists for the reason the hub's and the About page's do. Those two were
   promoted out of the `gl-` layer because a flat navy title bar was a visible
   downgrade from the section that linked to it — but the flat bar was the
   shared page template, so every other interior page kept it. Promoting the
   template rather than three more pages ends that one band at a time.

   What it is not is a copy of the other two. Both of those pair the title with
   a right-hand panel — recoveries on the hub, the firm at a glance on About —
   and both of those panels are written content. A shared template has no such
   content to place, and a masthead with an empty right column reads as a
   rendering fault. So this one is composed the other way: the title runs
   across the measure, and a hairline under it carries the deck on the left
   and the actions on the right. The width is used, and nothing is invented to
   fill it.

   The actions are the substantive addition. Interior pages carried no call to
   action above the fold at all — the closing CTA is at the foot of a page that
   is often several screens long — so the phone number and the case review are
   now where someone who has just landed can see them.
   -------------------------------------------------------------------------- */

.glh-pagehead__inner {
	margin-inline: auto;
	max-width: var( --glh-max );
	padding-block: clamp( 2.75rem, 5.5vw, 5rem ) clamp( 2.5rem, 4.5vw, 4rem );
}

/*
 * The masthead title is set a step below the hub's. It has to hold titles as
 * long as "Estadísticas de Limitaciones para Accidentes de Automóviles en
 * Texas" without running to five lines, and unlike the hub it is not competing
 * with a panel beside it for weight.
 */
.glh-pagehead__title {
	font-size: clamp( 2.25rem, 1.3rem + 3.4vw, 3.75rem );
	margin-top: 1.5rem;
	max-width: 18ch;
}

/*
 * The article variant of the masthead title — blog posts and search results.
 *
 * Two things change and both are about the difference between a page name and
 * a headline. A page title is a label: "Contact Us", "Truck Accidents", four
 * words that want to be shouted at 18ch in italic caps. A post title is a
 * sentence, it averages three times the length, and several of them turn on
 * punctuation the caps would flatten — "The Real Cost of a 'Minor' Car
 * Accident". At 18ch and uppercase the longest of the 339 ran to five lines
 * and lost its own quotation marks to the transform.
 *
 * So the face, the italic and the ground stay — this is unmistakably the same
 * masthead as every other page's — and the transform comes off, the measure
 * goes out to 26ch, and the ceiling comes down a step to pay for the extra
 * width. Sentence case at 48px reads as an article; caps at 60px reads as a
 * section of the site, which a post is not.
 */
.glh-pagehead__title--article {
	font-size: clamp( 1.875rem, 1.1rem + 2.8vw, 3rem );
	letter-spacing: -0.005em;
	max-width: 26ch;
	text-transform: none;
}

/*
 * On a post the kicker is the category, and `core/post-terms` renders it as a
 * link — so the one eyebrow on the site that is clickable was also the one
 * that arrived underlined, in a row of gold small-caps that is plain text
 * everywhere else. The link is worth keeping (it is the fastest route from an
 * article to its archive); the underline is not, until it is pointed at.
 */
.glh-pagehead__kicker a {
	color: inherit;
	text-decoration: none;
}

.glh-pagehead__kicker a:hover,
.glh-pagehead__kicker a:focus-visible {
	text-decoration: underline;
	text-underline-offset: 0.25em;
}

/* With no eyebrow above it — an unparented page with no kicker written for it
   — the title would otherwise start with the eyebrow's top margin missing. */
.glh-pagehead__inner > .glh-pagehead__title:first-child {
	margin-top: 0;
}

/*
 * Deck left, actions right, on a hairline. Below the breakpoint they stack in
 * that order, which is also the order they are read in: what the page is, then
 * what to do about it.
 */
.glh-pagehead__foot {
	align-items: end;
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 1.75rem clamp( 2rem, 5vw, 4.5rem );
	grid-template-columns: minmax( 0, 1fr ) auto;
	margin-top: clamp( 2rem, 3.5vw, 3rem );
	padding-top: clamp( 1.75rem, 3vw, 2.5rem );
}

.glh-pagehead__deck {
	margin: 0;
	max-width: 52ch;
}

.glh-pagehead__deck p {
	margin: 0;
}

/* The row is already at the foot of the masthead — it needs no margin of its
   own on top of the grid gap. */
.glh-pagehead__actions {
	margin-top: 0;
}

/*
 * The legal and site-map pages run the same masthead without the actions row,
 * so the foot holds the deck alone. A "Start your free case review" button
 * beside the H1 of a privacy policy is the wrong offer in the wrong place.
 */
.glh-pagehead--quiet .glh-pagehead__foot {
	grid-template-columns: minmax( 0, 1fr );
}

@media ( max-width: 860px ) {
	.glh-pagehead__foot {
		align-items: start;
		grid-template-columns: minmax( 0, 1fr );
	}
}

/*
 * A page whose excerpt is empty renders an empty post-excerpt wrapper, which
 * would leave the hairline sitting above nothing but the buttons. Collapsing
 * the deck to zero height keeps the rule reading as a rule under the title.
 */
.glh-pagehead__deck:empty {
	display: none;
}

/* --------------------------------------------------------------------------
   Terms strip — the opener's three promises, read across the column
   -------------------------------------------------------------------------- */

/*
 * The practice-page opener is a 58/42 column pair, and both halves were losing
 * their right edge to a cap: the prose to `.gl-measure` at 56ch and the rail to
 * its own 26rem. Measured on the frame at a 1700px window, the prose stopped at
 * 760 and the rail started at 1135 — **375px of nothing running the full height
 * of the first thing anyone reads on the page.**
 *
 * Two-thirds of that is the column split and comes off there (64/36 puts the
 * rail's column within 60px of the rail). The rest is this: the promises under
 * the lede were a `.gl-dash-list`, a stacked rail whose items are one line each
 * and which therefore inherited the 56ch cap and left the column's right half
 * empty for a third time.
 *
 * They are three terms of one line, which is a row, not a stack. Across the
 * column they anchor its right edge — which is the actual fix, because prose at
 * 56ch beside an 850px column is correct and should not be widened. What was
 * missing was something under it that spans.
 *
 * Not `.glh-pillars`: the section directly below this one opens with pillars
 * numbered 01–03, and running the same object twice inside 900px reads as a
 * repeat. Small caps and no numeral, so it reads as terms of engagement rather
 * than a second set of claims.
 */
/*
 * Cards rather than a ruled row. The strip was a hairline with two dividers
 * under it, which spans the column but weighs nothing: below three paragraphs
 * of 20px serif it read as a footnote to the prose instead of the terms of
 * taking the case. On a paper band a paper card is invisible, so the ground is
 * bone and the cap is gold — the same pairing the eyebrow above it already
 * uses, and enough edge that the three promises separate from the prose and
 * from each other at a glance.
 */
.glh-terms {
	display: grid;
	gap: 0.75rem;
	grid-template-columns: repeat( 3, minmax( 0, 1fr ) );
	list-style: none;
	margin: 3rem 0 0;
	padding: 0;
}

.glh-terms li {
	background: var( --wp--preset--color--bone );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: var( --gl-radius );
	border-top: 2px solid var( --glh-gold-hair );
	padding: 1.125rem clamp( 1rem, 1.6vw, 1.25rem ) 1.25rem;
}

@media ( max-width: 860px ) {
	.glh-terms {
		gap: 0.625rem;
		grid-template-columns: 1fr;
	}

	.glh-terms li {
		padding: 1rem 1.125rem 1.125rem;
	}
}

.glh-terms__label {
	color: var( --wp--preset--color--gold-dark );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.16em;
	margin: 0;
	text-transform: uppercase;
}

.glh-terms__body {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.625rem 0 0;
}

/*
 * The opener column — the prose between the ledger and the first ruled band.
 *
 * `:has( > .glh-terms )` is what identifies it. The terms strip is built for
 * this one place (blocks.py: "the case the practice-page opener has"), so the
 * column that carries one is the opener and nothing else is, which beats
 * hanging a class off the builder and reimporting every page to get it.
 *
 * Three paragraphs at one size, one weight and one colour is what the section
 * was: the reader arrives from a masthead and a ledger of six figures and lands
 * on an even grey block with no way in. The first paragraph is the thesis —
 * insurance pays when it is forced to — so it is set as a standfirst in the
 * display face with a gold rule over it. That rule is also the section's top
 * edge, which the band did not have.
 *
 * The measure stays where the comment above it argues it should: 56ch of body
 * prose beside an 850px column is right, and the standfirst's own cap is set in
 * `ch` at its own size so it hangs off the same left edge and runs a little
 * longer, which is what makes the two read as different voices rather than one
 * voice that changed size.
 */
.wp-block-column:has( > .glh-terms ) > p.gl-serif:first-child {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--body );

	/*
	 * Core emits font-size presets as `!important`, so `has-lead-font-size` on
	 * the paragraph wins on cascade order whatever the specificity here.
	 */
	font-size: clamp( 1.375rem, 1.05rem + 0.9vw, 1.6875rem ) !important;
	letter-spacing: 0;
	line-height: 1.4;
	max-width: 46ch;
}

.wp-block-column:has( > .glh-terms ) > p.gl-serif:first-child::before {
	background: var( --wp--preset--color--gold );
	content: "";
	display: block;
	height: 2px;
	margin-bottom: 1.75rem;
	width: 3rem;
}

/*
 * The foot closes the column, on the rule `.glh-sectionfoot` now carries
 * everywhere. The link goes up to reading size from the 15px the foot sets
 * elsewhere, so the column's bottom edge answers the gold rule at its top.
 */
.wp-block-column:has( > .glh-terms ) > .glh-sectionfoot .glh-textlink {
	font-size: 1rem;
}

/* --------------------------------------------------------------------------
   Worth — the schedule of damages, economic beside human
   -------------------------------------------------------------------------- */

/*
 * "What is my case worth" is the question the page is asked more than any
 * other, and the answer was five words long: a bare `<ul>` inside the third
 * entry of the Texas-law ledger, below the fold of that ledger, reading
 * "Medical bills, past and future / Lost wages ... / Pain and suffering".
 *
 * It is a section, and it is the one place on the page where the two kinds of
 * damage have to be told apart — economic losses are proved with paper and
 * non-economic ones are argued, which is the whole reason an adjuster's first
 * offer covers the first and ignores the second. Two groups side by side is
 * that distinction drawn in the layout rather than asserted in a sentence.
 *
 * The dash marker rather than a numeral: there are already five numbered
 * sequences on this page (pillars, docket, the scene ledger, the process rail
 * and the related docket) and none of these entries is a step. `.gl-dash-list`
 * is the house mark for a set, carried up to section scale.
 */
/*
 * `row-gap: 0`, and the vertical rhythm stays on the children's own margins.
 * The three rows below are subgrid rows shared by both groups, so a row gap
 * here is paid inside each group — between its name and its note, and again
 * between its note and its list — where it opens two 64px holes rather than
 * separating anything.
 */
.glh-worth {
	column-gap: clamp( 2rem, 4vw, 4rem );
	display: grid;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	grid-template-rows: auto auto auto;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	row-gap: 0;
}

@media ( max-width: 860px ) {
	.glh-worth {
		grid-template-columns: 1fr;
		grid-template-rows: none;
		row-gap: clamp( 2rem, 5vw, 3rem );
	}
}

/*
 * Subgrid, so the two kinds line up on three rows rather than three: the notes
 * are a sentence each and one of them wraps a line longer, which was enough to
 * start the two lists 15px apart and put every hairline in the section out of
 * register with its opposite number. Where subgrid is not supported the
 * declaration drops and the group falls back to its own auto rows, which is
 * what it did before — the span still holds the column.
 */
.glh-worth__group {
	border-top: 2px solid var( --wp--preset--color--gold );
	display: grid;
	grid-row: span 3;
	grid-template-rows: subgrid;
	padding-top: 1.5rem;
}

/* Stacked, there is nothing to line the two groups up with, and the subgrid
   would be mapping onto implicit rows it does not own. */
@media ( max-width: 860px ) {
	.glh-worth__group {
		display: block;
	}
}

.glh-worth__kind {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	font-size: 1.375rem;
	font-weight: 800;
	letter-spacing: 0.01em;
	margin: 0;
	text-transform: uppercase;
}

.glh-worth__note {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.5rem 0 0;
	max-width: 46ch;
}

.glh-worth__list {
	list-style: none;
	margin: 1.75rem 0 0;
	padding: 0;
}

.glh-worth__list li {
	border-top: 1px solid var( --wp--preset--color--rule );
	display: grid;
	gap: 0 1rem;
	grid-template-columns: 1.25rem minmax( 0, 1fr );
	padding: 1.125rem 0;
}

.glh-worth__list li::before {
	color: var( --wp--preset--color--gold );
	content: "\2014";
	grid-row: span 2;
	line-height: 1.4;
}

.glh-worth__list h4 {
	color: var( --wp--preset--color--ink );
	font-family: var( --wp--preset--font-family--display );
	font-size: 1rem;
	font-weight: 800;
	letter-spacing: 0.03em;
	margin: 0;
	text-transform: uppercase;
}

.glh-worth__list p {
	color: var( --wp--preset--color--slate-muted );
	font-size: 0.9375rem;
	line-height: 1.6;
	margin: 0.3125rem 0 0;
}

/* --------------------------------------------------------------------------
   Counsel — the attorney who takes the case, on navy
   -------------------------------------------------------------------------- */

/*
 * The page carried no face. It quoted "Aaron Genthe · Founder" under the
 * courtroom plate and closed by promising a real attorney rather than a call
 * centre four separate times, and the only photograph on it below the masthead
 * was an empty room. Every claim on the page is a claim about a person and the
 * person was never shown.
 *
 * It sits between the reviews and the FAQs on purpose: other people vouch,
 * then you see who they are vouching for, then the objections. On navy because
 * the two bands it separates are paper and bone, and because it is the second
 * of the page's two moments that are about the firm rather than the claim —
 * the process rail is the other, and they are the same ground.
 *
 * Nothing here is asserted that is not already on /about/our-team/: the A&M
 * degree, the years at a larger Dallas firm, 2015, and hundreds of cases.
 */
.glh-counsel {
	align-items: start;
	display: grid;
	gap: clamp( 2rem, 4vw, 4rem );
	grid-template-columns: minmax( 0, 0.72fr ) minmax( 0, 1.28fr );
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
}

@media ( max-width: 900px ) {
	.glh-counsel {
		grid-template-columns: 1fr;
	}

	/* Stacked, the portrait has the whole band to fill and a 4:5 frame turns
	   820px of width into 1,025px of height — a head-and-shoulders shot at the
	   size of a poster, with the copy it introduces a screen below it. Capped,
	   it stays a portrait. */
	.glh-counsel__portrait {
		max-width: min( 100%, 22rem );
	}
}

/*
 * The frame is inset rather than drawn on the edge: a gold hairline sitting on
 * the photograph's own boundary would read as a border on the image, and this
 * is a matted print. It is the one decorative move in the band.
 */
.glh-counsel__portrait {
	margin: 0;
	position: relative;
}

.glh-counsel__portrait::after {
	border: 1px solid var( --glh-gold-hair );
	content: "";
	inset: clamp( 0.75rem, 1.4vw, 1.25rem );
	pointer-events: none;
	position: absolute;
}

.glh-counsel__portrait img {
	aspect-ratio: 4 / 5;
	display: block;
	filter: grayscale( 0.18 ) contrast( 1.04 );
	height: auto;
	object-fit: cover;
	object-position: center 15%;
	width: 100%;
}

.glh-counsel__role {
	color: var( --wp--preset--color--gold );
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.2em;
	margin: 0;
	text-transform: uppercase;
}

.glh-counsel__name {
	color: #fff;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: clamp( 1.875rem, 2.6vw, 2.5rem );
	font-weight: 800;
	letter-spacing: 0;
	margin: 0.5rem 0 0;
}

.glh-counsel__prose {
	color: var( --wp--preset--color--ink-muted );
	font-size: 1.0625rem;
	line-height: 1.75;
	margin: 1.5rem 0 0;
	max-width: 62ch;
}

/*
 * Four facts in two columns, hairlined like a docket sheet. `<dl>` with each
 * pair in its own wrapper, because a bare dt/dd sequence in a two-column grid
 * lays the terms and the definitions out in alternating cells.
 */
.glh-counsel__facts {
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 0;
	grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	margin: 2.25rem 0 0;
}

@media ( max-width: 560px ) {
	.glh-counsel__facts {
		grid-template-columns: 1fr;
	}
}

.glh-counsel__facts > div {
	border-bottom: 1px solid var( --glh-hair-light );
	padding: 1.125rem 1.5rem 1.125rem 0;
}

.glh-counsel__facts dt {
	color: var( --wp--preset--color--gold );
	font-size: 0.625rem;
	font-weight: 700;
	letter-spacing: 0.2em;
	text-transform: uppercase;
}

.glh-counsel__facts dd {
	color: #fff;
	font-size: 1rem;
	line-height: 1.5;
	margin: 0.4375rem 0 0;
}

/* `.glh-textlink` is gold-dark against bone, which on this ground is very
   nearly the ground. The section foot has a `--light` variant for the same
   reason; this link is not in a foot. */
.glh-counsel__link {
	color: var( --wp--preset--color--gold );
	margin-top: 2rem;
}

/* --------------------------------------------------------------------------
   Figures — a row of statistics on the navy ground.

   The counterpart to `.glh-pillars` for a band whose content is numbers rather
   than claims: the figure in the display face at headline scale, its label
   under it, hairlines above and below the row so it reads as one instrument
   and not as four cards.

   Dark-ground only, which is where the band that needs it sits. The label
   takes ink-muted for the same reason `.glh-pillars--light p` does, and the
   figures take plain gold, which is 5.43:1 on this ground where gold-dark is
   2.67:1.
   -------------------------------------------------------------------------- */

.glh-figures {
	border-top: 1px solid var( --glh-hair-light );
	display: grid;
	gap: 0;
	grid-template-columns: repeat( 4, minmax( 0, 1fr ) );
	list-style: none;
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
	padding: 0;
}

@media ( max-width: 900px ) {
	.glh-figures {
		grid-template-columns: repeat( 2, minmax( 0, 1fr ) );
	}
}

@media ( max-width: 520px ) {
	.glh-figures {
		grid-template-columns: 1fr;
	}
}

.glh-figures li {
	border-bottom: 1px solid var( --glh-hair-light );
	padding: 1.75rem 1.75rem 1.75rem 0;
}

.glh-figures li:last-child {
	padding-right: 0;
}

.glh-figures__no {
	color: var( --wp--preset--color--gold );
	display: block;
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-style: italic;
	font-feature-settings: "tnum" 1;
	font-size: clamp( 2rem, 3.4vw, 2.875rem );
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	letter-spacing: 0;
	line-height: 1;
}

.glh-figures__label {
	color: var( --wp--preset--color--ink-muted );
	display: block;
	font-size: 0.9375rem;
	line-height: 1.6;
	margin-top: 0.875rem;
}

/* The attribution, not a fifth figure: set small and quiet, and the links in
   it take the gold the section foot's do on this ground. */
.glh-figures__src {
	color: var( --wp--preset--color--ink-muted );
	font-size: 0.8125rem;
	line-height: 1.7;
	margin: 1.5rem 0 0;
}

.glh-figures__src a {
	color: var( --wp--preset--color--gold );
}

/* --------------------------------------------------------------------------
   Clock — durations drawn against one axis

   The trucking cluster's argument, which had no visual form at all before this
   and was being made in prose six times over: the records that prove one of
   these cases are destroyed on a legal schedule, and the two-year filing
   deadline everybody has heard of is the last of them to run out.

   Three bar treatments carry the whole of it, and the contrast between them is
   the point rather than decoration:

     solid gold   a period that expires — the evidence
     hollow       a long deadline, ruled rather than filled, so it reads as an
                  outline of time available instead of another short bar
     dissolving   no retention rule at all, fading out a few percent in

   The geometry is `at / span`, done here in calc so the markup carries only
   the datum. Every row also prints its period as text in the third column and
   the track is aria-hidden, so nothing is lost without the CSS.
   -------------------------------------------------------------------------- */

.glh-clock {
	--glh-clock-bar: 0.625rem;
	--glh-clock-hair: var( --glh-hair-light );
	--glh-clock-ink: var( --wp--preset--color--paper );
	--glh-clock-dim: var( --wp--preset--color--ink-muted );

	border-top: 1px solid var( --glh-clock-hair );
	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;
}

.glh-clock--light {
	--glh-clock-hair: var( --glh-hair-dark );
	--glh-clock-ink: var( --wp--preset--color--ink );
	--glh-clock-dim: var( --wp--preset--color--slate-muted );
}

.glh-clock__rows,
.glh-clock__axis {
	list-style: none;
	margin: 0;
	padding: 0;
}

/*
 * label | track | value. The label column is capped rather than fluid so the
 * tracks all start on one left edge whatever the longest label is, which is
 * the only way the bars can be compared with each other — a track that begins
 * where its own label ends is not on a shared axis at all.
 */
.glh-clock__row {
	align-items: center;
	border-bottom: 1px solid var( --glh-clock-hair );
	column-gap: clamp( 1rem, 2vw, 2rem );
	display: grid;
	grid-template-columns: minmax( 0, 15rem ) minmax( 0, 1fr ) minmax( 0, 7rem );
	padding: 1.125rem 0;
}

.glh-clock__label {
	color: var( --glh-clock-ink );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-size: 1.0625rem;
	line-height: 1.3;
	margin: 0;
}

.glh-clock__track {
	background-image: linear-gradient(
		90deg,
		var( --glh-clock-hair ) 0 1px,
		transparent 1px 100%
	);
	background-size: calc( 100% / 8 ) 100%;
	border-radius: 2px;
	height: var( --glh-clock-bar );
	margin: 0;
	position: relative;
}

/*
 * The bar carries its own final width and is scaled from the left, so the
 * wipe below animates geometry that is already correct — a browser without
 * scroll-driven animations renders the finished bar and nothing is missing.
 */
.glh-clock__bar {
	background: linear-gradient(
		90deg,
		var( --wp--preset--color--gold-dark ),
		var( --wp--preset--color--gold )
	);
	border-radius: 2px;
	display: block;
	height: 100%;
	position: relative;
	transform-origin: left center;
	width: calc( var( --glh-clock-at ) / var( --glh-clock-span ) * 100% );
}

/*
 * The terminal cap. A bar that simply stops reads as a bar that was cut off by
 * its container; a brighter 2px upright at the end reads as a bar that ended
 * where it was always going to end, which is the entire claim being made.
 */
.glh-clock__bar::after {
	background: var( --wp--preset--color--gold );
	border-radius: 1px;
	bottom: -0.3125rem;
	content: "";
	position: absolute;
	right: 0;
	top: -0.3125rem;
	transform: translateX( 50% );
	width: 2px;
}

/* No retention rule at all — the bar has nowhere to stop, so it dissolves. */
.glh-clock__row--none .glh-clock__bar {
	background: linear-gradient(
		90deg,
		var( --wp--preset--color--gold ) 0%,
		rgba( 200, 149, 47, 0 ) 100%
	);
	width: 14%;
}

.glh-clock__row--none .glh-clock__bar::after {
	content: none;
}

/*
 * The long deadline, ruled rather than filled. Filled, it is the biggest gold
 * object in the figure and the eye reads it as the most important one, which
 * inverts the argument — it is the deadline that matters least here. Hollow,
 * it reads as the room available, which is what it is.
 */
.glh-clock__row--open .glh-clock__bar {
	background: repeating-linear-gradient(
		90deg,
		var( --glh-gold-hair ) 0 6px,
		transparent 6px 12px
	);
	border: 1px solid var( --glh-gold-hair );
}

.glh-clock__row--open .glh-clock__bar::after {
	background: var( --glh-gold-hair );
}

/*
 * A period that outlasts the axis. Drawn to the full width like any other
 * 24-month bar, it says "two years" while its own value column says "3 years+"
 * — so the fade and the missing terminal cap are what distinguish a bar that
 * ran out of chart from a bar that ran out of time.
 */
.glh-clock__row--over .glh-clock__bar {
	mask-image: linear-gradient( 90deg, #000 0 82%, transparent 100% );
}

.glh-clock__row--over .glh-clock__bar::after {
	content: none;
}

/*
 * An event rather than a span: a single upright at the point itself.
 *
 * It is drawn by keeping the terminal cap and dropping the bar under it, not
 * by a border — a border-left lands on the bar's *start*, which put the mark
 * at hour zero on a row whose whole meaning is that it happens at hour eight.
 */
.glh-clock__row--mark .glh-clock__bar {
	background: none;
}

.glh-clock__row--mark .glh-clock__bar::after {
	bottom: -0.5rem;
	top: -0.5rem;
	width: 2px;
}

.glh-clock__value {
	color: var( --wp--preset--color--gold );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 1.0625rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	margin: 0;
	text-align: right;
}

.glh-clock__row--none .glh-clock__value,
.glh-clock__row--open .glh-clock__value {
	color: var( --glh-clock-dim );
	font-style: italic;
}

/*
 * The axis sits under the tracks and is laid out on the same three columns, so
 * a tick at six months lands on the point six months lands on in every row
 * above it. It is a grid with one full-width cell rather than a flex row for
 * exactly that reason.
 */
.glh-clock__axis {
	column-gap: clamp( 1rem, 2vw, 2rem );
	display: grid;
	grid-template-columns: minmax( 0, 15rem ) minmax( 0, 1fr ) minmax( 0, 7rem );
	padding-top: 0.75rem;
}

/*
 * Every tick occupies the same cell and is placed by its own padding, so they
 * overlap in one row and each lands on the point its rows land on.
 */
.glh-clock__axis li {
	color: var( --glh-clock-dim );
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.6875rem;
	grid-column: 2;
	grid-row: 1;
	letter-spacing: 0.08em;
	padding-left: calc( var( --glh-clock-at ) / var( --glh-clock-span ) * 100% );
	position: relative;
	text-transform: uppercase;
	white-space: nowrap;
}

/*
 * The label alone leaves the reader to infer which end of the word is the
 * measurement. An upright above it says so, and it is the same gold hairline
 * the hollow bar is drawn in, so the axis and the deadline read as one object.
 */
.glh-clock__axis li::before {
	background: var( --glh-gold-hair );
	content: "";
	height: 0.3125rem;
	left: calc( var( --glh-clock-at ) / var( --glh-clock-span ) * 100% );
	position: absolute;
	top: -0.4375rem;
	width: 1px;
}

/*
 * The last tick is at 100%, so a label flowing right from it starts at the
 * column's right edge and hangs into the value column. Right-aligning it puts
 * the same text on the same point from the other side.
 */
.glh-clock__axis li:last-child {
	padding-left: 0;
	text-align: right;
}

.glh-clock__note {
	color: var( --glh-clock-dim );
	font-size: 0.8125rem;
	line-height: 1.7;
	margin: 1.5rem 0 0;
}

.glh-clock__note a {
	color: var( --wp--preset--color--gold );
}

/*
 * Stacked, the label goes over its own track and the value beside the label,
 * because a 15rem label column inside a 320px screen leaves the bars about
 * 40px to be compared in.
 */
@media ( max-width: 720px ) {
	.glh-clock__row {
		grid-template-columns: minmax( 0, 1fr ) minmax( 0, 5rem );
		row-gap: 0.625rem;
	}

	.glh-clock__track {
		grid-column: 1 / -1;
		grid-row: 2;
	}

	.glh-clock__axis {
		grid-template-columns: 1fr;
	}

	.glh-clock__axis li {
		grid-column: 1;
	}
}

/*
 * The bars wipe in as the figure crosses the viewport, staggered by shifting
 * each row's entry range rather than by animation-delay — on a view() timeline
 * a delay is a length along the timeline, not a duration, so the stagger has
 * to be expressed as range. Same `glh-wipe` keyframe and the same progressive
 * enhancement as `.glh-reveal`: without scroll-driven animation support the
 * bars are simply already drawn.
 */
@supports ( animation-timeline: view() ) {
	@media ( prefers-reduced-motion: no-preference ) {
		.glh-clock__bar {
			animation: glh-wipe linear both;
			animation-range: entry 12% cover 24%;
			animation-timeline: view();
		}

		.glh-clock__row:nth-child( 2 ) .glh-clock__bar {
			animation-range: entry 16% cover 28%;
		}

		.glh-clock__row:nth-child( 3 ) .glh-clock__bar {
			animation-range: entry 20% cover 32%;
		}

		.glh-clock__row:nth-child( 4 ) .glh-clock__bar {
			animation-range: entry 24% cover 36%;
		}

		.glh-clock__row:nth-child( 5 ) .glh-clock__bar {
			animation-range: entry 28% cover 40%;
		}

		.glh-clock__row:nth-child( 6 ) .glh-clock__bar {
			animation-range: entry 32% cover 44%;
		}

		.glh-clock__row:nth-child( 7 ) .glh-clock__bar {
			animation-range: entry 36% cover 48%;
		}
	}
}

/* --------------------------------------------------------------------------
   The ledger on a navy ground — .gl-index--light

   `.gl-index` had one ground. Every interior page uses two or three ledgers
   and they could only ever be set on paper or bone, which is a large part of
   why the practice pages run such long stretches of light bands — the README's
   "around eight thousand pixels without a change of ground" is describing the
   consequence of this gap. The daycare cluster wanted six of them on navy.

   Built the same way `.glh-pillars--light` is, because they are the same
   object at two lengths: hairlines to the light rule, headings to white, prose
   and asides to ink-muted. Nothing about the markup changes, so no shipped
   page moves unless it opts in.
   -------------------------------------------------------------------------- */

@media ( min-width: 1080px ) {
	.gl-index--light {
		column-rule-color: var( --glh-hair-light );
	}
}

.gl-index--light > li {
	border-top-color: var( --glh-hair-light );
}

.gl-index--light .gl-index__name h3 {
	color: #fff;
}

.gl-index--light .gl-index__body,
.gl-index--light .gl-index__body p,
.gl-index--light .gl-index__note {
	color: var( --wp--preset--color--ink-muted );
}

.gl-index--light .gl-dash-list li {
	border-bottom-color: var( --glh-hair-light );
	color: var( --wp--preset--color--ink-muted );
}

/*
 * Body links go gold rather than staying ink. On paper an in-prose link is
 * distinguishable by its underline alone; against ink-muted on navy it is not,
 * and these entries carry the rule citations that are the whole reason to
 * follow one.
 */
.gl-index--light .gl-index__body a,
.gl-index--light .gl-index__note a {
	color: var( --wp--preset--color--gold );
}

/*
 * The heading link keeps the heading's colour on both grounds — see the note
 * on `.gl-index__name h3 a` above — so on navy it inherits white, and only the
 * gold hairline under it says it is a link.
 */
.gl-index--light .gl-index__name h3 a {
	color: inherit;
}

/* --------------------------------------------------------------------------
   The ratio table — .glh-ratio

   26 TAC §§746.1601 and 746.1609 drawn rather than listed. See the component's
   docstring in tools/blocks.py for why the marks are there; the short version
   is that nine sentences of the shape "one caregiver to N children" cannot be
   compared without doing the arithmetic, and four marks against twenty-six can
   be compared without reading a word.
   -------------------------------------------------------------------------- */

/*
 * The custom properties live on the wrapper, not on the table. The note is a
 * sibling of the table rather than a descendant, so declaring them on
 * `.glh-ratio` put `--glh-ratio-dim` out of scope exactly where the note asked
 * for it — and an unresolved var() falls back to the inherited colour, which on
 * the navy band is body ink. The note under the dark table was rendering dark
 * type on a dark ground.
 */
.glh-ratio__wrap {
	--glh-ratio-hair: var( --glh-hair-light );
	--glh-ratio-ink: var( --wp--preset--color--paper );
	--glh-ratio-dim: var( --wp--preset--color--ink-muted );

	margin: clamp( 2.5rem, 4vw, 3.5rem ) 0 0;

	/*
	 * The one horizontally scrollable object on the site. The mark field has a
	 * floor below which twenty-six marks are a smudge rather than a crowd, so
	 * on a narrow screen the table keeps its width and scrolls inside its own
	 * box instead of collapsing — the page body never scrolls sideways.
	 */
	overflow-x: auto;
	overscroll-behavior-x: contain;
}

.glh-ratio__wrap--light {
	--glh-ratio-hair: var( --glh-hair-dark );
	--glh-ratio-ink: var( --wp--preset--color--ink );
	--glh-ratio-dim: var( --wp--preset--color--slate-muted );
}

.glh-ratio {
	border-collapse: collapse;
	min-width: 34rem;
	width: 100%;
}

/*
 * The caption is the source line. It sits under the table rather than over it
 * because the table's own column heads already say what the figures are, and a
 * caption above them says it a second time before the reader has seen a
 * number.
 */
.glh-ratio caption {
	caption-side: bottom;
	color: var( --glh-ratio-dim );
	font-size: 0.8125rem;
	line-height: 1.7;
	padding-top: 1.5rem;
	text-align: left;
}

.glh-ratio caption a {
	color: var( --wp--preset--color--gold );
}

.glh-ratio thead th {
	border-bottom: 1px solid var( --glh-ratio-hair );
	color: var( --glh-ratio-dim );
	font-family: var( --wp--preset--font-family--display );
	font-size: 0.6875rem;
	font-weight: 800;
	letter-spacing: 0.08em;
	padding: 0 1.25rem 0.75rem 0;
	text-align: left;
	text-transform: uppercase;
	vertical-align: bottom;
}

.glh-ratio thead th:last-child,
.glh-ratio__group {
	padding-right: 0;
	text-align: right;
}

.glh-ratio__row {
	border-bottom: 1px solid var( --glh-ratio-hair );
}

.glh-ratio__age,
.glh-ratio__per,
.glh-ratio__field,
.glh-ratio__group {
	padding: 1rem 1.25rem 1rem 0;
	vertical-align: middle;
}

.glh-ratio__age {
	color: var( --glh-ratio-ink );
	font-family: var( --wp--preset--font-family--display );
	font-size: 1.0625rem;
	font-weight: 400;
	text-align: left;
	white-space: nowrap;
	width: 11rem;
}

/*
 * The ratio itself, set at figure size. `tnum` so the single and double digits
 * sit on one right edge down the column — the column is read as a series and a
 * ragged one reads as nine unrelated numbers.
 */
.glh-ratio__per {
	color: var( --wp--preset--color--gold );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 1.5rem;
	font-variant-numeric: tabular-nums;
	font-weight: 800;
	line-height: 1;
	text-align: right;
	width: 3rem;
}

/*
 * One mark per child, on a shared left edge. `flex-wrap` rather than a grid
 * because the field has to be able to run to a second line at the bottom of
 * the table without the rows above it reserving the space.
 */
.glh-ratio__marks {
	display: flex;
	flex-wrap: wrap;
	gap: 0.3125rem;
	max-width: 22rem;
}

.glh-ratio__marks i {
	background: var( --wp--preset--color--gold );
	border-radius: 50%;
	display: block;
	height: 0.4375rem;
	transform-origin: center;
	width: 0.4375rem;
}

.glh-ratio__group {
	color: var( --glh-ratio-dim );
	font-family: var( --wp--preset--font-family--display );
	text-transform: uppercase;
	font-feature-settings: "tnum" 1;
	font-size: 1.0625rem;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	width: 5rem;
}

.glh-ratio__note {
	color: var( --glh-ratio-dim );
	font-size: 0.8125rem;
	line-height: 1.7;
	margin: 1.25rem 0 0;
}

.glh-ratio__note a {
	color: var( --wp--preset--color--gold );
}

/*
 * The marks scale in row by row as the table crosses the viewport, so the
 * infant row is drawn before the school-age one and the reader watches the
 * field fill up. Same progressive enhancement as `.glh-reveal` and
 * `.glh-clock__bar`: without scroll-driven animation support the marks are
 * simply already there.
 */
@supports ( animation-timeline: view() ) {
	@media ( prefers-reduced-motion: no-preference ) {
		.glh-ratio__marks i {
			animation: glh-pip linear both;
			animation-range: entry 10% cover 30%;
			animation-timeline: view();
		}

		.glh-ratio__row:nth-child( even ) .glh-ratio__marks i {
			animation-range: entry 16% cover 36%;
		}
	}
}

@keyframes glh-pip {
	from {
		opacity: 0;
		transform: scale( 0.4 );
	}

	to {
		opacity: 1;
		transform: scale( 1 );
	}
}

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

@media print {
	.gl-header,
	.gl-callbar,
	.gl-footer,
	.gl-rail {
		display: none !important;
	}
}
