/**
 * WP Showoff — theme stylesheet.
 *
 * This is the file WordPress actually loads. The theme header lives in the
 * root style.css, which is never enqueued; that file is also the artifact the
 * front page quotes back at you as its hero.
 *
 * Palette is the wp-admin "Coffee" colour scheme, kept honest:
 * #2b2724 base, #59524c rules, #c7a589 highlight, #9ea476 notification.
 *
 * Colour rule that governs everything below:
 *   tan  = what you can do   (links, buttons, keys, active states)
 *   sage = what is true      (versions, tested-up-to, current release, focus)
 *
 * Mobile first. Every media query is min-width; base styles are the phone.
 *
 * ---------------------------------------------------------------------------
 * TABLE OF CONTENTS
 * ---------------------------------------------------------------------------
 *  1. Tokens
 *  2. Base and utilities
 *  3. Keyframes
 *  4. Comment gutter and shell
 *  5. Topbar and site footer
 *  6. Header block — the signature
 *  7. Display type
 *  8. Bands and readme section heads
 *  9. Product grid
 * 10. Archive list
 * 11. Terms, filters, chips
 * 12. Search form and empty state
 * 13. Pagination
 * 14. Prose
 * 15. Two-column layout with rail
 * 16. Actions
 * 17. Screenshot frames
 * 18. Gallery grid and lightbox
 * 19. Changelog spine
 * 20. Support columns
 * 21. Hero and masthead
 * 22. Contact form
 * 23. Post meta icon row
 * 24. Back to top
 * 25. Reveal and reduced motion
 * 26. WordPress conversion layer
 * ---------------------------------------------------------------------------
 */


/* ==========================================================================
   1. Tokens
   ========================================================================== */

:root {

	/* Colour */
	--ink-990: #241f1c;
	--ink-950: #2b2724;
	--ink-900: #37322e;
	--ink-850: #3f3a35;
	--rule: #59524c;
	--tan: #c7a589;
	--sage: #9ea476;
	--paper: #ede8e3;
	--paper-dim: #b7ada4;

	/* Type */
	--mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
	--display: "Bricolage Grotesque", "Helvetica Neue", Arial, sans-serif;
	--body: "Newsreader", Georgia, serif;

	/* Layout */
	--gutter-w: 5.5rem;
	--pad-x: clamp(1.25rem, 4vw, 3.5rem);
	--maxw: 76rem;

	/* Motion */
	--ease: cubic-bezier(.2, .7, .2, 1);
}


/* ==========================================================================
   2. Base and utilities
   ========================================================================== */

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

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

body {
	margin: 0;
	background: var(--ink-950);
	color: var(--paper);
	font-family: var(--body);
	font-size: 1.0625rem;
	line-height: 1.65;
	font-optical-sizing: auto;
	-webkit-font-smoothing: antialiased;
}

a:focus-visible,
button:focus-visible,
input:focus-visible {
	outline: 2px solid var(--sage);
	outline-offset: 3px;
	border-radius: 1px;
}

.wrap {
	max-width: var(--maxw);
	margin-inline: auto;
	padding-inline: var(--pad-x);
}

/* Text a screen reader needs and the layout does not. */
.sr-label {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	border: 0;
}


/* ==========================================================================
   3. Keyframes
   ========================================================================== */

/* Hairlines draw themselves downward, like a file being read. */
@keyframes draw {

	from {
		transform: scaleY(0);
	}

	to {
		transform: scaleY(1);
	}
}

/* Header-block rows arrive one line at a time. */
@keyframes lineIn {

	from {
		opacity: 0;
		transform: translateY(.45rem);
	}

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


/* ==========================================================================
   4. Comment gutter and shell

   Page chrome borrowed from the `*` column of a style.css comment block.
   Appears at 60rem and up only; below that the page has no left rail.
   ========================================================================== */

.gutter {
	position: fixed;
	inset: 0 auto 0 0;
	z-index: 5;
	display: none;
	width: var(--gutter-w);
	border-right: 1px solid var(--rule);
	pointer-events: none;
}

.gutter::before {
	content: "";
	position: absolute;
	top: 0;
	left: calc(50% - .5px);
	width: 1px;
	height: 100%;
	background: var(--rule);
	transform-origin: top;
	animation: draw 1.4s .2s var(--ease) both;
}

.gutter b {
	position: absolute;
	left: 0;
	width: 100%;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 400;
	text-align: center;
	color: var(--rule);
}

@media (min-width: 60rem) {

	.gutter {
		display: block;
	}

	.shell {
		padding-left: var(--gutter-w);
	}
}


/* ==========================================================================
   5. Topbar and site footer
   ========================================================================== */

.topbar {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 1.5rem;
	padding-block: 1.5rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

.topbar nav {
	display: flex;
	flex-wrap: wrap;
	gap: 1.25rem;
}

.topbar a {
	padding-bottom: 2px;
	border-bottom: 1px solid transparent;
	text-decoration: none;
	color: var(--paper-dim);
}

.topbar a:hover,
.topbar a:focus-visible {
	border-bottom-color: var(--tan);
	color: var(--tan);
}

.topbar a[aria-current="page"] {
	border-bottom-color: var(--rule);
	color: var(--paper);
}

.site-foot {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 1rem;
	padding-block: 2rem 3.5rem;
	border-top: 1px solid var(--rule);
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .04em;
	color: var(--paper-dim);
}

.site-foot a {
	color: var(--paper-dim);
}

.site-foot a:hover {
	color: var(--tan);
}


/* ==========================================================================
   6. Header block — the signature

   The style.css header, set as type: the `*` gutter becomes a real rule,
   the keys become mono small-caps, the Theme Name value becomes the display
   line. Two columns from 44rem up, stacked below.
   ========================================================================== */

.block {
	position: relative;
	padding-left: 1.75rem;
}

.block::before {
	content: "";
	position: absolute;
	top: .4rem;
	bottom: .4rem;
	left: 0;
	width: 1px;
	background: var(--tan);
	opacity: .5;
	transform-origin: top;
	animation: draw 1.1s .15s var(--ease) both;
}

.block .star {
	position: absolute;
	left: -.15rem;
	font-family: var(--mono);
	font-size: .75rem;
	color: var(--tan);
	opacity: .6;
}

.row {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: .15rem .9rem;
	animation: lineIn .5s var(--ease) both;
}

.row + .row {
	margin-top: .7rem;
}

.row.tight + .row.tight {
	margin-top: .1rem;
}

.key {
	padding-top: .45rem;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tan);
}

.val {
	font-family: var(--body);
	color: var(--paper);
}

.val-mono {
	font-family: var(--mono);
	font-size: .875rem;
	letter-spacing: .01em;
	color: var(--paper-dim);
}

@media (min-width: 44rem) {

	.row {
		grid-template-columns: 11.5rem minmax(0, 1fr);
		align-items: baseline;
		gap: .35rem 1.25rem;
	}

	/* The display row aligns its key to the cap height, not the baseline. */
	.row-name {
		align-items: start;
	}

	.row-name .key {
		padding-top: .9rem;
	}
}


/* ==========================================================================
   7. Display type
   ========================================================================== */

.name {
	display: block;
	margin: 0 0 .1rem;
	font-family: var(--display);
	font-size: clamp(2.9rem, 10.5vw, 7rem);
	font-weight: 700;
	font-variation-settings: "wdth" 88;
	line-height: .88;
	letter-spacing: -.025em;
	color: var(--paper);
}

.title-xl {
	margin: 0 0 .75rem;
	font-family: var(--display);
	font-size: clamp(2.6rem, 8vw, 5.5rem);
	font-weight: 700;
	font-variation-settings: "wdth" 88;
	line-height: .92;
	letter-spacing: -.025em;
}

.title-lg {
	margin: 0 0 .6rem;
	font-family: var(--display);
	font-size: clamp(2rem, 5vw, 3.25rem);
	font-weight: 600;
	font-variation-settings: "wdth" 92;
	line-height: .98;
	letter-spacing: -.02em;
}

.lede {
	max-width: 36ch;
	margin: 0;
	font-size: clamp(1.15rem, 2.1vw, 1.5rem);
	line-height: 1.4;
	color: var(--paper);
}

.lede em {
	font-style: italic;
	color: var(--tan);
}

/* Filesystem paths do the job an eyebrow label usually pretends to do. */
.path {
	margin: 0 0 1.25rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .05em;
	word-break: break-all;
	color: var(--paper-dim);
}

.path i {
	font-style: normal;
	color: var(--tan);
}


/* ==========================================================================
   8. Bands and readme section heads

   Section spacing lives here and nowhere else, so vertical rhythm can never
   be doubled or cancelled by a child's margin.
   ========================================================================== */

.band {
	padding-block: clamp(2.75rem, 6vw, 4.5rem);
}

.band + .band,
.band-top {
	border-top: 1px solid var(--rule);
}

.band-head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .65rem;
	margin: 0 0 .5rem;
	font-family: var(--mono);
	font-size: .8125rem;
	font-weight: 500;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--paper);
}

/* The `==` of a readme.txt section head, dimmed so it reads as a mark. */
.band-head .eq {
	font-weight: 400;
	letter-spacing: 0;
	color: var(--rule);
}

.band-head .count {
	font-weight: 400;
	letter-spacing: .06em;
	color: var(--paper-dim);
}

.band-note {
	max-width: 46ch;
	margin: 0 0 clamp(1.75rem, 4vw, 2.5rem);
	font-family: var(--body);
	font-size: 1rem;
	color: var(--paper-dim);
}


/* ==========================================================================
   9. Product grid

   1px gaps over a rule-coloured background: hairline seams, not gutters, so
   the group reads as one table rather than as floating cards.
   ========================================================================== */

.grid {
	display: grid;
	gap: 1px;
	background: var(--rule);
	border: 1px solid var(--rule);
	border-radius: 2px;
}

.item {
	position: relative;
	display: flex;
	flex-direction: column;
	padding: 1.6rem 1.5rem 1.4rem;
	background: var(--ink-900);
	text-decoration: none;
	color: inherit;
	transition: background .25s ease;
}

.item:hover,
.item:focus-visible {
	background: var(--ink-850);
}

.item .path {
	margin: 0 0 1.1rem;
	font-size: .6875rem;
}

.item h3 {
	margin: 0 0 .55rem;
	font-family: var(--display);
	font-size: clamp(1.6rem, 3.4vw, 2.1rem);
	font-weight: 600;
	font-variation-settings: "wdth" 92;
	line-height: 1.02;
	letter-spacing: -.015em;
	color: var(--paper);
}

/* The one flourish: a rule wipes out from under the title on hover. */
.item h3::after {
	content: "";
	display: block;
	width: 0;
	height: 1px;
	margin-top: .4rem;
	background: var(--tan);
	transition: width .35s var(--ease);
}

.item:hover h3::after,
.item:focus-visible h3::after {
	width: 2.5rem;
}

.item p {
	max-width: 38ch;
	margin: 0 0 1.4rem;
	color: var(--paper-dim);
}

.item .meta {
	display: flex;
	flex-wrap: wrap;
	gap: .3rem 1.1rem;
	margin-top: auto;
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .05em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

/* `= 2.4.1 =` — readme.txt version syntax. Sage: this is state, not a link. */
.ver {
	display: inline-flex;
	align-items: center;
	gap: .4rem;
	color: var(--sage);
}

.ver s {
	display: inline-block;
	text-decoration: none;
	color: var(--rule);
	transition: color .25s ease;
}

.item:hover .ver s,
.item:focus-visible .ver s {
	color: var(--sage);
}

.beta {
	color: var(--tan);
}

@media (min-width: 52rem) {

	.grid {
		grid-template-columns: 1fr 1fr;
	}
}


/* ==========================================================================
   10. Archive list

   Denser than the product grid on purpose: archive, category, tag and search
   are indexes, not showcases. Three columns from 48rem up.
   ========================================================================== */

.list {
	border-top: 1px solid var(--rule);
}

.entry {
	position: relative;
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: .5rem 2rem;
	padding: 1.5rem 0 1.5rem 1.6rem;
	border-bottom: 1px solid var(--rule);
	text-decoration: none;
	color: inherit;
}

.entry::before {
	content: "*";
	position: absolute;
	top: 1.55rem;
	left: 0;
	font-family: var(--mono);
	font-size: .75rem;
	color: var(--rule);
	transition: color .25s ease, transform .25s ease;
}

.entry:hover,
.entry:focus-visible {
	background: var(--ink-900);
}

.entry:hover::before,
.entry:focus-visible::before {
	color: var(--tan);
	transform: translateX(.15rem);
}

.entry-stamp {
	display: flex;
	flex-direction: column;
	gap: .2rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .04em;
	color: var(--sage);
}

.entry-stamp s {
	text-decoration: none;
	color: var(--rule);
}

.entry-stamp time {
	font-size: .6875rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

.entry-body h2 {
	margin: 0 0 .35rem;
	font-family: var(--display);
	font-size: clamp(1.4rem, 2.6vw, 1.85rem);
	font-weight: 600;
	font-variation-settings: "wdth" 92;
	line-height: 1.05;
	letter-spacing: -.015em;
	color: var(--paper);
}

.entry:hover .entry-body h2,
.entry:focus-visible .entry-body h2 {
	color: var(--tan);
}

.entry-body p {
	max-width: 56ch;
	margin: 0;
	color: var(--paper-dim);
}

/* Search hits are marked with colour and italics, never a highlighter block. */
.entry-body mark {
	background: transparent;
	font-style: italic;
	color: var(--tan);
}

.entry-kind {
	display: flex;
	flex-direction: column;
	gap: .25rem;
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

@media (min-width: 48rem) {

	.entry {
		grid-template-columns: 9.5rem minmax(0, 1fr) 8.5rem;
		align-items: start;
		padding-right: .75rem;
	}

	.entry-kind {
		align-items: flex-end;
		text-align: right;
	}
}


/* ==========================================================================
   11. Terms, filters, chips
   ========================================================================== */

.filters {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem;
	margin: 0 0 clamp(1.5rem, 3vw, 2rem);
	padding: 0;
	list-style: none;
}

.chip {
	display: inline-flex;
	align-items: baseline;
	gap: .4rem;
	padding: .4rem .7rem;
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	text-decoration: none;
	color: var(--paper-dim);
	transition: border-color .2s ease, color .2s ease;
}

.chip:hover {
	border-color: var(--tan);
	color: var(--tan);
}

.chip b {
	font-weight: 400;
	color: var(--rule);
}

.chip:hover b {
	color: var(--tan);
}

.chip[aria-current="page"] {
	background: var(--tan);
	border-color: var(--tan);
	color: var(--ink-950);
}

.chip[aria-current="page"] b {
	color: var(--ink-950);
	opacity: .6;
}

.term-note {
	max-width: 52ch;
	margin: 0 0 clamp(1.75rem, 4vw, 2.5rem);
	padding: .15rem 0 .15rem 1.25rem;
	border-left: 1px solid var(--tan);
	color: var(--paper-dim);
}

.term-note strong {
	font-weight: 600;
	color: var(--paper);
}


/* ==========================================================================
   12. Search form and empty state
   ========================================================================== */

.searchform {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem;
	max-width: 34rem;
	margin: 0 0 clamp(1.5rem, 3vw, 2rem);
}

.searchform label {
	flex: 0 0 100%;
	margin-bottom: .15rem;
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tan);
}

.searchform input {
	flex: 1 1 14rem;
	min-width: 0;
	padding: .7rem .85rem;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .875rem;
	color: var(--paper);
}

.searchform input::placeholder {
	color: var(--rule);
}

.searchform input:focus {
	border-color: var(--tan);
	outline-offset: 1px;
}

.searchform button {
	padding: .7rem 1.1rem;
	background: var(--tan);
	border: 1px solid var(--tan);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 600;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--ink-950);
	cursor: pointer;
	transition: filter .2s ease;
}

.searchform button:hover {
	filter: brightness(1.08);
}

/* An empty result is an invitation to act, so it always offers a next step. */
.empty {
	max-width: 52ch;
	padding: clamp(1.5rem, 4vw, 2.5rem);
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
}

.empty h3 {
	margin: 0 0 .6rem;
	font-family: var(--display);
	font-size: 1.75rem;
	font-weight: 600;
	font-variation-settings: "wdth" 92;
	line-height: 1.05;
}

.empty p {
	margin: 0 0 1.1rem;
	color: var(--paper-dim);
}

.empty p:last-child {
	margin: 0;
}

.empty a {
	border-bottom: 1px solid var(--rule);
	text-decoration: none;
	color: var(--tan);
}

.empty a:hover {
	border-bottom-color: var(--tan);
}


/* ==========================================================================
   13. Pagination
   ========================================================================== */

.pager {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 1.25rem;
	padding-top: 1.75rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

.pager a {
	padding-bottom: 2px;
	border-bottom: 1px solid transparent;
	text-decoration: none;
	color: var(--paper-dim);
}

.pager a:hover {
	border-bottom-color: var(--tan);
	color: var(--tan);
}

.pager .pages {
	display: flex;
	gap: .85rem;
}

.pager .pages a[aria-current="page"] {
	border-bottom-color: var(--tan);
	color: var(--paper);
}

.pager .spacer {
	flex: 1;
}


/* ==========================================================================
   14. Prose

   Used by single.php and page.php. Section heads are readme.txt syntax;
   body copy is capped at 62ch.
   ========================================================================== */

.doc h2 {
	display: flex;
	align-items: baseline;
	gap: .65rem;
	margin: 0 0 1rem;
	font-family: var(--mono);
	font-size: .8125rem;
	font-weight: 500;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--paper);
}

.doc h2 .eq {
	font-weight: 400;
	letter-spacing: 0;
	color: var(--rule);
}

.doc h3 {
	margin: 1.75rem 0 .5rem;
	font-family: var(--body);
	font-size: 1.25rem;
	font-weight: 600;
	color: var(--paper);
}

.doc section + section {
	margin-top: clamp(2.5rem, 5vw, 3.5rem);
	padding-top: clamp(2.5rem, 5vw, 3.5rem);
	border-top: 1px solid var(--rule);
}

.doc p {
	max-width: 62ch;
	margin: 0 0 1.1rem;
}

.doc p:last-child {
	margin-bottom: 0;
}

.doc strong {
	font-weight: 600;
	color: var(--paper);
}

.doc a {
	border-bottom: 1px solid var(--tan);
	text-decoration: none;
	color: var(--paper);
}

.doc a:hover {
	color: var(--tan);
}

.doc code {
	padding: .1em .35em;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .8125em;
	color: var(--tan);
}

.doc ul,
.doc ol {
	max-width: 62ch;
	margin: 0 0 1.1rem;
	padding-left: 1.1rem;
}

.doc li {
	margin-bottom: .4rem;
}

.doc li::marker {
	color: var(--tan);
}

.doc blockquote {
	margin: 1.5rem 0;
	padding: .15rem 0 .15rem 1.25rem;
	border-left: 1px solid var(--tan);
	font-size: 1.15rem;
	line-height: 1.5;
	color: var(--paper);
}

.doc hr {
	margin: 2rem 0;
	border: 0;
	border-top: 1px solid var(--rule);
}

/* Question and answer pairs, hairline-separated. */
.qa {
	margin-top: 1rem;
	padding-top: 1rem;
	border-top: 1px solid var(--rule);
}

.qa:first-of-type {
	margin-top: 0;
	padding-top: 0;
	border-top: 0;
}

.qa h3 {
	margin: 0 0 .35rem;
	font-size: 1.0625rem;
}

.qa p {
	color: var(--paper-dim);
}


/* ==========================================================================
   15. Two-column layout with rail

   Prose plus a 19rem rail from 60rem up. Below that the rail becomes an
   ordinary block after the prose.
   ========================================================================== */

.cols {
	display: grid;
	gap: clamp(2.5rem, 5vw, 4rem);
	padding-block: clamp(2.5rem, 6vw, 4rem);
	border-top: 1px solid var(--rule);
}

.rail {
	align-self: start;
}

.card {
	padding: 1.25rem 1.25rem 1.4rem;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
}

/* The plugin header fields again, this time as a definition list. */
.card dl {
	display: grid;
	grid-template-columns: auto 1fr;
	align-items: baseline;
	gap: .5rem .9rem;
	margin: 0;
}

.card dt {
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .07em;
	text-transform: uppercase;
	color: var(--tan);
}

.card dd {
	margin: 0;
	font-family: var(--mono);
	font-size: .8125rem;
	text-align: right;
	color: var(--paper);
}

.card dd.ok {
	color: var(--sage);
}

.card-nav {
	display: flex;
	flex-direction: column;
	gap: .55rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.card-nav a {
	display: flex;
	gap: .5rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .04em;
	text-decoration: none;
	color: var(--paper-dim);
}

.card-nav a:hover {
	color: var(--tan);
}

.card-nav a b {
	font-weight: 400;
	color: var(--rule);
}

.card-nav a:hover b {
	color: var(--tan);
}

@media (min-width: 60rem) {

	.cols {
		grid-template-columns: minmax(0, 1fr) 19rem;
		gap: 5rem;
	}

	.rail {
		position: sticky;
		top: 2rem;
	}
}


/* ==========================================================================
   16. Actions

   Tan on dark brown, inverting on hover. Sage is never used for a button:
   at that scale it reads as a warning rather than an invitation.
   ========================================================================== */

.cta {
	display: block;
	margin-top: 1.25rem;
	padding: .8rem 1rem;
	background: var(--ink-990);
	border: 1px solid var(--tan);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .8125rem;
	font-weight: 600;
	letter-spacing: .06em;
	text-align: center;
	text-transform: uppercase;
	text-decoration: none;
	color: var(--tan);
	transition: background .2s ease, color .2s ease;
}

.cta:hover {
	background: var(--tan);
	color: var(--ink-990);
}

.cta-sub {
	display: block;
	margin-top: .6rem;
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .05em;
	text-align: center;
	text-decoration: none;
	color: var(--paper-dim);
}

.cta-sub:hover {
	color: var(--tan);
}

.btn {
	padding: .8rem 1.4rem;
	background: var(--ink-990);
	border: 1px solid var(--tan);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .8125rem;
	font-weight: 600;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--tan);
	cursor: pointer;
	transition: background .2s ease, color .2s ease;
}

.btn:hover {
	background: var(--tan);
	color: var(--ink-990);
}

.back {
	text-decoration: none;
	color: var(--paper-dim);
}

.back:hover {
	color: var(--tan);
}


/* ==========================================================================
   17. Screenshot frames

   Placeholder admin UI drawn in CSS, standing in for real screenshots.
   Swap `.frame` for an <img> and the surrounding components keep working.
   ========================================================================== */

.frame {
	display: flex;
	gap: .5rem;
	aspect-ratio: 16 / 10;
	padding: .55rem;
	overflow: hidden;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
}

.frame .side {
	display: flex;
	flex-direction: column;
	gap: .3rem;
	width: 22%;
	padding: .4rem .35rem;
	background: var(--ink-850);
	border-radius: 1px;
}

.frame .side i {
	display: block;
	height: .3rem;
	background: var(--rule);
	border-radius: 1px;
}

.frame .side i:first-child {
	width: 80%;
	background: var(--tan);
	opacity: .7;
}

.frame .main {
	display: flex;
	flex: 1;
	flex-direction: column;
	gap: .4rem;
}

.frame .bar {
	width: 45%;
	height: .55rem;
	background: var(--rule);
	border-radius: 1px;
}

.frame .field {
	flex: 0 0 auto;
	height: 1.5rem;
	border: 1px solid var(--rule);
	border-radius: 1px;
}

.frame .fill {
	flex: 1 1 auto;
	min-height: 1rem;
	background: var(--ink-850);
	border-radius: 1px;
}

.frame .go {
	flex: 0 0 auto;
	width: 5rem;
	height: 1.1rem;
	background: var(--tan);
	border-radius: 1px;
	opacity: .7;
}

/* Two-up figure pair, used where a full gallery would be too much. */
.shots {
	display: grid;
	gap: 1rem;
}

.shots figure {
	margin: 0;
}

.shots figcaption {
	margin-top: .5rem;
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .05em;
	color: var(--paper-dim);
}

@media (min-width: 40rem) {

	.shots {
		grid-template-columns: 1fr 1fr;
	}
}


/* ==========================================================================
   18. Gallery grid and lightbox

   Uniform cells on purpose, never masonry: readme.txt screenshots are
   numbered and ordered, so every tile carries the same weight and the
   sequence carries the meaning. Hairline seams match the product grid.
   ========================================================================== */

.gallery {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
	gap: 1px;
	background: var(--rule);
	border: 1px solid var(--rule);
	border-radius: 2px;
}

.tile {
	position: relative;
	display: block;
	width: 100%;
	margin: 0;
	padding: .9rem;
	background: var(--ink-900);
	border: 0;
	border-radius: 0;
	font: inherit;
	text-align: left;
	color: inherit;
	cursor: zoom-in;
	transition: background .25s ease;
}

.tile:hover,
.tile:focus-visible {
	background: var(--ink-850);
}

.tile figure {
	margin: 0;
}

.tile .num {
	position: absolute;
	right: .9rem;
	bottom: .95rem;
	z-index: 1;
	font-family: var(--mono);
	font-size: .625rem;
	letter-spacing: .08em;
	color: var(--rule);
}

.tile:hover .num,
.tile:focus-visible .num {
	color: var(--tan);
}

.tile figcaption {
	margin-top: .6rem;
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .04em;
	color: var(--paper-dim);
}

.tile:hover figcaption {
	color: var(--paper);
}

/* Same chrome, bigger frame. No slideshow, no rewritten captions. */
.lightbox {
	position: fixed;
	inset: 0;
	z-index: 20;
	display: none;
	align-items: center;
	justify-content: center;
	padding: clamp(1rem, 4vw, 3rem);
	background: rgba(23, 20, 18, .94);
}

.lightbox.open {
	display: flex;
}

.lightbox-inner {
	width: min(64rem, 100%);
}

.lightbox .frame {
	aspect-ratio: 16 / 10;
	padding: 1rem;
}

.lightbox figcaption {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 1rem;
	margin-top: .85rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .05em;
	color: var(--paper-dim);
}

.lightbox-bar {
	display: flex;
	justify-content: flex-end;
	margin-top: .85rem;
}

.lightbox-close {
	padding: .45rem .7rem;
	background: none;
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--paper-dim);
	cursor: pointer;
}

.lightbox-close:hover {
	border-color: var(--tan);
	color: var(--tan);
}


/* ==========================================================================
   19. Changelog spine

   The one place numbering is honest: releases are a sequence, newest first.
   ========================================================================== */

.log {
	position: relative;
	padding-left: 1.9rem;
}

.log::before {
	content: "";
	position: absolute;
	top: .6rem;
	bottom: .6rem;
	left: .32rem;
	width: 1px;
	background: var(--rule);
}

.rel {
	position: relative;
	padding-bottom: 1.6rem;
}

.rel:last-child {
	padding-bottom: 0;
}

.rel::before {
	content: "";
	position: absolute;
	top: .52rem;
	left: -1.58rem;
	width: .45rem;
	height: .45rem;
	background: var(--ink-950);
	border: 1px solid var(--rule);
	border-radius: 50%;
}

/* Current release: the only sage fill on the page. */
.rel.now::before {
	background: var(--sage);
	border-color: var(--sage);
}

.rel .tag {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .6rem;
	margin-bottom: .3rem;
	font-family: var(--mono);
	font-size: .8125rem;
	font-weight: 500;
	letter-spacing: .04em;
	color: var(--paper);
}

.rel .tag s {
	text-decoration: none;
	color: var(--rule);
}

.rel .tag time {
	font-size: .6875rem;
	font-weight: 400;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

.rel.now .tag {
	color: var(--sage);
}

.rel ul {
	max-width: 58ch;
	margin: 0;
	padding-left: 1.05rem;
	color: var(--paper-dim);
}

.rel li {
	margin-bottom: .25rem;
}


/* ==========================================================================
   20. Support columns
   ========================================================================== */

.support {
	display: grid;
	gap: 1.75rem;
}

.support h4 {
	margin: 0 0 .5rem;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tan);
}

.support p {
	margin: 0;
	color: var(--paper-dim);
}

.support a {
	border-bottom: 1px solid var(--tan);
	text-decoration: none;
	color: var(--paper);
}

.support a:hover {
	color: var(--tan);
}

@media (min-width: 52rem) {

	.support {
		grid-template-columns: repeat(3, 1fr);
		gap: 2.5rem;
	}
}


/* ==========================================================================
   21. Hero and masthead
   ========================================================================== */

.hero {
	padding-block: clamp(2.5rem, 7vw, 5rem) clamp(2rem, 4vw, 3rem);
}

/* Real header fields, doing the job invented statistics usually do. */
.hero-foot {
	display: flex;
	flex-wrap: wrap;
	gap: .4rem 2rem;
	margin-top: clamp(2rem, 5vw, 3rem);
	padding-top: 1rem;
	border-top: 1px solid var(--rule);
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .04em;
	color: var(--paper-dim);
}

.hero-foot span b {
	font-weight: 500;
	color: var(--paper);
}

.masthead {
	padding-block: clamp(2rem, 5vw, 3.5rem) clamp(1.75rem, 4vw, 2.75rem);
}

.masthead-eyebrow {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .65rem;
	margin: 0 0 1rem;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 500;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--tan);
}

.masthead-eyebrow .eq {
	font-weight: 400;
	letter-spacing: 0;
	color: var(--rule);
}

.masthead-eyebrow .count {
	font-weight: 400;
	color: var(--paper-dim);
}


/* ==========================================================================
   22. Contact form

   Field rows keep the header-block rhythm: mono key on the left, input on
   the right, one hairline per row.
   ========================================================================== */

.form {
	max-width: 38rem;
}

.field-row {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: .4rem;
	padding-block: 1.1rem;
	border-top: 1px solid var(--rule);
}

.field-row:last-of-type {
	border-bottom: 1px solid var(--rule);
}

.field-row label {
	padding-top: .7rem;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tan);
}

.field-row label .req {
	margin-left: .3rem;
	color: var(--sage);
}

.field-row input,
.field-row textarea,
.field-row select {
	width: 100%;
	padding: .7rem .85rem;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .875rem;
	line-height: 1.55;
	color: var(--paper);
}

.field-row textarea {
	min-height: 9rem;
	resize: vertical;
}

/* Native select arrow replaced with a tan caret drawn in two gradients. */
.field-row select {
	appearance: none;
	-webkit-appearance: none;
	padding-right: 2.25rem;
	background-image:
		linear-gradient(45deg, transparent 50%, var(--tan) 50%),
		linear-gradient(135deg, var(--tan) 50%, transparent 50%);
	background-position:
		calc(100% - 1.1rem) 1.15rem,
		calc(100% - .8rem) 1.15rem;
	background-size: .3rem .3rem, .3rem .3rem;
	background-repeat: no-repeat;
	cursor: pointer;
}

.field-row input::placeholder,
.field-row textarea::placeholder {
	color: var(--rule);
}

.field-row input:focus,
.field-row textarea:focus,
.field-row select:focus {
	border-color: var(--tan);
	outline-offset: 1px;
}

/* A hint demonstrates; the label labels. Neither does the other's job. */
.field-hint {
	grid-column: 1 / -1;
	margin: .15rem 0 0;
	font-family: var(--body);
	font-size: .9375rem;
	color: var(--paper-dim);
}

.form-foot {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 1.25rem;
	padding-top: 1.5rem;
}

.form-foot small {
	font-family: var(--mono);
	font-size: .6875rem;
	letter-spacing: .05em;
	color: var(--paper-dim);
}

/* Sage border for success, tan for errors. Neither apologises. */
.notice {
	max-width: 38rem;
	margin: 0 0 1.75rem;
	padding: 1rem 1.15rem;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-left: 2px solid var(--sage);
	border-radius: 2px;
}

.notice p {
	margin: 0;
	color: var(--paper);
}

.notice b {
	display: block;
	margin-bottom: .25rem;
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--sage);
}

.notice-error {
	border-left-color: var(--tan);
}

.notice-error b {
	color: var(--tan);
}

@media (min-width: 44rem) {

	.field-row {
		grid-template-columns: 9.5rem minmax(0, 1fr);
		align-items: start;
		gap: .4rem 1.25rem;
	}

	.field-hint {
		grid-column: 2;
	}
}


/* ==========================================================================
   23. Post meta icon row

   Font Awesome 6. One wrapping line under the masthead: when it shipped,
   who tagged it, where it lives. Icons are decorative; the text is the label.
   ========================================================================== */

.post-meta {
	display: flex;
	flex-wrap: wrap;
	gap: .55rem 1.5rem;
	margin: 1.5rem 0 0;
	padding: 0;
	list-style: none;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .05em;
	color: var(--paper-dim);
}

.post-meta li {
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	min-width: 0;
}

.post-meta i {
	flex: 0 0 auto;
	width: 1em;
	font-size: .8125rem;
	text-align: center;
	color: var(--tan);
}

.post-meta a {
	padding-bottom: 1px;
	border-bottom: 1px solid transparent;
	text-decoration: none;
	color: var(--paper-dim);
}

.post-meta a:hover {
	border-bottom-color: var(--tan);
	color: var(--tan);
}

.post-meta .terms {
	display: inline-flex;
	flex-wrap: wrap;
	gap: .4rem;
}

.post-meta .terms a::after {
	content: ",";
	color: var(--rule);
}

.post-meta .terms a:last-child::after {
	content: "";
}

.post-meta .ok {
	color: var(--sage);
}


/* ==========================================================================
   24. Back to top

   Set as a mono line, not a floating circle — the system has no circles
   apart from the changelog dots.
   ========================================================================== */

.to-top {
	position: fixed;
	right: clamp(1rem, 3vw, 2rem);
	bottom: clamp(1rem, 3vw, 2rem);
	z-index: 6;
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	padding: .6rem .8rem;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--paper-dim);
	opacity: 0;
	visibility: hidden;
	transform: translateY(.5rem);
	cursor: pointer;
	transition:
		opacity .3s ease,
		transform .3s var(--ease),
		visibility .3s,
		color .2s ease,
		border-color .2s ease;
}

.to-top.in {
	opacity: 1;
	visibility: visible;
	transform: none;
}

.to-top:hover {
	border-color: var(--tan);
	color: var(--tan);
}

.to-top i {
	font-style: normal;
	color: var(--tan);
}


/* ==========================================================================
   25. Reveal and reduced motion
   ========================================================================== */

.reveal {
	opacity: 0;
	transform: translateY(.6rem);
}

.reveal.in {
	opacity: 1;
	transform: none;
	transition:
		opacity .6s ease,
		transform .6s var(--ease);
}

/* Nothing on the page depends on motion to be readable. */
@media (prefers-reduced-motion: reduce) {

	html {
		scroll-behavior: auto;
	}

	* {
		animation-duration: .001s !important;
		animation-delay: 0s !important;
		transition-duration: .001s !important;
	}

	.reveal {
		opacity: 1;
		transform: none;
	}
}


/* ==========================================================================
   26. WordPress conversion layer

   Everything above this line is the source stylesheet, unchanged. Everything
   below was added during the WordPress conversion and does one of four jobs:

     26.1  replaces the ten inline `style` attributes the source HTML carried,
           so no template has to write a style attribute;
     26.2  repoints the eight places where --rule was used as *text* colour,
           which measured 1.96:1 against the page. Hairlines keep --rule;
     26.3  enlarges three tap targets to 44x44 CSS pixels without moving a
           single pixel of paint, using an invisible ::after overlay;
     26.4  spaces the gallery grid and styles the <img> that replaces the
           CSS-drawn .frame mock, matching .frame's box exactly;
     26.5  styles the skip link, which a static page had no need of;
     26.6  styles the breadcrumb trail, which a static page had no need of;
     26.7  spaces the link a capped band offers to its full archive;
     26.8  draws the inline marks used in listings;
     26.9  styles the search toggle and its overlay;
     26.10 offsets and de-outlines the bands the release-index chips jump to;
     26.11 hides the contact form's honeypot field from people but not bots.
   ========================================================================== */


/* --------------------------------------------------------------------------
   26.1  Inline styles, extracted
   -------------------------------------------------------------------------- */

/* Was: <b style="top:1.6rem"> etc. in the .gutter of every template. */
.gutter b:nth-child(1) {
	top: 1.6rem;
}

.gutter b:nth-child(2) {
	top: 9rem;
}

.gutter b:nth-child(3) {
	top: 16rem;
}

/* Was: <span class="star" style="top:.35rem"> in the front-page hero. */
.block .star {
	top: .35rem;
}

/* Was: <div class="row" style="animation-delay:.20s"> and five siblings.
   The .star is .block's first child, so the rows start at nth-child(2). */
.block .row:nth-child(2) {
	animation-delay: .2s;
}

.block .row:nth-child(3) {
	animation-delay: .3s;
}

.block .row:nth-child(4) {
	animation-delay: .4s;
}

.block .row:nth-child(5) {
	animation-delay: .46s;
}

.block .row:nth-child(6) {
	animation-delay: .52s;
}

.block .row:nth-child(7) {
	animation-delay: .58s;
}


/* --------------------------------------------------------------------------
   26.2  Contrast: --rule as text

   --rule (#59524c) is right for a hairline and wrong for a glyph: 1.96:1 on
   --ink-950, 1.75:1 on --ink-900. --rule-text is the same hue carried up to
   4.6:1 on --ink-900 and 5.5:1 on --ink-950, so it clears AA on both surfaces
   the marks ever sit on. Borders, gutters and spines are untouched.
   -------------------------------------------------------------------------- */

:root {
	--rule-text: #a89c91;
}

/* The `==` of a readme.txt section head. */
.band-head .eq,
.doc h2 .eq,
.masthead-eyebrow .eq {
	color: var(--rule-text);
}

/* The `=` marks bracketing a version number. */
.ver s,
.entry-stamp s,
.rel .tag s {
	color: var(--rule-text);
}

/* Counts and list bullets that carry real information. */
.chip b,
.card-nav a b,
.tile .num {
	color: var(--rule-text);
}

/* Placeholders were --rule on --ink-900: 1.75:1. */
.searchform input::placeholder,
.field-row input::placeholder,
.field-row textarea::placeholder {
	color: var(--paper-dim);
	opacity: 1;
}


/* --------------------------------------------------------------------------
   26.3  Tap targets

   .topbar a, .pager a and .chip all paint under 44px tall. Padding would move
   their underlines and borders, so the hit area is grown with a transparent
   overlay instead: same paint, same layout, 44px of touchable height.
   -------------------------------------------------------------------------- */

.topbar a,
.pager a,
.chip {
	position: relative;
}

.topbar a::after,
.pager a::after {
	content: "";
	position: absolute;
	inset: -.75rem 0;
}

.chip::after {
	content: "";
	position: absolute;
	inset: -.35rem 0;
}


/* --------------------------------------------------------------------------
   26.4  Gallery images

   The source drew .frame as a CSS mock of an admin screen and noted that an
   <img> could take its place. It now does, for attachments that have one;
   attachments without an image still get the drawn .frame. Same box either way.
   -------------------------------------------------------------------------- */

/*
 * The source design never needed this: its galleries sat in a <section> of
 * their own, and `.doc section + section` supplied the space. Inside post
 * content the grid is followed directly by the next heading, and `.doc h2`
 * has no top margin because it was relying on the same rule, so the two ended
 * up touching.
 *
 * Asymmetric on purpose. The paragraph above already contributes its own
 * 1.1rem, so the top only needs a little; the bottom carries the whole gap.
 */
.gallery {
	margin-block: .35rem clamp(2rem, 4.5vw, 3rem);
}

/*
 * A shortcode alone on a line can end up inside a paragraph, which would make
 * the grid a child of an inline context. This keeps it a block either way.
 */
.doc p > .gallery {
	display: grid;
}

.tile figure img,
.lightbox figure img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 16 / 10;
	object-fit: cover;
	background: var(--ink-900);
	border: 1px solid var(--rule);
	border-radius: 2px;
}


/* --------------------------------------------------------------------------
   26.5  Skip link

   The source had no skip link, because a static page has nothing to skip past.
   A WordPress template does. Set as the same mono chrome as the topbar, so it
   looks like part of the system rather than an accessibility bolt-on.
   -------------------------------------------------------------------------- */

.skip-link {
	position: absolute;
	top: -100%;
	left: var(--pad-x);
	z-index: 30;
	padding: .7rem 1rem;
	background: var(--ink-990);
	border: 1px solid var(--tan);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .75rem;
	font-weight: 600;
	letter-spacing: .06em;
	text-transform: uppercase;
	text-decoration: none;
	color: var(--tan);
}

/*
 * :focus-visible, not :focus.
 *
 * The back-to-top control moves focus here after scrolling, which is the right
 * target: it is the first focusable thing on the page, so the tab order picks
 * up where the reader now is. With :focus that also made the link appear, to a
 * mouse user who never asked for it and had no idea why it was there.
 *
 * :focus-visible draws exactly the distinction needed: a Tab press reveals it,
 * a script call after a mouse click does not. A keyboard user who activates
 * the same control with Enter does see it, which is correct, since they are about
 * to Tab, and it is the next thing they would reach.
 */
.skip-link:focus-visible {
	top: .75rem;
}


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

   Set as chrome, not as content: the same mono uppercase treatment as the
   topbar, so it reads as part of the frame rather than as the start of the
   article. That also keeps it clearly distinct from .path directly below it,
   which is lowercase and is content. One says where you are in the site, the
   other says where the file lives on disk.

   Separators are drawn here rather than written into the markup, so assistive
   technology announces three links and not three links and three slashes.
   -------------------------------------------------------------------------- */

.crumbs {
	padding-top: 1.5rem;
	font-family: var(--mono);
	font-size: .75rem;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--paper-dim);
}

.crumbs ol {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .3rem .55rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.crumbs li {
	display: inline-flex;
	align-items: baseline;
	gap: .55rem;
	min-width: 0;
}

/* The `/` of a path, dimmed to the same weight the `==` marks carry. */
.crumbs li + li::before {
	content: "/";
	color: var(--rule-text);
}

/*
 * Font Awesome marks, matching the ones the post meta row already uses for the
 * same ideas: a folder for a category, a hash for a tag. Decorative: the
 * label beside each one says the same thing in words.
 */
.crumbs i {
	flex: 0 0 auto;
	width: 1em;
	margin-right: .45rem;
	font-size: .8125rem;
	text-align: center;
	color: var(--tan);
}

.crumbs a {
	position: relative;
	display: inline-flex;
	align-items: baseline;
	padding-bottom: 2px;
	border-bottom: 1px solid transparent;
	text-decoration: none;
	color: var(--paper-dim);
}

.crumbs a:hover,
.crumbs a:focus-visible {
	border-bottom-color: var(--tan);
	color: var(--tan);
}

/* 44px hit area without moving the underline. See 26.3. */
.crumbs a::after {
	content: "";
	position: absolute;
	inset: -.75rem 0;
}

/*
 * The current page is not a link. It is the brightest thing in the row so the
 * trail reads as ending here rather than trailing off.
 */
.crumbs [aria-current="page"] {
	display: inline-flex;
	align-items: baseline;
	max-width: 32ch;
	color: var(--paper);
}

.crumbs [aria-current="page"] i {
	color: var(--paper-dim);
}

/*
 * The label is wrapped so it can truncate without clipping the icon beside it.
 * <b> rather than a span: it is the one word in the row carrying the weight.
 */
.crumbs b {
	overflow: hidden;
	font-weight: 400;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* The masthead already opens with generous space; do not add it twice. */
.crumbs + .masthead {
	padding-top: clamp(1rem, 2.5vw, 1.75rem);
}


/* --------------------------------------------------------------------------
   26.7  Capped band link

   A band on the release index shows a fixed number of cards and links to its
   own archive for the rest. Reuses the chip so the control reads as the same
   kind of thing as the filter row above it.
   -------------------------------------------------------------------------- */

.band-more {
	margin: clamp(1.25rem, 3vw, 1.75rem) 0 0;
}


/* --------------------------------------------------------------------------
   26.8  Inline marks

   The icons that appear in listings, drawn rather than fetched. Font Awesome
   loads on single posts, archives, search and the contact template only, and
   the product bands render on the front page and the release index where it is
   deliberately absent, so a webfont icon there would render nothing at all.

   Sized in em and coloured with currentColor, so a mark takes the size and
   colour of whatever row it sits in without a rule per context.
   -------------------------------------------------------------------------- */

.mark {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	width: 1em;
	height: 1em;
	margin-right: .45rem;
	vertical-align: -.1em;
}

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

.entry-kind .mark {
	color: inherit;
}

/*
 * Chips align on the baseline so the label and the count sit level. A mark has
 * no text in it to take a baseline from, so it is centred against the row
 * instead of hanging below it.
 */
.chip .mark {
	align-self: center;
	margin-right: .4rem;
	opacity: .85;
}

.chip:hover .mark,
.chip[aria-current="page"] .mark {
	opacity: 1;
}


/* --------------------------------------------------------------------------
   26.9  Search toggle and overlay

   The toggle is inline SVG at hairline weight, so it sits in the topbar as
   another mono mark rather than as an icon pasted onto one.

   The overlay reuses the lightbox's chrome: same backdrop, same close control,
   same close behaviour. Two full-screen surfaces on one site should not be two
   different designs.
   -------------------------------------------------------------------------- */

.search-toggle {
	position: relative;
	display: inline-flex;
	align-items: center;
	padding-bottom: 2px;
	border-bottom: 1px solid transparent;
	line-height: 1;
	text-decoration: none;
	color: var(--paper-dim);
}

.search-toggle:hover,
.search-toggle:focus-visible {
	border-bottom-color: var(--tan);
	color: var(--tan);
}

/* 44px hit area without moving the underline. See 26.3. */
.search-toggle::after {
	content: "";
	position: absolute;
	inset: -.75rem;
}

.search-overlay {
	position: fixed;
	inset: 0;
	z-index: 21;
	display: flex;
	align-items: flex-start;
	justify-content: center;
	padding: clamp(3rem, 12vh, 8rem) clamp(1rem, 4vw, 3rem);
	background: rgba(23, 20, 18, .94);
	opacity: 0;
	transition: opacity .2s ease;
}

/*
 * The hidden attribute is enforced by a user-agent rule, and the author
 * display above beats it. Without this the overlay is laid out on every page:
 * invisible at opacity 0, full viewport at z-index 21, and swallowing every
 * click on the site. It has to be restated in the author sheet to win.
 */
.search-overlay[hidden] {
	display: none;
}

/*
 * Nothing is clickable while it is fading out either. The element stays in the
 * tree for the length of the transition, and 200ms of a dead full-screen layer
 * over the page is 200ms of clicks going nowhere.
 */
.search-overlay:not(.open) {
	pointer-events: none;
}

.search-overlay.open {
	opacity: 1;
	pointer-events: auto;
}

.search-overlay-inner {
	width: min(42rem, 100%);
}

/*
 * The form is searchform.php, unchanged. Only its scale differs here: this is
 * the whole screen, so the field can be the size of the intent.
 */
.search-overlay .searchform {
	max-width: none;
	margin: 0;
}

.search-overlay .searchform label {
	margin-bottom: .5rem;
	font-size: .75rem;
}

.search-overlay .searchform input {
	flex: 1 1 18rem;
	padding: 1rem 1.1rem;
	font-size: 1.125rem;
}

.search-overlay .searchform button {
	padding: 1rem 1.4rem;
}

/*
 * Every category and tag, as browse links. On a catalogue most searches are an
 * attempt to find a category, and a reader who does not know the word you filed
 * something under gets further from a list than from a field.
 */
.search-overlay-browse {
	margin-top: clamp(1.75rem, 4vw, 2.5rem);
	padding-top: clamp(1.25rem, 3vw, 1.75rem);
	border-top: 1px solid var(--rule);
}

.search-overlay-label {
	margin: 0 0 .85rem;
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--tan);
}

/*
 * A site with a lot of tags would otherwise push the close control off the
 * bottom of the viewport. The row scrolls; the form above it does not move.
 */
.search-overlay-browse .filters {
	max-height: min(38vh, 22rem);
	margin: 0;
	overflow-y: auto;
	overscroll-behavior: contain;
}

.search-overlay-bar {
	display: flex;
	justify-content: flex-end;
	margin-top: .85rem;
}

.search-overlay-close {
	padding: .45rem .7rem;
	background: none;
	border: 1px solid var(--rule);
	border-radius: 2px;
	font-family: var(--mono);
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--paper-dim);
	cursor: pointer;
}

.search-overlay-close:hover {
	border-color: var(--tan);
	color: var(--tan);
}


/* --------------------------------------------------------------------------
   26.10  Jump targets

   A band scrolled to by a chip should not sit flush against the top of the
   viewport, and a section given tabindex="-1" to receive focus must not draw
   an outline when it does, because the reader asked to be moved there, they do not
   need telling that they were.
   -------------------------------------------------------------------------- */

.band[id] {
	scroll-margin-top: clamp(1rem, 3vw, 2rem);
}

.band[id]:focus {
	outline: none;
}

/* Keyboard focus on the band itself still shows, for anyone who tabs to it. */
.band[id]:focus-visible {
	outline: 2px solid var(--sage);
	outline-offset: 6px;
}


/* --------------------------------------------------------------------------
   26.11  Honeypot

   Hidden from the layout and from the accessibility tree, but still a real,
   focusable-by-nothing field in the DOM. display:none would get skipped by
   some bots; this does not.
   -------------------------------------------------------------------------- */

.hp-field {
	position: absolute;
	left: -9999px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}
