/* cogitator/source-check.css v22 */
/* SOURCE health-check page — table of mirrored files, loaded-version badges. */

/* DevAgent71 - 2026-10-14
   What: v22 — the Status column is 140px (was 110): "Deprecated" did not fit
         the 78px left inside the padding, overflowed and could not centre.
         Adopted On gives the 30px (310 -> 280).
   Why:  Jérôme's iPad check: the Status chips were not centred. */

/* DevAgent71 - 2026-10-14
   What: v21 — the mirror list's Adopted On column moves to fourth place
         (source-check.js v21), so the left-aligned column is nth-child(4);
         Status, now fifth, centres like the others.
   Why:  Jérôme's column order (DEV71-12). */

/* DevAgent71 - 2026-10-14
   What: v20 — the mirror list's Loaded date no longer wraps ("2026-09-30"
         broke onto two lines on the iPad): .source-mirrors__dim is nowrap, and
         the Loaded column takes 10px from Adopted (130 / 310).
   Why:  Jérôme's iPad check. */

/* DevAgent71 - 2026-10-14
   What: v19 — NEW .source-check__subheading (the "Mirrors" and "Files in the
         current mirror" headings) and the .source-mirrors table: its own
         class and rules, 950px like the files table. The .source-table rules
         are not reused, because their nth-child pairing is built for that
         table's seven columns. The Current and data-version chips reuse
         .source-table__badge's existing modifiers as they are.
   Why:  v22 stage S8 — SOURCE lists every mirror (source-check.js v16). */

/* DevAgent56 - 2026-09-21
   What: v18 — the twelve copied .ap-modal rules are DELETED. Nothing replaces
         them; army.css owns that family and already reaches this page.
   Why:  🔴 THEY WERE SILENTLY DISABLING EVERY RED CONFIRM IN THE APP. The copy
         is byte-for-byte identical to army.css — all twelve rules checked
         programmatically, zero differences — but army.css also carries the
         --danger modifiers, and a modifier is ONE class, so
         .ap-modal__confirm--danger and .ap-modal__confirm tie at (0,1,0). Ties
         break on document order, and index.html loads source-check.css at
         position 11 against army.css at 4. The copy won, and since the copy
         omits the modifiers, the red was unreachable.

   ⚠ THE v13 HEADER BELOW RESTS ON A FACTUAL ERROR, and it is worth naming
         because the reasoning was otherwise careful. It calls army.css and
         source-check.css "separate, page-scoped stylesheets". They are not
         page-scoped. index.html <link>s all twelve sheets into one document on
         every route, so there is no page for a rule to be scoped to — every
         selector in this file applies everywhere, always. A "local copy" in a
         globally-loaded sheet is not local; it is a global override of whatever
         loaded earlier. That is the whole bug.

   WHAT WAS BROKEN, precisely — four of army.css's five danger rules:
         · .ap-modal__confirm--danger                       (0,1,0) lost the tie
         · .ap-modal__confirm--danger:hover:not(:disabled)  (0,3,0) lost the tie
         · .ap-modal__header--danger                        (0,1,0) lost the tie
         · .ap-modal__cancel--danger:hover, in @media (hover: hover)  (0,2,0)
         Delete Army's red confirm is the visible casualty and has been amber
         since v13 shipped. ⚠ ONE SURVIVED, which is why nobody caught it:
         .ap-modal__cancel--danger:active / --pressed is (0,2,0) against a plain
         (0,1,0) cancel, so it wins on specificity. That is the press feedback on
         a touch device — the state Jérôme actually sees on iPad. The broken hover
         twin only shows on a mouse.

   ⚠ SAFE BECAUSE THIS SHEET IS NEVER LOADED ALONE: grep across /cogitator's
         HTML finds exactly one reference, index.html:127. There is no standalone
         source-check page needing its own chrome. Had there been one, the fix
         would have been to scope these rules to .source-check, not delete them.

   🔴 THE RULE THIS LEAVES BEHIND: never copy a shared primitive into a
         globally-loaded sheet. If a page needs the house look, it already has
         it. If it needs a variant, give the variant its own class name.
   Found: Jérôme, from a Delete button that rendered amber instead of red. */

/* DevAgent52 - 2026-09-18
   What: v17 — .source-check__title-group: align-items: center -> baseline.
         center aligns the button against the h1's full box height, which
         sits the smaller link text noticeably above "Sources"'s own
         baseline (a taller heading's vertical center is higher than a
         shorter line's baseline). baseline lines up the two text
         baselines directly, regardless of the size difference.
   Why:  Jérôme: "just need to lower the link so that it's the same
         baseline as SOURCE". */

/* DevAgent52 - 2026-09-18
   What: v16 — .source-check__changelog-check-status(--ok|--error) (v14/v15)
         is removed outright — the manual button's result now renders in
         ChangelogResultModal (source-check.js v14), reusing .ap-modal__desc
         and .ap-modal__error rather than a page-specific status line. No
         new CSS needed: every class that modal uses was already ported in
         v13 for ChangelogAlertModal.
   Why:  Jérôme: "the link should open the modal that says the
         result—whether it's positive or negative." */

/* DevAgent52 - 2026-09-18
   What: v15 — the changelog-check button moves from its own row at the
         foot of the page to sit beside "Sources". New
         .source-check__title-group (flex, same gap as __refresh-group)
         wraps the h1 and the button inside __title-row's existing
         space-between, so the group sits on the left and __refresh-group
         stays on the right. The now-unused .source-check__changelog-check
         wrapper (the old bottom-row flex container) is removed outright —
         nothing references it any more. __changelog-check-status keeps its
         look but gains margin-bottom: var(--space-3), matching
         __table-toolbar-error, since it now renders as its own full-width
         line under the title row instead of a span beside the button.
   Why:  Jérôme: "move the link next to 'sources' [Check GDC changelog]". */

/* DevAgent52 - 2026-09-18
   What: v14 — .source-check__changelog-check-error (v13, red only) ->
         .source-check__changelog-check-status(--ok|--error): the manual
         button now reports success too ("No new changelog — still at
         version N."), muted rather than red, alongside the unchanged red
         failure look — pairs with source-check.js v12's fix for the
         button giving no feedback at all on a working call that found
         nothing new.
   Why:  Jérôme: "nothing happens when I clicked the link" — the call
         worked, the UI just never said so. */

/* DevAgent52 - 2026-09-18
   What: v13 — Gate 4's changelog-alert modal and its manual "check now"
         link. (1) .ap-modal-backdrop / .ap-modal / __header / __body /
         __desc / __footer / __cancel / __confirm / __error are copied
         VERBATIM from army.css v101 — same values, same tokens, not
         reinvented. Jérôme confirmed this is the house modal pattern
         (ArmyActions.js's EditNameModal/DeleteModal/etc.) and that this
         page should match it rather than grow its own. Only the subset
         this modal actually uses is copied — no __label/__input/__report/
         __warning/--danger variants, since this dialog has no text field,
         no scrolling report and no destructive action. ⚠ THIS IS A LOCAL
         COPY, NOT A SHARED FILE: army.css and source-check.css are
         separate, page-scoped stylesheets (confirmed with Jérôme — no
         global modal sheet exists), so a future restyle of the house modal
         look has to be applied to both files by hand, the same "one copy
         of the words" caution ArmyActions.js already carries for its own
         shared text. (2) .source-check__changelog-check* — the small,
         deliberately unobtrusive link+error pair at the foot of the page
         for the manual "Check for a new changelog" troubleshooting button.
   Why:  Gate 4 — the new-changelog alert modal (Dismiss / Remind Me Next
         Time) and its manual recheck control. */

/* DevAgent52 - 2026-09-18
   What: v12 — two follow-ups from Jérôme's review of the deployed v11/v10
         page. (1) The v11 pairing nudge (var(--space-4) -> var(--space-2)
         on each pair's touching side) still read as "a bit off" rather than
         as a clear grouping — a 4px shift reads as a slightly-missed center,
         not as intentional. Deepened to var(--space-1) on the same six
         sides (cols 2-3, 4-5, 6-7), so the grouped pairs are unambiguous
         and the un-shrunk gaps between groups (and around the standalone
         Title column) read as a real contrast rather than a rounding
         error. This is a real trade-off, not a residual bug: once a cell's
         content is deliberately pulled toward its partner column, that
         cell is no longer sitting at its own true center by design — flag
         in case the current amount still isn't what he pictured. (2) The
         last column's own right edge — the table's outer boundary — gets
         its own explicit padding-right: var(--space-6), independent of the
         pairing logic (which only ever touched its left side). Before this,
         col 7's right padding was the untouched shared var(--space-4), same
         value as col 1's left padding, but Jérôme read the two edges as
         unequal; rather than keep guessing why, this gives the table's
         right edge dedicated, larger breathing room instead of only
         whatever the shared base rule happened to leave.
   Why:  Jérôme's review — "the centering still looks a bit off. Also I
         think it needs extra space at the right of the last UPDATED
         column... the left side has a margin... between the edge of the
         table and the text." */

/* DevAgent52 - 2026-09-18
   What: v11 — column pairing. Jérôme read the tightened (v10) table as
         having off-center date text; the nth-child(3)-(7) centering itself
         is unchanged and correct (re-checked — no competing text-align on
         .source-table__added / .source-table__data-updated, nothing else
         in this file touches it). What was actually missing is grouping:
         each date column sat centered in its own fixed-width box, fully
         disconnected from the column it reports on, which reads as "not
         centered" even though each box genuinely centers its own content.
         Fix is the same for both complaints — the padding on the touching
         side of each pair (Source file|Import Date, Mirror Ver.|Updated,
         Github Ver.|Updated) is cut from the standard var(--space-4) to
         var(--space-2), while the outer side of each pair is left alone.
         That shifts each date's centered text toward its partner column,
         so the table now reads as three grouped pairs plus a standalone
         Title column, instead of seven independently-centered columns.
         Applied to both th and td so header text stays aligned with its
         column's body text. No width, no text-align, changed.
   Why:  Jérôme's review — "the IMPORT DATE column should be closer to the
         json files; the first UPDATED column should be closer to the
         VERSION column; the second UPDATED column should be closer to the
         GITHUB column" — and the same review's "doesn't seem centered". */

/* DevAgent52 - 2026-09-18
   What: v10 — column widths tightened against actual content, from the
         deployed screenshot: 220/260/110/140/110/140/110 (1090px total)
         -> 210/230/100/90/100/120/100 (950px). Biggest cut is Version
         (140->90) — a 3-digit badge was sitting in a column sized for
         something much wider. Github keeps more room than Version (120
         vs 90) because it also holds the recheck icon beside the badge.
         The two date columns and Import Date drop only slightly (110->100)
         — "2026-09-04" was already close to filling 110px, so there was
         little slack to take there. Title and Source file both keep
         their overflow:hidden/ellipsis safety net for whichever entry
         among the 31 is the actual longest. .source-check__content and
         .source-table width both follow, 1090px -> 950px.
   Why:  Jérôme's review — "tighten the width of each column... so that
         everything is a bit neater." */

/* DevAgent52 - 2026-09-18
   What: v9 — .source-check__refresh-group (flex row, small gap) wraps the
         new "Last checked" label and the refresh button together, so both
         sit as one group on the right side of .source-check__title-row.
         .source-check__last-checked is small muted text, matching the
         page's other secondary-text styling (__added, __filename).
   Why:  Jérôme's review — "Last checked: 9/18/26" beside the button. */

/* DevAgent52 - 2026-09-18
   What: v8 — two fixes from Jérôme's review of the deployed Gate 3 page.
         (1) .source-check__table-toolbar (which sat above the table,
         right-aligned, pushing it down) is replaced by
         .source-check__title-row — a flex row holding "Sources" and the
         refresh button together, so the button no longer costs the page
         an extra row of vertical space. .source-check__heading's own
         margin-bottom moves to zero; the row itself carries the spacing
         that used to live on the heading. (2) .source-check__table-toolbar-error
         keeps its name and look (it's still just the failed-check message)
         but now sits on its own line under the title row rather than
         inside the button's flex row.
   Why:  Jérôme's review — the button belongs on the title row, not its
         own row above the table. */

/* DevAgent52 - 2026-09-18
   What: v7 — Gate 3. (1) Two new columns, --data-updated (110px) and
         --available-updated (110px), pushing table + content width
         870px -> 1090px; centering (nth-child 3-7) extended to cover them.
         (2) Version badge modifiers --checking (same neutral look as
         --unchecked — it's transient) and --error (new, var(--amber) family
         — a check that failed is neither a match nor confirmed behind, and
         must read as neither green nor red). (3) .source-check__table-toolbar
         holds the new global "Refresh GitHub repo check" button, right-
         aligned above the table, plus an inline error message that never
         hides the table itself. (4) .source-table__available-wrap /
         __recheck: a small circular per-row recheck control living in the
         Github cell alongside whatever it currently shows. (5)
         .source-table__data-updated styles both new Updated columns —
         same muted small-text look as the existing __added cell.
   Why:  Gate 3 — the global and per-row upstream check controls, and the
         mirror/repo "Updated" columns, all Jérôme's direct requests. */

/* DevAgent52 - 2026-09-18
   What: v6 — two fixes from Jérôme's review. (1) Added .source-check__content
         (width: 870px, margin: 0 auto) wrapping the heading, loading/error
         states and table in source-check.js v6, so the "Sources" title
         shares the table's left edge instead of sitting at the wider
         .source-check__body's own padding edge. Table's own margin: 0 auto
         removed as redundant — its parent is now exactly its width. (2)
         Zebra stripe on even table rows: this session has no record of the
         actual color behind the --surface-lo token, so rather than guess a
         replacement value, tr:nth-child(even) now blends it toward
         --surface with color-mix() instead of using it solid — same token,
         much lower contrast, no new hardcoded color introduced.
   Why:  Jérôme's review — title should align with the table's left edge;
         the alternating row shade read as too strong a contrast. */

/* DevAgent52 - 2026-09-18
   What: v5 — styling round from Jérôme's review. (1) Removed the now-dead
         .source-check__subhead rule (the paragraph it styled was deleted in
         source-check.js v5). (2) .source-check__heading: added
         font-size: calc(var(--text-4xl) * 0.7) — 30% smaller than the base
         h1 size, scoped to this page only. (3) .source-table: added
         margin: 0 auto to center it in .source-check__body, and width
         730px -> 870px to match the widened columns below. (4) Column
         widths: --file 200px -> 260px (+60), --version and --available
         100px -> 140px each (+40); --name and --date unchanged. (5) Added
         nth-child(3)/(4)/(5) centering for both th and td — Import Date,
         Version and Github columns — leaving Title and Source file
         left-aligned.
   Why:  Jérôme's review of the deployed Gate 2 page. */

/* DevAgent52 - 2026-09-18
   What: v4 — .source-check__header ported byte-for-byte from codex.css's
         .codex__header (background: var(--banner); color: var(--banner-text);
         height: var(--header-height); flex row, space-between, padding 0
         var(--space-6); flex-shrink: 0) — NavMenu carries no background of
         its own, so mounting it bare left the charcoal banner missing on
         this page. No other rule changed.
   Why:  Jérôme's review of the deployed Gate 2 page — the header lost its
         black fill because this wrapper was never added. */

/* DevAgent52 - 2026-09-18
   What: v3 — fixed column widths (Jérôme): Name 220px, Source file 200px,
         Date 110px, Version 100px, Version on GitHub 100px — total 730px.
         table-layout: fixed plus five .source-table__col--* rules keyed to
         the <colgroup> added in source-check.js v3. Table width is the exact
         730px sum rather than 100%, so columns hold their given widths
         instead of stretching to fill the body column. Title and file name
         cells get overflow: hidden / text-overflow: ellipsis as a safety net
         against a long faction name or filename breaking the fixed layout.
   Why:  Jérôme's ruling on table layout. */

/* DevAgent52 - 2026-09-18
   What: v2 — renamed from source-page.css. Selectors .source-page* renamed
         to .source-check* to match the renamed component; .source-table* is
         untouched — it was never tied to the old file name.
   Why:  Jérôme's ruling — this page is a check, not a passive view. */

/* DevAgent52 - 2026-09-18
   What: v1 — Gate 2. Page shell, heading and the loaded-file table. The
         badge carries an --unchecked neutral state; --match (green) and
         --behind (red) modifiers are reserved for the upstream-check gate.
   Why:  Session starter DevAgent52 v13. */

.source-check {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

.source-check__header {
  background: var(--banner);
  color: var(--banner-text);
  height: var(--header-height);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 var(--space-6);
  flex-shrink: 0;
}

.source-check__body {
  max-width: var(--app-max-width);
  width: 100%;
  margin: 0 auto;
  padding: var(--space-8) var(--space-6);
}

.source-check__content {
  width: 950px;
  margin: 0 auto;
}

.source-check__title-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  margin-bottom: var(--space-2);
}

.source-check__title-group {
  display: flex;
  align-items: baseline;
  gap: var(--space-4);
}

.source-check__refresh-group {
  display: flex;
  align-items: center;
  gap: var(--space-3);
}

.source-check__last-checked {
  color: var(--text-dim);
  font-size: var(--text-sm);
  white-space: nowrap;
}

.source-check__heading {
  margin-bottom: 0;
  font-size: calc(var(--text-4xl) * 0.7);
}

.source-check__loading {
  display: flex;
  justify-content: center;
  padding: var(--space-12) 0;
}

.source-check__error {
  color: var(--red);
  background: var(--red-light);
  border: var(--border-width) solid var(--red);
  border-radius: var(--radius);
  padding: var(--space-4);
}

/* ----------------------------------------------------------
   TABLE — fixed column widths,
   210 / 230 / 100 / 90 / 100 / 120 / 100 = 950px
   ---------------------------------------------------------- */

.source-check__table-toolbar-error {
  color: var(--red);
  font-size: var(--text-sm);
  margin-bottom: var(--space-3);
}

.source-check__refresh-btn {
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius);
  border: var(--border-width) solid var(--border);
  background: var(--surface);
  color: var(--text-hi);
  font-size: var(--text-sm);
  font-weight: 600;
  cursor: pointer;
}

.source-check__refresh-btn:hover:not(:disabled) {
  background: var(--surface-lo);
}

.source-check__refresh-btn:disabled {
  opacity: 0.6;
  cursor: default;
}

.source-table {
  table-layout: fixed;
  width: 950px;
  border-collapse: collapse;
  background: var(--surface);
  border: var(--border-width) solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}

.source-table__col--name               { width: 210px; }
.source-table__col--file               { width: 230px; }
.source-table__col--date               { width: 100px; }
.source-table__col--version            { width: 90px; }
.source-table__col--data-updated       { width: 100px; }
.source-table__col--available          { width: 120px; }
.source-table__col--available-updated  { width: 100px; }

.source-table th {
  background: var(--banner);
  color: var(--banner-text);
  font-family: var(--font-heading);
  font-weight: var(--heading-weight);
  text-transform: var(--heading-transform);
  letter-spacing: var(--heading-tracking);
  font-size: var(--text-sm);
  text-align: left;
  padding: var(--space-3) var(--space-4);
}

.source-table td {
  padding: var(--space-3) var(--space-4);
  border-top: var(--border-width) solid var(--border);
  font-size: var(--text-base);
}

/* Import Date, Version, Updated, Github, Updated — header and content
   centered. Title and Source file (columns 1-2) stay left-aligned. */
.source-table th:nth-child(3),
.source-table th:nth-child(4),
.source-table th:nth-child(5),
.source-table th:nth-child(6),
.source-table th:nth-child(7),
.source-table td:nth-child(3),
.source-table td:nth-child(4),
.source-table td:nth-child(5),
.source-table td:nth-child(6),
.source-table td:nth-child(7) {
  text-align: center;
}

/* Column pairing (v11, deepened v12) — three pairs, each read as one
   group: Source file with Import Date, Mirror Ver. with its Updated,
   Github Ver. with its Updated. The touching side of each pair is cut to
   var(--space-1) — tight enough to read as one group, not a rounding
   error; the outer side keeps the standard var(--space-4) from
   .source-table th/td above, so the gap between groups (and around the
   standalone Title column) reads as clearly wider than the gap inside a
   group. */
.source-table th:nth-child(2),
.source-table td:nth-child(2) {
  padding-right: var(--space-1);
}

.source-table th:nth-child(3),
.source-table td:nth-child(3) {
  padding-left: var(--space-1);
}

.source-table th:nth-child(4),
.source-table td:nth-child(4) {
  padding-right: var(--space-1);
}

.source-table th:nth-child(5),
.source-table td:nth-child(5) {
  padding-left: var(--space-1);
}

.source-table th:nth-child(6),
.source-table td:nth-child(6) {
  padding-right: var(--space-1);
}

.source-table th:nth-child(7),
.source-table td:nth-child(7) {
  padding-left: var(--space-1);
}

/* The table's own right edge (v12) — dedicated, larger breathing room for
   the last column's outer side, independent of the pairing above (which
   only ever touched this column's LEFT side, to pull it toward Github
   Ver.). Previously this side just fell through to the shared
   var(--space-4) base rule; called out explicitly now that Jérôme read it
   as tighter than the table's left edge. */
.source-table th:nth-child(7),
.source-table td:nth-child(7) {
  padding-right: var(--space-6);
}

.source-table tbody tr:nth-child(even) {
  background: color-mix(in srgb, var(--surface-lo) 30%, var(--surface));
}

.source-table__title {
  font-weight: 600;
  color: var(--text-hi);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.source-table__filename {
  color: var(--text-dim);
  font-size: var(--text-sm);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.source-table__added {
  color: var(--text-dim);
  font-size: var(--text-sm);
  white-space: nowrap;
}

.source-table__badge {
  display: inline-block;
  padding: var(--space-1) var(--space-3);
  border-radius: var(--radius);
  font-size: var(--text-sm);
  font-weight: 600;
  border: var(--border-width) solid var(--border);
}

.source-table__badge--unchecked {
  color: var(--text-dim);
  background: var(--surface-lo);
  border-color: var(--border);
}

.source-table__badge--match {
  color: var(--green);
  background: var(--green-light);
  border-color: var(--green);
}

.source-table__badge--behind {
  color: var(--red);
  background: var(--red-light);
  border-color: var(--red);
}

/* Transient — a check in flight. Same neutral look as --unchecked; it's
   on screen for a moment, not a state worth its own color. */
.source-table__badge--checking {
  color: var(--text-dim);
  background: var(--surface-lo);
  border-color: var(--border);
}

/* The check itself failed (timeout, 429, unreadable) — neither a
   confirmed match nor confirmed behind, so neither green nor red. */
.source-table__badge--error {
  color: var(--amber);
  background: var(--amber-light);
  border-color: var(--amber);
}

.source-table__available {
  color: var(--text-dim);
  font-size: var(--text-sm);
}

.source-table__available-wrap {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
}

.source-table__available-note {
  color: var(--text-dim);
  font-size: var(--text-sm);
}

.source-table__available-note--error {
  color: var(--amber);
}

.source-table__recheck {
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border-radius: 50%;
  border: var(--border-width) solid var(--border);
  background: var(--surface);
  color: var(--text-dim);
  font-size: var(--text-sm);
  cursor: pointer;
}

.source-table__recheck:hover:not(:disabled) {
  background: var(--surface-lo);
  color: var(--text-hi);
}

.source-table__recheck:disabled {
  opacity: 0.5;
  cursor: default;
}

.source-table__data-updated {
  color: var(--text-dim);
  font-size: var(--text-sm);
  white-space: nowrap;
}

/* ----------------------------------------------------------
   CHANGELOG WATCHER (Gate 4, v13)
   ---------------------------------------------------------- */

/* The manual "Check GDC changelog" link — deliberately small and quiet
   beside the "Sources" title (.source-check__title-group). This is a
   troubleshooting control, not a primary one; the automatic on-mount check
   is what normally matters. */
.source-check__changelog-check-btn {
  padding: 0;
  border: none;
  background: none;
  color: var(--text-dim);
  font-size: var(--text-sm);
  text-decoration: underline;
  cursor: pointer;
}

.source-check__changelog-check-btn:disabled {
  opacity: 0.6;
  cursor: default;
}

/* ⚠ THE .ap-modal FAMILY WAS REMOVED HERE AT v18. army.css owns it, loads
   first, and reaches this page like every other — see the v18 header. Do not
   copy it back. */


/* ----------------------------------------------------------
   MIRROR LIST (v19)
   90 / 110 / 130 / 280 / 140 / 100 / 100 = 950px
   ---------------------------------------------------------- */

.source-check__subheading {
  margin: var(--space-6) 0 var(--space-3);
  font-family: var(--font-heading);
  font-weight: var(--heading-weight);
  text-transform: var(--heading-transform);
  letter-spacing: var(--heading-tracking);
  font-size: var(--text-lg);
  color: var(--text-hi);
}

.source-mirrors {
  table-layout: fixed;
  width: 950px;
  border-collapse: collapse;
  background: var(--surface);
  border: var(--border-width) solid var(--border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}

.source-mirrors__col--id      { width: 90px; }
.source-mirrors__col--version { width: 110px; }
.source-mirrors__col--loaded  { width: 130px; }
.source-mirrors__col--current { width: 140px; }
.source-mirrors__col--adopted { width: 280px; }
.source-mirrors__col--count   { width: 100px; }

.source-mirrors th {
  background: var(--banner);
  color: var(--banner-text);
  font-family: var(--font-heading);
  font-weight: var(--heading-weight);
  text-transform: var(--heading-transform);
  letter-spacing: var(--heading-tracking);
  font-size: var(--text-sm);
  text-align: center;
  padding: var(--space-3) var(--space-4);
}

.source-mirrors td {
  padding: var(--space-3) var(--space-4);
  border-top: var(--border-width) solid var(--border);
  font-size: var(--text-base);
  text-align: center;
  vertical-align: middle;
}

.source-mirrors th:nth-child(4),
.source-mirrors td:nth-child(4) {
  text-align: left;
}

.source-mirrors tbody tr:nth-child(even) {
  background: color-mix(in srgb, var(--surface-lo) 30%, var(--surface));
}

.source-mirrors__id {
  font-weight: 600;
  color: var(--text-hi);
}

.source-mirrors__dim {
  color: var(--text-dim);
  font-size: var(--text-sm);
  white-space: nowrap;
}

/* The adopted date, then the backup the adoption names, on its own line. */
.source-mirrors__adopted {
  font-size: var(--text-sm);
  color: var(--text);
}

.source-mirrors__backup {
  margin-top: 2px;
  color: var(--text-dim);
  font-size: var(--text-xs);
  overflow-wrap: anywhere;
}

.source-mirrors__count {
  font-variant-numeric: tabular-nums;
}

.source-mirrors__unversioned td {
  color: var(--amber-dim);
  font-weight: 600;
}
