/* ============ CONTACT MESSAGE MOCKUP ============
   Styles for _design/concepts/contact-message-mockup.html only. Not
   linked from field-manual.css or any production page. Borrows the
   shared tokens (--space-*, --t-*, --ink, --red, --oaktag, --hair) from
   field-manual.css, which this page loads first. */

/* Impeccable critique P0: the browser's own UA rule for [hidden] is
   `[hidden]{ display:none }` at (0,1,0), and .form-error/.receipt below
   are also (0,1,0) but load after it, so they were winning and both
   panels rendered permanently, even on a fresh empty-state load. This
   restates the UA rule with !important so JS toggling the hidden
   attribute is the only thing that can show either panel. */
[hidden]{ display:none !important; }

/* Impeccable critique P1: --red on --oaktag measures ~3.35:1, below the
   4.5:1 body-text floor. --red stays the graphic color (borders, the
   button base, large glyphs); small red TEXT on oaktag uses this mixed,
   darker value instead, measured at ~6.1:1: --red-text, now in tokens.css. */

/* Round 3, layout: Lee, live 2026-09-23 7:30am, on the 1:2 split: "50/50
   doesn't make any choices for the user. We'll see." Equal width it is --
   the booking card's own content still sizes with width:fit-content (per
   close.css), so a 50/50 track just hands it more air, not more copy. */
.contact-ways{ display:grid; grid-template-columns:minmax(0,1fr); gap:var(--space-l); }
@media (min-width:861px){ .contact-ways{ grid-template-columns:minmax(0,1fr) minmax(0,1fr); align-items:start; } }
/* Round 3: Lee, same review, on the red card's padding: "it's just a hair
   too much padding... it reads as off center." close.css's own .close
   rule pads var(--space-l) (80px) above 1180px; that file is shared with
   contact.html and out of scope here, so the one step down to
   var(--space-m) is scoped to this page's own .contact-ways ancestor
   instead of edited at the source. Left unscoped below 1181px, where
   close.css already steps its own padding down to var(--space-m) (the
   901-1180 range) and var(--space-s) (the phone range) -- an unscoped
   override here would have frozen both of those at var(--space-m) and
   undone close.css's own narrower-width padding. */
@media (min-width:1181px){ .contact-ways .close{ padding:var(--space-m); } }
/* Holds the booking card and reuses close.css's own .quiet reassurance
   block underneath it, so the narrower column carries real content
   instead of ending at the card's own height with nothing below it. */
.close-column{ display:flex; flex-direction:column; }

.write-card{
  border:1px solid var(--hair); padding:var(--space-l); box-sizing:border-box;
  display:flex; flex-direction:column;
  position:relative;
  /* Establishes a container-query context sized to this card's own box
     (not the viewport) for the starter-prompts grid below. */
  container-type:inline-size;
}
@media (max-width:860px){ .write-card{ padding:var(--space-m); } }
/* Impeccable pass, round 3: a flat flex gap gave the heading, its intro
   line, the chips and the form all the same var(--space-m) breathing
   room, so a tightly-related pair (the h2 and the sentence under it)
   read as no closer to each other than two unrelated groups. Explicit
   margins replace the blanket gap: small below the heading, then a
   step up at every real group boundary, biggest before the "Rather
   talk?" line since that is a second call to action, not a continuation
   of the form above it. Flex items don't collapse margins, so each of
   these is the actual rendered gap, not halved against a neighbor. */
.write-card h2{ margin:0 0 var(--space-xs); }
.write-intro{ margin:0 0 var(--space-l); }

/* ---------- starter prompts ----------
   Impeccable pass, round 3: four bordered boxes read as a mismatched
   button toolbar and wrapped unevenly, the heaviest thing on the card
   after the red button. The site already has a quiet-label idiom for
   exactly this (close.css's .tool-item .lnk): a painted hairline rule
   at rest that reddens and thickens on hover, no box, no fill. Same
   idiom here -- these read as a row of labeled options, not buttons,
   while staying real <button> elements with a full 44px tap target. */
.starter-prompts{ display:flex; flex-wrap:wrap; gap:var(--space-s) var(--space-m); margin:0 0 var(--space-m); }
.starter-btn{
  font-family:var(--font-mono);
  font-size:var(--t-micro); font-weight:700; color:var(--warmink);
  background:transparent; background-image:linear-gradient(var(--hair),var(--hair));
  background-repeat:no-repeat; background-position:0 100%; background-size:100% 1px;
  border:0; padding:var(--space-xs) 0;
  min-height:var(--control-h); display:inline-flex; align-items:center;
  text-align:left; cursor:pointer;
  transition:background-size .15s ease-out, background-image .15s ease-out, color .15s ease-out;
}
.starter-btn:hover, .starter-btn:focus-visible{
  color:var(--red-text); background-image:linear-gradient(var(--red),var(--red)); background-size:100% 2px;
}

/* ---------- starter prompts, checkbox build ----------
   Lee, live 2026-09-23 9:14am, on the row above: "These don't read as
   checkboxes currently, and they're just a bit messy in the layout." Real
   <input type="checkbox"> elements this time, each wrapped in its own
   <label> so the full row is the tap target, not just the 18px box. A
   fieldset/legend group names the set for a screen reader without adding a
   visible heading weight the card doesn't need. Square box, drawn with the
   site's own tokens (--ink border, --oaktag ground, --red when checked) --
   no native appearance anywhere, so it renders the same in every browser. */
.starter-prompts{ border:0; margin:0 0 var(--space-m); padding:0; min-width:0; }
.starter-prompts legend{
  font-family:var(--font-mono);
  font-size:var(--t-micro); font-weight:700; color:var(--ink);
  padding:0 0 var(--space-xs); margin:0;
}
/* Coordinator, rendering the page live, 2026-09-23: a viewport breakpoint
   turned this into two columns whenever the WINDOW was wide enough, even
   while the write-card itself stayed narrow (squeezed by the close-plate
   rail), which wrapped every label to one or two words a line -- the exact
   messiness Lee flagged. A container query asks the CARD's own width
   instead, so two columns only appear once the card is actually wide
   enough for the longest label ("Our site doesn't say what we actually
   do") to sit on one line in each column. Single column below that,
   always -- the safe default in a browser without container-query support
   too. */
.starter-grid{ display:flex; flex-direction:column; gap:var(--space-xs); }
/* 780px measured against the real rendered label ("Our site doesn't say
   what we actually do" at 331.7px, the longest of the four, via
   Range.getBoundingClientRect on the live page), not a guess: each column
   needs the label plus the 18px box and its 8px gap (~358px), doubled,
   plus the space-m column gap (40px) = 756px, rounded up for slack across
   browsers/zoom. At the card widths this page's own split produces
   (~456px content), that keeps it single-column; a wider write-card
   elsewhere gets two once it actually has the room. */
@container (min-width:780px){
  .starter-grid{ display:grid; grid-template-columns:1fr 1fr; gap:var(--space-xs) var(--space-m); }
}
/* Every row the same height regardless of whether its label wraps, so a
   two-column grid stays aligned rather than ragged. */
.starter-item{
  display:flex; align-items:flex-start; gap:var(--space-xs);
  min-height:var(--control-h); padding:var(--space-xs) 0; cursor:pointer;
}
.starter-item input[type="checkbox"]{
  appearance:none; -webkit-appearance:none; -moz-appearance:none;
  width:18px; height:18px; flex:none; margin:0; margin-top:.2em;
  border:2px solid var(--ink); background:var(--oaktag);
  position:relative; cursor:pointer;
}
.starter-item input[type="checkbox"]:hover{ border-color:var(--red); }
.starter-item input[type="checkbox"]:checked{ background:var(--red); border-color:var(--red); }
.starter-item input[type="checkbox"]:checked::after{
  content:''; position:absolute; left:4px; top:0;
  width:6px; height:10px;
  border:solid var(--oaktag); border-width:0 2px 2px 0;
  transform:rotate(40deg);
}
.starter-item input[type="checkbox"]:focus-visible{ outline:3px solid var(--red); outline-offset:2px; }
/* Box aligned to the label's first line: the label sits at the same
   line-height as the box's own top edge, not centered against a wrapped
   two-line label. */
.starter-item span{
  font-family:var(--font-mono);
  font-size:var(--t-micro); color:var(--warmink); line-height:1.4;
}

/* ---------- form ---------- */
.contact-form{ display:flex; flex-direction:column; gap:var(--space-m); }
.field-group{ display:flex; flex-direction:column; gap:var(--space-xs); }
.field-group label{
  font-family:var(--font-mono);
  font-size:var(--t-micro); font-weight:700; color:var(--ink);
}
.field-group input, .field-group textarea{
  font-family:var(--font-body);
  font-size:var(--t-body); color:var(--ink); background:transparent;
  border:1px solid var(--hair); box-sizing:border-box;
  padding:var(--space-xs) var(--space-s);
  resize:vertical; min-height:var(--control-h);
}
.field-group textarea{ min-height:7em; }
.field-group input:focus-visible, .field-group textarea:focus-visible{
  outline:none; border-color:var(--ink); border-width:2px;
  padding:calc(var(--space-xs) - 1px) calc(var(--space-s) - 1px);
}
.field-group input.has-error, .field-group textarea.has-error{ border-color:var(--red); }
.field-hint{
  font-family:var(--font-mono);
  font-size:var(--t-micro); color:var(--red-text); min-height:1.2em; margin:0;
}

/* Honeypot: off-screen, not display:none (some bots skip hidden fields
   but still fill an off-screen one), out of tab order, unlabeled to a
   screen reader via aria-hidden on the wrapper. */
.hp-field{
  position:absolute; width:1px; height:1px; overflow:hidden;
  left:-9999px; top:auto;
}

.contact-form-actions{ display:flex; align-items:center; gap:var(--space-s); flex-wrap:wrap; }
.contact-form .btn{ min-height:var(--control-h); }
.contact-form .btn:disabled{ cursor:default; opacity:.65; }
.key-hint{ margin:0; }
.key-hint kbd{
  font-family:inherit; font-size:inherit; color:var(--ink);
  border:1px solid var(--hair); padding:0 .3em;
}
#form-status{ margin:0; }

/* ---------- failure state ----------
   Round 3: the round-2 left border read as a side-tab accent, the
   classic AI-UI tell (a colored bar stuck on one edge of a card). Gone
   entirely -- no border, no box, same no-border move the receipt
   already uses below. The state is marked by a small stamped label
   (the shared .stamp, "Not sent" instead of "Filed") plus the card's
   own type and spacing, never a rule. */
.form-error{
  border:0; padding:0; margin-top:var(--space-s);
  display:flex; flex-direction:column; gap:var(--space-s);
}
.form-error p{ margin:0; }
.form-error .btn{ align-self:flex-start; min-height:var(--control-h); }

/* ---------- success receipt ----------
   Round 2: this used to be a bordered plate inside the bordered
   write-card inside the bordered section -- three nested rules. It now
   REPLACES the form in the same slot (write-card already hides the form
   and the starter prompts on success), carries no border of its own,
   and separates from the intro copy above it with the card's existing
   gap plus one extra step, not a rule. The "Filed" stamp is the one
   surviving accent: small, inline, nowhere near write-card's own edge.
   A real 45-65ch measure (60ch) stops the echoed message and the email
   from column-hugging into a near-unreadable ~20-character line. */
.receipt{
  display:flex; flex-direction:column; gap:var(--space-m);
  max-width:60ch; margin-top:var(--space-s);
}
/* Shared stamp treatment: "Filed" on success, "Not sent" on failure.
   A small bordered label, never a rule that runs the length of a card
   edge, and its own border sits well clear of write-card's border. */
.stamp{
  display:inline-block; align-self:flex-start;
  border:2px solid var(--red); color:var(--red-text);
  padding:var(--space-xs) var(--space-s);
  letter-spacing:.08em;
}
@media (prefers-reduced-motion:no-preference){
  .stamp{ transform:rotate(-3deg); }
}
.receipt h2{ margin:0; outline:none; }
/* Round 2: focus still moves here for a screen reader (tabindex="-1" in
   the markup), but a script-triggered .focus() is not a keyboard
   interaction, so :focus-visible alone (dropping the old bare :focus
   rule) shows no ring for it while still showing one if a keyboard user
   later tabs to this same heading. */
.receipt h2:focus-visible{ outline:3px solid var(--red); outline-offset:3px; }
.receipt p{ margin:0; }
/* The email address wraps at a normal word boundary first; only a truly
   unbreakable, overlong address is allowed to split mid-word, and only
   this span breaks, not the sentence around it. */
#receipt-email{ overflow-wrap:anywhere; }
.receipt-echo{
  border-top:1px solid var(--hair); padding-top:var(--space-m);
  display:flex; flex-direction:column; gap:var(--space-xs);
}
#receipt-message{ white-space:pre-wrap; }

/* Impeccable pass, round 3: this trailing link used to inherit the same
   var(--space-m) card gap as everything above it, so a second call to
   action read as one more line of the form. It now gets its own
   hairline group boundary, the same idiom the receipt's echoed-message
   block already uses (.receipt-echo), plus the card's biggest step, so
   it reads as "or, the other path" rather than a form footnote. */
.rather-talk-line{
  margin:var(--space-l) 0 0; border-top:1px solid var(--hair); padding-top:var(--space-m);
}
/* Coordinator, live at 390: the full space-l + space-m gap (120px) read as
   an oversized empty band on a narrow card, well past the card's other
   group gaps. Tightened to the card's own group-boundary step (space-m,
   40px total) below 861px, where the write-card itself already narrows. */
@media (max-width:860px){
  .rather-talk-line{ margin-top:var(--space-m); }
}
