/* ============================================================================
 * EVE — the environment (the sitewide corner popup — Eve's only live surface
 * since the full /eve page retired, 2026-08-29 — plus the half-banner concept).
 *
 * The design is a port of the public-facing Eve front page (AH Brain eve.html,
 * the fa.feniex.com door) into a STOREFRONT SECTION: same Command Desk language
 * — Michroma display, Inter body, JetBrains Mono labels, void black, red-hot —
 * but the stage is a full-fold <section> between the site header and footer
 * instead of a chrome-less fixed app. Everything eve.html pins with
 * position:fixed is absolute inside .eve here; only the phone chat sheet
 * stays fixed, because there it deliberately takes the whole window over.
 *
 * One instance per page — ids are singletons that js/eve-concept.js binds.
 * ==========================================================================*/

.eve {
  --eve-void: #050404;
  --eve-ink: #0a0a0b;
  --eve-panel: #0e0e10;
  --eve-red: #ee3a23;
  --eve-red-hot: #ff5a41;
  --eve-gold: #e8c47a;
  --eve-gold-dim: #8a7648;
  --eve-text: #e9e4da;
  --eve-body: #dedbda;
  --eve-white: #f6f5f4;
  --eve-dim: #9a938a;
  --eve-dim2: #6d6a69;
  --eve-muted: #a8a5a4;
  --eve-edge: #241d1a;
  --eve-line: rgba(255, 255, 255, .1);
  --eve-hairline: rgba(255, 255, 255, .07);
  --eve-disp: 'Michroma', 'Arial Black', sans-serif;
  --eve-ui: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --eve-mono: 'JetBrains Mono', Consolas, ui-monospace, monospace;
  --eve-rail: min(528px, 92vw);
  /* the sticky site header is 80px tall — same constant synq-home.css keys on */
  --eve-header: 80px;

  position: relative;
  overflow: hidden;
  isolation: isolate;
  height: calc(100vh - var(--eve-header));
  height: calc(100svh - var(--eve-header));
  min-height: 540px;
  background: var(--eve-void);
  color: var(--eve-text);
  font-family: var(--eve-mono);
  -webkit-font-smoothing: antialiased;
}

/* ---------- the stage: her canvas (presence look) / the desk black ---------- */
.eve-stage { position: absolute; inset: 0; background: var(--eve-void); }
.eve-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
/* the no-JS / no-canvas truth: the still itself is the look */
.eve-fallback { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 49% 50%; }
.eve--boot .eve-fallback { display: none; }

/* the subtle look: the stage steps aside for the desk black and the wheel */
.eve[data-look="subtle"] .eve-canvas,
.eve[data-look="subtle"] .eve-fallback { display: none; }
.eve[data-look="subtle"] .eve-stage { background: #060607; }
.eve-orbwrap { position: absolute; inset: 0; display: none; align-items: center; justify-content: center; pointer-events: none; }
.eve[data-look="subtle"] .eve-orbwrap { display: flex; }
.eve-orb { width: min(52vh, 420px); height: min(52vh, 420px); pointer-events: auto; cursor: pointer; touch-action: none; }

/* ---------- the mark, top left — who this is ---------- */
/* TOP LEFT AND NOWHERE ELSE (Hamza, 2026-08-29, his last call of the day):
   it spent the evening docked in the wall as a 12.5px signature line under
   the lede — that cluster is broken up again, and the line stands well above
   the 12.5px it was reading at down there. Sized by eye, not by ratio: the
   first pass at 26-34px filled a third of the strip, so it came back 40%
   (Hamza, 2026-08-29) to sit in the corner comfortably. Spacing pulled in
   from .42em so the longer line reads as a title rather than a ruler.
   PX, NOT REM: the storefront's root font-size is 10px, so a rem figure here
   renders at HALF what it looks like in the source — the old 2.2rem cap was
   22px, barely above the wall line it was meant to tower over. */
.eve-mark {
  position: absolute; top: 20px; left: 28px; z-index: 8; margin: 0;
  pointer-events: none;
  font-family: var(--eve-mono); font-size: clamp(16px, 1.45vw, 20px); font-weight: 500;
  letter-spacing: .28em; text-transform: uppercase; color: var(--eve-dim);
  text-shadow: 0 1px 8px rgba(0, 0, 0, .9);
}
.eve-mark b { color: var(--eve-red-hot); font-weight: 700; }

/* ---------- the wall — EVE, the lede, the doors ---------- */
.eve-wall {
  position: absolute; left: 28px; bottom: 26px; z-index: 8;
  max-width: 340px; pointer-events: none;
  text-shadow: 0 1px 2px rgba(0, 0, 0, .95), 0 3px 16px rgba(0, 0, 0, .8);
}
.eve-wall h2 {
  font-family: var(--eve-disp); font-weight: 400; text-transform: uppercase;
  font-size: clamp(27px, 3.4vw, 46px); line-height: 1.06; letter-spacing: .02em;
  margin: 0 0 14px; text-shadow: none;
  filter: drop-shadow(0 2px 3px rgba(0, 0, 0, .9)) drop-shadow(0 6px 20px rgba(0, 0, 0, .7));
}
.eve-wall .eve-stroke { display: block; color: rgba(255, 255, 255, .42); }
@supports (-webkit-text-stroke: 1px #fff) {
  .eve-wall .eve-stroke { color: transparent; -webkit-text-stroke: 1.5px rgba(255, 255, 255, .5); }
}
.eve-wall .eve-solid { display: block; color: var(--eve-red-hot); text-shadow: 0 0 34px rgba(238, 58, 35, .5); }
.eve-lede {
  font-family: var(--eve-ui); font-size: 12.5px; line-height: 1.65; color: var(--eve-text);
  max-width: 290px; margin: 0 0 18px;
}
.eve-reach { list-style: none; display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; }
.eve-reach-tag {
  font-family: var(--eve-mono); font-size: 8.5px; font-weight: 700; letter-spacing: .14em;
  color: var(--eve-red-hot); border: 1px solid rgba(238, 58, 35, .4); border-radius: 4px;
  padding: 3px 6px; min-width: 42px; text-align: center;
}
.eve-reach a {
  display: flex; align-items: center; gap: 10px;
  font-family: var(--eve-mono); font-size: 11.5px; color: var(--eve-white); text-decoration: none;
  white-space: nowrap; pointer-events: auto; transition: color .15s;
}
.eve-reach a:hover { color: var(--eve-red-hot); }
.eve-reach a:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 2px; }
@media (max-width: 980px) {
  .eve-lede { display: none; }
  .eve-wall h2 { font-size: clamp(26px, 3.4vw, 40px); }
}

/* ---------- the foot — caption, hint, pill, the talk circle ---------- */
.eve-foot {
  position: absolute; left: 0; right: 0; bottom: 20px; z-index: 8;
  display: flex; flex-direction: column; align-items: center; gap: .55rem;
  pointer-events: none; padding: 0 1.1rem;
}
.eve-caption {
  width: 100%; max-width: 640px; margin: 0; text-align: center;
  font-size: .92rem; line-height: 1.55; color: var(--eve-text);
  min-height: 1.4em; text-shadow: 0 1px 12px rgba(0, 0, 0, .9);
  overflow-wrap: break-word; white-space: normal;
}
.eve-hint {
  margin: 0; font-size: .66rem; letter-spacing: .3em; text-transform: uppercase;
  color: var(--eve-dim); text-align: center;
}
.eve-hint b { color: var(--eve-gold); font-weight: 400; }
.eve-pill {
  height: 34px; min-width: 190px; padding: 0 16px; border-radius: 17px;
  border: 1px solid var(--eve-edge); background: rgba(10, 8, 7, .55);
  display: flex; align-items: center; justify-content: center; gap: 3px;
  transition: border-color .25s, box-shadow .25s;
}
.eve-pill.live { border-color: rgba(238, 58, 35, .55); box-shadow: 0 0 26px rgba(238, 58, 35, .30); }
.eve-pill i {
  width: 3px; height: 16px; border-radius: 2px; background: var(--eve-gold); opacity: .8;
  display: block; transform: scaleY(.12); transform-origin: center;
}

.eve-ptt {
  pointer-events: auto; touch-action: none; -webkit-touch-callout: none; -webkit-user-select: none; user-select: none;
  margin-top: .4rem; width: 150px; height: 150px; border-radius: 50%;
  border: 1px solid var(--eve-edge); background: rgba(10, 8, 7, .55);
  color: var(--eve-gold); font-family: var(--eve-mono); font-weight: 300; font-size: .62rem;
  letter-spacing: .2em; text-indent: .2em; line-height: 1.7; text-align: center; cursor: pointer;
  display: none; align-items: center; justify-content: center;
  transition: border-color .25s, box-shadow .25s, background-color .25s, color .25s;
}
.eve-ptt.wait { border-color: rgba(208, 138, 44, .7); box-shadow: 0 0 38px rgba(208, 138, 44, .4); }
.eve-ptt.on {
  border-color: rgba(70, 209, 127, .85); background: rgba(14, 30, 20, .72);
  box-shadow: 0 0 44px rgba(70, 209, 127, .5); color: rgb(120, 226, 166);
}
.eve-ptt .eve-lbl { pointer-events: none; }
.eve-ptt-timer { display: none; pointer-events: none; flex-direction: column; align-items: center; gap: 2px; }
.eve-ptt-timer .eve-tlab { font-size: .5rem; letter-spacing: .28em; color: rgba(208, 138, 44, .9); }
.eve-ptt-timer .eve-tsec { font-size: 1.5rem; letter-spacing: .04em; text-indent: 0; color: var(--eve-gold); line-height: 1.1; }
.eve-ptt.wait .eve-lbl { display: none; }
.eve-ptt.wait .eve-ptt-timer { display: flex; }
.eve-ptt:focus-visible { outline: 2px solid var(--eve-gold); outline-offset: 3px; }

/* every touch surface shows the circle and retires the pill (his call, 28 Aug 2026) */
@media (pointer: coarse), (max-width: 640px), (max-height: 560px) {
  .eve-ptt { display: flex; }
  .eve-hint, .eve-pill { display: none; }
}

/* ---------- the look switch (the full-page concept only) ---------- */
.eve-lookswitch { position: absolute; top: 20px; right: 22px; z-index: 9; display: flex; gap: 6px; }
.eve-lk {
  font-family: var(--eve-mono); font-size: 9.5px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
  color: var(--eve-muted); background: rgba(10, 10, 11, .6); border: 1px solid var(--eve-line); border-radius: 999px;
  padding: 8px 14px; cursor: pointer; transition: color .15s, border-color .15s, box-shadow .15s;
}
.eve-lk:hover { color: #fff; border-color: rgba(238, 58, 35, .55); }
.eve-lk:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 2px; }

/* ---------- the corner — TYPE, the door to the console ---------- */
.eve-corner { position: absolute; right: 22px; bottom: 20px; z-index: 9; display: flex; gap: .5rem; }
.eve-type {
  height: 42px; padding: 0 1.3rem; border-radius: 21px; border: 1px solid var(--eve-edge); cursor: pointer;
  background: rgba(10, 8, 7, .55); color: var(--eve-dim); font-family: var(--eve-mono); font-weight: 300;
  font-size: .62rem; letter-spacing: .28em; text-indent: .28em; text-transform: uppercase;
  display: flex; align-items: center; justify-content: center; transition: color .2s, border-color .2s;
}
.eve-type:hover { color: var(--eve-gold); border-color: var(--eve-gold-dim); }
.eve-type:focus-visible { outline: 2px solid var(--eve-gold); outline-offset: 2px; }
/* the console has its own ✕ — TYPE only stands when the console is away */
.eve--deck .eve-corner { display: none; }

/* ---------- the console — the desk's deck, docked right ---------- */
.eve-deck {
  position: absolute; top: 0; right: 0; bottom: 0; width: var(--eve-rail); z-index: 10;
  background: rgba(8, 8, 9, .97); border-left: 1px solid var(--eve-line);
  transform: translateX(102%); transition: transform .35s cubic-bezier(.22, .9, .3, 1), visibility 0s .35s;
  visibility: hidden;
  display: flex; flex-direction: column;
}
.eve-deck.open { transform: none; visibility: visible; transition: transform .35s cubic-bezier(.22, .9, .3, 1); }
.eve-dhead { display: flex; align-items: center; gap: 10px; padding: 16px 18px 14px; border-bottom: 1px solid var(--eve-hairline); }
.eve-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--eve-red); box-shadow: 0 0 9px rgba(238, 58, 35, .9); flex: none; }
/* the name takes the state text's flex slot (the "live and available" line
   came off, 2026-08-29 evening — the band's channel is the state now) */
.eve-dname { font-family: var(--eve-mono); font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--eve-white); flex: 1; min-width: 0; }
.eve-cbtn {
  width: 38px; height: 38px; border-radius: 50%; border: 1px solid var(--eve-line); cursor: pointer;
  background: transparent; color: var(--eve-muted); flex: 0 0 auto; align-self: center;
  display: flex; align-items: center; justify-content: center; transition: color .15s, border-color .15s; padding: 0;
}
.eve-cbtn svg { width: 17px; height: 17px; display: block; }
.eve-cbtn svg * { stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
.eve-cbtn:hover, .eve-cbtn.on { color: #fff; border-color: rgba(238, 58, 35, .55); }
.eve-cbtn:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 2px; }
.eve-cbtn.on .eve-offmark { display: none; }
/* no ✕ (Hamza, 2026-08-29): clicking off the chat closes it — the button
   stands ONLY on the phone's full-screen sheet, where there is no "off the
   chat" left to click (see the takeover block below) */
.eve-dclose {
  width: 38px; height: 38px; flex: none; border-radius: 50%; border: 1px solid var(--eve-line);
  background: transparent; color: var(--eve-muted); font-size: 1rem; line-height: 1; cursor: pointer;
  display: none; align-items: center; justify-content: center; padding: 0;
  transition: color .15s, border-color .15s;
}
.eve-dclose:hover { color: var(--eve-white); border-color: rgba(238, 58, 35, .55); }
.eve-dclose:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 2px; }

.eve-dlog {
  flex: 1; overflow-y: auto; padding: 18px 18px 14px; display: flex; flex-direction: column; gap: 18px;
  overscroll-behavior: contain;
  scrollbar-width: thin; scrollbar-color: rgba(255, 255, 255, .18) transparent;
}
.eve-turn { max-width: 82%; }
.eve-who { font-family: var(--eve-mono); font-size: 9.5px; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; margin-bottom: 6px; }
.eve-t-eve .eve-who { color: var(--eve-red-hot); }
.eve-t-eve .eve-who::before { content: "\25E4  "; font-size: 8px; }
.eve-t-you { align-self: flex-end; text-align: right; max-width: 76%; }
.eve-t-you .eve-who { color: var(--eve-dim2); }
.eve-said {
  font-family: var(--eve-ui); font-size: 14.5px; line-height: 1.66; color: var(--eve-body);
  white-space: pre-wrap; overflow-wrap: break-word; margin: 0;
}
.eve-t-you .eve-said {
  display: inline-block; background: rgba(255, 255, 255, .05);
  border: 1px solid rgba(255, 255, 255, .09); border-radius: 11px 11px 3px 11px;
  padding: 10px 15px; text-align: left;
}
/* the held mic's live bubble: pulsing dots stand in the visitor's turn from
   the instant the hold begins. Desktop SpeechRecognition replaces them with
   the words AS they're spoken (echoHeard); iPhone Safari has no live
   partials (WebKit SR is barred — recorder→Deepgram transcribes on
   release), so the dots carry the wait and ask() fills this same bubble
   with the transcript. */
.eve-said.eve-listening::after {
  content: "\2022 \2022 \2022"; letter-spacing: .12em; color: var(--eve-gold);
  animation: eve-hear 1.1s ease-in-out infinite;
}
@keyframes eve-hear { 0%, 100% { opacity: .35; } 50% { opacity: 1; } }
.eve-t-eve .eve-said.streaming::after {
  content: ""; display: inline-block; width: 7px; height: 1.05em;
  margin-left: 2px; background: var(--eve-red); vertical-align: text-bottom;
  animation: eve-blink 1s steps(2, start) infinite;
}
@keyframes eve-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }
.eve-think { font-family: var(--eve-mono); font-size: 11px; letter-spacing: .08em; color: var(--eve-dim2); }

/* the composer is one slim line (Hamza, 2026-08-29): the typed text is one
   14px row, so the box wears it close — no tall padding around a short
   line. Send shrank from the ASK word to a small round arrow ("like this
   chat"), which also hands its width to the mic's breathing room. */
.eve-dform {
  display: flex; gap: 8px; align-items: center; margin: 0 18px;
  background: var(--eve-panel); border: 1px solid var(--eve-line); border-radius: 999px; padding: 6px 6px 6px 10px;
}
.eve-dform:focus-within { border-color: rgba(255, 89, 61, .5); }
.eve-dinput {
  flex: 1; min-width: 0; background: transparent; border: 0; color: var(--eve-white);
  font-family: var(--eve-ui); font-size: 14px; line-height: 1.5; padding: 6px 8px; outline: none; user-select: text;
}
.eve-dinput::placeholder { color: rgba(201, 197, 196, .4); }
/* iOS Safari zooms the page on focus of any input under 16px and never zooms back */
@media (pointer: coarse) { .eve-dinput { font-size: 16px; } }
.eve-dsend {
  width: 38px; height: 38px; flex: none; border-radius: 50%; cursor: pointer; padding: 0;
  color: #fff; background: linear-gradient(180deg, #ff4d33, #d42d1b);
  border: 1px solid rgba(255, 109, 78, .6);
  display: flex; align-items: center; justify-content: center;
}
.eve-dsend svg { width: 16px; height: 16px; display: block; }
.eve-dsend svg path { stroke: currentColor; fill: none; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.eve-dsend:hover:not(:disabled) { filter: brightness(1.08); }
.eve-dsend:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 2px; }
.eve-dsend:disabled { cursor: wait; filter: saturate(.8) brightness(.9); }

/* the chips are the deck's last row since the voice row retired — the
   bottom padding is the console's own margin */
.eve-dtry {
  display: flex; flex-wrap: nowrap; gap: 7px; align-items: center; overflow-x: auto;
  scrollbar-width: none; padding: 13px 18px 15px;
}
.eve-dtry::-webkit-scrollbar { display: none; }
.eve-trylabel { font-family: var(--eve-mono); font-size: 9.5px; letter-spacing: .2em; color: var(--eve-dim2); flex: none; }
.eve-chip {
  flex: none; background: transparent; border: 1px solid var(--eve-line); color: var(--eve-muted);
  border-radius: 999px; font-family: var(--eve-ui); font-size: 11px; padding: 5px 11px; cursor: pointer;
  white-space: nowrap; transition: color .15s, border-color .15s;
}
.eve-chip:hover { color: #fff; border-color: rgba(238, 58, 35, .55); }
.eve-chip:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 2px; }

/* the mic lives IN the composer (Hamza, 2026-08-29, replacing the voice
   row): a held button instead of an advertised key — the popup opens with
   the cursor in the input, so a keyboard PTT could only ever type. Round,
   between the input and send. At REST it wears the mic glyph (his ruling:
   dots read as an ellipsis menu, a word can't fit or be honest about
   HOLD); while HELD the glyph yields to the five live level bars (the
   BARS engine scales them), green with the ring. */
.eve-dmic {
  position: relative;
  width: 38px; height: 38px; flex: none; border-radius: 50%; cursor: pointer;
  touch-action: none; -webkit-touch-callout: none; -webkit-user-select: none; user-select: none;
  border: 1px solid var(--eve-line); background: transparent; padding: 0;
  color: var(--eve-muted);
  display: flex; align-items: center; justify-content: center;
  transition: border-color .2s, box-shadow .2s, background-color .2s, color .2s;
}
.eve-dmic:hover { border-color: var(--eve-gold-dim); color: var(--eve-gold); }
.eve-dmic:focus-visible { outline: 2px solid var(--eve-gold); outline-offset: 2px; }
.eve-dmic-ico { width: 17px; height: 17px; display: block; }
.eve-dmic-ico * { stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
.eve-dmic-lvl { display: none; align-items: center; gap: 2px; pointer-events: none; }
.eve-dmic-lvl i {
  width: 2.5px; height: 14px; border-radius: 2px; background: rgb(120, 226, 166); opacity: .9;
  display: block; transform: scaleY(.14); transform-origin: center;
}
.eve-dmic.on {
  border-color: rgba(70, 209, 127, .85); background: rgba(14, 30, 20, .72);
  box-shadow: 0 0 18px rgba(70, 209, 127, .35);
}
.eve-dmic.on .eve-dmic-ico { display: none; }
.eve-dmic.on .eve-dmic-lvl { display: flex; }
/* the gesture teacher: a tap too short to carry speech flashes this above
   the mic (JS adds .show for ~1.6s) — the only place the words appear */
.eve-dmic-hint {
  position: absolute; bottom: calc(100% + 12px); left: 50%;
  transform: translateX(-50%) translateY(3px);
  font-family: var(--eve-mono); font-size: 9px; font-weight: 700;
  letter-spacing: .2em; text-indent: .2em; text-transform: uppercase; white-space: nowrap;
  color: var(--eve-gold); background: rgba(9, 9, 10, .94);
  border: 1px solid var(--eve-line); border-radius: 999px; padding: 6px 11px;
  opacity: 0; pointer-events: none; transition: opacity .18s, transform .18s;
}
.eve-dmic-hint.show { opacity: 1; transform: translateX(-50%) translateY(0); }

/* ---------- the split desk (wide screens, console out) ---------- */
@media (min-width: 1100px) and (pointer: fine) {
  .eve--deck:not(.eve--half) .eve-stage { right: var(--eve-rail); }
  .eve--deck:not(.eve--half) .eve-foot { right: var(--eve-rail); }
  .eve--deck:not(.eve--half) .eve-lookswitch { right: calc(var(--eve-rail) + 22px); }
}

/* ---------- the HALF banner (Hamza, 2026-08-29; simplified to a DOOR the
   same day): the environment at half the fold, reduced to three things —
   the EVE mark standing large top left as the strip's title, the EVE wall
   with the lede bottom left, her portrait in the middle (face-focused
   crop; js/eve-concept.js gets the focus through EVE_CFG). No Switch
   Looks, no TYPE tab, no spacebar furniture, no email row: the whole
   strip is ONE button — the nav wave's exact behaviour — and clicking
   anywhere toggles the popup chat window rising from the corner. -------- */
.eve--half {
  height: calc((100vh - var(--eve-header)) / 2);
  height: calc((100svh - var(--eve-header)) / 2);
  min-height: 360px;
}
.eve--half .eve-fallback { object-position: 49% 30%; }
/* the mark is the strip's title, standing alone in the top left corner, at
   the size .eve-mark already sets. NO font-size override here: this selector
   outranks the handset media block's plain .eve-mark, so re-stating the size
   would freeze the phone at the desktop figure. */
/* THE COLUMN (Hamza's pick, 2026-08-29): the strip's void becomes a dark
   room whose one light is a vertical beam crossing the wave dead centre —
   the antenna figure. The plate rides the stage as CSS (a new filename is
   its own cache-bust); the canvas above clears instead of painting void
   (eve-concept.js), so the live wave draws straight over the beam. The
   ::before scrim steadies the wall and cue corners against wider crops —
   a pseudo-child painted BEFORE the canvas, so the wave never dims. */
.eve--half[data-look="dispatch"] .eve-stage {
  background-image: url(../img/eve/eve-column-2560.webp);
  background-size: cover;
  background-position: 50% 50%;
}
.eve--half[data-look="dispatch"] .eve-stage::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background:
    linear-gradient(90deg, rgba(5, 4, 4, .40), rgba(5, 4, 4, 0) 32%),
    linear-gradient(0deg, rgba(5, 4, 4, .34), rgba(5, 4, 4, 0) 26%);
}
/* belt for the plate: the canvas rides in screen blend on the half strip, so
   the wave stays additive light and the near-black frame the js paints —
   #050404 cleared by the current js, but painted OPAQUE by any stale cached
   copy — can never black the room out. Screen over the plate is also exactly
   how the concept rounds were judged, so the look this protects IS the look
   that was signed off. Scoped to the half strip only: it is the one dispatch
   surface that carries a plate. */
.eve--half[data-look="dispatch"] .eve-canvas { mix-blend-mode: screen; }
/* the radio log clears the beam: TOP RIGHT on the strip (his call with the
   Column pick — "so it doesn't interfere with the column"). It mirrors the
   mark's corner geometry across the strip, anchored on its right edge; the
   chat deck itself is untouched, per his standing ruling.
   .eve.eve--half, not bare .eve--half: the base dispatch .eve-tx rule sits
   LATER in this file at equal specificity, and a tie there hands left/bottom/
   transform back to the centred layout — the block would stretch from
   top:20px to bottom:15% mid-strip. The doubled class outranks it outright. */
.eve.eve--half[data-look="dispatch"] .eve-tx {
  left: auto; right: 28px; top: 20px; bottom: auto;
  transform: none; width: auto; max-width: min(560px, 46%);
}
.eve--half .eve-wall { bottom: 26px; }
.eve--half .eve-wall h2 { font-size: clamp(22px, 2.4vw, 36px); margin-bottom: 10px; }
.eve--half .eve-lede { font-size: 12px; margin-bottom: 0; max-width: 250px; }
/* the strip is the button — every other control retires */
.eve--half .eve-lookswitch, .eve--half .eve-foot, .eve--half .eve-corner { display: none; }
/* the door: an invisible full-bleed button carrying the click and the
   keyboard — above the wall and the mark (both pointer-events:none),
   under the deck */
.eve-door { display: none; }
.eve--half .eve-door {
  display: block; position: absolute; inset: 0; z-index: 9;
  background: transparent; border: 0; padding: 0; margin: 0; cursor: pointer;
}
.eve-door:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: -4px; }
/* the cue, bottom right — the door's only handle text: the breathing wave
   beside ASK ME ANYTHING, brightening when the pointer is anywhere on the
   strip (the whole strip is the button, so the whole strip is the hover) */
.eve-cue {
  position: absolute; right: 28px; bottom: 26px; z-index: 8; margin: 0;
  display: flex; align-items: center; gap: 14px;
  pointer-events: none;
  font-family: var(--eve-mono); font-size: 13px; font-weight: 500;
  letter-spacing: .26em; text-transform: uppercase; color: var(--eve-text);
  text-shadow: 0 1px 2px rgba(0, 0, 0, .95), 0 3px 16px rgba(0, 0, 0, .8);
  transition: color .2s, opacity .25s;
}
.eve-cue .eve-wave { height: 17px; }
.eve--half:hover .eve-cue { color: #fff; }
.eve--half:hover .eve-cue .eve-wave i { box-shadow: 0 0 10px rgba(238, 58, 35, .8); }
/* the chat window rises over this corner — the cue yields while it stands */
.eve--half.eve--deck .eve-cue { opacity: 0; }

/* ---------- DISPATCH — the storefront look (Hamza, 2026-08-29, his pick off
   the "Shape of Eve" identity board): personify the voice, not the body. The
   photoreal portrait retires from every storefront surface; her body is the
   CHANNEL — a layered waveform js/eve-concept.js draws on the stage canvas
   in the mood's colour, breathing at idle and blooming with her real voice
   level. A radio-traffic log types canned exchanges mid-stage (qualitative
   copy only — no spec figures until verified off the shelf). ------------- */
.eve-tx { display: none; }
.eve[data-look="dispatch"] .eve-tx {
  display: block; position: absolute; left: 50%; bottom: 15%;
  transform: translateX(-50%); width: min(620px, 64%); z-index: 7;
  margin: 0; pointer-events: none;
  font-family: var(--eve-mono); font-size: clamp(11px, 1.05vw, 13.5px);
  line-height: 1.95; text-shadow: 0 1px 8px rgba(0, 0, 0, .9);
}
.eve-tx .eve-tx-pre { color: var(--eve-dim2); }
.eve-tx .eve-tx-qt { color: var(--eve-gold); }
.eve-tx .eve-tx-at { color: var(--eve-text); }
.eve-tx-cur {
  display: inline-block; width: 7px; height: 1em; margin-left: 2px;
  background: var(--eve-red); vertical-align: text-bottom;
  animation: eve-blink 1s steps(2, start) infinite;
}
/* the wall carries the EVE name and the lede and NOTHING else (Hamza,
   2026-08-29, closing the day): the mark that briefly docked here as a
   signature line went back to the strip's top-left corner, so the two
   corners each say one thing instead of both saying the wordmark. Its
   wall-scoped overrides retire with it — see .eve-mark above. */
/* the popup band reborn as a slim live channel: void ground, the canvas
   carries the wave, the bottom fade eases into the card without drowning
   the line the way the portrait's heavy gradient would. The horizontal mask
   (Hamza, 2026-08-29 evening) fades the channel to black before it reaches
   the EVE name on the left and the sound toggle on the right, so the wave
   reads as a centred figure between them instead of a full-bleed line. */
.eve-pband-wave { display: none; }
.eve[data-look="dispatch"] .eve-pband-wave {
  display: block; position: absolute; inset: 0; width: 100%; height: 100%;
  -webkit-mask-image: linear-gradient(90deg, transparent 0, transparent 18%, #000 36%, #000 64%, transparent 82%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0, transparent 18%, #000 36%, #000 64%, transparent 82%, transparent 100%);
}
.eve--popup[data-look="dispatch"] .eve-pband,
.eve--half[data-look="dispatch"] .eve-pband {
  background: #050404; height: 84px;
}
.eve--popup[data-look="dispatch"] .eve-pband::after,
.eve--half[data-look="dispatch"] .eve-pband::after {
  background: linear-gradient(180deg, rgba(9, 9, 10, 0) 0%, rgba(9, 9, 10, 0) 72%, #09090a 100%);
}

/* ---------- the POPUP (Hamza, 2026-08-29): Eve as a corner window. The
   section contributes nothing to the page flow — just a launcher (or the
   nav wave) and the deck restyled as a floating card: her portrait band on
   top, the console under it, rising from the corner. Voice still works the
   spacebar way while it stands open; the caption/stage furniture is the
   full banners' business and stays hidden here. ---------------------------- */
.eve--popup { position: static; height: auto; min-height: 0; background: transparent; overflow: visible; isolation: auto; }
.eve--popup .eve-stage, .eve--popup .eve-wall, .eve--popup .eve-foot,
.eve--popup .eve-mark, .eve--popup .eve-lookswitch, .eve--popup .eve-corner { display: none; }

/* the sound wave — five breathing bars; the same figure rides the corner
   launcher and the header button */
.eve-wave { display: flex; align-items: center; justify-content: center; gap: 3px; height: 22px; pointer-events: none; }
.eve-wave i {
  width: 3px; height: 100%; border-radius: 2px; background: var(--eve-red-hot);
  transform-origin: center; animation: eve-wave 1.15s ease-in-out infinite;
  box-shadow: 0 0 6px rgba(238, 58, 35, .5);
}
.eve-wave i:nth-child(1) { animation-delay: .30s; }
.eve-wave i:nth-child(2) { animation-delay: .15s; }
.eve-wave i:nth-child(3) { animation-delay: 0s; }
.eve-wave i:nth-child(4) { animation-delay: .15s; }
.eve-wave i:nth-child(5) { animation-delay: .30s; }
@keyframes eve-wave { 0%, 100% { transform: scaleY(.25); } 50% { transform: scaleY(1); } }
@media (prefers-reduced-motion: reduce) {
  .eve-wave i { animation: none; }
  .eve-wave i:nth-child(1), .eve-wave i:nth-child(5) { transform: scaleY(.35); }
  .eve-wave i:nth-child(2), .eve-wave i:nth-child(4) { transform: scaleY(.7); }
  .eve-wave i:nth-child(3) { transform: scaleY(1); }
  /* the nav pill's 3-bar halves rise toward the EVE word from both sides */
  .eve-nav-wave .eve-wave--tail i:nth-child(1) { transform: scaleY(1); }
  .eve-nav-wave .eve-wave--tail i:nth-child(3) { transform: scaleY(.35); }
}

/* the corner launcher — the door a customer page would carry */
.eve-launch {
  position: fixed; right: 24px; bottom: 24px; z-index: 99999;
  width: 58px; height: 58px; border-radius: 50%; cursor: pointer; padding: 0;
  border: 1px solid rgba(238, 58, 35, .55);
  background: linear-gradient(180deg, #141112, #0a0809);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 24px rgba(0, 0, 0, .6), 0 0 22px rgba(238, 58, 35, .22);
  transition: border-color .2s, box-shadow .2s, transform .15s;
}
.eve-launch:hover { border-color: var(--eve-red-hot); box-shadow: 0 4px 24px rgba(0, 0, 0, .6), 0 0 32px rgba(238, 58, 35, .4); transform: translateY(-1px); }
.eve-launch:focus-visible { outline: 2px solid var(--eve-red-hot); outline-offset: 3px; }

/* the window itself: a corner card, her portrait band over the console —
   shared with the half banner, whose door opens this same window */
.eve--popup .eve-deck,
.eve--half .eve-deck {
  position: fixed; top: auto; left: auto; right: 24px; bottom: 96px;
  width: min(400px, calc(100vw - 32px));
  height: min(620px, calc(100vh - 200px)); min-height: 420px;
  border: 1px solid var(--eve-line); border-left: 1px solid var(--eve-line);
  border-radius: 16px; overflow: hidden;
  background: rgba(9, 9, 10, .98);
  box-shadow: 0 24px 64px rgba(0, 0, 0, .65);
  visibility: hidden; opacity: 0;
  transform: translateY(10px) scale(.97); transform-origin: 100% 100%;
  transition: transform .28s cubic-bezier(.22, .9, .3, 1), opacity .28s, visibility 0s .28s;
  z-index: 100000;
}
/* no launcher bubble under the half banner's window — it sits lower */
.eve--half .eve-deck { bottom: 24px; }
/* the half section is a stacking context (isolation on .eve), so the deck's
   own z-index is trapped INSIDE it — and the section itself stands at
   z-auto, which the product pages' fixed dock bar (.ppx-dock, z 1030)
   paints over: the card's composer was getting cut off (Hamza,
   2026-08-29 evening). While the card stands open the whole section rides
   to the top; closed, it drops back into the normal flow. */
.eve--half.eve--deck { z-index: 100000; }
.eve--popup .eve-deck.open,
.eve--half .eve-deck.open {
  visibility: visible; opacity: 1; transform: none;
  transition: transform .28s cubic-bezier(.22, .9, .3, 1), opacity .28s;
}
.eve-pband { display: none; }
.eve--popup .eve-pband,
.eve--half .eve-pband {
  display: block; flex: none; height: 112px; position: relative;
  background: url('/img/eve/eve-presence-1280.jpg') no-repeat;
  /* not cover: cover fits the whole 16:9 still into a 400px strip and she
     reads as a distant figure. 240% zooms the band to her face and the gold
     dissolve beside it; the position percentages centre her measured face
     point (.49, .20 of the still) in the strip. */
  background-size: 240% auto; background-position: 48.5% 12%;
}
.eve--popup .eve-pband::after,
.eve--half .eve-pband::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(9, 9, 10, 0) 0%, rgba(9, 9, 10, 0) 45%, rgba(9, 9, 10, .9) 92%, #09090a 100%);
}
.eve--popup .eve-dhead,
.eve--half .eve-dhead {
  position: absolute; top: 0; left: 0; right: 0; z-index: 2; border-bottom: 0;
  background: linear-gradient(180deg, rgba(5, 4, 4, .62), rgba(5, 4, 4, 0));
  padding: 12px 14px 10px 16px;
}
.eve--popup .eve-dlog,
.eve--half .eve-dlog { padding-top: 14px; }

/* ---------- handset: the doors stand small top right, the circle talks ---------- */
@media (max-width: 640px), (pointer: coarse), (max-height: 560px) {
  .eve-wall { left: auto; right: 14px; top: 16px; bottom: auto; max-width: none; }
  .eve-wall h2 { display: none; }
  .eve-lede { display: none; }
  .eve-reach { gap: 6px; }
  .eve-reach a { gap: 7px; font-size: 10px; }
  .eve-reach-tag { font-size: 7.5px; min-width: 36px; padding: 2px 5px; }
  /* the corner is narrower here, so the title comes down with it and the
     cap opens up — at 13px the whole line clears a 375px strip without
     wrapping. It can still break after the middot on anything narrower
     (the FENIEX&nbsp;INTELLIGENCE pair is nbsp-joined, so it breaks there
     and nowhere else). */
  .eve-mark { left: 14px; top: 16px; font-size: 13px; letter-spacing: .2em; max-width: 24em; line-height: 1.7; }
  /* below the reach rail, never on it */
  .eve-lookswitch { top: 96px; right: 14px; }
  .eve-corner { bottom: 18px; right: 14px; }
  .eve-orb { width: min(62vw, 300px); height: min(62vw, 300px); }
  /* half banner on a handset: the mark holds the top left like everywhere
     else, so the wall stays bottom left carrying the EVE name — it survives
     the global h2 hide here because on this strip it is the only thing left
     in that corner (the lede stays hidden); the cue keeps the bottom right */
  .eve--half .eve-wall { left: 14px; right: auto; top: auto; bottom: 16px; max-width: 60%; }
  .eve--half .eve-wall h2 { display: block; margin-bottom: 0; }
  .eve-cue { right: 14px; bottom: 16px; gap: 9px; font-size: 10px; letter-spacing: .2em; }
  .eve-cue .eve-wave { height: 13px; }
  /* dispatch on a handset: the wall empties here (h2 and lede hide), so the
     radio log takes the width the strip has */
  .eve[data-look="dispatch"] .eve-tx { width: 86%; bottom: 18%; }
  /* the Column owns the handset crop — a top-right log would collide with
     the mark's row and a bottom one sits in the beam's floor glow, so the
     half strip's log stands down on phones (the wall already empties here).
     Doubled class to match the desktop rule's weight — see it above. */
  .eve.eve--half[data-look="dispatch"] .eve-tx { display: none; }
}

/* ---------- phone: the console is the FULL chat (his call, 28 Aug 2026) ---------- */
@media (max-width: 760px), (pointer: coarse) and (max-width: 1024px) {
  .eve-deck {
    position: fixed; inset: 0; width: 100%; border-left: 0; background: #070708;
    transform: translateY(103%); z-index: 100000;
  }
  /* the popup — and the half banner's door window — takes this same sheet
     (Hamza, 2026-08-29 evening, overruling the corner-card-on-every-size
     call above after seeing the card float over the page on a handset:
     the fa.feniex.com console's philosophy governs — the whole window is
     the conversation). These selectors match the corner-card rules'
     specificity so every card measurement falls away here; visibility
     stands in for the card's opacity fade, keeping the closed deck out of
     the tab order the way the card kept it. */
  .eve--popup .eve-deck,
  .eve--half .eve-deck {
    top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: auto;
    min-height: 0; border: 0; border-radius: 0; box-shadow: none;
    background: #070708; opacity: 1;
    visibility: hidden; transform: translateY(103%);
    transition: transform .28s cubic-bezier(.22, .9, .3, 1), visibility 0s .28s;
  }
  .eve-deck.open { transform: none; }
  .eve--popup .eve-deck.open,
  .eve--half .eve-deck.open {
    visibility: visible; transform: none;
    transition: transform .28s cubic-bezier(.22, .9, .3, 1);
  }
  /* the ✕ survives on the full-screen sheet — and on a phone EVERY deck is
     that sheet now, the popup and half windows included: the sheet IS the
     whole window, so there is no "off the chat" left to tap. Desktop keeps
     the corner cards, which keep no ✕ (the base rule) and close by tapping
     away. */
  .eve-dclose { display: flex; }
  .eve-dhead { padding: calc(env(safe-area-inset-top, 0px) + 12px) 14px 12px 18px; gap: 12px; }
  /* the popup/half head overlay pins its own padding at card specificity,
     so the notch ride-down has to land on it separately */
  .eve--popup .eve-dhead,
  .eve--half .eve-dhead { padding-top: calc(env(safe-area-inset-top, 0px) + 12px); }
  .eve-dlog { padding: 16px 16px 12px; gap: 16px; overscroll-behavior: contain; }
  /* the page holds still under the open sheet — js raises the flag while
     a deck stands open inside this takeover query. position:fixed, not just
     overflow:hidden: iOS ignores overflow on body the moment its keyboard
     wants the focused input on screen, and every pan it stole showed through
     the keyboard gap as the site drifting down behind the chat (Hamza's
     phone screenshots, 2026-08-30). The js stores the scroll offset in an
     inline top and hands it back on close. */
  body.eve-sheet-open { overflow: hidden; position: fixed; left: 0; right: 0; width: 100%; }
  /* the void behind the sheet (same screenshots): the open sheet sizes to
     the VISIBLE viewport (fitDeck), so the strip iOS keeps between the
     composer and its keyboard — URL pill, accessory bar, metric drift —
     used to show the raw page. This full-window shade owns that strip in
     the sheet's own black: an open chat is chat and void, never the site.
     Under the deck (100000), over everything else — the launcher's 99999
     included, because body::after paints after every body child at equal
     z-index. Fade-in only: on close the deck slides down and the page
     returning behind it IS the exit. */
  body.eve-sheet-open::after {
    content: ""; position: fixed; inset: 0; z-index: 99999;
    background: #070708;
    animation: eve-shade-in .22s ease both;
  }
  @keyframes eve-shade-in { from { opacity: 0; } to { opacity: 1; } }
  .eve-turn { max-width: 90%; }
  .eve-t-you { max-width: 84%; }
  .eve-said { font-size: 15px; }
  /* the composer splits on the sheet (Hamza, 2026-08-30, off his phone
     screenshots): the input keeps the pill, and the mic steps OUT of it to
     stand as its own thumb-size circle on the right — at 38px inside the
     pill the hold target was a squint, and push-to-talk lives or dies on
     the hold being easy to land. 52px clears Apple's 44px floor with room;
     the pill styling the form wore moves onto the input itself. */
  /* breathing room under the composer (Hamza, 2026-08-30, off his keyboard
     screenshot): with zero bottom margin the mic circle read as cut off by
     the keyboard's edge and the pill's red bottom line all but vanished.
     14px floats both clear of the keyboard; the env() term keeps them
     above the home bar when the keyboard is down (it resolves to 0 while
     the keyboard covers it). The chips used to carry this safe-area
     padding — they're gone on the sheet now, so the composer wears it. */
  .eve-dform { margin: 10px 12px calc(env(safe-area-inset-bottom, 0px) + 14px); background: transparent; border: 0; padding: 0; gap: 10px; }
  .eve-dinput {
    background: var(--eve-panel); border: 1px solid var(--eve-line);
    border-radius: 999px; padding: 12px 16px;
  }
  .eve-dform:focus-within .eve-dinput { border-color: rgba(255, 89, 61, .5); }
  .eve-dmic {
    width: 52px; height: 52px; background: var(--eve-panel);
    transition: border-color .2s, box-shadow .2s, background-color .2s, color .2s, transform .18s;
  }
  .eve-dmic-ico { width: 21px; height: 21px; }
  .eve-dmic-lvl i { width: 3px; height: 18px; }
  /* the held mic swells under the thumb — live proof the hold took */
  .eve-dmic.on { transform: scale(1.15); box-shadow: 0 0 26px rgba(70, 209, 127, .45); }
  /* the phone keyboard already carries the send key (enterkeyhint="send") */
  .eve-dsend { display: none; }
  /* no TRY chips on the phone sheet (Hamza, 2026-08-30): at that size the
     row read as clutter — tiny targets in a space the keyboard needs. The
     desktop corner card keeps them. */
  .eve-dtry { display: none; }
}

/* ---------- the header wave (Hamza, 2026-08-29, permanent the same day):
   Eve's door in the top nav — standing between the search circle and
   the Support pill on EVERY page, the word EVE in the middle of the sound
   wave (three bars each side). Ringless on desktop (Hamza, 2026-08-30: the
   pill's outer ring made it too bold next to the cart — the animated wave
   alone is the affordance; the ring survives only in the phone circle
   below). Hard-coded in layouts/main.php; clicking it
   opens the popup the layout hosts (or the page's own deck where one
   stands). NOTE: this button lives in the header, OUTSIDE section.eve, so
   the .eve custom properties don't reach it — colors and fonts are literal
   here, in the header pills' own voice (11px / 900 / .15em). ------------- */
.eve-nav-wave {
  height: 44px; flex: none; border-radius: 999px; cursor: pointer; padding: 0 12px;
  border: none; background: transparent;
  display: flex; align-items: center; justify-content: center; gap: 9px;
}
.eve-nav-name {
  font-family: inherit; font-size: 11px; font-weight: 900;
  letter-spacing: .15em; text-indent: .15em; text-transform: uppercase;
  color: rgba(255, 255, 255, .75); line-height: 1; transition: color .15s;
}
.eve-nav-wave .eve-wave { height: 15px; gap: 2.5px; }
.eve-nav-wave .eve-wave i { width: 2.5px; }
/* two 3-bar halves framing the word: each rises toward EVE — the base
   nth-child delays already read outer-slow → inner-fast on the left half,
   so only the tail half mirrors.
   HALF SPEED IN THE HEADER (Hamza, 2026-08-30): the shared wave's 1.15s
   pulse is right on Eve's own surfaces, but this button sits in every
   page's peripheral vision and the pace read as distracting. 2.3s turns
   the talk-rhythm into an idle breath. The delays double WITH the
   duration — same phase fractions, same ripple shape, just slower — so
   every delay here restates the base figure at 2x, left half included. */
.eve-nav-wave .eve-wave i { animation-duration: 2.3s; }
.eve-nav-wave .eve-wave i:nth-child(1) { animation-delay: .60s; }
.eve-nav-wave .eve-wave i:nth-child(2) { animation-delay: .30s; }
.eve-nav-wave .eve-wave i:nth-child(3) { animation-delay: 0s; }
.eve-nav-wave .eve-wave--tail i:nth-child(1) { animation-delay: 0s; }
.eve-nav-wave .eve-wave--tail i:nth-child(2) { animation-delay: .30s; }
.eve-nav-wave .eve-wave--tail i:nth-child(3) { animation-delay: .60s; }
/* with no ring the hover lives on the figure itself: the name lifts to
   white and the bars' resting glow deepens — same move as .eve-cue's */
.eve-nav-wave .eve-wave i { transition: box-shadow .15s; }
.eve-nav-wave:hover .eve-wave i { box-shadow: 0 0 10px rgba(238, 58, 35, .8); }
.eve-nav-wave:hover .eve-nav-name { color: #fff; }
.eve-nav-wave:focus-visible { outline: 2px solid #ff5a41; outline-offset: 2px; }
/* EVE YIELDS TO THE SEARCH (Hamza, 2026-08-30). The search field grows
   leftward from its icon toward the nav, and Eve's ~110px pushed that icon
   left past header_styles.css's measured geometry — the field was touching
   FLEET UPFIT. While the search stands open Eve folds to nothing and hands
   her ground to the field; she slides back when it closes. max-width, not
   width: the resting width is auto, and auto cannot animate. Desktop only —
   the ≤640px circle lives under the phone search takeover, which paints an
   opaque bar over the whole header row anyway. */
@media (min-width: 641px) {
  .eve-nav-wave { max-width: 200px; overflow: hidden; transition: max-width .4s ease, padding .4s ease, opacity .25s ease; }
  body.search-active .eve-nav-wave { max-width: 0; padding: 0; opacity: 0; pointer-events: none; }
}
/* a phone header is tight — and the slimmed PILL still didn't fit: at 375px
   its 84px pushed the menu circle's right edge to 396, clipping it off the
   screen (Hamza caught it live, 2026-08-29 night). His call: on a handset
   Eve is the row's third CIRCLE — search, EVE, cart, then the menu — the
   echo (both 3-bar wave halves) retires here and the word alone is the
   door. 40px matches the search-pill / cart-btn / mobile-menu-btn circles;
   the name's own text-indent keeps the letter-spaced EVE optically centred. */
@media (max-width: 640px) {
  .eve-nav-wave {
    width: 40px; height: 40px; padding: 0; gap: 0;
    /* the desktop button dropped its ring (2026-08-30) but the phone circle
       keeps it — it matches the search / cart / menu circles beside it */
    border: 1px solid rgba(255, 255, 255, .22);
  }
  .eve-nav-wave .eve-wave { display: none; }
  .eve-nav-name { font-size: 9px; }
}
/* sub-360 phones: all four header circles drop to 36px (the other three in
   header_styles.css's matching query) so the row clears the logo at 320px */
@media (max-width: 360px) {
  .eve-nav-wave { width: 36px; height: 36px; }
}

@media (prefers-reduced-motion: reduce) {
  .eve-t-eve .eve-said.streaming::after { animation: none; opacity: 1; }
  .eve-said.eve-listening::after { animation: none; opacity: 1; }
  .eve-chip { transition: none; }
  .eve-tx-cur { animation: none; }
}
