/* launcher-w2.css — the WAVE-2 layer. Loaded AFTER portal.css and launcher.css.
   ===========================================================================
   WHY A THIRD SHEET. `portal.css` is a byte copy of the athlete portal's
   app/globals.css and `launcher.css` is the wave-1 supplement the operator signed
   on 2026-09-06 (and the T0-1033 A-14 manifest digest-pins). Neither may take a
   wave-2 byte. Every rule wave 2 needs therefore lands here, and every rule here
   is listed in conformance.md §W2-3 with the brief section that demands it.

   NAMING. `lx-w2-` prefix on anything minted; a bare descendant selector only where
   it SCOPES an existing portal class to a wave-2 container (`.lx-w2-team .prow …`),
   which is the cure the brief specifies rather than a new component.

   WHAT IS NOT HERE. No new colour, no new type step, no new spacing unit, no
   keyframe. Every value below is either measured off a portal source file (cited
   inline) or a Tailwind utility resolved to its longhand, because the portal's
   chrome-less entry surfaces are authored in utilities and portal.css carries none
   of them (`grep -c place-items-center portal.css` = 0). The utility→longhand table
   is in conformance.md §W2-3.1 so the resolution is checkable, not asserted. */

/* ═══ F · the entry frame (§01.1, §02) ══════════════════════════════════════
   app/login/page.tsx:81  <main className="min-h-dvh grid place-items-center px-6 py-16">
   Tailwind default scale: px-6 = 1.5rem = 24px, py-16 = 4rem = 64px. */
.lx-w2-entry {
  min-height: 100dvh;
  display: grid;
  place-items: center;
  padding: 64px 24px;
}

/* `.frame.entryframe w-full max-w-[420px]` — app/login/page.tsx:82,
   app/link-expired/page.tsx:20. `.frame` and `.entryframe` are portal.css:328 and
   :2163-2192 and are consumed, not redeclared. */
.lx-w2-eframe {
  width: 100%;
  max-width: 420px;
}

/* head cell — app/link-expired/page.tsx:27
   "flex flex-col items-center gap-3 px-7 pt-9 pb-7 text-center"
   gap-3 = .75rem = 12px, px-7 = 1.75rem = 28px, pt-9 = 2.25rem = 36px, pb-7 = 28px. */
.lx-w2-ehead {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  padding: 36px 28px 28px 28px;
  text-align: center;
}

/* `<Wordmark className="h-5 w-auto text-sf-green" />` — link-expired:28. h-5 = 20px;
   tailwind.config.ts:23 maps `sf-green` to `var(--green)`, so the ink is the portal
   token, not a hex literal. */
.lx-w2-ewm {
  height: 20px;
  width: auto;
  color: var(--green);
  display: block;
}

/* headline — link-expired:29-31
   "font-display text-fg text-[clamp(1.6rem,7vw,2rem)] font-bold leading-[1.06] tracking-[-0.02em]"
   At 390 the frame is 342px wide and 7vw resolves to 27.3px; at 1440 the clamp caps
   at its 2rem ceiling (§02.7). Both are captured. */
.lx-w2-eh1 {
  font-family: var(--font-display);
  color: var(--fg);
  font-size: clamp(1.6rem, 7vw, 2rem);
  font-weight: 700;
  line-height: 1.06;
  letter-spacing: -.02em;
}

/* body cell — link-expired:36 "px-7 py-7 text-center" */
.lx-w2-ecell {
  padding: 28px;
  text-align: center;
}

/* body prose — link-expired:37 "mx-auto max-w-[320px] text-fg3 text-[13.5px] leading-relaxed".
   leading-relaxed = 1.625. */
.lx-w2-ep {
  margin: 0 auto;
  max-width: 320px;
  color: var(--fg3);
  font-size: 13.5px;
  line-height: 1.625;
}

/* §02.4 second body line, 12.5px --fg3. Same measure, one step down, so the
   instruction reads as subordinate to the sentence above it. */
.lx-w2-ep2 {
  margin: 12px auto 0 auto;
  max-width: 320px;
  color: var(--fg3);
  font-size: 12.5px;
  line-height: 1.55;
}

/* §02.5 foot line, 12px --fg3, centred. `.secd`'s quiet treatment (portal.css:1237)
   at the entry frame's own scale. */
.lx-w2-efoot {
  margin: 14px 0 0 0;
  color: var(--fg3);
  font-size: 12px;
  line-height: 1.5;
  text-align: center;
}

/* ═══ I · Team (§05.6) ══════════════════════════════════════════════════════
   THE ONE LAUNCHER RULE THIS SURFACE ADDS, and the brief says so in those words.
   portal.css:2293 sets `.prow .pmain { padding-right: 92px }` inside the ≤700 block
   to clear a `.statuspill` pinned top-right (:2295). Surface I pins none — its
   right-slot badges ride `.pr`, which unpins at the same breakpoint (:2294) — so at
   390 the reserve would remove 92px of a 342px text column for a pill that is not
   there. Scoped to the two Team panels; nothing else on the estate moves.

   NOTE ON THE CITATION. The brief writes this rule at globals.css:2288. Measured at
   675289b3 it is 2293; 2288 is `.setsec { padding: 22px 16px; gap: 22px }`, which
   the brief cites correctly in the same sentence. Recorded, not silently corrected. */
@media (max-width: 700px) {
  .lx-w2-team .prow .pmain { padding-right: 0; }
}

/* §05.3 — "The date and the email both take --fg3, not --muted." `.prow .pmain .d`
   ships at --muted (portal.css:1245), which the sheet's own comment (:149) records
   as 3.29:1, AA-large only. An email address is small meaningful text. Same cure as
   wave 1's conformance item 2, applied rather than rediscovered. */
.lx-w2-team .prow .pmain .d { color: var(--fg3); }

/* §05.4 — the invite hint at --fg3. `.setsave .hint` ships at --muted
   (portal.css:1278); the sentence carries the 72-hour rule, so it is meaningful
   small text by the same argument. */
.lx-w2-team .setsave .hint { color: var(--fg3); }

/* §05.5 — the rate-limit line beneath a pending row, 12.5px --fg3. It sits inside
   the row's own container so it reads as belonging to that invite, not to the panel. */
.lx-w2-ratelimit {
  font-size: 12.5px;
  color: var(--fg3);
  line-height: 1.5;
  padding: 0 16px 13px 16px;
  margin-top: -4px;
}

/* Layout glue only: the members panel's right slot holds a date and, on member
   rows, a control. `.pr` (portal.css:1246) is already flex with a 10px gap; the
   date needs no rule. The refusal panel above the fields is `.merr`
   (portal.css:1618) and takes only its position in the form's flow. */
.lx-w2-formerr { margin-bottom: 4px; }

/* ═══ J · the evidence upload states (§01.3, §06) ═══════════════════════════
   The in-flight row is a `.qrow` (portal.css:1570) with a `.qtile` left slot
   (:1586), a `.qpmeta`/`.qpn`/`.qpd` meta block (:1588-1590) and a `.statbar`
   (:360-361). §01.3 rules ONE property reset and nothing else: `.statbar` carries
   `margin-top: auto`, which is right in a `.statcell` (it pins the bar to a flex
   cell's foot) and wrong in an evidence row. */
.lx-w2-inflight .statbar { margin-top: 0; }

/* …and the two lines of flow the reset implies: the bar spans the row's full width
   BENEATH the meta block (§06.3), which in a flex row means the row wraps and the
   bar takes a full basis. `.qrow` is already `display:flex` with an 18px gap. */
.lx-w2-inflight { flex-wrap: wrap; }
.lx-w2-inflight .statbar { flex: 0 0 100%; }

/* the tabular percentage in the right slot, 12.5px (§06.3). `.tnum`
   (portal.css:288) supplies the figures; this is size and placement only. */
.lx-w2-pct {
  font-size: 12.5px;
  color: var(--fg3);
  margin-left: auto;
  flex-shrink: 0;
}

/* the refusal panel's position: inside the Evidence panel, above the upload
   control (§06.5). `.merr` owns its own box; this is the gutter that lines it up
   with `.lx-upload`'s 14px 20px 16px (launcher.css:239) and its ≤940 18px twin. */
.lx-w2-evmerr { padding: 14px 20px 0 20px; }
@media (max-width: 940px) {
  .lx-w2-evmerr { padding: 14px 18px 0 18px; }
}

/* W2-K (§06.7) — the one line wave 2 adds to a signed screen. It is a second
   `.lx-uphint` (launcher.css:241) in the control's own stack, so it takes that
   class and needs no rule of its own; only the leading is set, because two hint
   sentences stacked at 11.5px need the second to read as a sentence rather than a
   caption. */
.lx-uphint.lx-w2-nodelete { line-height: 1.5; max-width: 520px; }

/* the brand block inside the entry head cell — app/login/page.tsx:88-92 wraps the
   wordmark and its `.brandsub` eyebrow in a column at gap-2 (= .5rem = 8px) so the
   pair reads as one lockup and the headline's own gap-3 separates it from the title. */
.lx-w2-ebrand {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}

/* ═══ the anchor-as-button underline, cured for wave 2 ══════════════════════
   `.btn` (portal.css:547) is authored for the portal's <button> consumers and never
   sets `text-decoration`, so an <a class="btn"> renders underlined. launcher.css
   :443-456 already found and recorded this on the wave-1 filter chips and cured it
   there for `a.chip` only. F's two entry controls are anchors (they navigate: sign
   out, sign in), so they hit the same rule, and an underlined 50px pill is the first
   thing the operator would reject. Same cure, same reason, one selector wider.

   THIS DOES NOT REACH WAVE 1. No signed frame loads this sheet. The wave-1 dashboard's
   own `<a class="btn btn-line btn-sm">Open item</a>` (build2.mjs:237) still carries the
   underline; that is a wave-1 residual, measured and recorded in conformance.md §W2-5,
   not something wave 2 may reach in and change. */
a.btn, a.btn:hover { text-decoration: none; }
