/*
 * The left plate: the cover, the chapter title pages, the story plate, the
 * contact sheet, and the typographic plate.
 */

/*
 * The plate's fields are the SAME tokens as the page's, mirrored.
 *
 * In the prototype the plate invented its own padding, which resolved against
 * the half while --gut and --pad resolved against the frame: 60.4px inside the
 * spine on the left against 92px on the right at 1920, and the asymmetry
 * changed sign around 1180px. A spread whose four margins do not mirror reads
 * as a seam laid over two unrelated pages rather than as a binding.
 * 09-art-direction-review.md, G1 — the report's single most important finding.
 */
.plate {
	/*
	 * cqi inside .plate-page is the HALF's width, while --gut and --pad on the
	 * page resolve against the whole spread. Same token, two different numbers:
	 * measured 54px inside the spine on the plate against 92px on the page.
	 * These coefficients are the page's, doubled, so both halves land on the
	 * same value and the four margins mirror.
	 */
	--plate-pad: clamp(18px, 6.8cqi, 58px);
	--plate-gut: clamp(54px, 11.2cqi, 92px);

	/*
	 * The season seal's diameter, and the air between it and the type that sets
	 * around it. Here rather than on `.stamp`, because `.coverlines` is a
	 * sibling and has to compute its reservation from the same number.
	 */
	--stamp-size: clamp(58px, 8cqi, 86px);
	--stamp-gap: clamp(10px, 1.4cqi, 20px);

	position: absolute;
	inset: 0;
	display: flex;
	flex-direction: column;
	padding: var(--plate-pad) var(--plate-gut) var(--plate-pad) var(--plate-pad);
	color: #FFFFFF;
	opacity: 0;
	visibility: hidden;
	transition: opacity .6s cubic-bezier(.33, 0, .2, 1), visibility .6s;

	/* White type over a photograph needs a white ring, not a claret one. */
	--focus: #FFFFFF;

	/*
	 * Shared furniture — the credit rail, labels, meta — reads --ink-2 and
	 * --ink-3. In the Ivory edition those are dark, and on a photographic plate
	 * that put the rail's labels at 2.78:1 against the scrim. Rebinding them
	 * here fixes every reuse at once rather than one selector at a time.
	 */
	--ink: #FFFFFF;
	/*
	 * The colour that sits ON --ink. Not --paper: the page's paper is ivory,
	 * and a white button carrying ivory text measured 1.00:1.
	 */
	--on-ink: #0C0B0B;
	--ink-2: rgba(255, 255, 255, .88);
	--ink-3: rgba(255, 255, 255, .78);
	--rule: rgba(255, 255, 255, .22);
	--rule-2: rgba(255, 255, 255, .5);
}

.plate a {
	/*
	 * theme.json colours links from the root, which on a photographic plate is
	 * the page's ink, not the plate's — measured 1.09:1 on every coverline.
	 * Inherit from the plate instead.
	 */
	color: inherit;
}

.plate.is-on {
	opacity: 1;
	visibility: visible;
	z-index: 3;
}

/*
 * The outgoing plate is held opaque underneath for the length of the fade
 * rather than fading out alongside the incoming one. Two layers fading
 * independently expose the sheet beneath: measured at 25% at the midpoint,
 * lifting Day to 1.93x its true luminance and dropping Night to 0.53x, with
 * the headline falling from 13.07:1 to 2.13:1 for the middle third of every
 * transition. 11-motion-review.md, Part 1.
 */
.plate.is-leaving {
	opacity: 1;
	visibility: visible;
	z-index: 2;
}

.plate__frame {
	position: absolute;
	inset: 0;
	z-index: 0;

	/*
	 * A FLAT DARK GROUND, AND NO GRADIENT.
	 *
	 * This was `linear-gradient(155deg, #B5B0A7, #37322E)` — a light warm grey
	 * fading to a dark one — as the ground behind the photograph. It is only
	 * ever seen while the picture is still arriving or if it never does, and in
	 * both of those moments it is a large pale wash where a photograph belongs,
	 * which is the reading the owner rejected: a cover under a light haze.
	 *
	 * A single dark colour is what the plate is. It also means anything asking
	 * what is painted behind the masthead gets a dark answer rather than one
	 * that changes down the box.
	 */
	background-color: #26221F;
}

.plate__img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/*
 * THE LOCAL BACKINGS, AND THE ONLY TREATMENT THE PHOTOGRAPH GETS.
 *
 * One layer, ramped down the picture, carrying a per-band alpha that
 * `Tone\cover_style()` computed from what that band actually measures: exactly
 * enough to bring the colour chosen for that band to AA, and `rgba(6,5,5,0)` —
 * nothing at all — for every band that already carries its own type.
 *
 * On a properly dark cover and on a genuinely bright one every band is 0 and the
 * photograph is printed as it was taken. Only a mid-tone is touched, and only
 * where the type is.
 *
 * THE RAMP ACROSS THE WHOLE PLATE IS GONE, AND WITH IT A WHOLE CLASS OF BUG.
 *
 * It was one vertical gradient over the entire photograph with three alphas and
 * the stops `24% 30% 50% 58% 100%` typed into this file. Two things were wrong
 * with that, and the second one cannot be fixed by correcting the first.
 *
 * 1. THE STOPS HAD DRIFTED FROM THE BANDS. `Tone\regions()` had been re-cut to
 *    24/42/100 and these literals had not, so the `list` backing was painted six
 *    points below the band it was computed for and the `foot` backing sixteen
 *    points below its own. Measured on the installed 1.9.0 build at 1512, the
 *    kicker sat at .419-.455 of the plate, took the LIST alpha of 0.41 from the
 *    ramp, and was printed in a colour chosen from the FOOT's reading — which
 *    had assumed an alpha of 0.11. One band's ground, another band's colour, a
 *    third band's backing.
 *
 * 2. A RAMP IS A PARTITION AND THE LAYOUT IS NOT. The cover story's block starts
 *    at .323 of the plate at 1280 and at .567 at 1024, so the bands that contain
 *    it at each width OVERLAP across widths. Three boxes that overlap cannot be
 *    three stops on one gradient, and forcing them to be is what made the stops
 *    a compromise nobody had measured.
 *
 * So the treatment is local now — which is also what the brief asks for: "add
 * local backing only where needed". Each group of type carries its own, under
 * itself and nowhere else, at the alpha its own band was measured to need. A
 * cover whose every band reads on its own gets no treatment at all and the
 * photograph is printed exactly as it was taken, which on well-shot dark and
 * genuinely bright covers is the common case.
 *
 * `.plate__frame::before` keeps only the job it can still do honestly: nothing.
 * It is deleted rather than left at zero alpha, because an element that paints
 * nothing is one somebody restores a gradient into.
 */

/*
 * The backings, under the type and nowhere else.
 *
 * `--lift-<band>-<geometry>` is written by `Tone\cover_style()` and is the exact
 * alpha that band needs to bring the colour that band was given to AA — 0 when
 * the picture already carries it. The fallback is `rgba(6,5,5,0)`: transparent,
 * so a plate with no photograph, or one measured by an older companion that
 * writes only two geometries, paints nothing.
 *
 * Each patch is a gradient that reaches zero on its own edges rather than a box
 * with a hard edge — four hard-edged slabs down a 390px cover is what the first
 * version of this looked like, and the seal's own vignette further down exists
 * for the same reason.
 */
.plate--cover .masthead--plate,
.plate--cover .plate__rule,
.plate--section .plate__rule,
.plate--cover .plate__foot,
.plate--section .plate__foot {
	position: relative;
	isolation: isolate;
}

.plate--cover .masthead--plate::before,
.plate--cover .plate__rule::before,
.plate--section .plate__rule::before,
.plate--cover .plate__foot::before,
.plate--section .plate__foot::before {
	content: "";
	position: absolute;
	z-index: -1;
	pointer-events: none;
}

/*
 * The masthead group: the mark and the issue rule under it.
 *
 * On `.masthead--plate` and not on `.mast-zone`. The zone is `position:
 * absolute` in the three centre compositions — it leaves the flow and covers
 * the whole plate so the mark can sit in the middle of the picture — so a
 * backing anchored to it would be a wash over the entire cover in exactly the
 * composition an owner chooses to show the photograph off. The mark's own box
 * is the mark.
 */
.plate--cover .masthead--plate::before,
.plate--cover .plate__rule::before,
.plate--section .plate__rule::before {
	/*
	 * FULL ALPHA UNDER THE TYPE, AND A FADE ONLY OUTSIDE IT.
	 *
	 * `Tone\backing_alpha()` solves for the alpha that brings the chosen colour
	 * to exactly 4.5:1 on that band. It therefore assumes the alpha is actually
	 * THERE, uniformly, under the type. The first version of this patch was a
	 * radial that fell away from its own centre, so the average alpha under a
	 * wide element was about half what the engine had solved for — measured on
	 * the rendered page, the issue line came out at 4.06:1 where the engine had
	 * computed 4.50. A backing that fades where the type is is not a backing.
	 *
	 * So the plateau is expressed in the same lengths as the inset: opaque from
	 * one inset in to one inset from the end, which is exactly the element's own
	 * box whatever its height, and transparent at both edges.
	 *
	 * Sideways it reaches the PLATE'S own edges and stops there — the negatives
	 * are the plate's own padding, so the wash ends exactly where the picture
	 * does. A patch that stopped at the type's left and right edges would draw
	 * two vertical seams down the cover; one that overhung the plate would be
	 * clipped by `.plate-page`, which `verify.mjs` reports as content cut off by
	 * a clipping ancestor — measured at 293px past the clip at 1512 when this was
	 * written as `-50cqi`, and it was right to.
	 */
	inset-block: -1em;
	inset-inline: calc(-1 * var(--plate-pad)) calc(-1 * var(--plate-gut));
	background: linear-gradient(
		to bottom,
		rgba(6, 5, 5, 0) 0,
		var(--lift-mast, rgba(6, 5, 5, 0)) 1em,
		var(--lift-mast, rgba(6, 5, 5, 0)) calc(100% - 1em),
		rgba(6, 5, 5, 0) 100%
	);
}

/*
 * The cover story's block. Wider than it is tall and anchored to the foot of
 * the plate, so a linear wash upward reads as the print convention it is rather
 * than as a panel.
 */
.plate--cover .plate__foot::before,
.plate--section .plate__foot::before {
	inset-block: -1.4em calc(-1 * var(--plate-pad));
	inset-inline: calc(-1 * var(--plate-pad)) calc(-1 * var(--plate-gut));
	background: linear-gradient(
		to top,
		var(--lift-foot, rgba(6, 5, 5, 0)) 0,
		var(--lift-foot, rgba(6, 5, 5, 0)) calc(100% - 1.4em),
		rgba(6, 5, 5, 0) 100%
	);
}

/*
 * The season seal's own patch.
 *
 * One rule, not three gated on a boolean, and at the alpha the engine solved for
 * rather than a hand-written 0.62. `--lift-seal` is `rgba(6,5,5,0)` on a cover
 * whose corner already carries the stamp, so nothing is painted there.
 *
 * The plateau reaches 70% of the ellipse, which is past the stamp's own edge —
 * the pseudo is inset a little over an em on each side, so the disc occupies
 * about the middle two thirds of it. A vignette that falls away from its centre
 * puts less than the solved alpha under the type at the very place the type is,
 * which is what the first version of the band patches did and what
 * `cover.mjs` measured as 3.88:1 against a computed 4.50.
 *
 * `.stamp` is already `position: absolute`, so it is its own containing block —
 * giving it `position: relative` drops it back into the flow and onto the
 * headline, which is a mistake this file has a note about further up.
 */
.plate--cover .stamp,
.plate--section .stamp {
	isolation: isolate;
}

/*
 * A COVER CARRYING A CONTENTS LIST PUTS ITS SEAL AT THE FOOT.
 *
 * In its usual corner the stamp sits at the same height as the coverlines and
 * straddles the edge of their backing: measured on the high-contrast subject at
 * 820, the label stood on rgb(63,66,73) and the value on rgb(105,111,123) —
 * forty points apart inside one 86px disc. A seal half in and half out of a
 * treatment cannot be given a colour.
 *
 * It is a density rule and not a nudge: when the top of the cover is spoken for,
 * the seal goes where there is room for it. Beside the price line is where a
 * magazine puts one anyway. `Cover\get()` moves its reading down with it, so the
 * colour and the ground are still the same band's.
 */
.plate--listed .stamp {
	top: auto;
	bottom: 0;
}

/*
 * THE SEAL IS PRINTED, ALWAYS — IT DOES NOT FLOAT ON THE PHOTOGRAPH.
 *
 * It was an outlined disc with small caps inside it, standing on whatever the
 * picture happened to be, and it is the most fragile mark on the cover: the
 * smallest type, in a corner, over the least predictable part of the frame.
 * Across seven subjects measured at three widths in both editions it found a new
 * way to fail on almost every one — 1.92:1 straddling the coverlines' backing,
 * 3.11:1 on a foot that ramps to bright, 1.44:1 on busy mid-tone. Each fix moved
 * the failure to the next photograph, which is the signal that the element is
 * wrong rather than the numbers.
 *
 * So it carries its own ground, the way the menu trigger and the call to action
 * already do, on every cover: the disc is filled with the colour the band was
 * given and the type on it is the pair `Tone\cover_style()` worked out with that
 * colour. What a reader sees is a printed stamp, which is what it is, and the
 * photograph under it is untouched.
 */
/*
 * Only where there IS a photograph. A bare plate is the magazine's own paper,
 * nothing was measured and nothing is written, so the fill would fall back to
 * `--ink` and the type on it to a token rebound by the same rule — measured
 * 1.00:1 on the shim's own bare cover, which is a disc of one colour. An
 * outlined seal on paper is what a seal on paper looks like.
 */
.plate--cover:not(.plate--bare) .stamp,
.plate--section:not(.plate--bare) .stamp {
	background: var(--fg-badge-mob, var(--ink));
	border-color: transparent;
	color: var(--on-badge-mob, var(--on-ink, var(--paper)));
}

@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.plate--cover:not(.plate--bare) .stamp,
	.plate--section:not(.plate--bare) .stamp {
		background: var(--fg-badge-tab, var(--fg-badge-mob, var(--ink)));
		color: var(--on-badge-tab, var(--on-badge-mob, var(--on-ink, var(--paper))));
	}
}

@media (min-width: 1121px) and (pointer: fine) and (hover: hover) {
	.plate--cover:not(.plate--bare) .stamp,
	.plate--section:not(.plate--bare) .stamp {
		background: var(--fg-badge-desk, var(--ink));
		color: var(--on-badge-desk, var(--on-ink, var(--paper)));
	}
}

/*
 * A COVER CARRYING A CONTENTS LIST DOES NOT PRINT A SEASON SEAL. — a density rule.
 *
 * The two have never fitted together. In its own corner the seal sits at the
 * same height as the coverlines and straddles the edge of their backing — one
 * disc, two grounds forty points apart, no colour that serves both. Moved to the
 * foot it lands under the cover story's own wash and inside the price line's
 * row. Every placement traded one collision for another, across seven subjects
 * at three widths.
 *
 * So the cover drops it, which is what a magazine does when the top of the cover
 * is spoken for: five stories and a seal is a contents page, not a cover. The
 * issue line above still carries the number, the city and the season, so nothing
 * a reader needs is lost — and an owner who wants the seal has a five-line
 * control that turns the list off.
 *
 * This is the same class of decision as `plate--listed`'s type sizes: when the
 * content does not fit the plate, something gives, and it is chosen rather than
 * clipped.
 */
.plate--listed .stamp {
	display: none;
}

/* The coverlines, and a section opener's name and standfirst: the `list` band. */
.plate--cover .coverlines,
.plate--section .plate__section,
.plate--section .plate__brief {
	position: relative;
	isolation: isolate;
}

.plate--cover .coverlines::before,
.plate--section .plate__section::before,
.plate--section .plate__brief::before {
	content: "";
	position: absolute;
	z-index: -1;
	pointer-events: none;
	inset-block: -0.9em;
	inset-inline: calc(-1 * var(--plate-pad)) calc(-1 * var(--plate-gut));
	background: linear-gradient(
		to bottom,
		rgba(6, 5, 5, 0) 0,
		var(--lift-list, rgba(6, 5, 5, 0)) 0.9em,
		var(--lift-list, rgba(6, 5, 5, 0)) calc(100% - 0.9em),
		rgba(6, 5, 5, 0) 100%
	);
}

/*
 * WHICH GEOMETRY'S ALPHAS THESE ARE.
 *
 * The spread's by default, the phone's under the narrow-layout query, and the
 * tablet's after that — a subset of the narrow query, because a tablet is not a
 * large phone. Measured on one 1200x1800 master: a 390x844 plate keeps 69.3% of
 * the master's WIDTH and all of its height; an 820x1180 plate keeps all of the
 * width and 95.9% of the height. Those are different pixels, so a reading taken
 * on one is not evidence about the other, and until now every tablet took the
 * phone's.
 *
 * Written as a comma list of ANDed clauses rather than with `not`, because
 * CSSTidy mangles `not (…)` inside a media query list — the same reason the
 * narrow-layout query is a negated OR list. `css-check.php` enforces it.
 */
.plate {
	--lift-mast: var(--lift-mast-desk, rgba(6, 5, 5, 0));
	--lift-list: var(--lift-list-desk, rgba(6, 5, 5, 0));
	--lift-foot: var(--lift-foot-desk, rgba(6, 5, 5, 0));
	--lift-seal: var(--lift-seal-desk, rgba(6, 5, 5, 0));
}

@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.plate {
		--lift-mast: var(--lift-mast-mob, rgba(6, 5, 5, 0));
		--lift-list: var(--lift-list-mob, rgba(6, 5, 5, 0));
		--lift-foot: var(--lift-foot-mob, rgba(6, 5, 5, 0));
		--lift-seal: var(--lift-seal-mob, rgba(6, 5, 5, 0));
	}
}

@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.plate {
		--lift-mast: var(--lift-mast-tab, var(--lift-mast-mob, rgba(6, 5, 5, 0)));
		--lift-list: var(--lift-list-tab, var(--lift-list-mob, rgba(6, 5, 5, 0)));
		--lift-foot: var(--lift-foot-tab, var(--lift-foot-mob, rgba(6, 5, 5, 0)));
		--lift-seal: var(--lift-seal-tab, var(--lift-seal-mob, rgba(6, 5, 5, 0)));
	}
}

/*
 * THE SCRIM OVER THE WHOLE PHOTOGRAPH IS GONE.
 *
 * `.plate__frame::after` used to be
 * `linear-gradient(177deg, rgba(6,5,5,var(--scrim)) 0, …, rgba(6,5,5,.90) 100%)`
 * — 62 per cent of near-black across the top of every cover and 90 per cent
 * across the foot, whatever the picture was. Measured on the demonstration
 * stand by rendering the cover and the same file raw and differencing them:
 * the render was 101 points of red darker at the top of the plate, 58 at the
 * middle, 51 at the foot of the coverlines. That is not a treatment of a
 * photograph, it is a replacement for one, and on bright fashion photography it
 * reads as the haze the owner asked to have removed.
 *
 * What replaces it is `::before` above: a per-band alpha, computed from what
 * each band actually measures, zero wherever the picture carries its own type.
 */

.plate__body {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	flex: 1;
	min-height: 0;
}

/* ---------- The masthead's own layout zone (1.5.0) ---------- */

/*
 * WHY THE MASTHEAD HAS A ZONE OF ITS OWN.
 *
 * The mark used to be a bare item in this flow, taking the plate's whole width,
 * with no way for the owner to say how large it should be or where on the cover
 * it should sit. On a phone that meant one enormous desktop logotype across half
 * the hero, and when the 1.4.0 navigation strip changed the header's height the
 * mark moved with it — the owner reported it as the logo sliding down the cover.
 *
 * The zone is the mark's anchor. Its size is a per cent of the plate's own
 * column and its place is one of six compositions, both set per crop by the
 * owner. Nothing printed on the cover can reach either.
 *
 * A TOP COMPOSITION STAYS IN THE FLOW; A CENTRE COMPOSITION LEAVES IT.
 *
 * That is deliberate, and it is why there is no reserved band anywhere in this
 * file. Over the top of the plate the mark IS the first line of the cover and
 * the issue rule belongs directly under it, whatever height the owner's file and
 * size give it — a flow item does that exactly, and an absolute box can only
 * approximate it from the file's ratio. Set to the middle of the plate the mark
 * is over the photograph, where the cover deliberately has nothing else, so it
 * leaves the flow and gives the band back to the picture.
 *
 * `position: absolute` resolves against `.plate__body`, which is `relative` — so
 * `inset: 0` is the plate's own text column and the six compositions place the
 * mark inside exactly the box a top composition would have used.
 *
 * `pointer-events` is off in the floated case only, where the zone covers the
 * whole plate and would otherwise swallow every click on the cover.
 */
.mast-zone {
	z-index: 2;
	display: grid;

	/*
	 * One track, the width of the zone. Without this the implicit track is
	 * `auto` — it sizes to the mark's max-content, so a mark set wider than the
	 * plate widened the track with it and `max-width: 100%` measured against the
	 * widened track and clamped nothing. Measured at 390: the mark came out
	 * 296px inside a 282px zone.
	 */
	grid-template-columns: 100%;

	/* The three crops. The two queries below swap in the tablet's and phone's. */
	--mast-w: var(--mast-w-desk, 100%);
	--mast-dx: var(--mast-dx-desk, 0cqi);
	--mast-dy: var(--mast-dy-desk, 0cqi);
}

/*
 * AND BELOW THE SPREAD THE ZONE IS NOT DRAWN AT ALL — §1.7/§2.
 *
 * The masthead moves into the header row, beside the menu trigger, which is
 * what the owner asked for and what Anymag has always done: its
 * `inc/headers/header-cover.php` prints the trigger and `.cover-logo` in ONE
 * header inside the cover. Measured on 1.6.0 at 390x844 this theme had the
 * trigger at y=8 and the mark at y=74 with 66px of photograph between them —
 * "логотип находится ниже гамбургера, и над ним слишком много пустого
 * пространства", exactly.
 *
 * Hidden rather than moved, because one element cannot be in two subtrees: the
 * header is `position: fixed` outside the plate here and inside the right-hand
 * page on the spread. Exactly one copy is displayed at any width, so exactly
 * one is in the accessibility tree and the way home is announced once — see
 * page-top.php.
 *
 * The condition is the spread's own, negated, character for character. Written
 * as the OR list because CSSTidy mangles `not (…)` in a media query list.
 */
/*
 * AND IT IS `.masthead--plate` TOO — §1.9/§1, §1.9/§2.
 *
 * The rule above was written for the COVER, whose masthead is inside a
 * `.mast-zone` because the owner can place it. Four plates print the same
 * masthead WITHOUT that wrapper — the story, the index, the page and the plain
 * plate — so on those the rule reached nothing and the publication's mark was
 * printed twice on the first screen of a phone.
 *
 * Measured on the installed 1.8.0 build at 390x844, counting only marks the
 * browser actually renders:
 *
 *   home      2   header y=11 (168x40)   footer
 *   section   2   header y=9  (168x44)   footer
 *   article   3   header y=9  (143x44)   PLATE y=88 (309x74)   footer
 *   news      3   the same
 *   page      3   the same
 *   search    3   the same
 *   404       3   the same
 *
 * Two logotypes, 44px apart, at 44px and 74px tall, on the first screen —
 * which is the whole of "на статье появляется другой Header … это визуально
 * другая тема". It is not another header: it is this one, printed under a
 * second copy of the masthead that belongs to the spread.
 *
 * At 1121 and up every route is 2 and always was: there the plate IS the
 * left-hand page of the spread and carrying the masthead is what a left-hand
 * page does.
 */
@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.mast-zone,
	.masthead--plate {
		display: none;
	}
}

.mast-zone > .brand {
	width: var(--mast-w);
	max-width: 100%;

	/*
	 * The owner's fine adjustment, in per cent of the plate — the same unit the
	 * size is in, bounded to a fifth of the plate either way by the model. A
	 * translate rather than a margin so it never changes what is reserved below.
	 */
	translate: var(--mast-dx) var(--mast-dy);
	pointer-events: auto;
}

/*
 * The six compositions.
 *
 * `mid` rather than `center` in the class name because `center-center` reads as
 * a typo and `mid-mid` reads as a decision — see Cover\logo_style(), which does
 * the substitution.
 *
 * Each crop states BOTH cases, because the desktop rules are the base and a
 * phone set to a top composition has to undo a desktop set to a centre one.
 *
 * EVERY ONE OF THEM IS SCOPED TO `.mast-zone`, AND THAT IS NOT TIDINESS.
 *
 * They were bare class selectors. The header carries the same three classes now
 * — it has to, because below the spread the header is where the masthead is —
 * and `.mast--desk-top-left { position: static }` matched it, beat both
 * `.page-top { position: sticky }` and the narrow layout's `position: fixed` on
 * source order, and dropped the whole header out of the viewport: measured at
 * 390x844 with the bar at y=844, under the cover instead of over it.
 *
 * A modifier that describes one component must say which component.
 */
.mast-zone.mast--desk-top-left,
.mast-zone.mast--desk-top-mid,
.mast-zone.mast--desk-top-right {
	position: static;
	pointer-events: auto;
}

.mast-zone.mast--desk-mid-left,
.mast-zone.mast--desk-mid,
.mast-zone.mast--desk-mid-right {
	position: absolute;
	inset: 0;
	align-content: center;
	pointer-events: none;
}

.mast-zone.mast--desk-top-left,
.mast-zone.mast--desk-mid-left { justify-items: start; }

.mast-zone.mast--desk-top-mid,
.mast-zone.mast--desk-mid { justify-items: center; }

.mast-zone.mast--desk-top-right,
.mast-zone.mast--desk-mid-right { justify-items: end; }

@media (min-width: 641px) and (max-width: 1120px) {
	.mast-zone {
		--mast-w: var(--mast-w-tab, 100%);
		--mast-dx: var(--mast-dx-tab, 0cqi);
		--mast-dy: var(--mast-dy-tab, 0cqi);
	}

	.mast-zone.mast--tab-top-left,
	.mast-zone.mast--tab-top-mid,
	.mast-zone.mast--tab-top-right {
		position: static;
		pointer-events: auto;
	}

	.mast-zone.mast--tab-mid-left,
	.mast-zone.mast--tab-mid,
	.mast-zone.mast--tab-mid-right {
		position: absolute;
		inset: 0;
		align-content: center;
		pointer-events: none;
	}

	.mast-zone.mast--tab-top-left,
	.mast-zone.mast--tab-mid-left { justify-items: start; }

	.mast-zone.mast--tab-top-mid,
	.mast-zone.mast--tab-mid { justify-items: center; }

	.mast-zone.mast--tab-top-right,
	.mast-zone.mast--tab-mid-right { justify-items: end; }
}

@media (max-width: 640px) {
	.mast-zone {
		--mast-w: var(--mast-w-mob, 100%);
		--mast-dx: var(--mast-dx-mob, 0cqi);
		--mast-dy: var(--mast-dy-mob, 0cqi);
	}

	.mast-zone.mast--mob-top-left,
	.mast-zone.mast--mob-top-mid,
	.mast-zone.mast--mob-top-right {
		position: static;
		pointer-events: auto;
	}

	.mast-zone.mast--mob-mid-left,
	.mast-zone.mast--mob-mid,
	.mast-zone.mast--mob-mid-right {
		position: absolute;
		inset: 0;
		align-content: center;
		pointer-events: none;
	}

	.mast-zone.mast--mob-top-left,
	.mast-zone.mast--mob-mid-left { justify-items: start; }

	.mast-zone.mast--mob-top-mid,
	.mast-zone.mast--mob-mid { justify-items: center; }

	.mast-zone.mast--mob-top-right,
	.mast-zone.mast--mob-mid-right { justify-items: end; }
}

:root[data-split="45-55"] .plate {
	/* The plate is 45% of the spread, so the coefficients scale by 1/0.45. */
	--plate-pad: clamp(18px, 7.56cqi, 58px);
	--plate-gut: clamp(54px, 12.44cqi, 92px);
}

/* ---------- Masthead and the brand mark ---------- */

/*
 * The mark links home, so the link has to be the mark's shape and not an inline
 * box collapsed around an SVG. `display: block` and the full width, the same as
 * what it wraps; the focus ring is then drawn around the wordmark rather than
 * around a two-pixel sliver of it.
 */
.brand__home {
	display: block;
	width: 100%;
	color: inherit;
	text-decoration: none;
}

.brand__wordmark svg {
	display: block;
	width: 100%;
	height: auto;
}

/*
 * TWO FILES IN THE MARKUP, ONE OF THEM VISIBLE.
 *
 * Both logotypes are printed by PHP on every page. Which one shows is decided
 * here and only here — no JavaScript, no `data-` attribute written after load,
 * no second paint. That is the whole answer to "never flash the wrong logo on
 * first paint": there is no moment at which the browser has one and then
 * changes to the other.
 *
 * The default is the light-ground variant, because the page's own paper is the
 * commonest ground. Anything darker overrides it below.
 *
 * `filter: invert()` appears nowhere in this file and must not. A logotype is
 * an asset the publication commissioned; inverting it is arithmetic on somebody
 * else's colours.
 */
.brand__logo {
	display: block;
	position: relative;
}

.brand__img {
	display: block;
	width: auto;
	max-width: 100%;
	height: var(--logo-h, 34px);
	object-fit: contain;
	object-position: left center;
}

.brand__img--dark {
	display: none;
}

/*
 * A dark ground: the Noir edition, a photographic plate, or a region the tone
 * sampler measured as dark. Each of these three is a separate cause and they
 * are listed rather than combined, because a selector list is an OR and CSSTidy
 * — which W3 Total Cache runs over this file — mangles `:is()` in some builds.
 */
:root[data-mode="dark"] .brand__img--light,
.plate .brand__img--light,
[data-mast-desk~="dark"] .brand__img--light,
.brand--on-dark .brand__img--light {
	display: none;
}

:root[data-mode="dark"] .brand__img--dark,
.plate .brand__img--dark,
[data-mast-desk~="dark"] .brand__img--dark,
.brand--on-dark .brand__img--dark {
	display: block;
}

/*
 * The mark on the plate is the masthead: the width its owner asked for, its own
 * proportions, and a ceiling so a very tall file cannot push the cover story
 * off the plate. A 2000px logo once rendered at 2000px and tore the spread in
 * half; this is that ceiling.
 *
 * WHO OWNS THIS MARK — §1.9.2, and it is decided by the WRAPPER, not by a
 * media query.
 *
 * Two plates print it. On a COVER — the homepage and a section landing —
 * `plate-cover.php` and `plate-section.php` wrap it in `.mast-zone`, which
 * declares `--mast-w` from the cover's own `--mast-w-desk`, so the Cover
 * Masthead size owns it. On the four INNER plates — the story, the index, the
 * page and the plain plate — there is no zone, nothing declares `--mast-w`, and
 * the mark takes the fallback below. That fallback is a DESIGN CONSTANT and no
 * setting claims it: the left-hand page of the spread carries the publication's
 * mark at the width of its column, the same on every inner page, which is what
 * a left-hand page does.
 *
 * `100%` and not `var(--mast-w-desk, 100%)`, deliberately. Reading the cover's
 * token here would let the Homepage screen resize the masthead on an article,
 * and one rendered mark cannot answer to a control on a screen that is not
 * about it.
 *
 * AND THE CEILING IS A BOUND, NOT THE ANSWER — §1.9.2/§2.
 *
 * It was `clamp(56px, 14cqh, 150px)`, and 14cqh is a fraction of the plate's
 * HEIGHT: it decided the everyday case rather than guarding the pathological
 * one. Measured on the demonstration stand with Cover Masthead Desktop at 100%,
 * which is what every install ships with:
 *
 *   1920   box 810.0x150.0   the 150px ceiling, not the owner's per cent
 *   1440   box 590.4x126.0   14cqh, not the owner's per cent
 *   1280   box 524.8x112.0   14cqh, not the owner's per cent
 *
 * At 100% the owner asks for the full column and gets whatever 14cqh happens to
 * be — which is the shape of "owner puts 30 and CSS makes it 40".
 *
 * The bound is `24cqi` now: a fraction of the left-hand page's own WIDTH rather
 * than of its height, so it scales with the thing the setting is a per cent OF.
 * `cqi` resolves against `.plate-page`, which is where `container-type` is
 * declared — the whole page, not the plate's text column.
 *
 *   the column is about 82% of that, after the plate's padding
 *   this publication's wordmark is 4.2:1
 *   so at 100% it renders 0.82 / 4.2 = 19.5cqi tall, and never reaches 24
 *
 * A square file at 100% would be 82cqi and is held at 24 — which is the case the
 * ceiling exists for, and the only one it now touches. Measured at 1512 against
 * the `front-logo` fixture, whose logotype is 2.7:1: 227px under a 30cqi bound,
 * 181px under this one, 150px under the clamp that decided the everyday case.
 */
.brand--plate .brand__logo,
.brand--plate .brand__wordmark {
	width: 100%;
}

.brand--plate .brand__img {
	width: 100%;
	height: auto;
	max-height: 24cqi;
}

/*
 * ---------- THE OWNER'S ONE OPTICAL CORRECTION — §1.9.2b/§1 ----------
 *
 * `--top-inset` aligns the utility group with the top of the mark's BOX. A
 * logotype cropped to its letterforms puts its ink on that line. A file carrying
 * transparent room inside itself does not, and the two halves of the spread stop
 * agreeing while their boxes stay in register to the tenth of a pixel.
 *
 * The answer is a tighter file — the Branding screen measures the uploaded one
 * and says so when it is not. This is the correction for an owner who cannot
 * re-cut it: ONE number, theirs, bounded to ±12px by `Branding\offset_y()`, and
 * printed as a property only when they have set it.
 *
 * NOT a per-asset ink-bound alignment. The owner ruled that out and was right:
 * a placement computed from a pixel scan is different for every file, changes
 * under the owner on re-upload, and cannot be reasoned about when it is wrong.
 *
 * `translate` and not a margin, so the correction never changes what is reserved
 * around the mark — the row's height, the plate's rhythm and the space under the
 * masthead are all exactly what they were. It moves the ink and nothing else.
 *
 * Both places the mark stands on a line, because a file's padding is the file's
 * wherever it prints: the plate masthead on the spread, and the row's mark below
 * it. The footer is deliberately not included — it signs off at the foot of the
 * page and stands on no shared axis.
 */
.brand--plate .brand__img,
.brand--plate .brand__wordmark,
.brand--bar .brand__img,
.brand--bar .brand__wordmark,
.menu-panel .brand__img,
.menu-panel .brand__wordmark {
	translate: 0 var(--logo-nudge-y, 0px);
}

/*
 * THE HEADER'S SIZE, THE FOOTER'S SIZE, AND THE COVER'S ARE THREE SETTINGS.
 *
 * One number used to size all of them and the cover took the plate's width
 * whatever anybody wanted, so making the mark smaller on a phone made it smaller
 * everywhere and the footer could not be set at all. `--logo-h-desk`, `-tab`,
 * `-mob` and `-foot` are written into the document by `Branding\tokens()` from
 * four separate settings; the cover's is a per cent of the plate and lives on
 * the plate. The tablet and the phone are only written when the owner has set
 * one, so the fallback chain here is what makes them inherit the desktop.
 */
:root {
	--logo-h: var(--logo-h-desk, 34px);
}

@media (min-width: 641px) and (max-width: 1120px) {
	:root {
		--logo-h: var(--logo-h-tab, var(--logo-h-desk, 34px));
	}
}

@media (max-width: 640px) {
	:root {
		--logo-h: var(--logo-h-mob, var(--logo-h-desk, 34px));
	}
}

/*
 * In the bar, the menu panel and the footer the mark sits in a line of type
 * rather than on a plate, so it takes the height the owner set and lets the
 * width follow.
 */
.brand--bar .brand__img,
.menu-panel .brand__img,
.footer .brand__img {
	width: auto;
	height: var(--logo-h, 34px);
	max-height: var(--logo-h, 34px);
}

/*
 * The wordmark at line height rather than plate width, in the same three
 * places. Without this the fallback SVG stretched to the width of the bar and
 * set the publication's name in 90px letters across a phone.
 */
.brand--bar .brand__wordmark,
.menu-panel .brand__wordmark,
.footer .brand__wordmark {
	display: block;
	width: auto;
}

.brand--bar .brand__wordmark svg,
.menu-panel .brand__wordmark svg,
.footer .brand__wordmark svg {
	width: auto;
	height: clamp(15px, 3.6vw, 20px);
}

/*
 * THE MARK IS ALSO THE WAY HOME, AND A THUMB HAS TO BE ABLE TO HIT IT.
 *
 * `.brand__home` wraps the whole mark and takes its height from it. In the bar
 * that is the logotype height — 34px by default — and where no logotype has been
 * uploaded it is the fallback wordmark, which is smaller again. Measured on the
 * installed build at 390, 412, 393, 430, 768, 820 and 1024 with touch:
 *
 *   222x34  the bar, on a site with a logotype
 *   222x15  the bar, on a site with none — the fallback wordmark
 *   309x36  the cover's masthead, same site
 *
 * All three are the link home, all three are under the 44px this project holds
 * itself to for a control, and the third is the largest thing on the screen and
 * still not a target. Only the second and third appear on a site nobody has
 * configured, which is why no suite had seen them.
 *
 * The link grows, the lettering does not: the mark keeps the height the owner
 * set and the box around it is centred at 44. In the bar and the footer that is
 * free — both are flex rows that already centre their contents. On the plate it
 * adds at most eight pixels above the masthead on a site with no logotype, and
 * the composition checks in verify.mjs, live.mjs and viewports.mjs all measure
 * the cover after it.
 */
.brand--bar .brand__home,
.brand--plate .brand__home,
.menu-panel .brand__home,
.footer .brand__home {
	display: flex;
	align-items: center;
	min-height: 44px;
}

.brand__wordmark text {
	fill: var(--ink);
	font-family: var(--serif);
	font-weight: 500;
	font-variation-settings: "opsz" 96;
}

.brand__wordmark--foil text {
	fill: url(#prom-foil);
}

.plate__rule {
	display: flex;
	justify-content: space-between;
	gap: 16px;
	margin: 14px 0 0;
	padding-top: 10px;
	border-top: 1px solid var(--rule-2);
	font-family: var(--sans);
	font-size: var(--label-fine);
	font-weight: 300;
	letter-spacing: .16em;
	text-transform: uppercase;
}

/* ---------- Coverlines ---------- */

.coverlines {
	margin-top: clamp(20px, 4cqh, 46px);
}

/*
 * The seal owns a column, and the coverlines set around it.
 *
 * `.stamp` is absolutely positioned over the plate and the coverlines are in
 * normal flow beneath the masthead, so nothing stopped a headline running under
 * the seal. Measured on `front-cover` before this rule, with the seal tested
 * against its circle rather than its box: 22px of headline under it at 390, 5px
 * at 412, 22px at 820, 10px at 1512.
 *
 * It had never been seen because no fixture, clone or screenshot in this
 * project has ever had coverlines AND a seal at the same time — `coverlines`
 * defaults to 0 and the seal prints only when its text is set.
 *
 * The width is the seal's own, from the same custom property the seal is drawn
 * with, so the reservation tracks it at every viewport instead of being a
 * number that happens to work at one. `--stamp-gap` is the only judgement here.
 *
 * Only when there IS a seal. `.plate--sealed` is written by the template, so a
 * cover without one keeps the full measure.
 */
.plate--sealed .coverlines {
	padding-right: calc(var(--stamp-size) + var(--stamp-gap));
}

/*
 * The mask the entrance rises out of clips with `overflow: clip` and a clip
 * margin, not `overflow: hidden`.
 *
 * Hidden is coterminous with the link on three sides — measured at 0px of slack
 * top, left and bottom for a ring that needs 3px — so it cut the focus
 * indicator off every coverline on the cover's primary navigation, leaving a
 * stray hairline 216px away. The 5px margin lets the ring out and still masks
 * the entrance, which travels 66px. 11-motion-review.md, Part 1.
 */
.coverlines__mask {
	display: block;
	overflow: clip;
	overflow-clip-margin: 5px;
}

/*
 * width: 100% because a <button>/<a> in a block context shrink-wraps to
 * max-content, so `grid-template-columns: 1fr auto` never gets a full-width row
 * to push the folio against: the three rules measured 457 / 479 / 426px in a
 * 673px field, ragged where they should align.
 * 09-art-direction-review.md, G4.
 */
.coverline {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: baseline;
	gap: 14px;
	width: 100%;
	padding: 7px 0 8px;
	text-align: left;
	border-bottom: 1px solid var(--rule);
	transition: border-color var(--move);
}

.coverline__rubric {
	display: block;
	font-family: var(--sans);
	font-size: var(--label-lead);
	font-weight: 300;
	letter-spacing: .34em;
	text-transform: uppercase;
}

.coverline__head {
	display: block;
	font-family: var(--serif);
	font-size: clamp(1rem, 2.6cqi, 1.42rem);
	line-height: 1.16;
	font-variation-settings: "opsz" 28;
}

/*
 * The folio takes the band's PRIMARY colour, not its accent.
 *
 * It inherits from `.coverline`, which is set in the accent — right for the
 * rubric, which is a label with a colour's worth of meaning in it, and wrong for
 * the date, which is the smallest type on the cover and sits at the far right of
 * its rule where the photograph is usually brightest. Measured on the tablet
 * crops with three coverlines configured: 4.26:1 and 4.46:1 against the 4.5 that
 * type this size needs.
 *
 * The primary is the colour the band was measured to carry, so this is the
 * strongest answer available without treating the picture further.
 */
.coverline__folio {
	font-family: var(--serif);
	font-style: italic;
	font-size: var(--label-fine);
	color: var(--fg-coverline-mob, inherit);
}

@media (min-width: 1121px) and (pointer: fine) and (hover: hover) {
	.coverline__folio {
		color: var(--fg-coverline-desk, inherit);
	}
}

@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.coverline__folio {
		color: var(--fg-coverline-tab, var(--fg-coverline-mob, inherit));
	}
}

/*
 * OFF THE PLATE WHERE THE RULE WRAPS.
 *
 * On the spread the folio sits on the headline's own baseline at the right of
 * its rule — `grid-template-columns: 1fr auto` — and it reads as the folio of a
 * contents page, which is what it is. Below the spread the rule wraps and the
 * folio drops onto a line of its own under the headline, where it is a 12.8px
 * italic date standing on the photograph by itself. Measured on a 1024 tablet
 * with three coverlines: 4.26:1 against the 4.5 that type this size needs, on a
 * band the engine had already brought to 4.71 and could not lift further without
 * flattening the picture the coverlines are printed over.
 *
 * It is the smallest type on the cover and the only thing on it a reader can
 * also read on the story itself. So on a wrapped rule it comes off, and the
 * cover keeps the rubric and the headline — which are what a coverline is for.
 */
@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.coverline__folio {
		display: none;
	}
}

@media (hover: hover) and (pointer: fine) {
	.coverline:hover {
		border-bottom-color: var(--ink-2);
	}

	.coverline:hover .coverline__head {
		font-style: italic;
	}

	.coverline:hover .coverline__folio {
		color: var(--leaf-acc);
	}
}

/* The current coverline is marked by italics as well as colour (§8). */
.coverline[aria-current] {
	border-bottom-color: var(--ink-2);
}

.coverline[aria-current] .coverline__head {
	font-style: italic;
}

.coverline[aria-current] .coverline__folio {
	color: var(--leaf-acc);
	font-style: normal;
}

/*
 * The entrance: one rise, staggered 65ms rather than 90ms, so five lines read
 * as one gesture arriving instead of five separate events. Only ever plays
 * once — plate.js does not restart it on a view change.
 * 11-motion-review.md, Part 1.
 */
.coverlines__mask > * {
	display: block;
	transform: translateY(104%);
	animation: prom-rise .9s cubic-bezier(.19, .72, .13, 1) both;
}

.coverlines__mask:nth-child(1) > * { animation-delay: .06s; }
.coverlines__mask:nth-child(2) > * { animation-delay: .125s; }
.coverlines__mask:nth-child(3) > * { animation-delay: .19s; }
.coverlines__mask:nth-child(4) > * { animation-delay: .255s; }
.coverlines__mask:nth-child(5) > * { animation-delay: .32s; }

@keyframes prom-rise {
	to {
		transform: none;
	}
}

/*
 * The height ladder.
 *
 * `container-type: size` stays on at every width — dropping it below 780px is
 * what let the cover cut its own call to action off an overflow:hidden box with
 * no scroll path, against the specification's promise that the cover never
 * clips text. The rungs are cut from the plate's own height, not the viewport's:
 * a plate is the viewport minus the chrome above it.
 * 10-ui-quality-report.md, B2.
 */
@media (max-height: 1080px) {
	.coverlines__mask:nth-child(n + 5) { display: none; }
}

@media (max-height: 980px) {
	.coverlines__mask:nth-child(n + 4) { display: none; }
}

@media (max-height: 880px) {
	.coverlines__mask:nth-child(n + 3) { display: none; }
}

@media (max-height: 790px) {
	.plate__standfirst { display: none; }
}

@media (max-height: 720px) {
	.coverlines__mask:nth-child(n + 2) { display: none; }
}

@media (max-height: 660px) {
	.coverlines { display: none; }
	.plate__price { display: none; }
}

@media (max-height: 560px) {
	.plate__kicker,
	.plate .rail { display: none; }
}

/*
 * THE STORY'S CREDITS ARE PRINTED ONCE, NOT TWICE, WHERE THE HALVES STACK.
 *
 * On the spread the plate is the left-hand page and the credit rail is on the
 * right, so the reader sees WORDS and SECTION on the title page and the full
 * record — words, section, published, reading time — beside the article. That
 * is a spread, and it works.
 *
 * Stacked, they are eighty pixels apart and the reader gets WORDS / PROMINENT
 * Magazine / SECTION / Beauty, a rule, and then WORDS / PROMINENT Magazine /
 * SECTION / Beauty / PUBLISHED / June 8, 2026 / READING / 13 minutes. Measured
 * at 390x844 on a story with no photograph, where the plate no longer holds the
 * two apart with a screen of picture. The page's rail is a superset of the
 * plate's, so the plate's goes.
 */
@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.plate--story .rail {
		display: none;
	}
}

/* ---------- The season stamp ---------- */

/*
 * `right: 0`, not `right: var(--plate-gut)`.
 *
 * The seal used to float a full gutter inside the measure — 54px on a phone —
 * so the column the coverlines had to give up was the gutter PLUS the seal:
 * 112px of a 309px measure, over a third of it, which is not a reservation, it
 * is a different layout. Flush with the content edge the seal costs only its
 * own width, and it now aligns with the right edge of the issue rule above it
 * and the folio column beside it, which is where a seal belongs.
 *
 * The size is a custom property because the coverlines' reservation is computed
 * from it. Declared on `.plate` rather than here, so a sibling can read it.
 */
.stamp {
	position: absolute;
	top: clamp(120px, 22cqh, 210px);
	right: 0;
	display: grid;
	place-content: center;
	width: var(--stamp-size);
	aspect-ratio: 1;
	margin: 0;
	border: 1px solid var(--rule-2);
	border-radius: 50%;
	text-align: center;
}

.stamp__label {
	display: block;
	font-size: var(--label-fine);
	letter-spacing: .16em;
	text-transform: uppercase;
}

.stamp__value {
	display: block;
	font-family: var(--serif);
	font-size: 1.25rem;
	font-weight: 400;
}

/* ---------- The foot of the plate ---------- */

.plate__foot {
	margin-top: auto;
}

/*
 * WHY THERE IS NO RULE HERE PINNING THE FOOT TO ITS BAND.
 *
 * The first attempt at fixing the band drift made `.plate__foot` a flex column
 * with `justify-content: flex-end` and a `min-height` cut from the band, so the
 * block's top edge would land on the band's top edge by construction. It works,
 * and it also silently changes the composition: a flex container does not
 * collapse its children's adjacent margins, so the same six elements measured
 * 526px instead of 507px at 1440 and the whole block rose 19px. A structural fix
 * that moves the type it was meant to hold still is not a fix.
 *
 * So the layout is left exactly as it was and the BAND is cut to contain it,
 * from measurements at every width rather than at one — see `Tone\regions()` —
 * and `cover.mjs` reads both off the rendered page at ten viewports and fails
 * the moment any slot leaves its band. The band stops going stale because
 * something watches it, not because the layout was bent around it.
 */

.plate__kicker {
	margin: 0 0 .2em;
	font-family: var(--serif);
	font-style: italic;
	font-size: 1.3rem;
}

.plate__title {
	margin: 0 0 .3em;
	font-size: clamp(2.1rem, min(9cqi, 7.4cqh), 5.4rem);
	font-weight: 400;
	line-height: .9;
	letter-spacing: -.022em;
	font-variation-settings: "opsz" 96;
	text-wrap: balance;
}

.plate__standfirst {
	max-width: 30ch;
	margin: 0 0 1.2em;
	font-size: 1.15rem;
	line-height: 1.32;
	color: var(--ink-2);
}

/*
 * ---------- THE COVER DOES NOT GROW, SO IT DOES NOT CLIP ----------
 *
 * A cover is a fixed box: the viewport, once. Everything in it competes for the
 * same height, and when the composed block is taller than the plate the plate
 * does not scroll — it is `overflow: hidden` with no scroll path, so what does
 * not fit is simply not there and the page looks finished.
 *
 * Measured on the existing-data stand at 390, with the longest headline and the
 * longest standfirst this magazine has published, and five coverlines:
 *
 *   coverlines   .164–.351
 *   kicker       .351–.386
 *   headline     .390–.593    7 lines, 171px
 *   standfirst   .603–.948   12 lines, 291px
 *   button       .974–1.073  OFF THE PLATE by 28px
 *   reading time 1.099        OFF THE PLATE by 61px
 *   price line   1.099–1.129  OFF THE PLATE by 109px
 *
 * Three runs of type below the crop, invisible, on a cover that looked whole.
 *
 * THE ANSWER IS A DENSITY RULE, NOT A BIGGER BOX. §4: "coverlines overflow must
 * not be solved only by enlarging the container… shorten or defer secondary
 * items". So the two blocks that can run away are given a line budget, longest
 * first, and the button and the price line — which a reader ACTS on — keep their
 * room by construction.
 *
 * A standfirst on a cover is a teaser, not the article's introduction: three
 * lines on a spread, two on a phone, and the story carries the rest. The
 * headline is clamped last and generously, because a cover headline is chosen
 * for the cover and the owner can set a shorter one in the Cover Editor; five
 * lines is longer than any headline this magazine has printed on a cover and it
 * stops the pathological case rather than shaping the ordinary one.
 *
 * `line-clamp` and its `-webkit-` prefix together: the standard property is what
 * this theme targets and the prefixed pair is what the browsers on this QA
 * matrix act on. `css-check.php` runs the suite against W3TC's minifiers, so a
 * minifier that dropped `-webkit-box-orient` would be caught rather than
 * shipped.
 */
.plate--cover .plate__standfirst,
.plate--cover .plate__title {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.plate--cover .plate__standfirst {
	-webkit-line-clamp: 2;
	line-clamp: 2;
}

.plate--cover .plate__title {
	-webkit-line-clamp: 5;
	line-clamp: 5;
}

@media (min-width: 641px) and (min-height: 700px) {
	.plate--cover .plate__standfirst {
		-webkit-line-clamp: 3;
		line-clamp: 3;
	}
}

/*
 * Two lines that shared a size and do not share a job: one is prose telling the
 * reader where the headline goes next, the other is a credit.
 */
.plate__continues,
.plate__credit {
	margin: .4em 0 0;
	font-family: var(--serif);
	font-style: italic;
	color: var(--ink-3);
}

.plate__continues {
	font-size: var(--copy-small);
}

/*
 * A PHONE HAS NO SPREAD, SO THE HEADLINE DOES NOT CONTINUE ANYWHERE — §15.
 *
 * "the headline finishes on the page" and "the headline began on the plate" are
 * true above the spread, where the story genuinely opens on the left-hand page
 * and its copy runs on the right. Below it there is one column, and the two
 * lines are two pieces of italic furniture describing a layout the reader does
 * not have — with, on a story that has no photograph, a hundred and fifty pixels
 * of nothing between them.
 *
 * §15 asks for the mobile article to read as one rhythm: hero, metadata, share,
 * body. Two sentences about a two-page spread are not part of that rhythm.
 *
 * `display: none` and not `visibility: hidden`, so a screen reader on a phone is
 * not told about a plate either. The same negated OR list the rest of the narrow
 * layout uses, because CSSTidy mangles `not (…)` in a media query list.
 */
@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.plate__continues,
	.story__from {
		display: none;
	}
}

.plate__credit {
	font-size: var(--label);
}

.plate__cta {
	display: flex;
	align-items: center;
	gap: 22px;
	margin: 20px 0 0;
}

.plate__minutes {
	font-family: var(--sans);
	font-size: var(--label-fine);
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--ink-2);
}

/*
 * THE COVER'S CALL TO ACTION, ON A PHONE — §1.8/§18.
 *
 * Measured at 390x844: "READ THE COVER STORY" broke after COVER and "3 MINUTES"
 * broke after 3, so the one row the reader is meant to press was two wrapped
 * fragments beside two more. A magazine does not hyphenate its own buttons.
 *
 * The button keeps one line and the reading time goes under it. They are not
 * peers: the button is the action and the minutes are a note about it, so
 * stacking them says the right thing as well as fitting.
 */
@media (max-width: 430px) {
	.plate__cta {
		flex-wrap: wrap;
		gap: 12px 18px;
	}

	.plate__cta .action--solid {
		flex: 0 0 auto;
		padding-inline: 18px;
		white-space: nowrap;
	}

	.plate__minutes {
		flex-basis: 100%;
		white-space: nowrap;
	}
}

.plate .action--solid {
	background: var(--ink);
	color: var(--on-ink);
}

/*
 * The cover's call to action, hovered.
 *
 * It used to paint `background: var(--leaf-acc); color: #0C0B0B`. `--leaf-acc`
 * inverts between editions, so in the night edition that is claret carrying a
 * hardcoded near-black. The token pair alone — #7C1524 under #0C0B0B — is
 * 1.85:1; measured on the rendered plate, where the claret composites over the
 * scrim, verify.mjs read 2.51:1 against the 4.5:1 AA needs. After the fix the
 * same check reads 9.38:1.
 *
 * That figure is the identical fault the comments at critical.css and story.css
 * cite as the reason `--acc-ink` exists at all. The fix was applied to the
 * end-of-story seal and never here, because this rule hardcoded the colour
 * instead of reading the token that is kept legible against it.
 *
 * `--acc` and `--acc-ink` are a pair, tuned together in both editions. Using
 * the pair is the whole fix.
 */
@media (hover: hover) and (pointer: fine) {
	.plate .action--solid:hover {
		background: var(--acc);
		color: var(--acc-ink);
	}
}

.plate__price {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 20px;
	margin: 22px 0 0;
	font-family: var(--sans);
	font-size: var(--label-fine);
	letter-spacing: .16em;
	text-transform: uppercase;
	line-height: 1.8;
}

.plate__seal {
	display: grid;
	place-items: center;
	width: 26px;
	height: 26px;
	border: 1px solid var(--rule-2);
	border-radius: 50%;
	font-family: var(--serif);
	font-style: italic;
	letter-spacing: 0;
}

/* ---------- Chapter title page ---------- */

.chapter {
	margin-top: auto;
}

.chapter__number {
	margin: 0;
	font-family: var(--serif);
	font-style: italic;
	font-size: clamp(2.6rem, min(10cqi, 9cqh), 5.6rem);
	line-height: .95;
}

.chapter__name {
	margin: .2em 0 0;
	font-family: var(--sans);
	font-size: clamp(1rem, min(3.6cqi, 3cqh), 1.6rem);
	font-weight: 300;
	letter-spacing: .42em;
	text-transform: uppercase;
	line-height: 1.2;
}

.chapter__line {
	max-width: 34ch;
	margin: 1em 0 0;
	font-family: var(--serif);
	font-style: italic;
	font-size: 1.1rem;
	line-height: 1.4;
	color: var(--ink-2);
}

/* ---------- The surfacing quote ---------- */

/*
 * Says "you have just read", so it may only appear once the pull quote it
 * repeats has left the top of the viewport — otherwise the same sentence is set
 * twice on one screen, which is what the prototype did in 97 of 97 frames.
 * plate.js enforces that; this is only the appearance.
 */
.quote-float {
	max-width: 32ch;
	margin: auto 0 22px;
	opacity: 0;
	transform: translateY(14px);
	transition: opacity .45s cubic-bezier(.23, 1, .32, 1), transform .45s cubic-bezier(.23, 1, .32, 1);
}

.quote-float.is-on {
	opacity: 1;
	transform: none;
}

.quote-float__label {
	margin: 0 0 .4em;
	font-family: var(--sans);
	font-size: var(--label);
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--ink-2);
}

.quote-float__text {
	margin: 0;
	font-family: var(--serif);
	font-style: italic;
	font-size: 1.5rem;
	line-height: 1.24;
}

/* ---------- Plates with no photograph ---------- */

/*
 * Three ways a plate ends up with no photograph: it is a typographic plate by
 * design (--plain, --index), or the article simply has no featured image
 * (--bare). All three take the page's own ink polarity.
 *
 * Without --bare the plate kept the ink it uses over a photograph, so an
 * article with no cover image printed a white headline on ivory paper in the
 * day edition — 1.18:1, where WCAG AA asks 4.5. In the night edition it
 * happened to look fine, which is why it survived: the theme ships set to noir.
 */

.plate--plain,
.plate--index,
.plate--bare {
	background: var(--sheet);
	color: var(--wp--preset--color--ink, #000000);
	--focus: var(--acc);

	/* Paper, not photograph — the page's own ink polarity applies. */
	--on-ink: var(--wp--preset--color--paper, #EAE6DF);
	--ink: var(--wp--preset--color--ink, #000000);
	--ink-2: var(--wp--preset--color--ink-2, #4B4640);
	--ink-3: var(--wp--preset--color--ink-3, #5F5951);
	--rule: rgba(0, 0, 0, .18);
	--rule-2: rgba(0, 0, 0, .42);
}

:root[data-mode="dark"] .plate--plain,
:root[data-mode="dark"] .plate--index,
:root[data-mode="dark"] .plate--bare {
	--ink: #F2ECE3;
	/*
	 * The colour that sits ON --ink, rebound with it.
	 *
	 * This line was missing, and `--on-ink` stayed at the day palette's ivory
	 * while `--ink` became cream — so `.action--solid`, which is `background:
	 * var(--ink); color: var(--on-ink)`, drew cream type on a cream button.
	 * Measured 1.03:1 on the Noir edition's bare plate, and the words READ THE
	 * COVER STORY were invisible on the front page of any story published
	 * without a photograph.
	 */
	--on-ink: #141110;
	--ink-2: #ADA59D;
	--ink-3: #9A938A;
	--rule: rgba(242, 236, 227, .16);
	--rule-2: rgba(242, 236, 227, .38);
	color: var(--ink);
}

@media (prefers-color-scheme: dark) {
	:root[data-mode="system"] .plate--plain,
	:root[data-mode="system"] .plate--index,
	:root[data-mode="system"] .plate--bare {
		--ink: #F2ECE3;
		/* Rebound with --ink; see the block above for what happens without it. */
		--on-ink: #141110;
		--ink-2: #ADA59D;
		--ink-3: #9A938A;
		--rule: rgba(242, 236, 227, .16);
		--rule-2: rgba(242, 236, 227, .38);
		color: var(--ink);
	}
}

.plate--plain .brand__wordmark text,
.plate--bare .brand__wordmark text {
	fill: var(--ink);
}

.plate--plain .plate__rule,
.plate--bare .plate__rule {
	border-top-color: var(--rule);
	color: var(--ink-3);
}

.plate__set {
	margin-top: auto;
}

.plate__set-line {
	margin: 0;
	font-family: var(--serif);
	font-style: italic;
	font-size: 1.3rem;
	color: var(--ink-2);
}

/* ---------- Adaptive foreground: what the sampler measured ---------- */

/*
 * THE PROBLEM THIS SOLVES
 *
 * The plate is a designed dark ground: a photograph with a gradient scrim over
 * it and white type on top. That holds for most photographs and fails for a
 * particular kind — a blown-out sky, a white studio wall, a pale winter street
 * — where the scrim at the masthead's height is only 14% and the composite
 * comes back light. The white masthead then sits on white at 1.2:1.
 *
 * Nothing in the CSS can know that. inc/tone.php samples the actual region of
 * the actual crop, at the actual container ratio for a desktop and for a phone,
 * composites the same four gradient stops declared above, and writes the answer
 * onto the plate as `data-mast-desk`, `data-mast-mob`, `data-foot-*` and
 * `data-seal-*`. Each holds `light` or `dark`, and `scrim` when the region is
 * too uneven or too close to the boundary for either foreground alone.
 *
 * WHY THE ATTRIBUTES ARE PER GEOMETRY AND THE RULES ARE IN MEDIA QUERIES
 *
 * The two crops are different photographs as far as a masthead is concerned:
 * the spread keeps 77% of the frame's width and a phone keeps 50%, so the top
 * sixth of one can be sky and the top sixth of the other a face. Measuring one
 * and applying it to both is the "average colour of the whole photograph"
 * mistake in a different disguise.
 *
 * The condition on the mobile block is the spread's own, negated, character for
 * character — see critical.css. If the two ever disagree, one geometry gets the
 * other's reading.
 */

/*
 * A light region: dark type, and the dark-ground logotype is wrong here. Every
 * token the plate rebinds to white is rebound back.
 */
@media (min-width: 1121px) and (pointer: fine) and (hover: hover) {
	/*
	 * There is no `.stamp` rule here any more. The seal carries its own ground on
	 * every cover now — see the note further down — so a rebinding that set dark
	 * type on a light corner is not only unnecessary, it beat the pair the engine
	 * computed WITH that ground and printed near-black on near-black: measured
	 * 1.16:1 on the cold light subject at 820.
	 */
	.plate[data-mast-desk~="light"] .brand__img--light { display: block; }
	.plate[data-mast-desk~="light"] .brand__img--dark { display: none; }
	.plate[data-mast-desk~="light"] .brand__wordmark text { fill: #100E0D; }

	.plate[data-foot-desk~="light"] .plate__foot {
		--ink: #100E0D;
		--on-ink: #F4F1EB;
		--ink-2: rgba(16, 14, 13, .86);
		--ink-3: rgba(16, 14, 13, .74);
		--rule: rgba(16, 14, 13, .22);
		--rule-2: rgba(16, 14, 13, .5);
		--focus: #100E0D;
		color: #100E0D;
	}


	/*
	 * A local scrim, only where one is needed.
	 *
	 * Not a stronger scrim over the whole plate: darkening the entire cover to
	 * rescue one corner is what the global control already does, and it costs
	 * the photograph. This is a gradient the height of the element that needed
	 * it, under that element and nothing else. §7's step 2, and the reason its
	 * step 4 says legibility wins.
	 */
	/*
	 * `position: relative`, and NOT on the seal.
	 *
	 * A local scrim needs a containing block for its pseudo-element, and the
	 * masthead and the plate's foot are static, so they need one. The seal is
	 * already `position: absolute` at `top: clamp(120px, 22cqh, 210px); right: 0`
	 * — setting `relative` on it drops it back into the flow, and it lands on
	 * the headline and the standfirst. Measured the first time this block was
	 * written: 10 of the 12 seal-collision checks in verify.mjs went red, with
	 * the seal 6px, 9px, 13px, 19px, 21px, 24px and 29px into lines of type at
	 * 390, 412, 820 and 1512. An absolutely positioned element is already a
	 * containing block for its own pseudo-elements; it needs nothing here.
	 */

}

@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.plate[data-mast-mob~="light"] .brand__img--light { display: block; }
	.plate[data-mast-mob~="light"] .brand__img--dark { display: none; }
	.plate[data-mast-mob~="light"] .brand__wordmark text { fill: #100E0D; }

	.plate[data-foot-mob~="light"] .plate__foot {
		--ink: #100E0D;
		--on-ink: #F4F1EB;
		--ink-2: rgba(16, 14, 13, .86);
		--ink-3: rgba(16, 14, 13, .74);
		--rule: rgba(16, 14, 13, .22);
		--rule-2: rgba(16, 14, 13, .5);
		--focus: #100E0D;
		color: #100E0D;
	}


	/* The seal is already positioned; see the desktop block above. */

}

/*
 * THE TABLET'S OWN SURFACE, FOR THE SAME REASON AS ITS OWN COLOURS.
 *
 * Which logotype to print and whether a corner needs a patch are answers about
 * the CROP, and a tablet's crop is not a phone's: measured on one 1200x1800
 * master, the phone keeps 69.3% of the width and the tablet keeps all of it. So
 * a tablet was choosing its logotype from a reading of pixels it does not show.
 *
 * After the phone's block and a subset of its condition, so an install whose
 * plate carries only the two older attribute sets is unchanged.
 */
@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.plate[data-mast-tab~="light"] .brand__img--light { display: block; }
	.plate[data-mast-tab~="light"] .brand__img--dark { display: none; }
	.plate[data-mast-tab~="light"] .brand__wordmark text { fill: #100E0D; }

	.plate[data-foot-tab~="light"] .plate__foot {
		--ink: #100E0D;
		--on-ink: #F4F1EB;
		--ink-2: rgba(16, 14, 13, .86);
		--ink-3: rgba(16, 14, 13, .74);
		--rule: rgba(16, 14, 13, .22);
		--rule-2: rgba(16, 14, 13, .5);
		--focus: #100E0D;
		color: #100E0D;
	}


}

/* ---------- Adaptive foreground: the colour, not just the ground ---------- */

/*
 * THE PROBLEM THIS SOLVES
 *
 * The block above decides whether a region is light or dark and rebinds the
 * plate's tokens to ink or ivory accordingly. That is two answers, and the
 * owner's review of 1.1.0 said so: the system "appears to switch only between
 * black and white".
 *
 * `Tone\pick()` now measures every element separately — the logotype over the
 * masthead's strip, the headline over the foot, the badge over its corner, each
 * on the desktop crop and on the phone crop — and chooses from the magazine's
 * six approved tokens the one that measures best against what is actually
 * behind it. Ivory and ink are still first in the order, because a cover should
 * reach for an accent only when the plain answer does not carry; smoke,
 * graphite, champagne and claret are there for when it does not.
 *
 * The answer arrives as custom properties in the plate's own `style` attribute,
 * so it is in the first byte of the element and there is no repaint. Every rule
 * here falls back to `inherit`, which is the block above's answer, so a cover
 * with no photograph — where nothing was measured and nothing is written — is
 * unchanged.
 *
 * The two media conditions are the spread's own and its negation, character for
 * character, the same as the block above.
 */
@media (min-width: 1121px) and (pointer: fine) and (hover: hover) {
	.plate--cover .brand__wordmark text { fill: var(--fg-logo-desk, currentColor); }
	.plate--cover .plate__rule { color: var(--fg-issue-desk, inherit); }
	/*
	 * The coverlines take the band they are actually in.
	 *
	 * The colour goes on `.coverline` rather than on the rubric and the folio
	 * separately, so the two rules that mark the CURRENT coverline —
	 * `[aria-current] .coverline__folio` and the hover pair — still win on
	 * specificity and the accent that identifies it survives.
	 */
	.plate--cover .coverline { color: var(--fg-rubric-desk, inherit); }
	.plate--cover .coverline__head { color: var(--fg-coverline-desk, inherit); }
	.plate--cover .plate__kicker { color: var(--fg-kicker-desk, inherit); }
	.plate--cover .plate__title { color: var(--fg-headline-desk, inherit); }
	.plate--cover .plate__standfirst { color: var(--fg-dek-desk, var(--ink-2)); }
	.plate--cover .plate__minutes { color: var(--fg-minutes-desk, inherit); }
	.plate--cover .plate__price { color: var(--fg-minutes-desk, inherit); }
	.plate--cover .plate__seal { color: var(--fg-seal-desk, inherit); }
	.plate--cover .rail__label { color: var(--fg-minutes-desk, inherit); }
	.plate--cover .rail__link { color: var(--fg-dek-desk, inherit); }
	/*
	 * The seal's own colour is its GROUND now, not its type — the disc is filled
	 * and the type on it is the pair the engine worked out with that fill. This
	 * line used to paint the type in the fill colour, which after the seal became
	 * a printed stamp meant near-black on near-black: 1.16:1 measured on the cold
	 * light subject.
	 */
	.plate--cover .stamp { color: var(--on-badge-desk, var(--on-ink, var(--paper))); }

	/*
	 * The button is the one element where the chosen colour is the ground and
	 * not the type, so it takes the pair inc/tone.php worked out together.
	 */
	.plate--cover .plate__cta .action--solid {
		background: var(--fg-cta-desk, var(--ink));
		border-color: var(--fg-cta-desk, var(--ink));
		color: var(--on-cta-desk, var(--on-ink, var(--paper)));
	}
}

@media (max-width: 1120px), (pointer: coarse), (pointer: none), (hover: none) {
	.plate--cover .brand__wordmark text { fill: var(--fg-logo-mob, currentColor); }
	.plate--cover .plate__rule { color: var(--fg-issue-mob, inherit); }
	/*
	 * The coverlines take the band they are actually in.
	 *
	 * The colour goes on `.coverline` rather than on the rubric and the folio
	 * separately, so the two rules that mark the CURRENT coverline —
	 * `[aria-current] .coverline__folio` and the hover pair — still win on
	 * specificity and the accent that identifies it survives.
	 */
	.plate--cover .coverline { color: var(--fg-rubric-mob, inherit); }
	.plate--cover .coverline__head { color: var(--fg-coverline-mob, inherit); }
	.plate--cover .plate__kicker { color: var(--fg-kicker-mob, inherit); }
	.plate--cover .plate__title { color: var(--fg-headline-mob, inherit); }
	.plate--cover .plate__standfirst { color: var(--fg-dek-mob, var(--ink-2)); }
	.plate--cover .plate__minutes { color: var(--fg-minutes-mob, inherit); }
	.plate--cover .plate__price { color: var(--fg-minutes-mob, inherit); }
	.plate--cover .plate__seal { color: var(--fg-seal-mob, inherit); }
	.plate--cover .rail__label { color: var(--fg-minutes-mob, inherit); }
	.plate--cover .rail__link { color: var(--fg-dek-mob, inherit); }
	.plate--cover .stamp { color: var(--on-badge-mob, var(--on-ink, var(--paper))); }

	.plate--cover .plate__cta .action--solid {
		background: var(--fg-cta-mob, var(--ink));
		border-color: var(--fg-cta-mob, var(--ink));
		color: var(--on-cta-mob, var(--on-ink, var(--paper)));
	}
}

/*
 * AND THE TABLET'S OWN READING, WHICH IT DID NOT HAVE.
 *
 * This block is deliberately after the phone's and its condition is a subset of
 * it, so a tablet takes the phone's answer and then replaces it with its own.
 * Every property falls back to the phone's, so a cover measured before there was
 * a third geometry — or by a companion plugin that only writes two — is exactly
 * as it was rather than uncoloured.
 *
 * The clauses are ANDed pairs in a comma list rather than `not (…)`, which
 * CSSTidy mangles inside a media query list.
 */
@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.plate--cover .brand__wordmark text { fill: var(--fg-logo-tab, var(--fg-logo-mob, currentColor)); }
	.plate--cover .plate__rule { color: var(--fg-issue-tab, var(--fg-issue-mob, inherit)); }
	.plate--cover .coverline { color: var(--fg-rubric-tab, var(--fg-rubric-mob, inherit)); }
	.plate--cover .coverline__head { color: var(--fg-coverline-tab, var(--fg-coverline-mob, inherit)); }
	.plate--cover .plate__kicker { color: var(--fg-kicker-tab, var(--fg-kicker-mob, inherit)); }
	.plate--cover .plate__title { color: var(--fg-headline-tab, var(--fg-headline-mob, inherit)); }
	.plate--cover .plate__standfirst { color: var(--fg-dek-tab, var(--fg-dek-mob, var(--ink-2))); }
	.plate--cover .plate__minutes { color: var(--fg-minutes-tab, var(--fg-minutes-mob, inherit)); }
	.plate--cover .plate__price { color: var(--fg-minutes-tab, var(--fg-minutes-mob, inherit)); }
	.plate--cover .plate__seal { color: var(--fg-seal-tab, var(--fg-seal-mob, inherit)); }
	.plate--cover .rail__label { color: var(--fg-minutes-tab, var(--fg-minutes-mob, inherit)); }
	.plate--cover .rail__link { color: var(--fg-dek-tab, var(--fg-dek-mob, inherit)); }
	.plate--cover .stamp { color: var(--on-badge-tab, var(--on-badge-mob, var(--on-ink, var(--paper)))); }

	.plate--cover .plate__cta .action--solid {
		background: var(--fg-cta-tab, var(--fg-cta-mob, var(--ink)));
		border-color: var(--fg-cta-tab, var(--fg-cta-mob, var(--ink)));
		color: var(--on-cta-tab, var(--on-cta-mob, var(--on-ink, var(--paper))));
	}
}

/*
 * A mark borrowed from the other ground, kept readable.
 *
 * When only one logotype has been uploaded, both grounds show it — a
 * wrong-coloured mark is still the publication's, and a wordmark where a
 * logotype belongs is a visible downgrade. Set over a photograph, a dark-ink
 * file was legible in the sense that the pixels were there and unreadable in
 * the sense that mattered.
 *
 * So the borrowed one gets a backing: §7's own step 3, the same answer the tone
 * sampler gives a headline over an uneven photograph, and restrained enough
 * that it reads as a printed panel rather than as a highlighter. It disappears
 * the moment the matching file is uploaded, and the admin notice says which one.
 */
/*
 * A BORROWED MARK IS BACKED BY THE GROUND IT WAS DRAWN FOR, NOT THE ONE IT IS
 * STANDING ON. THESE TWO RULES WERE THE WRONG WAY ROUND.
 *
 * `--light` and `--dark` name the ground a slot is SHOWN on, not the ink in the
 * file. So when the dark ground borrows, the file in `--dark` is the light
 * ground's file, which is drawn in dark ink — and it needs a CREAM backing to be
 * readable. The rule gave it rgba(14,12,11,.86), a near-black backing behind
 * dark ink, on a body of rgb(12,11,11).
 *
 * Measured on the existing-content stand, which is the ordinary case — one
 * logotype uploaded, the night edition, which is this theme's default:
 *
 *   .brand__img--dark.brand__img--borrowed   590x126
 *   src  prominent-wordmark-dark.svg          dark ink
 *   bg   rgba(14, 12, 11, 0.86)               near-black
 *   body rgb(12, 11, 11)                      near-black
 *
 * The publication's name was invisible on the front page, the section pages,
 * the article pages, the menu panel and the footer — every screen of the
 * magazine — and the backing that exists to prevent exactly that was what made
 * it invisible. The owner has been looking at this since 1.1.0.
 */
.brand__img--borrowed {
	padding: .34em .5em;
	border-radius: 2px;

	/* The dark ground's slot holds the light ground's file: dark ink, cream behind it. */
	background: rgba(246, 243, 237, .92);
}

/* And the light ground's slot holds the dark ground's file: light ink, near-black behind it. */
.brand__img--light.brand__img--borrowed {
	background: rgba(14, 12, 11, .88);
}

/*
 * The owner's prompt on an unconfigured cover.
 *
 * Set as editorial matter rather than as an admin notice: it is on the front of
 * the magazine, so it is typeset like the magazine. Nobody but somebody who can
 * change the cover ever sees it — see templates/plate-cover.php.
 */
.plate__starter {
	max-width: 34ch;
	margin: 0 0 1.1em;
	font-family: var(--serif);
	font-style: italic;
	font-size: 1.06rem;
	line-height: 1.44;
	color: var(--ink-2);
}

/* ---------- A section's opening page (1.3.0) ---------- */

/*
 * The section's name, across the photograph.
 *
 * The largest thing on the plate after the masthead, and set in the sans rather
 * than the Didone: the masthead is the publication's voice and the section name
 * is a label on it, so they must not be mistaken for each other at a glance.
 * Wide tracking and small caps are what a printed section opener uses, and they
 * survive being set over a photograph in a way a hairline Didone does not.
 */
.plate__section {
	margin: clamp(18px, 4cqh, 42px) 0 0;
	font-family: var(--sans);
	font-size: clamp(1.6rem, min(7.4cqi, 5.4cqh), 3.4rem);
	font-weight: 300;
	line-height: 1;
	letter-spacing: .18em;
	text-transform: uppercase;

	/*
	 * `--fg-section-*`, not `--fg-headline-*`.
	 *
	 * The headline tokens are measured against the FOOT of the photograph and
	 * this name sits a third of the way down it. On a picture whose middle is
	 * light and whose foot is dark, borrowing them set the section name in cream
	 * over a bright band: 1.46:1, measured on the shipped build. The section
	 * slot is measured against `list`, which is the band it is actually in.
	 */
	color: var(--fg-section-mob, inherit);
}

@media (min-width: 1121px) and (pointer: fine) and (hover: hover) {
	.plate__section {
		color: var(--fg-section-desk, inherit);
	}
}

/* The tablet's own reading of its own crop; see the note on the tone blocks. */
@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.plate__section {
		color: var(--fg-section-tab, var(--fg-section-mob, inherit));
	}
}

/*
 * What the section is for, in the magazine's own sentence.
 *
 * Capped in measure rather than in words: this is the term description an
 * editor wrote on Prominent Magazine → Sections, and truncating somebody's
 * standfirst mid-thought is worse than letting it set to three lines.
 */
.plate__brief {
	max-width: 34ch;
	margin: clamp(10px, 2cqh, 20px) 0 0;
	font-size: 1.05rem;
	line-height: 1.4;

	/* The quiet voice of the `list` band, for the reason above. */
	color: var(--fg-brief-mob, var(--ink-2));
}

@media (min-width: 1121px) and (pointer: fine) and (hover: hover) {
	.plate__brief {
		color: var(--fg-brief-desk, var(--ink-2));
	}
}

@media (min-width: 641px) and (max-width: 1120px),
	(min-width: 641px) and (pointer: coarse),
	(min-width: 641px) and (pointer: none),
	(min-width: 641px) and (hover: none) {
	.plate__brief {
		color: var(--fg-brief-tab, var(--fg-brief-mob, var(--ink-2)));
	}
}

/*
 * ---------- THE BUDGET, WHEN THERE ARE COVERLINES ----------
 *
 * `plate--listed` is written by `Cover\classes()` when the owner has switched
 * coverlines on. The plate is one screen and does not scroll, so the four things
 * that set in it — masthead, issue rule, coverlines, the cover story — share a
 * fixed column, and three of them used to be sized as though the fourth were not
 * there. Measured at 1440x900 with three coverlines and a four-line headline:
 * 941px of matter in an 802px box, with the button and the price line clipped
 * away entirely.
 *
 * Everything below is expressed against the plate's own height, so the budget
 * holds at every viewport rather than at the one it was written on.
 */
.plate--listed .coverline {
	padding: 4px 0 5px;
}

.plate--listed .coverline__head {
	font-size: clamp(.95rem, 2.4cqh, 1.15rem);
}

.plate--listed .coverlines {
	margin-top: clamp(12px, 2.4cqh, 28px);
}

.plate--listed .plate__title {
	font-size: clamp(1.7rem, min(6.4cqi, 4.6cqh), 3.4rem);
}

.plate--listed .plate__kicker {
	font-size: 1.1rem;
}

/*
 * The credit rail is the first thing a cover with a contents list gives up.
 *
 * It names the people who made the cover story, and that credit is on the story
 * itself where a reader who opens it will see it. A button that is off the
 * bottom of the screen is not a trade worth making for a second printing of it.
 */
.plate--listed .plate__foot .rail {
	display: none;
}

/*
 * The lead's block sits at the foot, as it does on the cover — `.plate__foot`
 * already carries `margin-top: auto`. On a section opener the headline is an
 * <h2> under the section's <h1>, so it is set a step down from the cover's.
 */
.plate--section .plate__title {
	font-size: clamp(1.7rem, min(6.6cqi, 5.4cqh), 3.6rem);
	font-variation-settings: "opsz" 60;
}

/*
 * A section whose opening has no photograph.
 *
 * `plate-page--brief` shrinks the plate to its own type on a phone, so the
 * section name, the standfirst and the lead print on the magazine's own paper
 * and the run starts immediately under them — rather than a screen and a half
 * of empty sheet before the first story.
 */
.plate-page--brief .plate--section .plate__foot {
	margin-top: clamp(20px, 5cqh, 48px);
}

/* ---------- The bare cover's own palette (1.3.1) ---------- */

/*
 * A COVER WITH NO PHOTOGRAPH IS NOT AN EXCUSE FOR TWO COLOURS.
 *
 * The adaptive palette is a measurement, and there is nothing to measure on the
 * magazine's own paper — so `cover_style()` writes no custom properties at all
 * and every element falls back to `inherit`. Measured on a reproduction of the
 * owner's beta, where no cover had been chosen: the whole plate drew in two
 * values, ivory and ink. Which is honest, and is also exactly the binary the
 * owner has now rejected twice.
 *
 * Over paper the ground is KNOWN — `--sheet`, a fixed colour — so the answer is
 * not a measurement but a decision, and the decision is the one a printed cover
 * makes: the section label and the seal in the edition's accent, the standfirst
 * and the furniture a step down from the headline, the headline at full ink.
 * The same three-token register the measured covers reach, set deliberately.
 *
 * `--fg-*` still wins where it exists, because these are fallbacks inside
 * `var()` on a class the template only writes when there is no photograph.
 */
.plate--bare .plate__kicker {
	color: var(--acc);
}

.plate--bare .coverline__rubric,
.plate--bare .coverline__folio {
	color: var(--acc);
}

.plate--bare .plate__title {
	color: var(--ink);
}

.plate--bare .plate__standfirst,
.plate--bare .plate__minutes,
.plate--bare .plate__price,
.plate--bare .rail__value {
	color: var(--ink-2);
}

.plate--bare .rail__label,
.plate--bare .plate__rule {
	color: var(--ink-3);
}

.plate--bare .plate__seal,
.plate--bare .stamp {
	color: var(--acc);
	border-color: var(--acc);
}

.plate--bare .stamp__label {
	color: var(--ink-3);
}
