/*===========================================================================
Gateway Chess Proprietary. Do not reproduce without permission in writing.
Copyright © 2026-2026, Gateway Chess League, Inc.  All rights reserved.
===========================================================================*/

/* Tournaments — only the rules the High School League stylesheet (loaded
   first, see index.php/admin.php) doesn't already provide. Colours come
   from that file's own :root custom properties so light/dark mode works
   here without a second theme implementation. */

.t-note {
  color: var(--color-muted-text);
  max-width: 60em;
}

/* Optional admin-entered tournament intro text, live results page only
   (2026-09-30, per the user -- see results.js's own
   tournamentDescriptionHtml()) -- ordinary readable body text (not muted
   like .t-note above), just capped to a comfortable reading width the
   same way .t-note already is. */
.t-tournament-description {
  max-width: 60em;
}

/* Individual-tournament quick-nav row in the shared site header
   (header.php's #header-tournaments-nav, 2026-09-02, per the user) --
   deliberately smaller/muted, same reasoning as .t-jump-nav's own
   treatment on results.php, so it doesn't visually compete with the
   header's own site-wide nav (High School League | Grand Prix | ...)
   right below it. */
.t-header-tournaments-nav {
  font-size: 0.85em;
  color: var(--color-muted-text);
}

.t-header-tournaments-nav a {
  margin: 0 2px;
}

.t-tournaments-list {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 60em;
}

.t-tournament-row {
  padding: 8px 0;
  border-bottom: 1px solid var(--color-border);
}

.t-tournament-name {
  font-weight: bold;
}

/* Leads each row (2026-08-31, per the user) -- plain weight so the bold
   name right after it still reads as the row's primary label. A fixed
   min-width plus right-alignment (2026-09-01, per the user: "vertically
   align the dashes") means the dash immediately after this column (see
   .t-row-dash) lands in the same spot row to row, regardless of how wide
   that row's own date text is -- right-aligning is what matters here:
   min-width alone still lets a *shorter* date's dash drift left, since
   left-aligned text doesn't reach the column's fixed-width right edge. A
   rescheduled row's longer "(rescheduled from ...)" text just grows past
   the min-width instead of being clipped. */
.t-tournament-date {
  display: inline-block;
  min-width: 6.5em;
  flex-shrink: 0;
  text-align: right;
  color: var(--color-muted-text);
}

.t-row-dash {
  flex-shrink: 0;
  color: var(--color-muted-text);
}

/* Date+dash column on the left, vertically centered against the name/site
   text beside it (2026-09-01, per the user). */
.t-row-top {
  display: flex;
  align-items: center;
  column-gap: 8px;
}

.t-tournament-site {
  color: var(--color-muted-text);
}

/* Same left edge as #refrigerator-list-link above the list -- both land
   at the date column's own horizontal midpoint (2026-10-05, per the
   user), so the Flyer/Results line lines up as a column down the page
   instead of under the date column's own full width. See
   #refrigerator-list-link's own comment for the matching 3.25rem. */
.t-row-line2 {
  margin-top: 2px;
  margin-left: 3.25rem;
  font-size: 0.9em;
}

.t-row-line2 > * + * {
  margin-left: 10px;
}

/* Refrigerator List link, above the tournament list (2026-10-05, per the
   user) -- its left edge lands roughly at the horizontal middle of each
   row's own date column (.t-tournament-date, min-width 6.5em, right-
   aligned -- see that rule's own comment), not at the list's left edge.
   An earlier version instead centered this element's own text on the
   row dash (.t-row-dash) via transform: translateX(-50%), but that
   tied the position to this text's own width, so it drifted once the
   text grew past a bare "Refrigerator List" (2026-10-05, per the user,
   after adding the season-label prefix pushed it visibly off). A fixed
   left-edge offset has no such dependency. Uses rem, not em -- see the
   removed transform version's own prior comment on this file's history
   for why: .t-tournament-date's "6.5em" is sized against the row's own
   (body-sized) font-size, but this element has a larger font-size of
   its own, so the same distance written in em here comes out too wide. */
#refrigerator-list-link {
  margin-left: 3.25rem;
}

.t-cancelled .t-tournament-name {
  text-decoration: line-through;
  color: var(--color-muted-text);
}

.t-cancelled-badge {
  color: var(--color-danger);
  font-weight: bold;
  margin-left: 8px;
}

.t-cancelled-reason {
  color: var(--color-muted-text);
  font-style: italic;
  margin-left: 8px;
}

/* A rescheduled date/site is highlighted (2026-08-31, per the user) — the
   new value stands out, the old one is shown small and muted alongside it. */
.t-rescheduled-value {
  color: var(--color-danger);
  font-weight: bold;
}

.t-previous-value {
  color: var(--color-muted-text);
  font-size: 0.9em;
}

/* Admin: Tournaments panel (mirrors Grand Prix admin's own .field-note/
   .checkbox-label rules — duplicated here rather than shared, same
   per-page-CSS convention as Grand Prix's own style.css). */
.field-note {
  color: var(--color-muted-text);
  font-size: 0.9em;
  max-width: 60em;
}

.checkbox-label {
  flex-direction: row !important;
  align-items: center;
  gap: 6px;
}

#tournament-status-reason-row {
  margin-top: 8px;
}

.gp-review-item {
  border: 1px solid var(--color-border-strong);
  border-radius: 8px;
  padding: 10px 14px;
  margin-bottom: 12px;
  max-width: 60em;
  background: var(--color-surface);
}

.gp-review-item h4 { margin: 0 0 6px 0; }

.gp-review-item table { width: auto; margin: 6px 0; }

.gp-review-item .gp-review-choices {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  align-items: center;
  margin-top: 6px;
}

.gp-review-item label {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  gap: 5px;
}

.gp-review-undecided { border-color: var(--color-danger); }

.gp-review-kind {
  font-size: 0.85em;
  color: var(--color-muted-text);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

/* Public results page (2026-08-31): Team Standings / Wall Chart / Cross
   Table per section — wide tables scroll horizontally rather than
   overflowing the page (per every other wide-table page in this app). */
.t-results-section {
  margin-bottom: 2.5em;
}

.t-table-scroll {
  overflow-x: auto;
  max-width: 100%;
}

.t-results-table {
  font-size: 0.9em;
  white-space: nowrap;
}

/* TEST (2026-09-03, per the user: "as a test, let's change the table
   header text color to match the green in the gateway data hub logo") --
   #29723C is the logo's own dominant green (sampled directly from
   logo-datahub.png's non-gray pixels), not a hand-picked approximation.
   Scoped to this page's own results tables only, not the sitewide `th`
   rule (high-school-league/style.css) -- this is explicitly a one-off
   look test, not a site-wide color change, so it's easy to revert if it
   doesn't read well.

   REVISED 2026-09-04, per the user: "change the header rows to be the
   opposite of the page mode. So in light mode use a dark background with
   light text, and in dark mode use a light background with dark text."
   Background reuses the *other* theme's own --color-surface value
   directly (dark mode's #2a2a2a as light mode's header background, and
   vice versa) rather than a new hand-picked tone, so it's a genuine
   theme inversion, not just "a dark color." Text stays on the same green
   family as the original test rather than going plain white/black --
   #29723C itself (the original, unmixed logo green, already confirmed
   >5:1 against a light background by the first version of this rule)
   reads as "dark text" once the header background flips to the
   light-mode-style tone in dark mode.

   REVISED AGAIN 2026-09-04, per the user: "make the light mode header
   text a brighter green" -- light mode's own text was #a9c7b1, a pastel
   tint (same hue, ~72% lightness, only ~21% saturation -- a straight
   white/green mix desaturates as it lightens). #52e077 keeps the same
   hue but pushes saturation to 70% at a slightly lower 60% lightness, so
   it reads as a vivid, saturated green rather than a washed-out pastel,
   while still landing at >8:1 contrast against the #2a2a2a dark-mode
   -style header background (dark mode's own #29723C "dark text" wasn't
   flagged, so it's unchanged). */
/* .t-prize-group-heading td (2026-09-03, per the user: "Change the
   subheaders like 'Team Prize List' to instead be another header row in
   the table itself. Use the same inverse color scheme as the column
   headers") shares this exact rule -- it's a <td>, not a <th> (it sits
   mid-tbody, between groups, where a real <thead><th> can't go), so it
   needs its own selector to pick up the same colors rather than a real
   header cell inheriting them automatically. */
/* :not(.row-header-cell) (2026-09-15, accessibility-fix regression, per
   the user: "Individual standings & wall chart: Player names incorrectly
   have the inverted background of a header") -- the 2026-09-14
   accessibility pass turned each Individual Standings/Wall Chart row's
   own player-name cell from a <td> into a <th scope="row"
   class="row-header-cell"> (a real header is what scope="row" requires),
   and .row-header-cell (high-school-league/style.css, shared) resets a
   plain <th>'s default bold/background back to looking like its sibling
   <td> cells -- but this rule's plain `.t-results-table th` selector has
   higher specificity (class+element vs. .row-header-cell's class alone)
   and was never meant to reach anything but a real <thead> column
   header/.t-table-title/.t-prize-group-heading row to begin with, so it
   was winning that fight and painting every row-header cell with the
   inverted column-header look instead. */
.t-results-table th:not(.row-header-cell),
.t-prize-group-heading td {
  background: #2a2a2a;
  color: #52e077;
}

/* .t-table-title (2026-09-03, per the user, same request as above,
   extended to every table on this page's own title row, not just the two
   Prize List ones): centered, and no border-bottom against the ordinary
   column-header row directly beneath it in the same <thead> -- the
   sitewide `th, td { border-bottom: ... }` rule would otherwise draw a
   thin line across the middle of what reads as one solid two-line header
   bar. The column-header row's own border-bottom (separating it from the
   body rows below) is untouched. */
.t-results-table th.t-table-title {
  text-align: center;
  border-bottom: none;
}

/* Dark mode's own inverted-header background toned down from an earlier
   near-white #f4f4f4 (2026-09-06, per the user: "too bright") to #e6e6e6
   -- still light enough to read as a real inversion against the page's
   dark surroundings, and still >4.5:1 (WCAG AA) against the #29723C text,
   just not glaring. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .t-results-table th:not(.row-header-cell),
  :root:not([data-theme]) .t-prize-group-heading td {
    background: #e6e6e6;
    color: #29723C;
  }
}

:root[data-theme="dark"] .t-results-table th:not(.row-header-cell),
:root[data-theme="dark"] .t-prize-group-heading td {
  background: #e6e6e6;
  color: #29723C;
}

/* TEST (2026-09-03, per the user: "a green gradient background for the
   page ... dark mode would be black fading to dark green and light mode
   would be white fading to light green") -- both green tints are mixed
   from the same logo green (#29723C) as the header-text test just above,
   not independently chosen (light: white + 18% green; dark: black + 40%
   green). Scoped to this page's own <body class="t-results-page">
   (results.php) rather than the shared `body { background: var(--color
   -bg) }` rule (high-school-league/style.css) -- another one-off look
   test, not a site-wide change. Gated on [data-theme] the same way that
   file's own :root color blocks are (theme.js sets it on <html> before
   first paint; the @media block is the matching no-JS progressive
   -enhancement fallback for the same reason theirs has one).

   REVISED 2026-09-04, per the user: a single top-to-bottom fade "doesn't
   quite work on large pages" -- this page's real length (a full
   tournament's worth of team standings/cross table/wall chart per
   section) means most of any one fade's own length is spent near
   whichever end color it started at, barely visible, with the actual
   color change only apparent over a page far longer than any one screen.
   repeating-linear-gradient instead of linear-gradient tiles the same
   two-color fade indefinitely down the whole page, so it stays a visible,
   consistent "back and forth" at any scroll position regardless of the
   page's own total length. Per the user's own sizing spec ("the moving
   diagonal being 1xwidth and 2xlength of standard viewport width"): a
   135deg diagonal band, one full white/black -> green -> white/black
   cycle every 200vw traveled along that diagonal (2x viewport width),
   reaching the opposite (green) color at the halfway point, 100vw in (1x
   viewport width) -- both in real vw units, so it's tied to the actual
   viewport rather than this page's own (narrower, max-width: 1040px)
   content column.

   REVISED 2026-09-05, per the user: "The light mode background gradient
   could get a bit darker" -- light mode's own green endpoint was white +
   18% green (#d8e6dc); bumped to white + 28% green (#c3d8c8), same logo
   green, just a stronger mix.
   REVISED AGAIN 2026-09-05, per the user: "Not quite so dark" -- 28% was
   too much; settled on white + 22% green (#d0e0d4), between the original
   18% and the overshot 28%. Dark mode's own endpoint wasn't mentioned
   either time and is unchanged. */
.t-results-page {
  background: repeating-linear-gradient(135deg,
    #ffffff 0,
    #d0e0d4 100vw,
    #ffffff 200vw);
  /* Covers the full viewport even when the page's own content is shorter
     than it (2026-09-10, per the user: "the background gradient doesn't
     work" on a short page) -- without this, the <body> box (this
     gradient's own background) only extends as tall as its content, and
     the sitewide `body { margin: 40px auto }` rule means it never reaches
     the viewport's own bottom edge on its own either way, leaving a plain
     white/black gap below it down to wherever the real page ends. Some
     slight extra scroll room past 100vh (the sitewide rule's own 40px
     top+bottom margins, outside this box) is harmless and unnoticeable --
     simpler and more robust than hardcoding that 80px into a `calc()`
     here, which would silently drift out of sync if that margin ever
     changes. */
  min-height: 100vh;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .t-results-page {
    background: repeating-linear-gradient(135deg,
      #000000 0,
      #102e18 100vw,
      #000000 200vw);
  }
}

:root[data-theme="dark"] .t-results-page {
  background: repeating-linear-gradient(135deg,
    #000000 0,
    #102e18 100vw,
    #000000 200vw);
}

/* The sitewide default (8px 12px) reads as too much vertical whitespace on
   these longer tables (2026-09-02, per the user) -- same reasoning Team
   Standings/Prize List already got tightened for below, extended here to
   the Individual Standings/Cross Table (no more specific class of its own)
   and the Wall Chart (its own .t-wallchart-row1/row2 rules below trim one
   side further per row so a player's two lines sit close as a pair). Team
   Standings/Prize List each have their own slightly different value below,
   which (equal selector specificity, later in the file) wins over this. */
.t-results-table th,
.t-results-table td {
  padding: 4px 9px;
}

/* Every cell in a row shares one text baseline (2026-09-02, per the user:
   the mono numeric columns kept looking vertically off against the
   proportional-font columns beside them) -- the browser's own per-row
   baseline alignment handles this correctly for whatever font actually
   loads (the ui-monospace stack below resolves to a different real font
   per OS/browser, so a fixed px/em nudge tuned against one of them drifts
   on another), which a fixed offset can't. Default td vertical-align is
   middle, which is what let the taller mono font-size visibly ride
   higher/lower than the surrounding text in the first place. */
.t-results-table td {
  vertical-align: baseline;
}

.t-results-table .t-num {
  text-align: right;
}

/* Grade is a small plain integer, not a stat worth right-alignment or the
   monospace treatment (2026-09-02, per the user) -- centered instead. */
.t-results-table .t-center {
  text-align: center;
}

/* Board tournaments' own Players column (2026-09-08, per the user, mirroring
   the same change already made to the printable output) -- left-justified
   under a left-justified header, matching printable's own td.print-left/
   print-indent (printable_generator.php), rather than this table's usual
   .t-num right-alignment. */
.t-results-table .t-left {
  text-align: left;
}
.t-results-table .t-indent {
  text-align: left;
  padding-left: 1em;
}

/* white-space: nowrap (2026-09-05, per the user) -- "(Rating, Grade)" now
   sits on an expanded cross-section team member's own second line (a
   <br> before this span in results.js), and that line itself must never
   break mid-parenthetical once .t-team-member-detail's own white-space:
   normal (needed so the *name* above it can still wrap on a long one)
   would otherwise let it wrap between "Rating," and "Grade" on a narrow
   column. */
.t-results-table .t-muted {
  color: var(--color-muted-text);
  font-weight: normal;
  white-space: nowrap;
}

/* Same reasoning as .t-prize-table's own width: auto (2026-09-02, per the
   user: "do not stretch wall charts") -- the sitewide table default is
   width: 100%, which stretched this table's own columns out across the
   full page width even though it already scrolls horizontally past a
   handful of rounds. */
.t-wallchart {
  width: auto;
}

/* Wall Charts: every cell vertically centered (2026-09-25, per the user),
   overriding .t-results-table td's baseline alignment above -- with two-line
   players and rowspan cells, middle keeps each cell centered against its
   neighbors. */
.t-wallchart td,
.t-wallchart th {
  vertical-align: middle;
}

.t-wallchart-row1 td {
  border-bottom: none;
  padding-bottom: 2px;
}

.t-wallchart-row2 td {
  border-top: none;
  padding-top: 0;
  color: var(--color-muted-text);
  font-size: 0.9em;
}

.t-round-cell {
  text-align: center;
}

/* Reduced vertical padding on every Score/tiebreak-value cell, across
   every results table except the Wall Chart (2026-09-05, per the user:
   "All tables except wall charts: Reduce the vertical padding between
   the scores and the tiebreak columns"). Every Score/tiebreak <td> on
   this page consistently carries plain .t-num with no .t-mono-num --
   every *other* plain-integer numeric column (Place/Rate/Players/chart
   number/USCF ID) gets .t-num *and* .t-mono-num together instead -- so
   :not(.t-mono-num) reliably targets only Score/tiebreak cells without
   needing to name every table. The Wall Chart never has a td.t-num
   without .t-mono-num at all (its own running-cumulative cells use
   .t-round-cell, not .t-num), so it's naturally excluded here too,
   without an explicit :not(.t-wallchart). Higher specificity than both
   the sitewide .t-results-table td rule above and .t-team-table/
   .t-prize-table's own td overrides below, so this wins regardless of
   source order. */
.t-results-table td.t-num:not(.t-mono-num) {
  padding-top: 2px;
  padding-bottom: 2px;
}

/* Cross Table's own per-round cells, same reduction -- but NOT the Wall
   Chart's (2026-09-05, per the user: "Cross tables: Also reduce the
   vertical padding between rounds") -- both tables' round cells share
   .t-round-cell, so this is scoped by the containing table's own class
   rather than .t-round-cell alone. */
.t-crosstable td.t-round-cell {
  padding-top: 2px;
  padding-bottom: 2px;
}

/* Alternate-row shading (2026-09-03, per the user: "Use the alternate
   shading rows for all tables like what you did for wall charts"), plain
   tr:nth-child on every results table's own tbody -- :nth-child counts
   DOM position regardless of a row's own visibility, so a Team Standings/
   Team Prize List row's expanded member rows (visibility: collapse when
   closed, results.js's teamMemberRowsHtml()/teamPrizeMemberRowsHtml())
   fall into this same alternation automatically, without needing their
   own team-aware logic -- confirmed this is what the user actually wanted
   after an earlier version shaded a whole team + its members as one flat
   block instead: "Expanded team members should also have alternating
   shading" too, same as every other table's own rows.

   --t-row-shade is a translucent black/white *overlay*, not a flat
   --color-surface-alt like this rule's first version (2026-09-04, per the
   user: with the .t-results-page gradient test above now in play, a flat
   color only contrasts well against the one gradient position it happens
   to be closest to -- light mode's #fafafa read as basically invisible
   near the page's own near-white top and only became visible much further
   down once the gradient had drifted away from that tone, and in dark
   mode the gradient's own ending color could coincide with a flat shaded
   -row tone outright). A percentage overlay instead darkens/lightens
   *relative to whatever's directly underneath it*, so it reads as the
   same consistent step at any scroll position and can never land on
   the exact same value as the gradient itself.

   REVISED 2026-09-04, per the user: light mode's overlay was neutral
   black (rgba(0,0,0,...)), which read as "a reddish shade" against the
   .t-results-page gradient's own green -- a true neutral grey placed
   next to a saturated color visually shifts toward that color's
   complement (simultaneous contrast), and green's complement is red, so
   a mathematically-neutral overlay perceptually picked up a red cast
   from its own green surroundings. Tinting the overlay itself green
   (the same #29723C logo green as the rest of this page's tests) instead
   of neutral black removes the clash outright rather than fighting the
   perceptual effect. Dark mode's overlay is untouched (white, not
   flagged as an issue). */
:root {
  --t-row-shade: rgba(41, 114, 60, 0.08);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) {
    --t-row-shade: rgba(255, 255, 255, 0.08);
  }
}

:root[data-theme="dark"] {
  --t-row-shade: rgba(255, 255, 255, 0.08);
}

/* A row-header cell (a <th scope="row"> holding a player/team name) must not
   paint its own copy of the row's translucent shade (2026-09-25, per the
   user: "the player name ... is a different background color") -- the shared
   .row-header-cell rule's `background: inherit` (high-school-league/
   style.css) copies the <tr>'s rgba shade onto the cell, which then stacks on
   the row's own already-painted shade, so the name cell rendered darker than
   its neighbors. Transparent lets the row's one shade show through, same as
   every sibling <td>. */
.t-results-table .row-header-cell {
  background: transparent;
}

.t-wallchart tbody tr:nth-child(4n + 1),
.t-wallchart tbody tr:nth-child(4n + 2),
.t-crosstable tbody tr:nth-child(even),
.t-prize-table tbody tr:nth-child(even) {
  background: var(--t-row-shade);
}

/* Team Standings' own shading can't be plain tr:nth-child at all
   (2026-09-04, per the user: "Unexpanded teams need to be alternate
   color row") -- a collapsed team's own member rows still count toward
   :nth-child's position even though they take no visible space
   (visibility: collapse), so a team's own row lands on whatever parity
   its *predecessors' own member counts* happened to add up to, not a
   clean alternation by team position. results.js now stamps a team's own
   row with .t-row-shade directly (by team index, not DOM position), and
   its member rows with .t-member-shade-a/-b -- "The first expanded player
   changes from that color and alternates from there" (2026-09-04, per the
   user): member 1 is deliberately the opposite of its own team row, then
   alternates normally from there, independent of every other team's own
   member count.

   This does mean an odd-sized team's own last member and the next team's
   row land on the same *logical* alternation slot ("if the number of
   players is odd the last player and the next team will be the same
   color" -- 2026-09-04, per the user, describing the inherent conflict
   between "clean per-team alternation" and "members keep alternating
   from their own team's color": the two can't both hold when a team's
   member count is odd). Per the user's own mitigation ("make the
   expanded player colors slightly different than the overall alternating
   colors"), --t-row-shade-member-a/-b are a *different* pair of overlay
   strengths from --t-row-shade/transparent, not a re-use of the same
   two tones -- so even when a member row and the following team row
   share the same logical slot, they never render as the exact same
   color, just two visibly different, deliberately-adjacent tones.

   Light mode's pair is green-tinted (rgba(41,114,60,...)), not neutral
   black, same reasoning and same fix as --t-row-shade just above (a
   neutral overlay against this page's own green gradient read as
   reddish; dark mode's white overlay wasn't flagged as an issue). */
:root {
  --t-row-shade-member-a: rgba(41, 114, 60, 0.03);
  --t-row-shade-member-b: rgba(41, 114, 60, 0.13);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) {
    --t-row-shade-member-a: rgba(255, 255, 255, 0.03);
    --t-row-shade-member-b: rgba(255, 255, 255, 0.13);
  }
}

:root[data-theme="dark"] {
  --t-row-shade-member-a: rgba(255, 255, 255, 0.03);
  --t-row-shade-member-b: rgba(255, 255, 255, 0.13);
}

.t-team-row.t-row-shade {
  background: var(--t-row-shade);
}

.t-team-member-row.t-member-shade-a {
  background: var(--t-row-shade-member-a);
}

.t-team-member-row.t-member-shade-b {
  background: var(--t-row-shade-member-b);
}

/* Numeric columns get a monospaced font, close in shape to the sitewide
   system-ui but with fixed-width digits (2026-09-02, per the user) --
   Grade is deliberately excluded (it's a plain small integer, not a stat
   worth this treatment). ui-monospace/-apple-system-ish stack is the
   standard "monospaced sibling" of a system-ui sans stack, so digits stay
   visually close to the surrounding text rather than jumping to a
   noticeably different typeface like Courier. Score/tiebreak values (via
   .t-score-int/.t-score-half below) get it through that shared span pair;
   every other plain numeric cell (Place, #, Rate, Players, a Wall Chart
   round's own cumulative total) carries this class directly instead. */
.t-score-int,
.t-score-half,
.t-mono-num {
  font-family: ui-monospace, 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
  /* This stack's digits render visibly smaller than system-ui's at the
     same font-size (2026-09-02, per the user) -- a small bump brings
     their apparent size back in line with the surrounding proportional
     text instead of looking like a shrunken afterthought. Vertical
     baseline alignment against the surrounding proportional text is
     handled by .t-results-table td's own vertical-align: baseline above
     -- not a fixed px/em nudge here, since which real font this stack
     resolves to (and therefore its baseline position within its line
     box) varies by OS/browser. */
  font-size: 1.08em;
}

/* ½-glyph score/tiebreak display (results.js's scoreCellHtml()) -- same
   fixed-width whole/half pair technique, and the same 32px/10px sizing, as
   app.js's own .board-pts-int/.board-pts-half: a tiebreak sum here (Cum/
   CumOp) reaches 3 digits just as easily as a season's board-point total
   does there (e.g. "152"), and a narrower box let a 3-digit value overflow
   into the ½ span right after it. Duplicated under this page's own name
   per the usual per-page convention. */
.t-score-int {
  display: inline-block;
  width: 32px;
  text-align: right;
}

.t-score-half {
  display: inline-block;
  width: 10px;
  text-align: left;
}

.t-expand-col {
  width: 1%;
  white-space: nowrap;
}

/* Team Standings is usually a short table, and the sitewide default
   padding (8px 12px) reads as too much whitespace on it (2026-09-01, per
   the user) -- tightened the same way Grand Prix's own #cross-table-
   container did for a different reason (a much wider table). Tightened
   again 2026-09-02 (per the user) alongside the general .t-results-table
   rule above.
   width: auto (2026-09-06, per the user: "City/state is still too wide on
   live results. Tables should be same as complete results") -- turned out
   not to be enough on its own. .t-results-table sets white-space: nowrap
   table-wide (real reasons elsewhere: numeric/tiebreak columns, the Cross
   Table's own dense grid), which also forces every column here to size to
   its longest single, unwrapped line -- including each expanded team
   member's own roster row, which reuses the Team (Code)/Players column
   slots to show "Name (rating, Section Title)" (teamMemberRowsHtml()/
   teamDivisionMemberRowsHtml() in results.js). That text is long enough
   on real multi-section tournaments (the Grade Tournament especially) that
   width: auto alone still measured out to the full 1000px page width --
   confirmed by force-setting `width: auto !important` directly on the
   table element and finding the computed width unchanged, i.e. genuinely
   content-driven, not a losing CSS rule. .t-team-name (Team (Code)) and
   .t-team-member-detail (that same expanded-roster text) below opt back
   into wrapping specifically, which is what actually lets width: auto
   here mean something. Much more visible on a Live (not yet complete)
   tournament specifically because Team Prize List is suppressed while
   live (same "no prize lists" rule as the per-section one), leaving Team
   Standings as the only, and therefore most obviously oversized, table on
   the page -- though the same oversizing is really there on a complete
   tournament's own Team Standings too, just less noticeable next to an
   already-narrow Team Prize List sitting right above it. */
.t-team-table {
  width: auto;
}
.t-team-table th,
.t-team-table td {
  padding: 4px 9px;
}
.t-team-name {
  white-space: normal;
}
.t-team-member-detail {
  white-space: normal;
}

/* table-layout: fixed (2026-09-06) -- plain width: auto plus per-column
   max-width/white-space: normal (the first attempt at this fix) still
   didn't shrink the table: table-layout: auto's own column-width
   algorithm uses each cell's *unwrapped* preferred width as an input and
   only treats max-width as a ceiling on how much extra room a column can
   be GIVEN, not a floor forcing it to actually wrap when the table has
   room to spare -- confirmed by measuring the Players column still at its
   pre-fix width even after every cell in it had both white-space: normal
   and a real max-width. Fixed layout is what schools-players/index.php's
   own nested roster table ended up needing for the exact same reason (see
   that page's own style.css comment).
   Per-column widths themselves used to live here too, keyed by column
   position (:nth-child). Moved into a real <colgroup>
   (teamTableColgroupHtml(), results.js) instead (2026-09-06, per the
   user: City/State and Players are now three underlying grid columns,
   not two -- a team row's own City/State spans the first two of them
   while an expanded member row instead spans its own name/rating[/
   section] detail across the last two, leaving only the first for that
   row's own team_rank number). No single row has three separate,
   non-spanning cells across that group any more for :nth-child to read a
   per-column width off of (some rows span 1+2 there, others 2+1) -- a
   <colgroup> declares each column's width directly instead, independent
   of which cells in any given row span how many of them. */
.t-team-table {
  table-layout: fixed;
}

/* A team standings row's own expanded roster (results.js's
   teamMemberRowsHtml()) -- real sibling <tr>s of the same table (2026-09-
   02, per the user: its Score/tiebreak columns must align with the team
   row's own), not a separate nested table, so this is row styling rather
   than a second table's worth of rules. Muted color plus a slightly
   smaller size is this page's own version of the progressively-denser-
   per-nesting-level convention (schools-players/style.css's .sp-roster-
   table/.player-games-table pair) applied to a row instead of a table. */
.t-team-member-row {
  color: var(--color-muted-text);
  font-size: 0.9em;
}

/* Collapsed state (results.js's attachTeamExpandHandlers()) -- visibility:
   collapse, not display: none, so the row keeps counting toward this
   table's own column widths while contributing no height (2026-09-02, per
   the user: "columns should not adjust when a team is expanded"). */
.t-row-collapsed {
  visibility: collapse;
}

.t-team-member-row td {
  padding-top: 3px;
  padding-bottom: 3px;
}

/* A board-based member row's own "Board N —" rank cell (results.js's
   teamDivisionMemberRowsHtml()/teamDivisionPrizeMemberRowsHtml()) --
   zeroes this cell's own right padding (2026-09-08, per the user: "Too
   much space on the right side of the em-dash. Both sides should be the
   same... check printable but that looks better"). The em-dash's LEFT-side
   gap is just the one literal space character before it in the rank
   string itself (~8px at this row's own 0.9em font) -- its RIGHT-side gap
   used to be this cell's own right padding *plus* the name cell's left
   padding (9px + 9px = 18px, this table's sitewide .t-team-table td
   padding, far more than a single space character). Dropping this side's
   share leaves just the name cell's own 9px on the right, close enough to
   the ~8px on the left to read as symmetric. Printable's own version of
   this same row never had the problem in the first place -- its cell
   padding is only 3px each side (printable_generator.php's own <style>),
   so the pre-existing asymmetry there was too small to notice.
   Scoped under .t-team-member-row (not just td.t-board-rank alone) to
   out-specificity BOTH .t-team-table td and .t-prize-table td's own
   "padding: 4px 9px" rules -- a board-based Team Prize List row's own
   table carries both classes at once (teamDivisionPrizeListHtml()), and a
   same-specificity plain td.t-board-rank lost to whichever of the two
   happened to come later in this file's own source order. */
.t-team-member-row td.t-board-rank {
  padding-right: 0;
}

.t-jump-nav {
  margin-bottom: 16px;
  color: var(--color-muted-text);
}

.t-jump-nav a {
  margin: 0 6px;
}

.t-jump-nav a:first-child {
  margin-left: 8px;
}

/* Trophy/medal-count inputs on the roster-upload review screen (2026-09-02,
   per the user) -- a bare <input type="number"> defaults to a much wider
   box than these ever need, since none of them run past 4 digits. Same
   `ch`-unit sizing convention as high-school-league/style.css's own
   #roster-body .edit-* inputs.
   (This rule used to also list `.roster-section-indiv-count`/
   `.roster-section-threshold` for the individual-prize-group inputs, but
   those two class names stopped matching anything once the individual
   -prize-groups rework renamed them to `.roster-group-award-count`/
   `.roster-group-threshold` -- turns out harmless: that rework also added
   its own `.roster-prize-group input[type="number"] { width: 5em; }`
   below, which already sizes both current classes on its own, at higher
   specificity than a single-class rule could anyway. Found and reverted
   a redundant-and-inert rename attempt here while fixing the Team
   Divisions inputs just below, which had the same symptom for an
   unrelated, still-real reason.) */
.roster-section-team-count {
  width: 4ch;
}

/* Team Divisions table's own two number inputs (2026-09-05, per the
   user: "team data, like number of players to count for team standings
   ... single digit answers") -- counted-size is a small team-roster
   count (min 2, realistically well under 10) so it gets the same
   treatment as high-school-league/style.css's own #roster-body
   .edit-grade; award-count is the same "how many trophies" question as
   .roster-section-team-count above, so it matches its width instead. */
.roster-division-counted-size {
  width: 3ch;
}

.roster-division-award-count {
  width: 4ch;
}

/* Rating-eligibility min/max inputs (2026-09-04, per the user: "Ratings
   are at most 4 digits, so the box can be smaller") -- same `ch`-unit
   sizing convention as the other narrow number inputs just above. */
.roster-section-rating-min,
.roster-section-rating-max {
  width: 4ch;
}

/* Grade-eligibility min/max inputs (2026-09-05, per the user: "Grade limit
   text boxes way too big. Values go from K to 12") -- these had no width
   rule at all yet, defaulting to a bare <input type="number">'s much wider
   browser default, same symptom as every other never-sized number input
   on this page. 2ch matches the widest real value ("12"); K itself is
   entered as plain 0, same convention as every other grade input
   sitewide. */
.roster-section-grade-min,
.roster-section-grade-max {
  width: 2ch;
}

/* Board-number-override input (2026-09-13, per the user) -- had no width
   rule at all yet, same never-sized-number-input symptom as the grade/
   rating inputs above originally had. */
.roster-section-board-number {
  width: 10ch;
}

/* Tournament Sections panel's own grade min/max inputs (2026-09-13, per
   the user) -- a section defined before any upload (gc_tournament_
   planned_sections), separate markup from the post-upload review
   screen's own .roster-section-grade-min/-max above, so its own width
   rule is needed too. 3ch, one wider than the post-upload version's 2ch
   -- the user's own explicit choice for this panel specifically, not
   assumed to be the same value. */
.planned-section-grade-min,
.planned-section-grade-max {
  width: 3ch;
}

/* Upload Tournament's own two file-picker labels (2026-09-13, per the
   user: "Align the Browse buttons") -- "Tournament File — .ptoz" and
   "Team File — .ptlz" render at different natural text widths, which
   left their Browse buttons starting at two different x positions.
   Fixing the label text to one shared column width, same fix already
   used for .start-mode-option in the High School League stylesheet,
   lines both buttons up regardless of which label text is longer. Widened
   to 230px and pinned to one line (2026-09-13, per the user: "Make the
   cells... wider so the '(optional)' no longer wraps") -- the longer
   "Team File — .ptlz (optional)" text measures ~173px, too close to the
   original 190px column for some real browsers/zoom levels to keep on one
   line; white-space: nowrap guarantees it regardless of exact width from
   here on, rather than relying on the column always being just wide
   enough. */
.upload-file-label strong {
  flex: 0 0 230px;
  white-space: nowrap;
}

/* Prize List (2026-09-01) -- a step denser than the sitewide default,
   same reasoning as .t-team-table just above (a short, simple table).
   width: auto (2026-09-02, per the user: "don't stretch the rows") --
   the sitewide table default is width: 100%, which stretched this
   short/narrow table's rows out across the full page width. */
.t-prize-table {
  width: auto;
}

.t-prize-table th,
.t-prize-table td {
  padding: 4px 9px;
}

/* Roster-upload review screen (admin.php): one row per individual-prize
   group within a section's own table cell (2026-09-03, per the user) --
   stacked rather than side-by-side, since a section can have several
   (one per grade/team-division present in that section's own roster). */
.roster-prize-group {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 4px;
}
/* 5em, wrapping allowed (2026-09-06, per the user: "reduce width of
   'Whole section:' and allow wrapping") -- was a 9em min-width sized to
   fit every possible label (including a long division name + "Division:")
   on one line, which left "Whole section:" -- the shortest, most common
   label (individual_prize_basis = 'section', the default) -- with far
   more reserved space than it ever needs. A real long division name now
   simply wraps to a second line instead of forcing every row's label
   column that wide. */
.roster-prize-group-label {
  min-width: 5em;
  font-size: 0.9em;
  white-space: normal;
}
/* 2em (2026-09-06, per the user: "reduce the width ... by one-third") --
   was 3em (itself already reduced the same day from 5em, "unlikely to
   need more than 2 digits"); a threshold's one decimal place (e.g. "9.5")
   still fits. The header's own "All" fill pair for this column
   (#roster-prize-award-all/#roster-prize-threshold-all, style.css below)
   matches this same width so the header and data boxes actually line up
   instead of the header ones (sized off the shared, wider .roster-all-
   input default) overhanging past their own column. */
.roster-prize-group input[type="number"] {
  width: 2em;
}

/* Per-section Schedule text input (2026-09-06, per the user: "text boxes
   for schedule are too large") -- a bare <input type="text"> with no
   width rule at all defaults to a much wider box than any real schedule
   name ("4 rounds", "Saturday AM") needs; the header's own "All" fill
   version of this same field (.roster-all-input, used for every column's
   All control, not just this one) is left at its own wider width since
   it's shared with other columns whose values can run longer. Cut in
   half again the same day, per the user ("still too wide") -- 10em was
   still more room than a real schedule name needs. */
.roster-section-schedule {
  width: 5em;
}

/* Column "All" fill controls in the roster-upload review's <thead> cells
   (2026-09-06, per the user) -- sits on its own line under the column's
   own label, small/muted so it doesn't compete with the label for
   attention. Every column gets exactly one of these, Individual Prizes
   included -- it fills every grade/division group's own award-count/
   threshold input across the whole column with the same value, same as
   every other column here. */
.roster-all-control {
  display: block;
  font-weight: normal;
  font-size: 0.8em;
  color: var(--color-muted-text);
  margin-top: 3px;
  white-space: nowrap;
}
/* Checkbox-flavored "All" controls (In use / Check grade / Check rating)
   stack the "All" label above the checkbox rather than beside it
   (2026-09-06, per the user) -- narrows the column to the checkbox's own
   width instead of checkbox-plus-label side by side. */
.roster-all-checkbox {
  text-align: center;
}
.roster-all-input {
  width: 4.5em;
}
/* Individual Prizes' own "All" pair overrides the shared 4.5em above
   (2026-09-06, per the user: "align the header boxes with the data
   boxes") -- narrowed to match .roster-prize-group input[type="number"]'s
   own 2em exactly, so the header row's two fill-boxes actually line up
   over the award-count/threshold columns they fill instead of
   overhanging past them the way the wider shared default did. */
#roster-prize-award-all,
#roster-prize-threshold-all {
  width: 2em;
}

/* Individual Prize List sub-heading row (2026-09-03, per the user) -- one
   per grade/team-division group when individual_prize_basis isn't plain
   'section' (results.js's individualPrizeListHtml()), separating each
   group's own winners within the one shared table rather than splitting
   into several small tables. Colors themselves come from the shared
   .t-prize-group-heading td rule alongside .t-results-table th, above --
   just the layout/spacing lives here. */
.t-prize-group-heading td {
  padding: 6px 9px;
  font-weight: bold;
}

/* "How to read..." insets (2026-09-01) -- collapsed by default, same
   <details> pattern the rest of this app already uses for optional
   detail, not a fresh disclosure widget. */
.t-legend {
  margin: 6px 0 14px;
  font-size: 0.9em;
  color: var(--color-muted-text);
}

.t-legend summary {
  cursor: pointer;
  color: var(--color-text);
}

.t-legend-table {
  margin-top: 6px;
}

.t-legend-table td {
  padding: 2px 10px 2px 0;
  border: none;
}

/* Proportional, not monospace (2026-09-15, per the user: "Make the font
   consistent for the following display to the same proportional font")
   -- matches the surrounding legend prose's own font instead of standing
   out as a different typeface. */
.t-legend-code {
  white-space: nowrap;
}

/* USCF ID links (results.js's tUscfCell()) and, since 2026-09-02 (per the
   user: "make results links subtle"), every team/player link on this page
   too (teamLinkHtml()/teamCodeLinkHtml()/playerLinkHtml()) -- same
   blend-in-at-rest, reveal-on-hover treatment as Schools/Players' own
   .sp-subtle-link / Grand Prix's own .gp-subtle-link, duplicated under this
   page's own name per the established per-page convention (not a shared
   class -- see CLAUDE.md's Stack section). */
.t-subtle-link {
  color: inherit;
  /* Was `text-decoration: none` (2026-09-15, accessibility fix, per the
     user -- this page's own copy had missed the same 2026-09-14 fix
     .sp-subtle-link (high-school-league/style.css) already got): at-rest
     links were visually indistinguishable from plain text, so a
     keyboard/touch user (anyone not currently hovering) had no cue this
     was a link at all. A plain underline in the *same* color as the
     surrounding text (not the hover blue) keeps the "blends in" look
     while still being a real, always-visible non-color signal. */
  text-decoration: underline;
}

.t-subtle-link:hover {
  color: #3b7dd8;
}

/* Individual Standings/Cross Table, further reduced (2026-09-02, per the
   user: "reduce font size further") past the sitewide .t-results-table
   0.9em -- this table alone (not Team Standings/Wall Chart) carries the
   most columns (place/name/USCF ID/grade/rate/team/score/tiebreaks/every
   round), so it's the one that benefits most from a smaller step. */
/* width: auto, same reasoning/fix as .t-wallchart's and .t-prize-table's
   own width: auto above (2026-09-05, per the user: "Don't stretch the
   extra games cross tables") -- the sitewide table default is width:
   100%, which was never overridden for this table specifically (unlike
   its siblings), so a small section's own Cross Table (the "Extra Game"
   section -- a handful of players/rounds, real rated games played
   outside a normal tournament round, per wintd_standings.php's own
   sectionType handling) stretched to the page's full width regardless of
   how little content it actually has. A section with many players/rounds
   (High School/Middle School/Elementary) is unaffected in practice --
   its own real content already exceeds any percentage-based width, so it
   scrolls horizontally (.t-table-scroll) either way. */
.t-crosstable {
  width: auto;
  font-size: 0.82em;
}

/* Team column, pinned to fit its own real content exactly (2026-09-05,
   per the user: "Team will only ever be six upper-case characters,
   please reduce the column width accordingly") -- gc_schools.school_code
   is a real varchar(6) column, so 6 is a schema-backed upper bound, not
   just what today's data happens to show. table-layout is auto (the
   sitewide default, unset here), which otherwise sizes each column off
   the content actually present *and* can hand a column extra width from
   whatever the table has left over to distribute -- confirmed visually
   before this change that Team was sitting noticeably wider than its own
   5-character codes needed. `ch` is a genuine "N characters" unit (the
   width of the "0" glyph in this cell's own font), the right sizing tool
   for exactly this ask -- scoped to the Cross Table specifically (its own
   .t-crosstable ancestor), not the Wall Chart's own separate Team column
   -- the user's own wording named this table only. */
.t-crosstable .t-team-code {
  width: 6ch;
  white-space: nowrap;
}

/* City/State column, Team Standings/Team Prize List tables (2026-09-06,
   per the user: "City/State column is too wide") -- same table-layout:auto
   over-widening as the Cross Table's own Team column above, just without a
   schema-fixed length to size exactly to (city_state is a free-typed
   VARCHAR, not a fixed code). Capped rather than pinned, and left to wrap
   onto a second line rather than truncated with an ellipsis, so a longer
   real value (e.g. "Maryland Heights, MO") still shows in full instead of
   silently losing characters. */
.t-city-state {
  max-width: 12em;
  /* white-space: normal (2026-09-06) -- .t-results-table's own table-wide
     nowrap otherwise makes this max-width a no-op: with nowrap, a column
     can never render narrower than its own longest single-line content,
     so this cap only ever engaged when that content already happened to
     be narrower than 12em anyway. */
  white-space: normal;
}

/* Registrations page (2026-09-09, per the user) -- highlighting for an
   unpaid entrant or one who needs a USCF membership (no id at all, or an
   expired one as of the tournament's own event date -- both booleans
   computed server-side, see api/tournament_results.php's own registrations
   branch). Plain hex pairs (light default + dark override), same pattern
   as this file's own header-color rules above, rather than new sitewide
   :root custom properties -- these two colors are only ever used here.
   Scoped to the specific *cell* the problem is about (2026-09-10, per the
   user: "Highlights should only highlight the USCF/Exp date... and the
   Paid? field", not the whole row like the first version of this table
   did) -- results.js applies .reg-cell-needs-uscf to the USCF ID/Exp.
   cells, .reg-cell-unpaid to the Paid cell, and (2026-09-13, per the user)
   .reg-cell-needs-uscf/.reg-cell-unpaid again -- whichever one applies,
   needs-uscf taking priority when both do -- to the "No." cell too, so a
   flagged row is traceable by color alone without reading every column.
   .reg-cell-problem is its own third color now, not a reuse of
   needs-uscf's red -- it marks only the leading Attn column's own cell,
   which by definition can't tell you which specific problem it is (that's
   what the No./USCF/Paid cells' own colors are for), so it stays a
   neutral "look here" flag instead of borrowing one problem's color over
   the other's.
   These three colors are now also the ones api/tournament_registrations_
   export.php's own docx (as literal w:shd fills, not Word's native
   highlighter enum -- see that file's own treg_run() comment for why) and
   printable/printable_generator.php's own inline CSS use, kept in sync by
   hand across all three (2026-09-13, per the user: "Make the highlighting
   colors on all three output pages the same"). */
/* Unpaid changed from a brightened yellow to light blue (2026-09-13, per
   the user: "Change the Paid color to a light blue") -- freed up yellow's
   own hue for the new Attn-only color below instead of the two being
   easily confused. */
.reg-cell-unpaid {
  background: #cfe2ff;
}
.reg-cell-needs-uscf {
  background: #f8d7da;
}
/* Middle-bright orange-yellow (2026-09-13, per the user: "Add a third
   color for only the ATTN column") -- deliberately distinct from both the
   needs-uscf red and the unpaid blue above, so it reads as a plain "this
   row needs a look" flag rather than implying which specific problem. */
.reg-cell-problem {
  background: #ffcc66;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .reg-cell-unpaid {
    background: #1c3a5e;
  }
  :root:not([data-theme]) .reg-cell-needs-uscf {
    background: #4a1f24;
  }
  :root:not([data-theme]) .reg-cell-problem {
    background: #5c4013;
  }
}
:root[data-theme="dark"] .reg-cell-unpaid {
  background: #1c3a5e;
}
:root[data-theme="dark"] .reg-cell-needs-uscf {
  background: #4a1f24;
}
:root[data-theme="dark"] .reg-cell-problem {
  background: #5c4013;
}

/* Same reasoning as .t-wallchart's own width: auto above (2026-09-10, per
   the user: "Do not stretch the rows to the full viewport width") -- the
   sitewide table default is width: 100%. */
.t-reg-table {
  width: auto;
}

/* Header cells didn't carry the same alignment class as their column's own
   data cells (2026-09-10, per the user: "Headers are not aligned with the
   data") -- <th> has no alignment of its own otherwise, so it fell back to
   the browser default (centered) regardless of whatever a data column's
   .t-num/.t-left/.t-center actually used. The sitewide .t-results-table
   .t-num/.t-center/.t-left rules above (line ~372) already target the
   class alone, not `td.t-num` specifically, so they apply to a `<th>`
   with the same class too -- results.js just needed to actually put the
   matching class on both, nothing new needed here. */

.t-reg-jumpnav {
  font-size: 0.9em;
}

.t-reg-legend {
  color: var(--color-muted-text);
  font-size: 0.9em;
}
.t-reg-swatch {
  display: inline-block;
  width: 1em;
  height: 1em;
  vertical-align: middle;
  margin: 0 0.3em 0 1em;
  border: 1px solid var(--color-border);
}
.t-reg-swatch.reg-unpaid {
  background: #cfe2ff;
}
.t-reg-swatch.reg-needs-uscf {
  background: #f8d7da;
}
/* Attn's own swatch (2026-09-13, per the user) -- added alongside the
   other two now that Attn is its own color rather than a reuse of
   needs-uscf's red, so the legend still explains every color a row can
   show. */
.t-reg-swatch.reg-problem {
  background: #ffcc66;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .t-reg-swatch.reg-unpaid {
    background: #1c3a5e;
  }
  :root:not([data-theme]) .t-reg-swatch.reg-needs-uscf {
    background: #4a1f24;
  }
  :root:not([data-theme]) .t-reg-swatch.reg-problem {
    background: #5c4013;
  }
}
:root[data-theme="dark"] .t-reg-swatch.reg-unpaid {
  background: #1c3a5e;
}
:root[data-theme="dark"] .t-reg-swatch.reg-needs-uscf {
  background: #4a1f24;
}
:root[data-theme="dark"] .t-reg-swatch.reg-problem {
  background: #5c4013;
}

/* Bookkeeping-divisions checkbox pane (2026-09-19) -- collapsed by default
   inside its own table cell, per-division checkboxes stacked when open
   rather than wrapping inline across the already-wide Tournament Format
   table. */
.roster-bkdiv-details summary {
  cursor: pointer;
}
.roster-bkdiv-details[open] summary {
  margin-bottom: 0.25em;
}
.roster-bkdiv-option {
  display: block;
  white-space: nowrap;
  font-weight: normal;
}
