/* Prestige League shared design system — letterhead edition
   (design/README.md, high-fidelity). All player-facing pages consume
   this file; no page defines its own copy of these tokens or
   components. No build step — plain CSS custom properties.

   THE NIGHT DESK (design/design_handoff_night_desk, 2026-07-31):
   dark mode is the letterhead's reversed vocabulary promoted from
   accent to ground. Every themed color is a custom property here;
   :root[data-theme=night] re-seats the stations; @media print (end
   of file) re-pins daylight unconditionally. Themed colors appear
   ONLY in these blocks — everything else is var(); the never-themed
   white #FFFFFF / field paper #FDFBF4 pair alone may print raw
   (grep-pinned in tests/night-desk.test.js). */

:root {
  /* letterhead palette. Station V (type & the flood): --ink flips to
     cream at night — type, structural rules, flood fields, outline
     stamps, badge borders, and focus rings all ride it. --counter is
     its opposite number (what sits ON a flood): cream by day, ink by
     night. --cream is the constant pigment (stamp text, paper
     objects) and never themes. */
  --ink: #23211D;         /* text, rules, floods, th borders — themed */
  --counter: #F5F1E6;     /* the flood's type; the dock knockout — themed */
  --cream: #F5F1E6;       /* the pigment: paper objects, stamp text — constant */
  --ground: #FDFBF4;      /* station I: the page itself (html/body) — themed */
  --parchment: #FDFBF4;   /* station II: cards, tooltips, board-set — themed */
  --band: #F5F1E6;        /* the cream compartments: notices, ticker
                             latest, row hovers — themed */
  --bar: #FFFFFF;         /* the chrome bar + index menu — themed to shelf */
  --shelf-hover: #F5F1E6; /* hover on shelf surfaces (the index menu) — themed */
  --hairline: #D8D2C2;    /* station III: 1px borders, row rules, dead fill — themed */
  --brass: #A98C4A;       /* honors only — never body chrome; never themed */
  --brass-pulse: #C9AC66;
  --muted: #8A8375;       /* station IV, the shared mute — never themed */
  --body-muted: #56514A;  /* secondary text — themed */
  --desk: #EAE5D6;        /* quiet in-card row rules — themed to station III */

  /* stamps hold (the flood law): a stamp's identity is pressed ink in
     both themes; its seat-line is border 1px var(--ink) — invisible
     ink-on-ink by day, the cream seat-line by night. */
  --stamp: #23211D;       /* the held ink face — constant */
  --lift: transparent;    /* the ON THE CLOCK ledger chip: nothing by
                             day, the inverted flood's cream at night */

  /* white is where you write (sacred, both themes) */
  --blank-edge: #D8D2C2;      /* eligible cells: hairline by day, no drawn edge at night */
  --writeline-fill: transparent;  /* the display-name write-line's night white fill */
  --writeline-rule: #23211D;      /* its daylight underline; gone at night */
  --avatar-cell: transparent;     /* avatar choice cells: shelf at night */

  /* the paper-law constants (modals, correspondence, the docket's
     yours-rows, the white NEXT seat): never themed — paper containers
     re-scope the themed tokens onto them (the rule below). */
  --paper-ink: #23211D;
  --paper-hair: #D8D2C2;
  --paper-body: #56514A;
  --paper-up: #1E7A44;
  --paper-down: #9E1B32;

  /* the scrim + the chrome's one shadow */
  --scrim: rgba(35,33,29,.45);
  --chrome-shadow: rgba(35,33,29,.12);
  --modal-shadow: rgba(35,33,29,.5);  /* documents float on it in both themes */
  --stamp-hover: #3A372F;   /* btn-primary hover, an ink-family lift — constant */
  --tip-shadow: rgba(35, 33, 29, .18);  /* the tooltip's spec'd exception */

  /* success/error reuse conference green/crimson (spec); night takes
     the verified values on ground surfaces (5.1:1 / 4.0:1) */
  --trend-up: #1E7A44;
  --trend-down: #9E1B32;
  --danger: #9E1B32;

  /* conference color coding — the RE-CUT hexes (ledger & badge
     handoff, owner brief 2026-07-31): muted toward the paper (a 0.8
     saturation), BAKED per conference — never a CSS filter at
     runtime. Badges always pair bg with
     an accessible text color (worst case Pac-12 5.6:1 at the 9.5px
     face). Won-green #1E7A44 and the reserved crimson #9E1B32 are
     semantic colors, not badge fills — the re-cut separates them from
     Big 12/Pac-12, and they never mute. */
  --conf-sec:         #F5D029; --conf-sec-text:    #111;
  --conf-acc:         #3252A8; --conf-acc-text:    #fff;
  --conf-big12:       #8A2133; --conf-big12-text:  #fff;
  --conf-pac12:       #2C754A; --conf-pac12-text:  #fff;
  --conf-bigten:      #8AC5DB; --conf-bigten-text: #111;
  --conf-ind:         #D47624; --conf-ind-text:    #111;
  --conf-g5:          #DC73A5; --conf-g5-text:     #111;

  /* type layers (spec): Graduate display / Spectral editorial /
     system-ui data / monospace metadata */
  --font-display: Graduate, serif;
  --font-serif: Spectral, Georgia, serif;
  --font-data: system-ui, sans-serif;
  --font-mono: ui-monospace, Menlo, monospace;

  /* THE TYPE RULING (design_handoff_clarity §3): Graduate carries one
     weight, so size alone cannot carry hierarchy — four Graduate ranks
     and two mono ranks, each with a second, non-size signal. Every
     other size is retired; nothing renders below var(--m2) on an app
     surface. The 380 column lands with the app's mobile breakpoint. */
  --g1: 21px;    /* wordmark · the letterhead lockup and nowhere else */
  --g2: 17px;    /* page title · exactly one per page */
  --g3: 13px;    /* section head · on a 1px ink rule, phase slot opposite */
  --g4: 11px;    /* sub-head · muted, never ruled, indented; tracking .2em */
  --m1: 11px;    /* wire · slugs, wire lines, stamps, deadlines, ledger values */
  --m2: 9.5px;   /* rule · foot-rules under a blank, keys, legends */

  /* the mark's one hue beyond ink/cream/brass (design_handoff_clarity
     §4): laurel, the sprig drawn as a plant. MARK-ONLY — this value
     appears in the mark's SVG/CSS and nowhere else: never a badge,
     never a chart series, never a state, never a chip (grep-pinned in
     tests/copy-rules.test.js). */
  --laurel: #4A5D34;
}

@media (max-width: 720px) {
  :root {
    --g1: 16px; --g2: 14.5px; --g3: 12px; --g4: 10.5px;
    --m1: 10.5px; --m2: 9px;
  }
}

/* =====================================================================
   THE NIGHT LADDER (design/design_handoff_night_desk): five stations,
   station for station — ink and cream trade seats, the mute is the
   hinge. Set by the boot script before first paint; THE LAMP (My
   Page) writes the key; print re-pins daylight at the end of this
   file. The warm ink family — never neutral gray.
   ===================================================================== */
:root[data-theme=night] {
  --ink: #F5F1E6;         /* V · type & the flood: cream */
  --counter: #23211D;     /* what sits on the inverted flood */
  --ground: #1A1815;      /* I · the ground: the desk after hours */
  --parchment: #272420;   /* II · the compartment (night shelf) */
  --band: #272420;        /* cream compartments join the shelf */
  --bar: #272420;         /* chrome sits on the shelf; the seam does
                             the work the shadow did */
  --shelf-hover: #3C382F;
  --hairline: #3C382F;    /* III · the hairline; doubles as dead fill */
  --body-muted: #C2BAAA;  /* secondary text (9.2:1 on the ground) */
  --desk: #3C382F;        /* in-card row rules join station III */

  /* the flood law's chip; white-as-writable's rulings */
  --lift: #F5F1E6;
  --blank-edge: transparent;   /* the face is the edge at night */
  --writeline-fill: #FFFFFF;   /* a bare underline cannot be "light" on ink */
  --writeline-rule: transparent;
  --avatar-cell: #272420;

  /* semantics: same hues, night-verified values (ground surfaces
     only — paper objects re-scope to the daylight constants) */
  --trend-up: #2E9C5C;
  --trend-down: #C74E62;
  --danger: #C74E62;

  /* the scrim deepens; the scrolled shadow is not drawn at night
     (nav-fold amendment: a shadow on ink reads as nothing) */
  --scrim: rgba(10,9,7,.62);
  --chrome-shadow: transparent;
}

/* ---- paper structure (square = document; no radii on paper/tables/
   buttons/inputs/badges; avatars alone keep their rounded shape —
   the badge's exception was revoked by the 2026-07-31 re-cut) ------ */
html { background: var(--ground); }
body {
  margin: 0 auto; padding: 60px 12px 28px;  /* top offset = fixed bar + gap */
  background: var(--ground); color: var(--ink);
  font-family: var(--font-data);
}

/* paper carries daylight law inside (night desk hard cases): the
   documents — modals, correspondence, the member letter, the pick
   surface's white rows, the chain's open rung — re-scope the themed
   tokens to the daylight constants, so ink stays ink on paper under
   any lamp (daylight badge border, daylight green/crimson, #D8D2C2
   hairlines). Pages add their own paper objects (the draft/desk
   modals, the docket's yours-rows, the white NEXT seat) with the
   same re-scope. */
.plspot-modal, .plform-refusal, .plbulletin-row.member,
.plspot-eligrow, .plspot-cell.is-next {
  /* the re-scope's second half (defect fix 2026-08-20): inherited
     text follows the re-seated ink — without this, text never routed
     through a token keeps the body's night cream on the paper fill */
  color: var(--ink);
  --ink: var(--paper-ink);
  --counter: var(--cream);
  --hairline: var(--paper-hair);
  --body-muted: var(--paper-body);
  --trend-up: var(--paper-up);
  --trend-down: var(--paper-down);
  --danger: var(--paper-down);
  --band: var(--cream);
}
.paper {
  /* full-bleed parchment (owner call): the sheet is the page itself —
     no desk band, no card border; readable measure retained */
  max-width: 980px; margin: 0 auto; background: transparent;
  border: none; padding: 24px 40px 32px;
}
.paper--narrow { max-width: 760px; }
@media (max-width: 720px) {
  .paper { padding: 12px 4px 20px; }
}

.muted { color: var(--muted); opacity: 1; }

/* anchors are type (station V), never UA blue: the walkthrough found
   the register link printing default blue/visited-purple — illegible
   on the night ground and never the letterhead's voice by day. The
   prospectus set the precedent (a { color: ink }); underlines stay
   the affordance. */
a { color: var(--ink); }

/* =====================================================================
   THE FORM VOCABULARY (design/design_handoff_registrar_desk — the
   reusable spec for every league form; see CLAUDE.md design
   conventions). Four anatomies: an open blank you can write in, a
   sealed entry printed & stamped, permanent record in the archive's
   voice, and fixed law framed as constitution. State is never
   conveyed by graying; red is reserved for malformed input.
   ===================================================================== */

.plform-label { font-family: var(--font-mono); font-size: var(--m1); letter-spacing: .14em; color: var(--muted); }
.plform-sublabel { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .12em; color: var(--muted); }
.plform-pre { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .1em; color: var(--muted); }

/* 1 · open entry — the page's only white besides the chrome bar */
.plform-blank {
  height: 44px; background: #FFFFFF; border: 1px solid var(--paper-hair);
  box-sizing: border-box; padding: 0 12px; font-size: 16px; color: var(--paper-ink);
  font-family: var(--font-data); border-radius: 0;
}
.plform-blank:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.plform-foot {
  font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em;
  color: var(--muted); margin-top: 8px; line-height: 1.55;
}
.plform-err { font-family: var(--font-mono); font-size: var(--m2); color: var(--danger); margin-top: 6px; }

/* 1a · the week selector — an enumerated blank (Jul 21 amendment):
   a radio group of 44px squares printing the whole lawful range.
   Cell states reuse the page's treatments — eligible is the blank's
   white surface, the entry is the stamp reversal, ineligible is the
   disabled treatment (server-ruled, never client-derived). */
.plform-weeklead {
  font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .12em;
  color: var(--muted); margin-bottom: 6px;
}
.plform-weekrail {
  display: grid; grid-template-columns: repeat(auto-fill, 44px);
  gap: 6px; max-width: 644px;
}
.plform-weekcell {
  position: relative; width: 44px; height: 44px; box-sizing: border-box;
  display: flex; align-items: center; justify-content: center;
  background: #FFFFFF; border: 1px solid var(--blank-edge);
  font-family: var(--font-mono); font-weight: 700; font-size: 15px;
  color: var(--paper-ink); cursor: pointer;
}
.plform-weekcell input {
  position: absolute; inset: 0; width: 100%; height: 100%;
  margin: 0; opacity: 0; cursor: inherit;
}
.plform-weekcell.is-entry { background: var(--stamp); border-color: var(--ink); color: var(--cream); }
.plform-weekcell.is-ineligible { background: var(--hairline); color: var(--muted); cursor: default; }
.plform-weekcell:has(input:focus-visible) { outline: 2px solid var(--ink); outline-offset: 2px; }

/* the derived voice beneath the rail — wire grammar, never editable */
.plform-derivedline {
  margin-top: 10px; font-family: var(--font-mono); font-size: var(--m1); line-height: 1.6;
}
.plform-derivedline .verb { color: var(--muted); }
.plform-derivedline .when { font-weight: 700; color: var(--ink); }

/* 2 · sealed entry — printed flat (never grayed) & stamped */
.plform-printed { font-size: 14.5px; font-weight: 600; line-height: 21px; }
.plform-stamp {
  background: var(--stamp); color: var(--cream); font-family: var(--font-mono);
  border: 1px solid var(--ink);  /* the seat-line: ink-on-ink by day */
  font-size: var(--m2); letter-spacing: .18em; padding: 3px 5px 3px 7px;
}
.plform-sealline { font-family: var(--font-mono); font-size: var(--m1); }
.plform-sealline .verb { color: var(--muted); }
.plform-sealline .when { font-weight: 700; }

/* 3 · permanent record — the archive's voice, quieter than law */
.plform-stamp--record {
  background: transparent; color: var(--ink); border: 1px solid var(--ink);
  padding: 2px 4px 2px 6px;
}
.plform-ledger { font-family: var(--font-mono); font-size: var(--m1); color: var(--body-muted); }

/* 4 · fixed law — the confirm modal's document-block lineage.
   Law leads take G4 (the type ruling): Graduate sub-head, muted,
   never ruled. */
/* THE PRIVATE MARK (M4.5 §2): ⌖ — member-held state without white
   (the class's point: white is reserved for the record). Chip
   grammar; the stamp is the held state; the rival stamp carries the
   inner cream keyline (the cap class, findable at a glance, never by
   color alone). Hover sharpens border and label to ink and never
   fills (the hover-contrast law); zero motion; real buttons. */
.plwatch { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--hairline);
           background: transparent; color: var(--muted); font-family: var(--font-mono);
           font-size: var(--m2); font-weight: 700; letter-spacing: .1em; padding: 6px 10px;
           min-height: 34px; cursor: pointer; }
.plwatch:hover, .plwatch:active { border-color: var(--ink); color: var(--ink); }
.plwatch:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.plwatch[aria-pressed="true"] { background: var(--stamp); color: var(--cream); border-color: var(--ink); }
.plwatch[aria-pressed="true"].rival { box-shadow: inset 0 0 0 2px var(--stamp), inset 0 0 0 3px var(--cream); }
/* the read-only wire + the refusal seat + the keyline mini-stamp */
.plwatch-wire { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--muted); }
.plwatch-refuse { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--ink); }
.plwatch-mini { display: inline-flex; align-items: center; font-family: var(--font-mono); font-size: var(--m2);
                font-weight: 700; letter-spacing: .1em; background: var(--stamp); color: var(--cream);
                border: 1px solid var(--ink); box-shadow: inset 0 0 0 2px var(--stamp), inset 0 0 0 3px var(--cream);
                padding: 2px 7px; }
@media (max-width: 720px) { .plwatch { min-height: 44px; width: 100%; justify-content: center; } }

/* THE MARK COLUMN (rehearsal §1): the glyph IS the whole control — a
   real button, 34×34 at rest (the inline-affordance size), 44×44 at
   380. Three states, never by color alone: hairline mute (unwatched)
   · solid ink cell, cream ⌖ (watched, unrostered) · ink cell + inner
   cream keyline (watched, rival — the double-rule motif carried down;
   the label drops a reduction step, the keyline survives as the class
   signal). The words live in aria (`Watch {team}` · `Lift your watch
   on {team}` · `Lift the rival watch on {team}`) and on MY PAGE. The
   hover law binds: the hairline sharpens to ink, no fill change.
   A span.plmark.on is the turn-locked stamp: the held mark keeps
   printing while the control drops (no dead buttons). Zero motion. */
/* THE RENDER NUDGE (owner eyeball ruling 2026-09-02, on the
   registry-mobile-fits branch): the mark's LAYOUT box keeps the
   margin offsets (−7 desktop / −8 fold — row heights never move);
   the relative top shifts only the RENDER. Desktop +3: the drawn
   cell centers the TEAM line exactly (center 21 vs the line's
   20.5). The fold band below re-nudges +12: the drawn 44px cell
   centers the ROW box (center 34 vs the ~70px row's ~35) — the
   owner's ruled preference at the fold, superseding team-line
   centering there. Hit target rides the render. */
.plmark { width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center;
          background: none; border: 1px solid var(--hairline); color: var(--muted);
          font-family: var(--font-mono); font-size: 15px; padding: 0; cursor: pointer; position: relative; top: 3px; }
.plmark:hover, .plmark:active { border-color: var(--ink); color: var(--ink); }
.plmark:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.plmark[aria-pressed="true"], .plmark.on { background: var(--stamp); color: var(--cream); border-color: var(--ink); }
.plmark.rival[aria-pressed="true"], .plmark.rival.on { box-shadow: inset 0 0 0 2px var(--stamp), inset 0 0 0 3px var(--cream); }
/* THE PRESSED MARK INVERTS AT NIGHT (M4.7 §4, owner ruling): the
   glyph-only mark cell is flood-class, not stamp-class — its face IS
   its signal, and pressed must never converge with unwatched. Night
   watched: cream cell, ink glyph; the rival keyline inverts with its
   cell. Cream, never white (white-as-writable untouched). SCOPE:
   this cell alone — labeled ⌖ stamps (.plwatch, the filter chip,
   ⌖ ADD/⌖ POACH) keep the night stamp law by token, untouched. */
:root[data-theme=night] .plmark[aria-pressed="true"],
:root[data-theme=night] .plmark.on { background: var(--cream); color: var(--stamp); border-color: var(--cream); }
:root[data-theme=night] .plmark.rival[aria-pressed="true"],
:root[data-theme=night] .plmark.rival.on { box-shadow: inset 0 0 0 2px var(--cream), inset 0 0 0 3px var(--stamp); }
span.plmark.on { cursor: default; }
/* the 44px band rides the registry's fold seam, widened 720 → 980
   (registry-mobile-fits): the fold's mark seat is the 44×44 form
   wherever the fold governs */
@media (max-width: 980px) { .plmark { width: 44px; height: 44px; font-size: 17px; top: 12px; } }

/* THE LINE'S BOX ANATOMY (rehearsal §5 — rendering law; makes the
   smashed PHIL⌖ and the broken baseline impossible): a ticker chip is
   a flex COLUMN, gap 4; each of its lines is a flex ROW, center-
   aligned, gap 6, min-height 18 — every segment (glyph, verb run,
   figure, separator ·, member chip) its OWN flex item; spacing comes
   from gap, never inline whitespace or margins. Member chips sit
   16px, flex:none — mixed chips and text share one centerline by
   construction. Wrap is lawful at the facts (.wraps); an inseparable
   value+verb pair rides .pair (nowrap) — a wire may wrap between
   facts, never inside one. */
.tick { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.tick-line { display: flex; align-items: center; gap: 6px; min-height: 18px; }
.tick-line.wraps { flex-wrap: wrap; }
.tick-line .plmem-short { display: inline-flex; align-items: center; gap: 3px; height: 16px; flex: none; }
.tick-line .pair { white-space: nowrap; }
.tick-mono { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--muted); }
.tick-mono .paid { font-weight: 700; color: var(--ink); }

.plform-law { border-top: 3px double var(--ink); border-bottom: 1px solid var(--hairline); padding: 16px 2px 14px; }
.plform-law-lead { font-family: var(--font-display); font-size: var(--g4); letter-spacing: .2em; color: var(--body-muted); margin-bottom: 4px; }
.plform-law-body { font-family: var(--font-serif); font-size: 14.5px; line-height: 1.55; }
.plform-law-note { font-family: var(--font-serif); font-style: italic; font-size: 12px; color: var(--body-muted); margin-top: 4px; }

/* the refusal — correspondence, not alarm (bulletin addressed-row) */
.plform-refusal {
  margin-top: 16px; background: var(--cream); border-left: 2px solid var(--ink);
  padding: 12px 14px; display: flex; gap: 10px; align-items: flex-start;
}
.plform-refusal-body { font-family: var(--font-serif); font-size: 13.5px; line-height: 1.55; }
/* the M2 ink rule: the refusal foot states what happened to the
   member's entry — ink, never mute */
.plform-refusal-foot { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--ink); margin-top: 7px; }

/* save model — per-section RECORD in the signature seat */
.plform-recordrow { margin-top: 16px; display: flex; align-items: center; justify-content: flex-end; gap: 14px; flex-wrap: wrap; }
.plform-recordnote { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--muted); }
.plform-receipt { font-family: var(--font-mono); font-size: var(--m2); color: var(--brass); }
.plform-record {
  height: 44px; padding: 0 22px; font-weight: 600; font-size: 13px;
  letter-spacing: .04em; font-family: var(--font-data); border-radius: 0;
  background: var(--stamp); color: var(--cream); cursor: pointer;
  border: 1px solid var(--ink);  /* the seat-line */
}
.plform-record:disabled { background: var(--hairline); color: var(--muted); cursor: default; border: none; }
.plform-record:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }

/* quiet mono row action (rotate/strike/enter) */
.plform-action {
  height: 44px; padding: 0 14px; background: transparent; border: 1px solid var(--hairline);
  color: var(--body-muted); font-family: var(--font-mono); font-size: var(--m1);
  letter-spacing: .12em; cursor: pointer; border-radius: 0;
}
.plform-action:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }

/* ◇/◆ marks — the danger gradient; weight from the mark, never color */
.plform-mark { font-size: 11px; line-height: 1; color: var(--ink); }
.plform-mark--brass { color: var(--brass); }

/* the external-reference glyph retired (THE LINK LAW, 2026-08-29;
   deck design_handoff_link_law §3): the record's names carry their
   own references — teamPrimary's anchor (.plref) and the docket's
   matchup anchor (.tw-match) replace the mark. REST IS BARE: a
   linked row and an unlinked one are indistinguishable at rest, and
   that is the point — the record reads as a record. Hover/active:
   the underline alone (the decoration rides the name; it cannot
   propagate into the atomic inline-flex .team box). Never brass, no
   visited state, zero motion; the print block strips decoration. */
/* THE SHRINK LAW (registry-mobile-fits, third-playthrough defect 2a):
   the anchor seats itself as the flex item where bare .team used to
   sit, and .team carried min-width: 0 — the anchor must carry it
   too, or the identity unit refuses to shrink and its trailing badge
   spills under the neighbor cells (the wide-mobile overlap). With it,
   the name ellipsizes exactly as it did before the link law. */
.plref { text-decoration: none; color: inherit; min-width: 0; }
.plref:hover .nm, .plref:active .nm {
  text-decoration: underline; text-decoration-thickness: 1px;
  text-decoration-color: currentColor; text-underline-offset: 3px;
}
.plref:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
/* the offset-3 underline must paint below the baseline, where the
   name's ellipsis machinery (overflow: hidden) would clip it at the
   content edge — the padding strip gives the decoration room and
   the negative margin keeps the box metrics unmoved */
.plref .nm { padding-bottom: 4px; margin-bottom: -4px; }


/* ---- fixed chrome bar + scroll-dock (the Index nav fold) ---------
   The bar is quiet at rest: only the ruled INDEX affordance at its
   right. The chrome's single shadow always sits at its lowest edge —
   the menu's bottom when open, the bar when docked-and-closed,
   never both. */
.plnav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 50;
  height: 48px; background: var(--bar); border-bottom: 1px solid var(--hairline);
  display: flex; align-items: center;
  padding: 0 0 0 24px;
}
.plnav-spacer { flex: 1; }
/* the scrolled shadow rides --chrome-shadow: transparent at night
   (nav-fold amendment — the seam does the work) */
.plnav.docked:not(.index-open) { box-shadow: 0 2px 12px var(--chrome-shadow); }
@media (max-width: 720px) {
  .plnav { padding: 0 0 0 12px; }
}
/* The mark's two states (design_handoff_clarity §4): stamped, zero
   motion — no scale, no crossfade, no translate, no duration. State B
   is present exactly where the letterhead is gone. */
.plnav-brand {
  display: flex; align-items: center; gap: 9px;
  opacity: 0;
  pointer-events: none;
}
.plnav.docked .plnav-brand { opacity: 1; pointer-events: auto; }
.plnav-brand span {
  font-family: var(--font-display); font-size: 13px; letter-spacing: .11em; color: var(--ink);
}
@media (max-width: 720px) {
  .plnav-brand span { display: none; }  /* keep only the 26px shield */
}

/* ---- letterhead --------------------------------------------------- */
.letterhead {
  display: flex; align-items: center; gap: 12px; padding-top: 6px;
  border-bottom: 3px double var(--ink); padding-bottom: 18px; margin-bottom: 24px;
}
/* the wordmark: the lockup's own span (a direct child, or inside the
   sign-in page's home anchor) — scoped so it never reaches the masthead
   league name's spans (NAVIGATION & TABS R13, 2026-09-29) */
.letterhead > span, .letterhead > a > span { font-family: var(--font-display); font-size: var(--g1); letter-spacing: .11em; }
@media (max-width: 720px) {
  .letterhead { flex-wrap: wrap; }
}

/* ---- page title row + section headings --------------------------- */
.titlerow { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 20px; }
.titlerow h1 { margin: 0; font-family: var(--font-display); font-size: var(--g2); letter-spacing: .14em; text-transform: uppercase; font-weight: 400; }
.titlerow .slug { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); }
.section-title {
  margin: 24px 0 12px; font-family: var(--font-display); font-size: var(--g3);
  letter-spacing: .12em; text-transform: uppercase; font-weight: 400;
  border-bottom: 1px solid var(--ink); padding-bottom: 8px;
}
.intro { font-size: 14px; font-style: italic; color: var(--body-muted); font-family: var(--font-serif); }

/* ---- tables ------------------------------------------------------- */
.sheet-table { border-collapse: collapse; width: 100%; font-family: var(--font-data); font-size: 13.5px; }
.sheet-table th {
  text-align: left; font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--muted); padding: 6px 8px; border-bottom: 2px solid var(--ink); font-weight: 600;
}
.sheet-table td { padding: 8px; border-bottom: 1px solid var(--hairline); vertical-align: middle; }
.sheet-table th.num, .sheet-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
.sheet-table tbody tr:hover { background: var(--band); }
/* visually hidden, read aloud: the aria story's words for a fact the
   fill carries (THE TIEBREAK's " (deciding)", M4.9) */
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden;
           clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* ---- buttons (square) --------------------------------------------- */
.btn-primary {
  background: var(--stamp); color: var(--cream); padding: 8px 18px;
  border: 1px solid var(--ink);  /* the seat-line */
  font-size: 13px; font-weight: 600; cursor: pointer; font-family: var(--font-data);
}
.btn-primary:hover { background: var(--stamp-hover); }
.btn-secondary {
  background: transparent; color: var(--body-muted); border: 1px solid var(--hairline);
  padding: 7px 14px; font-size: 13px; cursor: pointer; font-family: var(--font-data);
}
.btn-secondary:hover { background: var(--band); }
.btn-primary:disabled, .btn-secondary:disabled {
  background: var(--hairline); color: var(--muted); cursor: not-allowed; border: none;
}

/* ---- notice box (needs/gate) — leads with a brass honor ----------- */
.notice {
  background: var(--band); border: 1px solid var(--hairline);
  padding: 10px 14px; font-size: 13.5px; font-family: var(--font-data);
}
.notice::before { content: '◆ '; color: var(--brass); }

/* ---- inputs ------------------------------------------------------- */
/* the display-name write-line: theme-conditional anatomy (night desk
   hard cases) — daylight keeps the bare ink underline; night gains a
   white fill (a bare underline cannot be "light" on an ink ground) */
.input-ledger {
  background: var(--writeline-fill); border: none;
  border-bottom: 1px solid var(--writeline-rule);
  font-family: var(--font-serif); font-size: 17px; padding: 4px 2px;
  color: var(--paper-ink);
}
/* filled fields keep their daylight faces verbatim (white-as-writable) */
.input-field, select.input-field {
  background: var(--cream); border: 1px solid var(--paper-hair);
  padding: 8px 12px; color: var(--paper-ink); font-family: var(--font-data);
  -webkit-appearance: none; appearance: none; border-radius: 0;
}
/* appearance:none strips the native indicator — draw an ink chevron */
select.input-field {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%2323211D' stroke-width='1.5'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center;
  padding-right: 30px;
}

/* ---- paper footer -------------------------------------------------- */
.paperfoot {
  border-top: 1px solid var(--hairline); margin-top: 28px; padding-top: 12px;
  display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  font-family: var(--font-mono); font-size: 10.5px; color: var(--muted);
}

/* ---- team display (unchanged house rule: logo always with name) --- */
.team { display: inline-flex; align-items: center; gap: 7px; min-width: 0; }
.team img { height: 1.35em; width: 1.35em; object-fit: contain; flex: none; }
.team .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* THE RANK's lead mark (§6, 2026-08-17): the one proportional-cell
   rendering — M2 mono, 700, ink, ahead of the chip inside the
   identity unit (#3 {chip} Georgia). Mono seats (the NEXT wire)
   print the rank as plain text in the seat's own voice instead.
   Unranked renders no mark at all — never a dash. */
.plrank { font-family: var(--font-mono); font-size: var(--m2); font-weight: 700;
          letter-spacing: .02em; color: var(--ink); flex: none; }

img.avatar { height: 1.3em; width: 1.3em; object-fit: contain; vertical-align: middle; border-radius: 3px; }

/* ---- conference badge, RE-CUT (ledger & badge handoff 2026-07-31;
   the pill retires) --------------------------------------------------
   One anatomy everywhere the badge renders: square (the letterhead
   radius exception is revoked; avatars keep theirs), 1px solid ink
   border (it holds the muted fills off parchment and cream alike),
   face 700 uppercase-via-transform at 9.5px — the type floor exactly,
   held over the owner's ~0.48rem target (nothing renders below 9.5px
   on an app surface). */
.conf { display: inline-block; padding: .05rem .35rem .06rem; border: 1px solid var(--ink);
        border-radius: 0; font-size: 9.5px; font-weight: 700; letter-spacing: .02em;
        text-transform: uppercase; white-space: nowrap; font-family: var(--font-data); }
.conf-sec    { background: var(--conf-sec);    color: var(--conf-sec-text); }
.conf-acc    { background: var(--conf-acc);    color: var(--conf-acc-text); }
.conf-big12  { background: var(--conf-big12);  color: var(--conf-big12-text); }
.conf-pac12  { background: var(--conf-pac12);  color: var(--conf-pac12-text); }
.conf-bigten { background: var(--conf-bigten); color: var(--conf-bigten-text); }
.conf-ind    { background: var(--conf-ind);    color: var(--conf-ind-text); }
.conf-g5     { background: var(--conf-g5);     color: var(--conf-g5-text); }

.trend-up   { color: var(--trend-up); }
.trend-down { color: var(--trend-down); }

/* ---- WILD WEEK (design/design_handoff_wild_week, M5 session 2) ----
   The vocabulary the bet sheet (My Page) and the register (standings)
   share: the day lead (M2 700 ink — inside a section the days are
   sub-groups, not sections; M2 sets ink because the lead carries a
   date), the line wire's label/value pair (M1; labels mute 400,
   values 700 ink), the grade (the shipped graded-outcome pair; PUSH
   ink; the pardon ♚ 0 — brass mark, ink zero; the en-dash until
   final), the crown mark (U+265A, brass, always in the mono run —
   never Graduate; honors-only, the reserved seat now occupied). Night
   rides the tokens alone; brass never themes; zero motion. */
.ww-day {
  font-family: var(--font-mono); font-size: var(--m2); font-weight: 700;
  letter-spacing: .14em; color: var(--ink); margin-top: 16px;
}
.ww-lbl { color: var(--muted); font-weight: 400; }
.ww-val { font-weight: 700; color: var(--ink); }
.ww-dash { color: var(--muted); }
.ww-grade { font-family: var(--font-mono); font-size: 14px; font-weight: 700; white-space: nowrap; }
.ww-push { color: var(--ink); }
.ww-pending { color: var(--muted); }
.ww-zero { color: var(--ink); }
.ww-crown { font-family: var(--font-mono); color: var(--brass); font-weight: 400; }

/* ---- the roster card (draft board handoff Jul 31; system
   vocabulary per the four amendments) --------------------------------
   One parchment compartment per roster: Spectral 600 head on a 1px
   ink rule, captions in the th voice on a hairline, team rows in the
   data face. The value seat (.val) is generic — PROJ on the board,
   RECORD on standings — M1 ink tabular; BYE stays M2 muted
   (reference, so the ink rule does not bite). Pages own their grids
   (repeat(3) on the board, repeat(2) on standings) and may override
   the column template; the anatomy lives here once. */
.rosters-head { display: flex; align-items: baseline; justify-content: space-between;
                gap: 10px; flex-wrap: wrap; border-bottom: 1px solid var(--ink);
                padding-bottom: 8px; margin: 24px 0 16px; }
.rosters-head .section-title { border-bottom: none; margin: 0; padding-bottom: 0; }
.rosters-phase { font-family: var(--font-mono); font-size: var(--m1); letter-spacing: .12em; color: var(--muted); }
.roster-card { background: var(--parchment); border: 1px solid var(--hairline);
               padding: 14px 16px 8px; }
.roster-card-head { display: flex; align-items: baseline; justify-content: space-between;
                    gap: 8px; border-bottom: 1px solid var(--ink); padding-bottom: 9px; }
.roster-card-head .id { display: inline-flex; align-items: center; gap: 4px; min-width: 0; }
.roster-card-head .nm { font-family: var(--font-serif); font-weight: 600; font-size: 16px;
                        white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.roster-card-head .tally { display: inline-flex; align-items: baseline; gap: 7px; white-space: nowrap; }
.roster-card-head .count { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); }
.roster-card-head .onclock { font-family: var(--font-mono); font-size: var(--m2); font-weight: 700;
                             letter-spacing: .1em; color: var(--paper-ink);
                             background: var(--lift); }
/* the chip's flood exists only at night (--lift): the inverted field
   takes the frame's padding; daylight prints the bare wire word */
:root[data-theme=night] .roster-card-head .onclock { padding: 2px 5px; }
/* captions in the th voice on a hairline — the in-card rule stays
   1px so a wall of cards does not shout (sheet tables keep 2px) */
.roster-cols { display: grid; grid-template-columns: minmax(0,1fr) 36px 70px; gap: 8px;
               padding: 7px 0 5px; border-bottom: 1px solid var(--hairline); }
.roster-cols span { font-size: 10px; font-weight: 600; letter-spacing: .12em;
                    text-transform: uppercase; color: var(--muted); }
.roster-cols span.num { text-align: right; }
.roster-team { display: grid; grid-template-columns: minmax(0,1fr) 36px 70px; gap: 8px;
               align-items: center; padding: 7px 0; border-bottom: 1px solid var(--desk); }
.roster-team .tcell { min-width: 0; }
.roster-team .tm { display: inline-flex; align-items: center; gap: 7px; min-width: 0;
                   max-width: 100%; font-size: 13px; font-weight: 600; }
.roster-team .val { font-family: var(--font-mono); font-size: var(--m1); color: var(--ink);
                    font-variant-numeric: tabular-nums; text-align: right; }
.roster-team .bye { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted);
                    text-align: right; white-space: nowrap; }
/* the under-line mark seat (four amendments §1: the register's wire
   sits under the team line wherever the card grammar carries a
   roster — the pool's own precedent for compartmented rows) */
.roster-undermark { display: block; font-family: var(--font-mono); font-size: var(--m2);
                    color: var(--muted); padding-left: 25px; margin-top: 2px; white-space: nowrap; }
/* a standing light on a ledger add reads ink (rehearsal §6) */
.roster-undermark.inkwire { color: var(--ink); }
/* BYE at rest in any sheet table: reference, muted mono */
.bye-cell { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted); white-space: nowrap; }
@media (max-width: 720px) {
  .roster-card-head .nm { font-size: 15px; }
}

/* THE GROWING LEDGER (rehearsal §6): the roster surfaces carry the
   season's whole roster story. The double rule divides the eras —
   the masthead's 3px double ink rule, full card measure, NO caption
   (the adds' IN wires attribute the era). The strike marks tenure,
   not existence: name 400, mute, line-through — the LINK stays live,
   the badge prints at rest, the frozen rostered record prints mute,
   BYE keeps printing. Nothing grays; 22 rows is lawful length. */
.ledger-rule { border-bottom: 3px double var(--ink); margin: 2px 0; }
.plstruck .nm { font-weight: 400; color: var(--muted); text-decoration: line-through; }
.plstruck .val, .ledger-frozen { color: var(--muted); }
/* the REALIGN value's semantic colors (owner ruling Aug 30, via the
   EXISTING tokens — reversing M4 §11's no-color clause): +N won-
   green, −N crimson, 700; verb and the en dash stay mute */
.realign-up { font-weight: 700; color: var(--trend-up); }
.realign-down { font-weight: 700; color: var(--trend-down); }

/* landing-slot pulse (draft confirm modal) */
@keyframes plPulse { 0%, 100% { background-color: var(--brass); } 50% { background-color: var(--brass-pulse); } }

/* ---- the Index (nav fold) ----------------------------------------
   design/design_handoff_nav_fold — the affordance is universal; only
   the open menu's geometry changes at the 720px line. Zero motion:
   open and closed are two stamped states. No scrim, no transitions. */
.plindex {
  height: 48px; padding: 0 16px; display: flex; align-items: center; gap: 8px;
  border: none; border-left: 1px solid var(--hairline);
  background: none; color: var(--ink);
  font-family: var(--font-serif); font-size: 12px; letter-spacing: .18em;
  text-transform: uppercase; cursor: pointer;
}
.plindex-glyph { font-size: 9px; }
/* the open INDEX cell is a stamp: it holds the ink face and takes
   the seat-line (ink-on-ink by day, cream at night) */
.index-open .plindex { background: var(--stamp); color: var(--cream); border: 1px solid var(--ink); }
.plindex:focus-visible { outline: 2px solid var(--ink); outline-offset: -3px; }
.index-open .plindex:focus-visible { outline: 2px solid var(--cream); outline-offset: -3px; }

.plindex-menu {
  position: absolute; top: 49px; right: 0; width: 300px;
  background: var(--bar);
  border-left: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline);
  box-shadow: 0 2px 12px var(--chrome-shadow);
  max-height: calc(100vh - 49px); overflow-y: auto;
}
.plindex-menu nav a {
  display: flex; align-items: center; min-height: 48px; padding: 0 16px;
  text-decoration: none; font-family: var(--font-serif); font-size: 13px;
  letter-spacing: .16em; text-transform: uppercase; color: var(--body-muted);
}
.plindex-menu nav a + a { border-top: 1px solid var(--hairline); }
.plindex-menu nav a:hover { background: var(--shelf-hover); }
.plindex-menu nav a:focus-visible { outline: 2px solid var(--ink); outline-offset: -3px; }
.plindex-menu nav a.active span { color: var(--brass); border-bottom: 2px solid var(--brass); padding-bottom: 2px; }

.plindex-id { border-top: 1px solid var(--ink); padding: 14px 16px 18px; display: flex; flex-direction: column; gap: 10px; }
.plindex-id-label { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .14em; color: var(--muted); }
.plindex-id-chip { display: flex; align-items: center; gap: 8px; }
.plindex-id-av { font-size: 16px; }
.plindex-id-name { font-family: var(--font-serif); font-size: 14px; font-weight: 600; }
.plindex-id-no { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); }
.plindex-withdraw {
  width: 100%; min-height: 44px; background: transparent; border: 1px solid var(--hairline);
  padding: 13px 14px; font-family: var(--font-mono); font-size: var(--m1);
  letter-spacing: .14em; color: var(--body-muted); cursor: pointer; text-transform: uppercase;
}
.plindex-withdraw:hover { background: var(--shelf-hover); }
.plindex-withdraw:focus-visible { outline: 2px solid var(--ink); outline-offset: -3px; }
.plindex-id-note { font-family: var(--font-serif); font-style: italic; font-size: 11.5px; color: var(--muted); }

@media (max-width: 720px) {
  .plindex-menu { left: 0; width: auto; border-left: none; }
}

/* ---- THE PROSE REGISTER (design/design_handoff_prose, 2026-09-20) ----
   The two seats that print an edition's stored prose: THE WEEK on THIS
   WEEK and YOUR WEEK on MY PAGE. One paragraph directly on the head's
   ink rule: Spectral 400 16/1.55 — one step above the page's line size,
   found by weight of type — with its values inline in mono 13 700 (an
   inline value takes the prose's scale, not the wire ranks'). One size
   at both widths; the paragraph reflows.
   --letter (THE WEEK): bare paper at a 640px reading measure, closing
   on the letterhead's 3px double ink rule — no fill (the cream is THIS
   WEEK's yours and COMPLETED signal), no box (THE TOP MATCHUP's).
   --band (YOUR WEEK): the lead-line band; MY PAGE has no yours-row for
   the fill to collide with; night joins the shelf through the token,
   no seat-line.
   Tokens alone; zero motion; no anchors inside (the link law). Empty is
   absence: no head, no band, no gap. The fold rides the G3 head's own
   breakpoint so the head and its body turn together. */
.plprose { margin: 0; font-family: var(--font-serif); font-weight: 400; font-size: 16px; line-height: 1.55; color: var(--ink); text-wrap: pretty; }
.plprose-v { font-family: var(--font-mono); font-size: 13px; font-weight: 700; letter-spacing: 0; color: var(--ink); }
.plprose--letter { max-width: 640px; padding: 16px 0 20px; border-bottom: 3px double var(--ink); }
.plprose--band { background: var(--band); padding: 14px 16px; }
@media (max-width: 720px) {
  .plprose--letter { max-width: none; padding: 12px 0 14px; }
  .plprose--band { padding: 12px 12px; }
}

/* ---- THE SPOTLIGHT (design/design_handoff_spotlight) --------------
   The mechanic's shared vocabulary: the ⊙ mark, the chain anatomy,
   the pick surface, the initialed confirmation, and the register.
   The ⊙ is always monospace, never brass; crimson appears only as
   graded-loss data (the miss cell, ledger −N, register outcomes) —
   never as alarm. Zero motion: every state is a restamp. */

.plspot-mark { font-family: var(--font-mono); color: var(--muted); }

/* section head: Graduate lead over the 1px ink rule, mono phase slot */
.plspot-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; flex-wrap: wrap; border-bottom: 1px solid var(--ink);
  padding-bottom: 8px; margin-top: 30px;
}
.plspot-head-lead { font-family: var(--font-display); font-size: var(--g3); letter-spacing: .12em; }
.plspot-phase { font-family: var(--font-mono); font-size: var(--m1); letter-spacing: .12em; color: var(--muted); }
.plspot-introrow {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 14px; flex-wrap: wrap; margin-top: 10px;
}
.plspot-intro { font-family: var(--font-serif); font-style: italic; font-size: 12.5px; color: var(--body-muted); max-width: 470px; }
.plspot-wirenote { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); }

/* the chain — the ladder strip's four cell states */
.plspot-chainrow {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 18px; flex-wrap: wrap; margin: 16px 0 4px;
}
.plspot-chain { display: flex; gap: 5px; align-items: center; flex-wrap: wrap; }
.plspot-cell {
  width: 26px; height: 26px; box-sizing: border-box;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--hairline); color: var(--muted);
  font-family: var(--font-mono); font-size: var(--m1); font-weight: 700;
  background: transparent;
}
.plspot-cell.is-correct { background: var(--stamp); color: var(--cream); border: 1px solid var(--ink); }
.plspot-cell.is-next { background: #FFFFFF; border: 2px solid var(--ink); color: var(--ink); }
.plspot-cell.is-miss { background: var(--danger); border-color: var(--danger); color: var(--cream); }
.plspot-thereafter { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted); padding-left: 4px; }
.plspot-ladderlaw { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--muted); }
.plspot-status { font-family: var(--font-mono); font-size: var(--m1); line-height: 1.6; }
.plspot-status .verb { color: var(--muted); }
.plspot-status .val { font-weight: 700; }

/* eligible / ineligible groups */
.plspot-grouphead {
  font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .14em;
  color: var(--muted); margin-top: 18px; padding-bottom: 2px;
}
.plspot-grouphead.ruled { border-bottom: 1px solid var(--hairline); padding-bottom: 6px; }
.plspot-eligrow {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px;
  align-items: center; background: #FFFFFF; border: 1px solid var(--hairline);
  padding: 9px 12px; margin-top: 8px;
}
.plspot-teamcell { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.plspot-teamline { display: flex; align-items: center; gap: 8px; min-width: 0; }
.plspot-teamline .nm { font-size: 13.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plspot-ctx { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); padding-left: 25px; }
.plspot-btn {
  height: 44px; padding: 0 16px; background: transparent;
  border: 1px solid var(--ink); color: var(--ink); border-radius: 0;
  font-family: var(--font-mono); font-size: var(--m1); letter-spacing: .12em; cursor: pointer;
}
.plspot-btn:hover { background: var(--cream); }
.plspot-btn:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
/* THE LAST-PLACE SPOTLIGHT (design_handoff_last_place_spotlight R4 + R11,
   as amended Oct 7, 2026): won-green enters three seats for the held
   week alone — the ⊙ SPOTLIGHT flood here, the NEXT cell's stroke, and
   the register's ⊙ square. The constant daylight green (--paper-up,
   #1E7A44): cream on it measures 5.3:1 under either lamp. The flood
   keeps its ground and type under the pointer (the hover law: a hover
   never lowers contrast; the shipped cream hover would erase the type). */
.plspot-btn.lp {
  background: var(--paper-up); border-color: var(--paper-up);
  color: var(--cream); font-weight: 700;
}
.plspot-btn.lp:hover { background: var(--paper-up); color: var(--cream); }
.plspot-cell.is-next.lp { border-color: var(--paper-up); color: var(--paper-up); }
/* the lockout's NEXT cell: the stroke stands, the white does not —
   nothing is writable while a window is open (white census 0) */
.plspot-cell.is-next.is-locked { background: transparent; }
/* the lockout line, in the eligible list's seat: M1 mute, one line */
.plspot-lockout {
  font-family: var(--font-mono); font-size: var(--m1); color: var(--muted);
  margin-top: 18px; line-height: 1.6;
}
.plspot-inelrow {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px;
  align-items: center; padding: 9px 2px; border-bottom: 1px solid var(--hairline);
}
.plspot-inelrow .nm { font-size: 13.5px; font-weight: 400; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* the M2 ink rule: a reason cell states why the row is dead — ink,
   never mute (NO LINE POSTED · NOT ELIGIBLE, ON BYE THIS WEEK, …) */
.plspot-reason { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--ink); text-align: right; }
@media (max-width: 720px) {
  .plspot-eligrow { grid-template-columns: minmax(0, 1fr); }
  .plspot-btn { width: 100%; }
  .plspot-inelrow { grid-template-columns: minmax(0, 1fr); }
  .plspot-reason { text-align: left; padding-left: 25px; }
}

/* the ledger */
.plspot-ledgerhead {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; flex-wrap: wrap; margin-top: 18px;
}
.plspot-ledgerrow {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px;
  padding: 4px 0; font-family: var(--font-mono); font-size: var(--m1); color: var(--body-muted);
}
.plspot-ledgerrow .val { font-weight: 700; }
.val-paid { color: var(--trend-up); }
.val-cost { color: var(--trend-down); }
/* a free miss's 0: ink 700, toneless — no points moved */
.val-free { color: var(--ink); }
.plspot-empty { margin-top: 6px; font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); }

/* the document block — sealed / graded / the confirmation's pick */
.plspot-doc {
  border-top: 3px double var(--ink); border-bottom: 1px solid var(--hairline);
  margin-top: 16px; padding: 14px 2px 12px;
}
.plspot-sealrow { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.plspot-docteam { display: flex; align-items: center; gap: 9px; margin-top: 14px; }
.plspot-docteam .nm { font-family: var(--font-serif); font-size: 17px; font-weight: 600; }
.plspot-docwire { font-family: var(--font-mono); font-size: var(--m1); margin-top: 7px; }
.plspot-docwire .verb { color: var(--muted); }
.plspot-docwire .val { font-weight: 700; }
.plspot-docfoot { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em; color: var(--muted); margin-top: 3px; }
.plspot-docfoot.first { margin-top: 9px; }
.plspot-receipt-paid { font-weight: 700; color: var(--trend-up); }
/* the graded free miss: WRONG · COST 0 in ink, no crimson (R6) */
.plspot-receipt-free { font-weight: 700; color: var(--ink); }

/* retired — the archive's voice */
.plspot-dignity {
  font-family: var(--font-serif); font-style: italic; font-size: 13.5px;
  line-height: 1.6; color: var(--body-muted); margin-top: 14px; max-width: 560px;
}
.plspot-closedline { font-family: var(--font-mono); font-size: var(--m1); color: var(--body-muted); }
.plspot-registerlink {
  margin-top: 16px; border-top: 1px solid var(--hairline); padding-top: 12px;
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap;
}
.plspot-registerlink a { font-weight: 600; font-size: 12.5px; text-decoration: none; }
.plspot-registerlink a:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }

/* the initialed confirmation — deliberate-record lineage, no pulse */
.plspot-modal {
  border: 1px solid var(--ink); border-radius: 0; padding: 20px 22px;
  width: min(480px, calc(100vw - 32px)); box-sizing: border-box;
  background: var(--cream); box-shadow: 0 16px 48px var(--modal-shadow);
}
.plspot-modal::backdrop { background: var(--scrim); }
.plspot-modalhead { font-family: var(--font-mono); font-size: var(--m1); letter-spacing: .14em; color: var(--muted); }
.plspot-modaldoc {
  border-top: 3px double var(--ink); border-bottom: 1px solid var(--hairline);
  margin-top: 12px; padding: 14px 2px 12px; text-align: center;
}
/* the modal title is the only G3 in the card (type ruling) */
.plspot-modallead { font-family: var(--font-display); font-size: var(--g3); letter-spacing: .12em; color: var(--ink); }
.plspot-modalteam { display: flex; align-items: center; justify-content: center; gap: 9px; margin-top: 10px; }
.plspot-modalteam .nm { font-family: var(--font-serif); font-size: 21px; font-weight: 600; }
.plspot-fact {
  display: flex; gap: 14px; align-items: flex-start;
  border-bottom: 1px solid var(--hairline); padding: 13px 2px;
}
.plspot-factbody { flex: 1; min-width: 0; }
/* modal fact heads take G4 (type ruling) */
.plspot-factlead { font-family: var(--font-display); font-size: var(--g4); letter-spacing: .2em; color: var(--body-muted); }
.plspot-facttext { font-family: var(--font-serif); font-size: 13.5px; line-height: 1.5; margin-top: 4px; }
/* width-pinned initials column: button and under-label alike hold
   44px so INITIAL → INITIALED never reflows the fact text beside it
   (an unpinned label widening the column on tap is a defect). */
.plspot-initcol {
  width: 56px; display: flex; flex-direction: column; align-items: center;
  gap: 3px; flex: none;
}
.plspot-init {
  width: 44px; height: 44px; box-sizing: border-box; padding: 0;
  background: #FFFFFF; border: 1px solid var(--hairline); border-radius: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 17px; cursor: pointer;
}
.plspot-init[aria-checked="true"] { background: var(--ink); border-color: var(--ink); }
.plspot-init:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.plspot-init img { width: 22px; height: 22px; object-fit: contain; }
.plspot-initlab {
  width: 56px; display: flex; justify-content: center; white-space: nowrap;
  font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .08em; color: var(--muted);
}
.plspot-footnote {
  font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em;
  color: var(--muted); line-height: 1.6; margin-top: 12px;
}
.plspot-ctarow {
  display: flex; align-items: center; justify-content: flex-end;
  gap: 14px; flex-wrap: wrap; margin-top: 14px;
}
.plspot-armnote {
  font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .06em;
  color: var(--muted); flex: 1; min-width: 140px;
}

/* THE TWO MEMBER CLASSES (short name law §4) — the mark form and the
   full form. The mark: mono 700 at the scale's floor, mute, tracked —
   the 700 holds four characters together at 9.5; the mute keeps them
   behind the teams (the mark-subordinate law). Never ink. Spectral is
   reserved for the full name — the second signal that a name is
   short. Seats size the avatar; the classes carry the face. */
.plmem-short, .plmem-full { display: inline-flex; align-items: center; gap: 5px; min-width: 0; }
.plmem-short .msn {
  font-family: var(--font-mono); font-size: var(--m2); font-weight: 700;
  color: var(--muted); letter-spacing: .08em;
}
.plmem-full .mnm {
  font-family: var(--font-serif); font-weight: 600;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* the register (/standings) — SPENT BY at 80px (short name law §6:
   no lawful short name can clip 80; THE CALL takes the room) */
.plreg-row {
  display: grid; grid-template-columns: 44px minmax(0, 1.3fr) 80px minmax(0, 1fr) auto;
  gap: 10px; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--hairline);
}
.plreg-row.head { padding-bottom: 6px; border-bottom: 2px solid var(--ink); margin-top: 14px; }
.plreg-row.head span {
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--muted); font-weight: 600;
}
.plreg-wk { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted); }
.plreg-team { display: flex; align-items: center; gap: 7px; min-width: 0; }
.plreg-team .nm { font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plreg-by { display: flex; align-items: center; gap: 6px; min-width: 0; }
/* the fallback (an unsigned member renders FULL) keeps the old seat size */
.plreg-by .mnm { font-size: 12.5px; }
.plreg-call { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.plreg-outcome { font-family: var(--font-mono); font-size: var(--m1); text-align: right; white-space: nowrap; }
.plreg-outcome .val { font-weight: 700; }
.plreg-outcome .note { color: var(--muted); }
/* the last-place ⊙: a 17px won-green square, the cream glyph (R11) — the
   tab's button in miniature; the fig's decode prints it at 13px */
.plreg-lp {
  display: inline-block; width: 17px; height: 17px; line-height: 17px; text-align: center;
  background: var(--paper-up); color: var(--cream);
  font-family: var(--font-mono); font-size: var(--m1); font-weight: 700; flex: none;
}
.plreg-fig .plreg-lp { width: 13px; height: 13px; line-height: 13px; }
/* the holder line (R10): M1, chipless; the week and the member 700 ink */
.plreg-holder { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); margin-top: 10px; }
.plreg-holder b { color: var(--ink); font-weight: 700; }
.plreg-fig {
  font-family: var(--font-mono); font-size: var(--m2); color: var(--muted);
  border-top: 1px solid var(--hairline); margin-top: 12px; padding-top: 8px;
}
@media (max-width: 720px) {
  .plreg-row { grid-template-columns: 34px minmax(0, 1fr) auto; row-gap: 3px; }
  .plreg-row.head .h-by, .plreg-row.head .h-call { display: none; }
  .plreg-by { grid-column: 2; }
  .plreg-call { grid-column: 2; }
  .plreg-outcome { grid-column: 3; grid-row: 1; }
}

/* Season Form's re-voiced View-2 key (the deck's legend rows) */
.sf-key2 { display: flex; flex-direction: column; gap: 7px; margin-top: 12px; }
.sf-key2-row {
  display: flex; gap: 9px; align-items: flex-start;
  font-family: var(--font-mono); font-size: var(--m2); color: var(--body-muted); line-height: 1.5;
}
.sf-key2-sw { width: 26px; height: 16px; flex: none; margin-top: 1px; }

/* in-situ spent seats — the spent ⊙ stays mute under any lamp */
.tw-spot { font-family: var(--font-mono); font-size: var(--m1); color: var(--muted); }
.plspot-poolmark { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted); white-space: nowrap; }
.plspot-rostermark { font-family: var(--font-mono); font-size: var(--m2); color: var(--muted); white-space: nowrap; }

/* ---- THE LAMP (design/design_handoff_night_desk) ------------------
   The theme control: My Page foot, the week-selector's radio-cell
   grammar. Three real radios, 44px, mono 700 11px/.14em. Open options
   are white blanks (writable law); the choice is stamped solid and
   takes the seat-line at night. SYSTEM is the default. Two stamped
   states, zero motion — the switch restamps the page, nothing fades. */
.pllamp { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 14px; }
.pllamp-cell {
  position: relative; min-width: 96px; height: 44px; box-sizing: border-box;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0 18px; background: #FFFFFF; border: 1px solid var(--blank-edge);
  color: var(--paper-ink); font-family: var(--font-mono); font-weight: 700;
  font-size: var(--m1); letter-spacing: .14em; cursor: pointer;
}
.pllamp-cell input {
  position: absolute; inset: 0; width: 100%; height: 100%;
  margin: 0; opacity: 0; cursor: inherit;
}
.pllamp-cell.is-entry { background: var(--stamp); border-color: var(--ink); color: var(--cream); cursor: default; }
.pllamp-cell:has(input:focus-visible) { outline: 2px solid var(--ink); outline-offset: 2px; }

/* everything prints — the chain, the register, and a sealed pick are
   the member's record; chrome and writable affordances are not (the
   lamp is a device control and never prints) */
@media print {
  .plnav, .plbulletin, .plspot-btn, .plform-record, .plform-action, .pllamp { display: none !important; }
  /* links print as plain names (link law): paper cannot follow a
     reference, but a name is content — nothing hides, only the
     decoration goes */
  .plref, .plref .nm, .tw-match, .tw-match .nm { text-decoration: none !important; }
}

/* =====================================================================
   PRINT IS ALWAYS LIGHT (night desk, unconditional): the letterhead
   prints as paper regardless of theme. Every token the night block
   themes is re-pinned to its daylight value; the selector list
   carries the night attribute so this block outranks it whatever the
   boot script stamped. Keep this block LAST in the file.
   ===================================================================== */
@media print {
  :root, :root[data-theme=night] {
    --ink: #23211D;
    --counter: #F5F1E6;
    --ground: #FDFBF4;
    --parchment: #FDFBF4;
    --band: #F5F1E6;
    --bar: #FFFFFF;
    --shelf-hover: #F5F1E6;
    --hairline: #D8D2C2;
    --body-muted: #56514A;
    --desk: #EAE5D6;
    --lift: transparent;
    --blank-edge: #D8D2C2;
    --writeline-fill: transparent;
    --writeline-rule: #23211D;
    --avatar-cell: transparent;
    --trend-up: #1E7A44;
    --trend-down: #9E1B32;
    --danger: #9E1B32;
    --scrim: rgba(35,33,29,.45);
    --chrome-shadow: rgba(35,33,29,.12);
  }
}

/* ---- the Bulletin (nav fold's sibling; design_handoff_bulletin,
   amended by design_handoff_bulletin_dismissal) ---
   A posted notice, not an inbox. In flow with the page (scrolls with
   the paper — never sticky, never a shadow), flush under the fixed
   bar, full viewport width. The reversed ink rail carries the mass;
   notices overprint the parchment beneath and align to the paper's
   text column. Zero motion — notices change like tape. Officialdom
   comes from ink, rules, and type — never urgency color (red stays
   reserved for errors; the announcement voice has none). The lead ◆
   is the one brass element on the page's bulletin — and it marks
   exactly the rows that can cost a member something (standing
   windows); costless postings lead with the ink ◇ and carry no brass.
   Full-bleed + flush-under-bar: body pads 12px sides / 60px top
   (bar 48 + gap 12); the negative margins break both out. Row text
   aligns to the paper column via a 1004px/52px inner box that tracks
   .paper's 980px/40px column at every width (16px on mobile).
   Row geometry (owner request 2026-07-17): an explicit two-column
   grid — mark, then main (lead + body + trailing link, ~9/12), then
   the right slot (~3/12: deadline grammar / IN SESSION stamp),
   right-aligned and top-aligned with the lead. minmax(max-content,…)
   means the right column wins the argument with the 3fr share: a
   deadline string never wraps. ≤720 restacks per the shipped 380
   anatomy: lead line (stamp holds its right), body under it, dated
   slots on their own indented line. */
.plbulletin { margin: -12px -12px 0; }
.plbulletin[hidden] { display: none; }   /* zero residue when nothing's open */

.plbulletin-rail { margin: 0; background: var(--ink); }
.plbulletin-rail-inner {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  max-width: 1004px; margin: 0 auto; padding: 8px 52px;
  font-family: var(--font-mono); color: var(--counter);
}
.plbulletin-rail-l { font-size: var(--m2); letter-spacing: .18em; }
.plbulletin-rail-r { font-size: var(--m2); letter-spacing: .06em; }

/* DISMISS × — the rail control, in the seat the wire date was
   wasting. Drawn ~14px to sit inside the rail; the hit box is a
   44px-tall button whose transparent overage extends into the fixed
   bar above (which stacks over it — no stolen taps) and the first
   row's top padding below. Cream-on-ink, like the reversed CONTENTS
   control; focus is the reversed-cell treatment (ink outlines are
   invisible on the ink rail). */
.plbulletin-dismiss {
  height: 44px; box-sizing: border-box; margin: -7px 0;
  padding: 0 0 0 14px; background: transparent; border: 0;
  color: var(--counter); font-family: var(--font-mono);
  font-size: var(--m2); letter-spacing: .14em; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
}
.plbulletin-dismiss:hover { text-decoration: underline; }
.plbulletin-dismiss:focus-visible { outline: 2px solid var(--counter); outline-offset: 2px; }
.plbulletin-dismiss-x { font-size: 13px; line-height: 1; }

/* notices overprint the page in both lamps (bulletin lamps R2): the
   bulletin is news printed on the page, not a compartment. The night
   board reads rail-flood / overprint / paper letter — the same three
   ranks as day. */
.plbulletin-list {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  border-bottom: 1px solid var(--ink);
  background: transparent;
}
.plbulletin-li {
  display: block;
  max-width: 1004px;
  margin: 0 auto;
}

.plbulletin-row {
  display: grid;
  grid-template-columns: auto minmax(0, 3fr) minmax(max-content, 1fr);
  align-items: start;
  column-gap: 10px; row-gap: 5px; padding: 12px 52px;
  text-decoration: none; color: var(--ink); min-height: 44px; box-sizing: border-box;
}
.plbulletin-li + .plbulletin-li .plbulletin-row { border-top: 1px solid var(--hairline); }
/* THE HOVER LAW (bulletin lamps R4): a hover may never reduce any
   text's contrast below its rest state. The fill hover is struck in
   BOTH lamps (at night every lightening fill lowers light-on-dark
   contrast; by day it was cream-on-cream, doing no work). Hover and
   active on a block-link row underline the trailing link — the link
   law's affordance, zero contrast delta. A row without a destination
   is not an anchor and has no hover at all. */
a.plbulletin-row:hover .plbulletin-link,
a.plbulletin-row:active .plbulletin-link {
  text-decoration: underline; text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.plbulletin-row:focus-visible { outline: 2px solid var(--ink); outline-offset: -2px; }

.plbulletin-mark { color: var(--brass); font-size: 12px; line-height: 19px; }
.plbulletin-mark.posting { color: var(--ink); }  /* ◇ — nothing closes, no brass */
.plbulletin-main { min-width: 0; font-size: 13px; line-height: 19px; }
/* notice leads take G4 (type ruling): sub-heads under the rail's rank */
.plbulletin-lead { font-family: var(--font-display); font-size: var(--g4); letter-spacing: .2em; color: var(--body-muted); line-height: 19px; margin-right: 10px; }
.plbulletin-detail { font-size: 13px; line-height: 19px; }
.plbulletin-body { color: var(--body-muted); }
.plbulletin-body.italic { font-family: var(--font-serif); font-style: italic; font-size: 13.5px; }
.plbulletin-link { font-weight: 600; font-size: 12.5px; white-space: nowrap; color: var(--ink); }
.plbulletin-right {
  justify-self: end; text-align: right; white-space: nowrap;
  line-height: 19px; min-width: 0;
}
.plbulletin-stamp {
  display: inline-block;
  background: var(--stamp); color: var(--cream); font-family: var(--font-mono);
  border: 1px solid var(--ink);  /* the seat-line */
  font-size: var(--m2); letter-spacing: .18em; padding: 3px 5px 3px 7px;
}
.plbulletin-dl { font-family: var(--font-mono); font-size: var(--m1); line-height: 19px; }
.plbulletin-dl-label { color: var(--muted); }
.plbulletin-dl-date { font-weight: 700; }

/* correspondence register: the docket's "yours" treatment verbatim —
   cream fill + 2px ink left rule; the first row divides from the
   public register with a 1px ink rule. */
/* the member letter is paper in both themes (cream fill, 2px ink
   left rule, daylight law inside via the paper re-scope above —
   letters are addressed, not themed; the rule resolves #23211D under
   any lamp because it sits inside the re-scope). 48 + 2px keeps the
   text column at 50 (bulletin lamps R3). */
.plbulletin-row.member { padding-left: 48px; border-left: 2px solid var(--ink); background: var(--cream); }
.plbulletin-row.member.boundary { border-top: 1px solid var(--ink); }
.plbulletin-mem-av { font-size: 13px; line-height: 19px; }
.plbulletin-mem-name { font-family: var(--font-serif); font-weight: 600; font-size: 13.5px; line-height: 19px; }
.plbulletin-row.member .plbulletin-main,
.plbulletin-row.member .plbulletin-detail { font-family: var(--font-serif); font-size: 13.5px; }
/* the letter's kickoff wire speaks the deadline grammar (bulletin
   lamps R6, superseding the Jul 17 all-muted line): the wrapper
   declares no color, so the verb takes --muted from its label class
   and the 700 date inherits the row's re-scoped paper ink — a
   kickoff is a time a member acts by. */
.plbulletin-mem-wire { font-family: var(--font-mono); font-size: var(--m1); line-height: 19px; }

@media (max-width: 720px) {
  .plbulletin-rail-inner { padding: 8px 16px; }
  .plbulletin-list { max-width: none; }
  .plbulletin-row { grid-template-columns: auto minmax(0, 1fr) auto; column-gap: 8px; padding: 11px 16px; }
  .plbulletin-row.member { padding-left: 12px; }  /* + the 2px rule */
  .plbulletin-mark { font-size: 11px; }
  .plbulletin-lead { display: block; margin-right: 0; }
  .plbulletin-mem-name { display: block; }
  /* dated right slots restack to their own indented line under the
     body (the shipped 380 anatomy); the IN SESSION stamp keeps the
     lead line's right. */
  .plbulletin-right.is-date {
    grid-column: 2; grid-row: 2;
    justify-self: start; text-align: left;
  }
}

/* ---- THE TABS (NAVIGATION & TABS, design/design_handoff_nav_tabs
   R1-R7, §8; owner rulings 2026-09-28/29) -------------------------------
   The chip row, made of links: one row directly under the title row
   (the title row's own 20px margin; nothing between them), exactly one
   tab in force. At rest a 1px hairline box, transparent, ink 400; in
   force the ink stamp (--stamp face, cream 700, the 1px var(--ink)
   seat-line: invisible by day, cream at night); hover and active sharpen
   the border to ink (the roster filter's hover); focus-visible the 2px
   ink ring. M1 mono .14em uppercase (wire register). No count, badge,
   dot, slot or glyph rides a tab; zero motion. At the 720 fold the row
   becomes THE TAB MENU (R5): one 44px button whose face is the tab in
   force (M1 700 ink) with the worded fold glyph; opening stamps the
   button (the INDEX's open state) and prints the same links in flow
   beneath it, 48px rows, hairlines between, a 1px ink rule under the
   last, the tab in force between ▸ ◂ (only the button stamps). No
   overlay, no scrim, no shadow. Print: one line of plain ink labels,
   the tab in force at 700. */
.pltabs { display: block; }
.pltabs-fold { display: none; }
.pltabs-list { display: flex; flex-wrap: wrap; gap: 6px; }
.pltabs-list a {
  display: inline-flex; align-items: center; height: 34px; padding: 0 14px; box-sizing: border-box;
  border: 1px solid var(--hairline); background: transparent; color: var(--ink);
  font-family: var(--font-mono); font-size: var(--m1); font-weight: 400; letter-spacing: .14em;
  text-transform: uppercase; text-decoration: none; white-space: nowrap;
}
.pltabs-list a:hover, .pltabs-list a:active { border-color: var(--ink); }
.pltabs-list a:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.pltabs-list a[aria-current="page"] { background: var(--stamp); color: var(--cream); font-weight: 700; border-color: var(--ink); }
.pltabs-ptr { display: none; font-size: 9px; }
@media (max-width: 720px) {
  .pltabs-fold {
    display: flex; align-items: center; justify-content: space-between; width: 100%; height: 44px;
    padding: 0 14px; box-sizing: border-box; border: 1px solid var(--ink); border-radius: 0;
    background: transparent; color: var(--ink); cursor: pointer;
    font-family: var(--font-mono); font-size: var(--m1); font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
  }
  .pltabs-glyph { font-size: 9px; }
  .pltabs-fold:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
  .pltabs.is-open .pltabs-fold { background: var(--stamp); color: var(--cream); }
  .pltabs-list { display: none; }
  .pltabs.is-open .pltabs-list { display: flex; flex-direction: column; gap: 0; border-bottom: 1px solid var(--ink); }
  .pltabs-list a { width: 100%; height: 48px; border: none; padding: 0 14px; gap: 8px; }
  .pltabs-list a + a { border-top: 1px solid var(--hairline); }
  .pltabs-list a:hover, .pltabs-list a:active { border-color: var(--hairline); }
  /* the tab in force is its row, set like every other row: ink 400, no
     fill, between the pointers; only the button stamps */
  .pltabs-list a[aria-current="page"] { background: transparent; color: var(--ink); font-weight: 400; }
  .pltabs-list a[aria-current="page"] .pltabs-ptr { display: inline; }
}
@media print {
  .pltabs-fold { display: none; }
  .pltabs-list, .pltabs.is-open .pltabs-list { display: block; border: none; }
  .pltabs-list a, .pltabs-list a[aria-current="page"] {
    display: inline; height: auto; padding: 0; border: none; background: none; color: var(--ink);
  }
  .pltabs-list a[aria-current="page"] { font-weight: 700; }
  .pltabs-list a + a::before { content: ' · '; font-weight: 400; }
  .pltabs-ptr { display: none !important; }
}
/* a tab's pane: the census seats every shipped block in exactly one */
.pltab-pane[hidden] { display: none !important; }

/* the page-level stack under the row (R8): TEAMS' band and its annex,
   WEEK's wire line — the first seat under the tabs on every tab. A band
   keeps its shipped 18px top margin (14px under the fold's button); a
   section head keeps its own. */

/* ---- THE MASTHEAD LEAGUE NAME (R13, as amended 2026-09-29) --------------
   Opposite the lockup on the wordmark's line, M1 mono 700 ink .14em
   uppercase; plain text for one membership. At ≤720 it drops to its own
   line under the lockup, left-aligned, 8px below. With two or more
   memberships it is the switcher: the same type as a button, `{NAME} ▾`,
   opening a fold in the index menu's anatomy (48px rows, Spectral 13
   .16em uppercase), the current league's row on the brass underline. A
   name two of the member's leagues share prints the 8-character id
   beside it, M2 mute mono. Two stamped states, zero motion. */
.plmast { margin-left: auto; position: relative; }
.plmast-name { font-family: var(--font-mono); font-size: var(--m1); font-weight: 700; letter-spacing: .14em;
  text-transform: uppercase; color: var(--ink); }
.plmast-id { font-family: var(--font-mono); font-size: var(--m2); letter-spacing: .08em; color: var(--muted); margin-left: 8px; }
.plmast-switch { display: inline-flex; align-items: baseline; gap: 0; min-height: 34px; padding: 0 8px; margin-right: -8px;
  background: transparent; border: 1px solid transparent; border-radius: 0; cursor: pointer; color: var(--ink); }
.plmast-glyph { font-size: 9px; margin-left: 8px; }
.plmast-switch:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.plmast.is-open .plmast-switch { background: var(--stamp); border-color: var(--ink); }
.plmast.is-open .plmast-switch .plmast-name, .plmast.is-open .plmast-switch .plmast-glyph,
.plmast.is-open .plmast-switch .plmast-id { color: var(--cream); }
.plmast-menu { position: absolute; right: 0; top: 100%; z-index: 20; width: 300px; background: var(--bar);
  border: 1px solid var(--hairline); box-shadow: 0 2px 12px var(--chrome-shadow); }
.plmast-menu[hidden] { display: none; }
.plmast-menu a { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 48px; padding: 0 16px;
  text-decoration: none; font-family: var(--font-serif); font-size: 13px; letter-spacing: .16em; text-transform: uppercase;
  color: var(--body-muted); }
.plmast-menu a + a { border-top: 1px solid var(--hairline); }
.plmast-menu a:hover { background: var(--shelf-hover); }
.plmast-menu a:focus-visible { outline: 2px solid var(--ink); outline-offset: -3px; }
.plmast-menu a[aria-current="page"] .plmast-rowname { color: var(--brass); border-bottom: 2px solid var(--brass); padding-bottom: 2px; }
.plmast-season { font-family: var(--font-mono); font-size: var(--m1); letter-spacing: .1em; color: var(--muted); margin-left: auto; }
@media (max-width: 720px) {
  .plmast { flex-basis: 100%; margin-left: 0; margin-top: 8px; }
  .plmast-switch { margin-right: 0; padding-left: 0; }
  .plmast-menu { left: 0; right: 0; width: auto; }
}
@media print { .plmast-glyph, .plmast-menu { display: none; } }

/* the before-paint hold (the 404 forward): a shell whose league is not
   the device's stored one keeps its paper unpainted until the identity
   read proves the device a member here (or it forwards) */
.pl-league-check .paper { visibility: hidden; }
