/* About, FAQ and Contact.
 *
 * These three are read, not operated, so the work is typographic: a measure
 * that stays comfortable, a clear hierarchy, and motion that marks structure
 * rather than decorating it. Everything is built from tokens.css and base.css
 * — the reveals are the shared data-rise / data-type system, so these pages
 * behave exactly like Home rather than inventing their own.
 */

.page-head { padding: 4.5rem 0 2.5rem; }
.page-head h1 { font-family: var(--serif); font-weight: 400; font-size: clamp(2.1rem, 4.6vw, 3.5rem); line-height: 1.04; margin-top: 0.6rem; max-width: 18ch; text-wrap: balance; }
.page-head .stand { font-family: var(--text); font-size: var(--text-sm); color: var(--muted); max-width: 56ch; margin-top: 1.1rem; }
.page-head .ctas { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 1.75rem; }

/* A pulled quote carries the founding line. Amber stroke on the left, no fill:
   colour as stroke, never as area. */
.pull { border-left: 2px solid var(--amber); padding: 0.35rem 0 0.35rem 1.5rem; margin: 0; }
.pull p { font-family: var(--serif); font-size: clamp(1.35rem, 2.4vw, 1.9rem); line-height: 1.25; text-wrap: balance; }

.prose { max-width: 62ch; display: grid; gap: 1.1rem; }
.prose p { font-family: var(--text); font-size: var(--text-sm); line-height: 1.65; }

.story { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); gap: 3rem; align-items: start; }

/* ---------- what makes us different · the dark cards ----------
   Until 2026-09-02 these were a numbered index of three ranked rows on
   hairlines. Darrell asked for them to read exactly like "Why we exist" on the
   home page: same card, same type, same arrival. The ranking went with the
   rows — home's cards are not numbered, and three cards that all read as
   equals is what "match it exactly" means here.

   ⚠️ A DELIBERATE COPY OF HOME'S .toc, NOT A SHARED CLASS. The obvious move is
   to load home.css on this page and reuse .toc directly. The reason not to is
   that home.css is home: pulling all of it in to borrow twelve declarations
   puts every other home rule one specificity accident away from a page that
   never asked for it. These values are duplicated on purpose. home.css .toc is
   the original and this is the copy — change one, change both.

   ⚠️ THE COLUMN COUNT WAS LOAD-BEARING AND IS NOW A DESIGN CHOICE, 2026-09-03.
   It is left exactly as it was, and the reason it is left is no longer the
   reason it was written.
   It was three columns because checkSystem counted anything 400px wide and
   160px tall as a "dark block" and permitted one per page — so /about reported
   four against a ceiling of one, and the 78rem measure below put each card at
   roughly 379px to duck under it. Darrell struck that ceiling: how many dark
   blocks a page carries is a visual call, not a number. So nothing forces this
   any more.
   Three still reads better than two here — three sentences of copy in a 379px
   card is a comfortable measure and a 600px one is not — so the layout stands
   on its own merits. What has gone is the claim that widening it BREAKS
   something. It no longer does; judge it by eye. */
.diff-grid {
  list-style: none;
  margin: 3.25rem auto 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 56px;
  /* ⚠️ 78rem RATHER THAN THE FULL 82.5rem MEASURE, AND IT IS THE CHECK ABOVE
     THAT SETS THE NUMBER. At the emerald page's full width these cards come
     out 403px each, and checkSystem counts anything 400px wide and 160px tall
     as a dark BLOCK — so /about reported four of them against a ceiling of
     one, and it was right to. Home's .toc cards are the same 403px wide and
     escape on HEIGHT instead: their copy is a single line, so they never reach
     160px tall. This page's copy is three sentences and always will, so height
     is not available here and width is. 1248px of measure puts each card at
     roughly 379px, which is 21px of headroom rather than a coin toss.
     Widen this and /about fails checkSystem. */
  max-width: 78rem;
}
.diff-grid li { display: grid; }
.diff-card {
  position: relative;
  padding: 32px;
  background: var(--silk);
  border: 1px solid var(--emerald-lit);
  border-radius: var(--radius);
  transition: box-shadow 0.3s ease;
}
.diff-card h3 {
  margin: 0;
  color: var(--wash);
  font-family: var(--sans);
  font-weight: 500;
  font-size: 0.9375rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  line-height: 1.45;
}
.diff-card h3::after {
  content: "";
  display: block;
  width: 34px;
  height: 2px;
  background: var(--emerald-lit);
  margin-top: 0.9375rem;
}
.diff-card p { margin: 0.9375rem 0 0; color: var(--wash); font-size: 18px; }

/* ⚠️ base.css paints `p strong` in --amber-deep. That is evergreen #0A3D2B,
   which lands at 1.36:1 on silk — unreadable, and the identical trap
   emerald.css §8 records for .text-link on the velvet panel. --emerald-lit is
   the sanctioned dark-ground accent and measures 4.91:1 here. Home's .toc
   never hit this because its one-line cards carry no emphasis at all. */
.diff-card p strong { color: var(--emerald-lit); }

/* hover — the glow, not a lift. Nothing moves, so nothing reflows. */
.diff-grid li:hover .diff-card {
  box-shadow: 0 0 0 1px var(--emerald-lit),
              0 0 40px -6px color-mix(in srgb, var(--emerald-lit) 70%, transparent);
}

/* Arrival is the house library's, same as home: data-deal and --i on each li,
   driven by base.css. Nothing to add here. */

@media (max-width: 900px) {
  .diff-grid { grid-template-columns: 1fr; gap: 24px; }
}

/* The showroom strip: amber stroke-bound, the loudest object on the page. */
.strip-cta { border: 1px solid var(--amber); border-radius: var(--radius); padding: clamp(1.75rem, 4vw, 3rem); background: var(--wash); display: grid; gap: 1.1rem; }
.strip-cta h2 { font-family: var(--serif); font-weight: 400; font-size: clamp(1.6rem, 3vw, 2.25rem); line-height: 1.1; }
.strip-cta .addr { font-family: var(--sans); font-size: var(--label-md); letter-spacing: 0.06em; text-transform: uppercase; color: var(--amber-deep); }
.strip-cta p { font-family: var(--text); font-size: var(--text-sm); line-height: 1.62; max-width: 62ch; }

/* ---------- a link inside a sentence ----------
   ⚠️ .text-link IS A CTA, AND USING IT INSIDE RUNNING PROSE IS THE BUG DARRELL
   REPORTED ON 2026-09-01: "the text bump overlaps the fixed text." Both halves
   of that are right, and there is a second half he did not have to name. It
   scales to 1.12 on hover, which inside a paragraph pushes the link over the
   words either side of it — that is the overlap. It is also uppercase Poppins
   at --label-md on 0.11em tracking, which in the middle of a --text-sm
   sentence is a different size, a different case and a different face from the
   words it sits between. A CTA is supposed to break out of the page. A link in
   a sentence is supposed to stay in it.

   So this is the other link type, and the two are not variants of each other:
   .text-link is a destination you go to, .prose-link is a word you can follow.
   It takes the sentence's own type and it does not move.

   ⚠️ THE UNDERLINE IS PERMANENT, NOT DRAWN ON HOVER, and that is the one place
   this deliberately does not copy .text-link. A CTA sitting alone on its own
   line is findable without a rule under it. A link buried in a paragraph is
   not, and colour alone is not allowed to be the only signal. So it starts
   underlined and the rule deepens on hover, instead of arriving on hover.

   ⚠️ text-decoration, NOT AN ::after BAR. .text-link can afford an absolutely
   positioned bar because it is inline-flex and never wraps. An inline link
   does wrap, and an absolute bar on a link broken across two lines draws one
   rule through the whole box rather than under each line. */
.prose-link {
  font: inherit;
  color: var(--amber-deep);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.18em;
  text-decoration-color: color-mix(in srgb, var(--amber) 45%, transparent);
  transition: text-decoration-color 0.28s var(--ease-out);
}
.prose-link:hover,
.prose-link:focus-visible { text-decoration-color: var(--amber); }

@media (prefers-reduced-motion: reduce) {
  .prose-link { transition: none; }
}

/* ---------- FAQ ---------- */
.faq-tools { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; padding-bottom: 1.25rem; }
/* ⚠️ SIZED TO MATCH /rentals' .search, NOT TO ITS OWN TASTE. Darrell,
   2026-08-15: "apply design changes from the Inventory/Rentals page search bar
   here as well." It was 1.0625rem on 0.65/0.9 padding against that field's
   1rem on 0.6/0.8 — close enough that nobody would call it wrong on one page
   and far enough that the two never looked like the same control. /faq loads
   pages.css and never rentals.css, so this is a deliberate second copy of that
   rule rather than a shared one; rentals.css .search is the original. */
/* ⚠️ THE RESTING EDGE IS EVERGREEN, NOT THE HAIRLINE. Darrell, 2026-09-02:
   "let's keep this dark green ... when you click in it, let's fill that bar
   dark green and the typing text will be the paper white." The field is the
   reference the rest of .faq-tools now matches, so its edge has to be the
   green everything else is being pointed at. */
.faq-search { flex: 1 1 18rem; font-family: var(--text); font-size: 1rem; padding: 0.6rem 0.8rem; border: 1px solid var(--evergreen); border-radius: var(--radius-sm); background: var(--paper); color: var(--ink);
  transition: background-color .22s var(--ease-out), color .22s var(--ease-out); }

/* ⚠️ THE FIELD FILLS. IT DOES NOT GLOW AND IT DOES NOT GO GOLD. Darrell,
   2026-09-02, the same note on both search fields: "remove the glow on the
   search and remove the transition to the gold outline ... when you click in
   it, let's fill that bar dark green and the typing text will be the paper
   white." This replaces the gilt-border-plus-64px-halo state that landed on
   2026-09-01; the history of THAT state is worth keeping, because it explains
   why the outline is suppressed here rather than restyled —

     the field's own border is set in this file at (0,2,0), and
     `body.em :focus-visible` sets outline-color to --gilt at (0,2,1). The
     theme wins on colour, so a focused field wore its own edge AND a gold
     ring floating 2px off it. `outline: none` in the shorthand sets
     outline-STYLE, which the theme rule never touches, so the ring goes and
     the state is carried by the fill.

   ⚠️ THE FILL IS THE INDICATOR AND IT IS A BIGGER ONE THAN THE RING WAS.
   Evergreen against paper is 12.2:1, which is four times the 3:1 that SC 1.4.11
   asks of a non-text state change, and it moves the whole control rather than
   one hairline. Paper on evergreen is 12.2:1 for the text she types.

   ⚠️ THE PLACEHOLDER HAS TO MOVE WITH THE GROUND. Left alone it stays the
   muted taupe it is on paper and lands at roughly 1.4:1 on evergreen —
   readable in the mockup only because the field is usually empty by the time
   anyone looks. Mist mixed back into the ground holds ~6:1.

   ⚠️ forced-colors PUTS THE OUTLINE BACK. In High Contrast the OS repaints
   background and border from its own palette, so the fill stops being a
   state change at all and `outline: none` would leave nothing. */
.faq-search:focus-visible {
  outline: none;
  background: var(--evergreen);
  border-color: var(--evergreen);
  color: var(--paper);
  caret-color: var(--paper);
}
.faq-search:focus-visible::placeholder { color: color-mix(in srgb, var(--wash) 70%, var(--evergreen)); }
@media (forced-colors: active) {
  .faq-search:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; }
}
.faq-count { font-family: var(--sans); font-size: var(--label-sm); letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); font-variant-numeric: tabular-nums; }
/* ⚠️ THE UNDERLINE IS EVERGREEN, NOT EMERALD. Darrell, 2026-09-02, pointing at
   .faq-tools: "make all of the dark green the darkest green we have so it
   matches the search." The label was already --amber-deep, which IS #0A3D2B —
   the underline was the one thing in this row still on --amber (#0E5F41), and
   two greens a step apart in one control read as a mistake rather than a
   hierarchy. The search field's edge above is the reference. */
.faq-expand { background: none; border: 0; border-bottom: 1px solid var(--evergreen); padding: 0 0 1px; cursor: pointer; font-family: var(--sans); font-size: var(--label-sm); letter-spacing: 0.1em; text-transform: uppercase; color: var(--evergreen); }

.faq-list { border-top: 1px solid var(--rule-line); }
.faq-item { border-bottom: 1px solid var(--rule-line); }
.faq-item[hidden] { display: none; }
.faq-q { width: 100%; display: flex; align-items: baseline; gap: 1rem; background: none; border: 0; padding: 1.35rem 0; cursor: pointer; text-align: left; font-family: var(--serif); font-weight: 400; font-size: clamp(1.05rem, 1.7vw, 1.3rem); line-height: 1.3; color: var(--ink); }
.faq-q:hover { color: var(--amber-deep); }
.faq-q .mark { margin-left: auto; flex: none; width: 1.1rem; height: 1.1rem; position: relative; align-self: center; }
/* A plus that becomes a minus. Two rules, one rotating — cheaper to read than
   a chevron, and it says "more of this" rather than "somewhere else". */
.faq-q .mark::before, .faq-q .mark::after { content: ""; position: absolute; inset: 50% 0 auto 0; height: 1px; background: var(--amber-deep); transition: transform 0.32s var(--ease-out); }
.faq-q .mark::after { transform: rotate(90deg); }
.faq-q[aria-expanded="true"] .mark::after { transform: rotate(0deg); }
.faq-a { overflow: hidden; height: 0; transition: height 0.34s var(--ease-out); }
.faq-a p { font-family: var(--text); font-size: var(--text-sm); line-height: 1.66; color: var(--muted); max-width: 68ch; padding-bottom: 1.45rem; }
@media (prefers-reduced-motion: reduce) { .faq-a { transition: none; } .faq-q .mark::before, .faq-q .mark::after { transition: none; } }
.faq-none { padding: 2.5rem 0; font-family: var(--text); font-style: italic; color: var(--muted); }

/* ---------- Contact ---------- */
.contact-grid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 3rem; align-items: start; }
.form-card { border: 1px solid var(--rule-line); border-radius: var(--radius); background: var(--paper); padding: clamp(1.5rem, 3vw, 2.25rem); }
.form-card h2 { font-family: var(--serif); font-weight: 400; font-size: 1.6rem; margin-bottom: 1.25rem; }
.field { display: grid; gap: 0.35rem; margin-bottom: 1.1rem; }
.field label { font-family: var(--sans); font-size: var(--label-sm); letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
.field input, .field select, .field textarea { font-family: var(--text); font-size: 1.0625rem; padding: 0.65rem 0.8rem; border: 1px solid var(--rule-line); border-radius: var(--radius-sm); background: var(--ground); color: var(--ink); }
.field textarea { min-height: 7rem; resize: vertical; }

/* ---------- a checkbox inside a field ----------
   ⚠️ A SECOND COPY OF design.css's .sendcheck, NOT A SHARED RULE. /contact
   loads pages.css and never design.css, the same split .diff-grid lives with.
   The values are deliberately identical: this control asks the same question
   the canvas asks, in the same words, and two treatments of one question is
   how a visitor learns the two forms are unrelated when they are not.

   ⚠️ IT HAS TO OUT-SPECIFY .field's OWN INPUT RULE, which gives every input in
   a field a border and 0.65rem of padding. On a checkbox that is a large grey
   rounded rectangle with a tick lost inside it. And `.field label` is uppercase
   tracked, which is right for a field name and wrong for a sentence somebody
   reads. Both are undone below rather than weakened where they are. */
.field-check {
  display: flex; align-items: center; gap: .5rem; margin-top: .2rem;
}
.field-check label {
  font-family: var(--text); font-size: .92rem; color: var(--ink);
  text-transform: none; letter-spacing: 0; cursor: pointer;
}
.field .field-check input[type="checkbox"] {
  appearance: none; -webkit-appearance: none;
  width: 18px; height: 18px; flex: none; margin: 0; padding: 0;
  border: 1px solid var(--rule-line); border-radius: var(--radius-sm);
  background: var(--paper); cursor: pointer; position: relative;
  transition: border-color .15s, background .15s;
}
.field .field-check input[type="checkbox"]:hover { border-color: var(--amber); }
.field .field-check input[type="checkbox"]:checked {
  background: var(--amber); border-color: var(--amber);
}
/* Drawn rather than a glyph, so it scales with the box instead of depending
   on a font that may not have loaded. */
.field .field-check input[type="checkbox"]:checked::after {
  content: ""; position: absolute; left: 5px; top: 1px;
  width: 5px; height: 10px; border: solid var(--paper);
  border-width: 0 2px 2px 0; transform: rotate(45deg);
}
.field-help {
  font-family: var(--text); font-style: italic; font-size: .9rem;
  color: var(--muted); margin: .15rem 0 .1rem;
}
.field-help[hidden] { display: none; }
.field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible { outline: 2px solid var(--amber); outline-offset: 1px; }
.form-note { font-family: var(--text); font-size: 1rem; color: var(--muted); margin-top: 0.75rem; }

.aside-block { display: grid; gap: 1.75rem; align-content: start; }
.aside-block h2 { font-family: var(--sans); font-size: var(--label-xs); font-weight: 400; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); margin-bottom: 0.5rem; }
.aside-block p, .aside-block a { font-family: var(--text); font-size: var(--text-sm); line-height: 1.6; }
.aside-block .notice { border: 1px solid var(--amber); border-radius: var(--radius); background: var(--wash); padding: 1.1rem 1.25rem; }

@media (max-width: 60rem) {
  .story, .contact-grid { grid-template-columns: 1fr; gap: 2rem; }
}

/* ============================================================
   THE EMERALD GROUND — About, FAQ, Contact
   ============================================================
   Everything above this line is Honey Pulse composition and is token-driven,
   so it re-skins for free the moment a page carries body.em. This block is
   only the parts a token cannot express: the compositions the 2026 system
   asks for that Honey Pulse had no equivalent of.

   ⚠️ THIS FILE HAD ZERO HARDCODED COLOUR BEFORE THIS BLOCK AND STILL DOES.
   That is not a coincidence, it is the reason the migration is a hundred
   lines rather than a thousand, and it is worth keeping: if you need a
   colour here, add a token in emerald.css and read it. The moment one hex
   lands in this file, the next palette costs a search instead of an edit.

   The system's skeletons, and which page is which:
     02 SERVICE — paper masthead, content on paper, one dark finale.
                  About and FAQ. "Service" is the system's word for a page
                  that explains one thing and then asks.
     04 CONTACT — the dark block is the HERO, at the top, and the form sits
                  on paper below it. Contact only. The reasoning is in the
                  system doc: by the time someone is on Contact they have
                  decided, so the loud moment confirms they are in the right
                  place and then gets out of the form's way.
   ============================================================ */

/* ---------- the masthead (02 SERVICE) ----------
   The same 55/45 the homepage settled on, so the two do not disagree about
   what a KMC page looks like at the top. Copy left, media right, and the BOX
   owns the ratio — a <video> drops into .page-media unchanged, same as home.

   ⚠️ NO max-width ON THE HEADLINE. Same reason emerald.css §3b gives for the
   homepage: constraining d1 to a character count is what produced the tidy,
   small, two-line version that did not look like the system. */
body.em .page-head { padding: 5rem 0 0; }
body.em .page-grid {
  display: grid;
  grid-template-columns: var(--page-cols, 1.1fr 0.9fr);
  gap: 3.5rem;
  align-items: center;
}
body.em .page-head h1 {
  font-size: clamp(40px, 4.8vw, 68px);
  line-height: 1.02;
  max-width: none;
  margin-top: 0.75rem;
}
body.em .page-head .stand {
  font-family: var(--text);
  font-size: 1.25rem;
  line-height: 1.45;
  color: var(--muted);
  max-width: 34ch;
}
/* ⚠️ A MEASURE IS RELATIVE TO WHAT IS BESIDE IT. 34ch is right for the
   standfirst in a 55/45 split, where a photograph closes the line off at the
   column edge. On a masthead with no media the same 34ch sets three short
   lines adrift in a 1320px field and reads as a mistake rather than as a
   measure. FAQ and any future page that opens without a picture take the
   wider one. Same token, two settings, named so the difference is sayable. */
body.em .page-head--solo .stand { max-width: 52ch; }
body.em .page-head--solo h1 { max-width: 20ch; }

body.em .page-media { margin: 0; aspect-ratio: 1 / 1; overflow: hidden; background: var(--plate); }
body.em .page-media img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* the rule under the masthead headline, drawn by motion.js */
body.em .page-rule { height: 2px; width: 44px; background: var(--amber); border: 0; margin: 1.5rem 0; }

/* ---------- the pulled quote ----------
   Colour arrives as stroke: an emerald edge, no fill. The mist ground the
   system sanctions for a quote is used here rather than a band, because a
   quote is an object on the page and not a section of it. */
body.em .pull { border-left: 2px solid var(--amber); background: var(--wash); padding: 1.75rem 2rem; }
body.em .pull p { font-family: var(--serif); font-weight: 500; letter-spacing: .01em; }

/* ⚠️ THE NUMBERED ROWS WERE HERE AND ARE GONE, 2026-09-02. They carried the
   only IBM Plex Mono on these pages, in the 01/02/03 rail. If a mono voice is
   wanted back on /about it now has nowhere to live, so it would be a decision
   rather than a restoration — see the .diff-grid note above for why the rows
   became cards. */

/* ---------- the showroom strip ----------
   ⚠️ OUTLINED, NOT FILLED, AND THIS IS A GOVERNANCE LINE RATHER THAN A TASTE
   CALL. Honey Pulse filled this block with --wash across its whole width,
   which under the 2026 system is a filled section: "Structure is ink frames
   and hairlines, not background bands." The stroke does the work now. */
body.em .strip-cta {
  background: transparent;
  border: 1px solid var(--ink);
  padding: clamp(2rem, 4vw, 3.25rem);
  /* ⚠️ TWO COLUMNS, BECAUSE ONE LEFT HALF OF AN INK FRAME IS AN EMPTY BOX.
     Inherited as a single column, which under Honey Pulse was invisible: the
     block was washed edge to edge, so the right half read as ground rather
     than as space nobody filled. Take the fill away and the frame draws a
     hard line around the emptiness. An outlined container has to be composed
     all the way to its own edge, and that is a general lesson about this
     migration rather than a note about this block.

     ⚠️ TWO EXPLICIT CHILDREN, NOT ROW SPANS. The first version made the
     headline, the copy and the side column siblings and reached for
     `grid-row: 1 / span 3` to hold the side together. That works until the
     copy wraps to a different number of lines, at which point the span is
     wrong and the block silently comes apart. .strip-main and .strip-side
     cannot drift, because the grid only ever has two cells. */
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(15rem, 20rem);
  gap: clamp(2rem, 4vw, 3.5rem);
  align-items: end;
}
body.em .strip-main { display: grid; gap: 1.5rem; align-content: start; }
body.em .strip-side {
  display: grid;
  gap: 1.5rem;
  justify-items: stretch;
  border-left: 1px solid var(--rule-line);
  padding-left: clamp(1.5rem, 3vw, 2.5rem);
}
body.em .strip-cta .addr {
  font-family: var(--mono);
  font-size: var(--label-md);
  text-transform: none;
  letter-spacing: .02em;
  line-height: 1.7;
  color: var(--muted);
}
/* the bloom seed needs its clearance, same scar base.css records */
body.em .strip-side .btn { text-align: center; padding-left: 2.25rem; }

/* ---------- the same strip, on silk · /contact only ----------
   ⚠️ IT WAS A NAMED EXCEPTION TO A RULE THAT NO LONGER EXISTS. Darrell asked
   for it on 2026-09-02 knowing it broke the one-dark-block ceiling — "even
   though this might make the page super heavy, recalling the contact card
   above ... we need to go darker and match those darker closing container
   things across the website; this thing stands out, not in a good way" — and
   struck the ceiling itself on 2026-09-03, because how many dark blocks a page
   carries is a proportion judgement rather than a count. Nothing excuses this
   block any more; nothing needs to.

   ⚠️ AND IT WAS NOT THE WHOLE COMPLAINT. The block was also missing its
   .strip-main / .strip-side wrappers, so its four children flowed into a
   two-column grid in source order and the headline was rendering in the 320px
   side column. See the note in contact/index.html. The wrappers are the fix
   for "not getting it done"; this rule is the fix for "go darker", and they
   are worth judging separately once both are on screen.

   ⚠️ NO SECOND GILT. .close spends a page's gold on one button; these two are
   the house's stroke button, restated for a dark ground rather than gilded.
   The system counts visible gold controls and /contact's is on the hero. */
body.em .strip-cta--dark {
  background: var(--silk);
  border-color: rgba(244, 241, 234, .16);
  color: var(--velvet-text);
}
body.em .strip-cta--dark h2 { color: var(--velvet-text); }
body.em .strip-cta--dark h2 em { color: var(--emerald-lit); }
body.em .strip-cta--dark p { color: var(--velvet-soft); }
body.em .strip-cta--dark .eyebrow { color: var(--velvet-soft); }
body.em .strip-cta--dark .eyebrow::before { background: var(--emerald-lit); }
/* The divider between the columns was a paper hairline. */
body.em .strip-cta--dark .strip-side { border-left-color: rgba(244, 241, 234, .16); }
/* ⚠️ THE BUTTON INVERTS RATHER THAN BRIGHTENS. At rest it is --amber-deep type
   inside an --amber stroke, which is evergreen on blackened emerald — 1.2:1,
   a button you can only find with a cursor. Pale type inside a lit stroke
   fixes the rest state; the reveal then has to invert too, because --btn-fill
   is --ink and an ink fill on silk is a 1.1:1 non-event. Filling pale and
   flipping the letters dark is the same gesture the light version makes, read
   the other way round.
       --velvet-text on --silk      17.6:1
       --emerald-lit stroke on silk  5.9:1
       --velvet on --velvet-text    19.9:1 (the hovered state) */
body.em .strip-cta--dark .btn:not(.btn--gilt) {
  --btn-fill: var(--velvet-text);
  --btn-on-fill: var(--velvet);
  color: var(--velvet-text);
  border-color: var(--emerald-lit);
}

/* ---------- the close · the one dark block (02 SERVICE) ----------
   ⚠️ COUNT THEM. One dark block per page, and on About and FAQ this is it.
   The topbar is chrome and does not count; a second dark SECTION does. It is
   also the page's only gilt, because gold is an event.

   Contained rather than full-bleed, for the reason the homepage panel gives:
   full-bleed silk under a paper page reads as a different site's footer
   arriving early, and a panel inside the measure reads as a card the page is
   handing you. The ground lives in emerald.css; only the composition is here. */
body.em .close {
  display: grid;
  grid-template-columns: 1.15fr 0.85fr;
  gap: 3.25rem;
  align-items: center;
  padding: 3.5rem 3rem;
}
body.em .close p { margin-top: 1.375rem; max-width: 46ch; }
body.em .close .eyebrow { margin-bottom: 1rem; }
/* ⚠️ THE GILT CONTROL SIZES TO ITS LABEL, NOT TO ITS COLUMN. Home's panel
   runs it full width because it closes a stack of two input fields and the
   three read as one form. Alone in a column it became a 496px box around two
   words, which reads as an unfinished container rather than as the one gilt
   event on the page. */
body.em .close-act { display: flex; flex-direction: column; align-items: start; gap: 0.75rem; }
body.em .close-act .btn { text-align: center; }
/* ⚠️ THERE IS NO RULE HERE FOR THE EXPLORE LINKS, AND THAT IS THE FIX RATHER
   THAN THE GAP. `body.em .close .text-link` in emerald.css:589 already paints
   them — cream at 14.79:1 with an emerald-lit underline — and its comment
   spells out why they are not champagne: "gold is an event and the system
   permits ONE per page ... a champagne link beside that ember is a second gold
   thing, and build/verify/system.mjs counts it as exactly that and fails the
   page."

   A champagne rule was written here on 2026-09-02 when /about gained its two
   links, reasoning from home.css:679 — which sets champagne on .cta-act and
   has been DEAD ever since emerald.css:589 landed at higher specificity, so it
   was never what the homepage actually looked like. This one at (0,3,0) tied
   emerald's selector and won on load order, and took /about and /faq red
   together: three gilt controls counted on each.

   ⚠️ IF A DARK-PANEL LINK EVER NEEDS RESTYLING, IT GOES IN emerald.css BESIDE
   THAT NOTE. A second opinion in this file is how the first one got missed. */

/* ⚠️ .btn--onsilk IS GONE, 2026-08-31, AND THE GOLD MOVED WITH IT.
   This panel used to take the bloom specifically so it would not be a second
   gold event — the page spent its one gilt on .dock-submit. Darrell moved that
   spend: the close panel is now the ember, matching the same "next step"
   moment on Home and About, and .dock-submit gives up its gilt in rentals.css.

   The count is still exactly one. If you re-gild the wish-list submit without
   un-gilding this, build/verify/system.mjs:294 counts two visible gold controls
   on /rentals and fails the page. They move as a pair or not at all. */

@media (max-width: 900px) {
  body.em .page-grid { grid-template-columns: 1fr; gap: 2rem; }
  body.em .strip-cta { grid-template-columns: 1fr; gap: 2rem; }
  body.em .strip-side { border-left: 0; border-top: 1px solid var(--rule-line); padding-left: 0; padding-top: 1.75rem; justify-items: start; }
  body.em .strip-side .btn { width: 100%; }
  body.em .close { grid-template-columns: 1fr; gap: 2rem; padding: 2.5rem 1.5rem; }
}

/* ---------- the hero · the one dark block (04 CONTACT) ----------
   ⚠️ THE DARK BLOCK OPENS THIS PAGE INSTEAD OF CLOSING IT, and that is the
   only structural difference between the system's 04 CONTACT and its 02
   SERVICE. Contact has already been chosen by the time it is reached, so the
   loud moment goes at the top to confirm the arrival and then the page gets
   out of the form's way.

   ⚠️ CONSEQUENCE, AND IT IS THE ONE PEOPLE MISS: spending the dark block up
   here means nothing further down this page may take a dark ground. The
   browse block at the foot is an ink frame on paper for that reason, not by
   preference. build/verify/system.mjs counts them and will say so.

   Contained rather than full-bleed, same as every other panel in the house.
   The ground lives in emerald.css; only the composition is here. */
/* ⚠️ TWO COLUMNS, AND THE REASON IS THE SAME ONE THE SHOWROOM FRAME TAUGHT.
   Built first as a single 44ch measure inside a full-width panel: the
   headline set on FOUR lines down the left edge with sixty per cent of a
   silk block empty beside it. On paper an unfilled half reads as space; on a
   dark ground it reads as a rendering fault, because the eye has nowhere
   else to go. A dark block has to be composed edge to edge or it should not
   be full width.

   Headline left where it can stay large, the rule and the standfirst
   bottom-aligned right. Two lines at 68px in this column, which is the cap
   a hero headline gets. */
body.em .page-hero {
  margin-top: 2.5rem;
  padding: clamp(3rem, 6vw, 4.5rem) clamp(1.5rem, 4vw, 3rem);
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.75fr);
  gap: clamp(2rem, 5vw, 4rem);
  align-items: end;
}
body.em .page-hero h1 {
  font-size: clamp(40px, 4.4vw, 62px);
  line-height: 1.04;
  max-width: 15ch;
}
body.em .page-hero .hero-side { align-self: end; }
body.em .page-hero .stand { font-family: var(--text); font-size: 1.25rem; line-height: 1.5; max-width: 34ch; }
body.em .page-hero .gilt-hair { margin: 0 0 1.5rem; max-width: 12rem; }

@media (max-width: 900px) {
  body.em .page-hero { grid-template-columns: 1fr; gap: 1.75rem; }
  body.em .page-hero h1 { max-width: none; }
}

/* ---------- the enquiry form ----------
   The ONE gilt on this page sits on the submit, because this is the enquiry
   and the enquiry is what gold is for. Every other control on the page is a
   bloom. */
/* ============================================================
   THE ENQUIRY FORM WEARS THE EXPANDED RAIL
   ============================================================
   Darrell, 2026-09-03: "I did really want to match that velvet coloring
   throughout all of the coloring on the expanded rail of the design page — the
   titles, all the font styles, the button style, all of it. I know it'll be
   more dark on the white page but it's really gonna make that contact form pop
   and we need something to offset all that white."

   ⚠️ THIS IS A PORT, NOT A SHARE, AND IT CANNOT BE THE OTHER THING. panel.css's
   own header says it is "the control panel's only stylesheet and nothing about
   that component lives anywhere else", and it is loaded ONLY on the two rentals
   pages. /contact does not load it and must not start: that file namespaces
   everything under `cpanel` and expects a velvet ground under every rule in it.
   So the values are copied here the way .it.shade in rentals.css copies the
   napkin from design.css — two stylesheets, one look, and a note in each
   saying the other exists. Change one, change the other.

   ⚠️ IT IS /contact's THIRD DARK BLOCK AND THAT IS NO LONGER A COUNT ANYBODY
   KEEPS. The ceiling was struck on 2026-09-03, hours after this landed and
   partly because of it: three exceptions in two days is a check asking to be
   re-read rather than re-bent. What still holds is proportion — the tallest
   block here is 962px of a 2548px document, 38%, and "a panel, not the page"
   is still asserted.

   ⚠️ TWO DELIBERATE DEVIATIONS FROM THE RAIL, both recorded because "match it
   exactly" was the instruction:

     1. LABELS TAKE --velvet-soft, NOT --emerald-mid. panel.css's own contrast
        ledger records emerald-mid on velvet at 3.53:1 and says it "fails and it
        ships that way, on purpose" — acceptable for compact labels on a
        floating tool, and not acceptable on the field labels of the form where
        a bride types her name, her email and her wedding date. That ledger
        names the fix itself: "--velvet-soft is 12.08:1 on velvet and is
        declared for exactly this role. That is a call to make while looking at
        the page." This is that call.

     2. FIELD TEXT STAYS AT 1.0625rem, not the rail's .9rem. The rail is a
        compact panel beside a canvas; this is the primary form on the site.
        Everything else about the field — the face, the gilt edge, the velvet
        fill, the 2px radius — is the rail's exactly.

   ⚠️ color-scheme: dark IS LOAD-BEARING, NOT A NICETY. The date picker's
   calendar icon, the select's arrow, the checkbox and any scrollbar inside this
   card are painted by the BROWSER, not by us. Left light, they render as dark
   glyphs on a near-black field and effectively disappear. The rail never needed
   this because it has no native date or select control. */
body.em .form-card {
  background: var(--velvet);
  border: 2px solid var(--gilt);
  border-radius: 3px;
  color-scheme: dark;
}
/* The rail's section title: Garamond, 20px, uppercase, tracked, emerald-lit.
   Same setting as body.em .cpanel__head — including the 500, which is there
   because EB Garamond ships at 400 only and a 600 request would be synthesised.
   See the note in panel.css before changing this number. */
body.em .form-card h2 {
  font-family: var(--text); font-size: 20px; font-weight: 500;
  text-transform: uppercase; letter-spacing: .12em;
  color: var(--emerald-lit);
}
body.em .form-card .field label,
body.em .form-card .field-check label {
  font-family: var(--sans); font-size: 14px; letter-spacing: .06em;
  text-transform: none; color: var(--velvet-soft);
}
body.em .form-card .field input,
body.em .form-card .field select,
body.em .form-card .field textarea {
  background: var(--velvet); color: var(--emerald-lit);
  border: 1px solid var(--gilt); border-radius: 2px;
}
body.em .form-card .field input::placeholder,
body.em .form-card .field textarea::placeholder { color: var(--emerald-mid); }
/* ⚠️ ONE EDGE, NOT TWO, AND THE SECOND ONE WAS GREEN. Darrell, 2026-09-03:
   "inside of that gold line a green line appears in the existing gold line,
   pops brighter and thicker simulating a glow effect. I would love to remove
   that green line."

   Measured: resting border rgb(184,134,11), focused border rgb(14,95,65). The
   green is a BORDER, not an outline — `body.em .field input:focus-visible`
   sets `border-color: var(--amber)`, and --amber on this page is emerald
   #0E5F41. The first version of this rule set only the outline, so that green
   border applied unopposed and the champagne ring sat 1px outside it: a gold
   line, a green line, and a gap. Exactly the "gold ring floating off its own
   green edge" that rentals.css and the /faq field each record fixing.

   So the edge itself carries the state, and there is only one of it. The
   border brightens gilt → champagne and takes the panel's own glow — the same
   pairing .cpanel__btn:hover uses, which is what "match the expanded rail"
   means here. --champagne on velvet is 12.78:1.

   ⚠️ forced-colors PUTS AN OUTLINE BACK. In High Contrast the OS repaints
   borders and box-shadows from its own palette, so the brightened edge stops
   being a state change and `outline: none` would leave nothing at all. */
body.em .form-card .field input:focus-visible,
body.em .form-card .field select:focus-visible,
body.em .form-card .field textarea:focus-visible {
  outline: none;
  border-color: var(--champagne);
  box-shadow: 0 0 0 1px var(--champagne), 0 0 40px -12px var(--champagne);
}
@media (forced-colors: active) {
  body.em .form-card .field input:focus-visible,
  body.em .form-card .field select:focus-visible,
  body.em .form-card .field textarea:focus-visible {
    outline: 2px solid Highlight; outline-offset: 2px;
  }
}
/* ---------- the two native controls, given the house's manners ----------
   Darrell, 2026-09-03: "the date selector and the event type selector are so
   1990s Windows vibes."

   ⚠️ WHAT CAN BE FIXED HERE IS THE CLOSED STATE, AND IT IS MOST OF WHAT HE IS
   LOOKING AT. A <select>'s dropdown LIST and a date input's calendar POPUP are
   drawn by the operating system in a layer CSS cannot reach — no stylesheet
   restyles them, in any browser. What the page does own is the control at
   rest: the arrow, the icon, the type, the spacing. Both were sitting on the
   browser's defaults, which is the Windows-98 note exactly.
   ⚠️ THE POPUPS ARE OURS NOW TOO, ON DESKTOP ONLY — 2026-09-03, later the
   same day. The paragraph above stood for one afternoon and is superseded in
   part: the calendar and the option list are drawn by contact.js and voiced by
   datepick.css whenever `(pointer: fine)` matches. What it says is still
   exactly true of a phone, where nothing is mounted and the OS keeps both
   popups by choice. So the rules in this block are not dead code — they are
   the whole of the control on every touch device, and the closed state on
   every device.

   ⚠️ appearance: none IS WHAT REMOVES THE NATIVE ARROW. Without it the OS
   draws its own chevron on top of whatever we add, and the control wears two.
   The chevron below is an inline SVG in champagne, sized and placed to match
   .dpicon on the canvas's own date field — 17px, hard against the right
   padding — so the two date controls on this site look related. */
body.em .form-card .field select {
  appearance: none; -webkit-appearance: none;
  padding-right: 2.4rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23E8CD82' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right .8rem center;
  background-size: 17px 17px;
  cursor: pointer;
}
/* ⚠️ THE OPTION LIST IS THE OS's AND THIS IS THE MOST WE GET. Chromium on
   Windows and Linux honours a background and colour on <option>; macOS and
   Safari ignore both and draw the system menu. Set anyway — it costs nothing
   and it is the difference between a readable list and white-on-white for
   everyone it does reach. */
body.em .form-card .field select option {
  background: var(--velvet); color: var(--velvet-text);
}
/* The calendar button inside the date field. color-scheme: dark already makes
   it light rather than a black glyph on near-black; this makes it the field's
   own champagne and the same 17px as the canvas picker's icon. */
body.em .form-card .field input[type="date"]::-webkit-calendar-picker-indicator,
body.em .form-card .field input[type="month"]::-webkit-calendar-picker-indicator {
  width: 17px; height: 17px; cursor: pointer; opacity: 1;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23E8CD82' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='1.5'/%3E%3Cpath d='M8 3v4M16 3v4M3 10h18'/%3E%3C/svg%3E");
  background-size: 17px 17px;
}
/* An empty date field prints mm/dd/yyyy in the input's own colour, which is
   emerald-lit — the same weight as a real answer. It is a placeholder and
   should read like one. */
body.em .form-card .field input[type="date"]:not(:focus):invalid,
body.em .form-card .field input[type="date"]::-webkit-datetime-edit-text,
body.em .form-card .field input[type="date"]::-webkit-datetime-edit-month-field,
body.em .form-card .field input[type="date"]::-webkit-datetime-edit-day-field,
body.em .form-card .field input[type="date"]::-webkit-datetime-edit-year-field {
  color: var(--emerald-mid);
}
body.em .form-card .field input[type="date"]:focus::-webkit-datetime-edit-text,
body.em .form-card .field input[type="date"]:focus::-webkit-datetime-edit-month-field,
body.em .form-card .field input[type="date"]:focus::-webkit-datetime-edit-day-field,
body.em .form-card .field input[type="date"]:focus::-webkit-datetime-edit-year-field {
  color: var(--emerald-lit);
}

/* ---------- and the two popups the house draws instead ----------
 * ⚠️ THE FIELD ITSELF IS UNCHANGED AND THE WRAPPER IS NEW. contact.js puts a
 * .dpfield around the native <input type="date"> and hangs our calendar button
 * off it, so the border has to move from the input to the wrapper — one
 * control, one rectangle. Leaving it on the input draws a second box around
 * two thirds of the field, which is the note .dpfield carries in datepick.css
 * for the modal it was written for.
 *
 * ⚠️ SPECIFICITY IS THE POINT OF THE EXTRA CLASS. `body.em .form-card .field
 * input` is already three classes deep and paints border, ground and colour;
 * .dpfield in datepick.css is one. Without .dpfield in these selectors the
 * generic rule wins and the stripping never happens.
 *
 * ⚠️ PADDING AND TYPE ARE THE NEIGHBOURS', NOT THE MODAL'S. datepick.css sets
 * .5rem/.6rem and var(--sans) because the send modal's fields do; this card's
 * do not, and a date row a few pixels shorter than the venue row above it is
 * the kind of thing that reads as sloppy without ever being noticed. */
body.em .form-card .field .dpfield,
body.em .form-card .field .hsbtn {
  background: var(--velvet);
  border: 1px solid var(--gilt);
  border-radius: 2px;
  padding: .65rem .8rem;
  font-family: var(--text); font-size: 1.0625rem; letter-spacing: normal;
}
body.em .form-card .field .dpfield input {
  background: none; border: 0; padding: 0;
  font-family: var(--text); font-size: 1.0625rem; letter-spacing: normal;
  color: var(--emerald-lit);
}
/* The wrapper carries the state, so the input inside must not draw one of its
   own — otherwise focusing the text lights two edges at once. */
body.em .form-card .field .dpfield input:focus-visible {
  outline: none; border: 0; box-shadow: none;
}
/* focus-within rather than :focus, because tabbing to the calendar button and
   tabbing to the text are the same control being focused as far as the eye is
   concerned. The pairing is the card's own: gilt brightening to champagne,
   with the rail's glow. See the note on the field focus rule above. */
body.em .form-card .field .dpfield:focus-within,
body.em .form-card .field .hsbtn:focus-visible {
  outline: none;
  border-color: var(--champagne);
  box-shadow: 0 0 0 1px var(--champagne), 0 0 40px -12px var(--champagne);
}
@media (forced-colors: active) {
  body.em .form-card .field .dpfield:focus-within,
  body.em .form-card .field .hsbtn:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; }
}
body.em .form-card .field .dpfield:hover,
body.em .form-card .field .hsbtn:hover { border-color: var(--champagne); }
/* Champagne, matching the ::-webkit-calendar-picker-indicator this replaces —
   the icon is in the same place, at the same 17px, in the same colour, so
   nothing about the field appears to move when the enhancement mounts. */
body.em .form-card .field .dpcal,
body.em .form-card .field .hsicon { color: var(--champagne); }
body.em .form-card .field .dpcal:hover,
body.em .form-card .field .dpcal[aria-expanded="true"] { color: var(--velvet-text); }
body.em .form-card .field .hsbtn { color: var(--emerald-lit); }
/* Nothing chosen is a placeholder and takes the placeholder's colour, which is
   the one the text inputs on this card already use. */
body.em .form-card .field .hsbtn.empty .hsval { color: var(--emerald-mid); }

body.em .form-card .field .field-check input[type="checkbox"] { border-color: var(--gilt); }
body.em .form-card .field .field-check input[type="checkbox"]:checked {
  background: var(--gilt); border-color: var(--gilt);
}
body.em .form-card .field-help { color: var(--velvet-soft); }
body.em .form-card .form-note { color: var(--velvet-soft); }
/* ⚠️ CREAM, NOT CHAMPAGNE, AND I REACHED FOR CHAMPAGNE TWICE BEFORE GETTING
   HERE. --amber-deep is evergreen on this ground and measures 1.4:1, so the
   link plainly has to change; champagne is the obvious replacement and is the
   wrong one. emerald.css:589 already says so in as many words — "gold is an
   event and the system permits ONE per page ... build/verify/system.mjs counts
   it as exactly that and fails the page. The check is right and the instinct
   was wrong." It counted this address alongside the Send button and failed
   /contact, exactly as it failed /about and /faq when the same instinct hit
   .close-act on 2026-09-02.
   The house answer for a link on a dark ground is cream type with an accent
   draw: --velvet-text at 17.6:1, underlined in emerald-lit. The gold on this
   card stays where it belongs — the border, the field edges and the one
   button.
   ⚠️ text-decoration-color, NOT AN ::after BAR. .prose-link's own note explains
   why it uses a real underline: it is an inline link and can wrap, and an
   absolute bar on a wrapped link draws one rule through the whole box. */
body.em .form-card .prose-link {
  color: var(--velvet-text); text-decoration-color: var(--emerald-lit);
}
body.em .form-card .prose-link:hover { text-decoration-color: var(--velvet-text); }
body.em .form-card .btn--gilt { width: 100%; text-align: center; }
/* ⚠️ THE EVERGREEN HEADING THAT STOOD HERE IS SUPERSEDED, 2026-09-03. It was
   the paper-voice answer to "match the expand rail" — emerald-lit is a
   dark-grounds-only token and measured 2.9:1 on the white card, so the heading
   took evergreen instead and the card stayed white. Darrell has since taken the
   other branch: the card itself is velvet now, so emerald-lit is back on the
   ground it was made for at 5.86:1. The heading rule lives with the rest of the
   port above. */
body.em .form-card .btn--gilt { width: 100%; text-align: center; margin-top: .5rem; }
body.em .field input,
body.em .field select,
body.em .field textarea { background: var(--paper); border-color: var(--rule-line); }
body.em .field input:focus-visible,
body.em .field select:focus-visible,
body.em .field textarea:focus-visible { outline-color: var(--amber); border-color: var(--amber); }
body.em .aside-block .notice { background: var(--wash); border-color: var(--amber); }
body.em .aside-block h2 { font-family: var(--sans); letter-spacing: var(--track-eyebrow, .16em); }
