/**
 * 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  styles the gallery <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  offsets and de-outlines the bands the release-index chips jump to;
     26.8  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.
   -------------------------------------------------------------------------- */

.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);
}

.skip-link:focus {
	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  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 — 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.8  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;
}
