MediaWiki:Common.css: Difference between revisions

Content deleted Content added
No edit summary
No edit summary
 
(177 intermediate revisions by the same user not shown)
Line 4:
Logged-in overrides live in MediaWiki:Group-user.css
MANAGED WHOLESALE: replace the entire page from the canonical file
(temptools/designwiki/common_css_cleanpages/MediaWiki-Common.css in the repo) — no incremental block pastes.
block pastes.
Color/typography authority: SECTION 12 owns all heading, link,
footer, table and AI-panel colors; earlier sections are structure.
Line 115 ⟶ 116:
by section 12) --- */
.infobox {
color: black; padding: 0.2em;
line-height: 1.5em; border-spacing: 3px;
}
Line 243 ⟶ 244:
font-weight: 700;
line-height: 1.4;
color: #202122var(--text-dark) !important;
text-decoration: none !important;
cursor: pointer;
Line 1,074 ⟶ 1,075:
--wt-xl: 24em;
--wt-xxl: 39em;
/* row-label indent step — the wt-indent-N classes multiply it; tunable here
/* palette (section 12 re-points these onto the warm ramp) */
(not baked inline), so a change applies to every class-based page, no re-render */
--wt-border: #eceef1;
--wt-ruleindent-step: #72777d1.5em;
/* NB: this block is STRUCTURAL tokens only — every color token (ink,
--wt-edge: #dadde1;
accent, --wt-th-bg) lives in section 12's :root, the single color
--wt-th-bg: #f6f7f9;
authority. §11 no longer renders standalone; the sheet is managed
--wt-th-text: #54595d;
wholesale, so the old standalone-then-theme split is retired. */
--wt-pad-y: 0.5em;
}
Line 1,085 ⟶ 1,087:
/* ── Theme: EVERY wikitable, any type ── */
.wikitable { width: 100% !important; }
 
/* ── Chunk Info (summary Phase 3): per-chunk tags + data-items box.
Infobox geometry — narrow right float in the data voice — as the
ONE exception to the full-width wikitable clamp above (higher
specificity carries the !important override). Emitted by the
summary renderer as class-only markup. ── */
.mw-parser-output table.chunkinfo {
width: var(--ed-infobox-w) !important;
min-width: 0 !important;
/* the list-geometry rule positions every li (for the ::before markers),
and positioned boxes paint ABOVE floats — bullets flowing beside the
box were swallowing its clicks. Lift the box one stacking level. */
position: relative;
z-index: 1;
}
@media (min-width: 640px) {
.mw-parser-output table.chunkinfo {
float: right; clear: right;
margin: 0.5em 0 0.5em 1em;
}
}
 
table.wikitable {
font-size: 0.85em;
border: 1px solid var(--text-dark);
background-color: #fff;
border: 1px solid var(--wt-border);
font-variant-numeric: tabular-nums;
margin-top: 0.3em;
margin-bottom: 2em;
}
/* (td/caption backgrounds + caption typography are owned by §12) */
table.wikitable td { background-color: #fff; }
table.wikitable caption {
text-align: left;
font-weight: bold;
background-color: #fff;
padding-bottom: 0.45em;
}
table.wikitable > tr > th,
table.wikitable > tr > td,
table.wikitable > * > tr > th,
table.wikitable > * > tr > td {
border: 1px0; solid var(--wt- /* inner grid removed. NOT `transparent` — under border);-collapse a
transparent border reveals the white table bg, which shows as white
lines over the tinted header/hover rows. border:0 = truly no line;
frame + header-divider are set explicitly on edge cells and win. */
padding: var(--wt-pad-y) 0.6em;
}
table.wikitable > * > tr > th {
background-color: var(--wt-th-bg);
color: var(--wt-th-text-dark); /* header cells are emphasized (bold) → dark */
}
table.wikitable > * > tr:first-child > th,
table.wikitable > * > tr:first-child > td { border-top: 1px solid var(--wttext-ruledark); }
/* the ONE header divider — PURE header rows only (`:not(:has(> td))`).
table.wikitable > * > tr:has(> th):has(+ tr > td) > th { border-bottom: 1px solid var(--wt-rule); }
Transcript tables carry the printed row LABELS as <th> inside data rows;
without the guard every label cell drew its own dark underline (broken
segments down the first column). Interior all-<th> band rows (one framed
table with repeated section headers) still get the divider, as printed. */
table.wikitable > * > tr:has(> th):not(:has(> td)):has(+ tr > td) > th { border-bottom: 1px solid var(--text-dark); }
table.wikitable > * > tr:last-child > td,
table.wikitable > * > tr:last-child > th { border-bottom: 1px solid var(--wttext-ruledark); }
/* a top rule ABOVE emphasized (strong/bold) rows — they are sums or section
headers, so a hairline above them improves readability. :has() gives it a
higher specificity than the base border:0, so it wins on the interior; the
first-row frame (ink) still outranks it, so a strong first row
keeps the medium frame rather than a doubled line. Collapses cleanly with the
header divider (same ink) when a strong row sits right under a header.
Every pipeline now marks a bold row the same way — '''bold''' -> <b>/<strong>
(wikitable.py wraps total rows; the SEC path no longer emits inline
font-weight:bold), so one selector covers them all. */
table.wikitable > * > tr:has(b, strong) > th,
table.wikitable > * > tr:has(b, strong) > td {
border-top: 1px solid var(--text-dark);
}
 
table.wikitable > tbody > tr:hover > td { background-color: #f8f9fa; }
Line 1,148 ⟶ 1,185:
table.wikitable:has(.col, .col-wide) td:not(:first-child) { min-width: var(--wt-s); }
 
/* frozen row-label column. */white-space:normal (NOT nowrap) with a max-width
cap: a normal label keeps to one line as long as it fits (auto table layout
sizes the column to its content), but a runaway label — e.g. a long note
that ends up in the cell — WRAPS at ~2/3 of the table instead of forcing a
giant one-line column that pushes the data off-screen. overflow-wrap breaks
an unbreakable token. min-width keeps it from collapsing too narrow. */
table.wikitable.fintable th:first-child,
table.wikitable.fintable td:first-child,
table.wikitable:has(.col, .col-wide) th:first-child,
table.wikitable:has(.col, .col-wide) td:first-child {
white-space: nowrapnormal;
max-width: 66%; /* hard cap: never hog more than ~2/3 */
overflow-wrap: anywhere;
min-width: 16em;
position: sticky;
left: 0;
z-index: 1;
box-shadow: 1px 0 0 var(--wttext-edgedark);
}
table.wikitable.fintable td:first-child,
Line 1,181 ⟶ 1,225:
left: var(--wt-xs);
z-index: 1;
box-shadow: 1px 0 0 var(--wttext-edgedark);
background-color: #fff;
}
Line 1,187 ⟶ 1,231:
table.wikitable.wt-freeze-2 td:first-child { background-color: #fff; }
table.wikitable.wt-freeze-2 th:first-child { background-color: var(--wt-th-bg); }
 
/* ── wt-bleed add-on: a .fintable that BREAKS OUT to the right instead of scrolling in its wrapper — it
differs from plain fintable ONLY in the overflow. A wide .wt-bleed table paints past the content edge at
its natural width and the PAGE gains a horizontal scroll (default MediaWiki wide-table behavior) instead
of a per-table scrollbar. There are TWO scroll wrappers to neutralise — both via :has(…wt-bleed) +
!important (which beats their inline / script-set overflow):
1. the emitter's inline <div style="overflow-x:auto"> (Module:TermMap table_open), and
2. .copy-table-scroll — a SECOND scroll container the copy-table gadget injects (by JS, ~1s after
load) as the table's DIRECT parent. Without overriding it too, the table briefly breaks out then
SNAPS BACK the moment the gadget wraps it.
Everything else — column widths, frame, header tint, the frozen first column — stays exactly fintable.
The TOC is in the left grid column, so a right-edge breakout never reaches it. Apply by adding `wt-bleed`
to the table class (Module:TermMap does this for the Datacheck review tables). ── */
.mw-parser-output div[style*="overflow-x"]:has(table.wikitable.wt-bleed),
.copy-table-scroll:has(table.wikitable.wt-bleed) {
overflow-x: visible !important;
}
 
@media screen and (max-width: 719px) {
Line 1,194 ⟶ 1,255:
table.wikitable > tbody > tr > th,
table.wikitable > tbody > tr > td {
border: 1px0; solid var /* inner grid removed (--wt-border:0, not transparent); */
}
}
 
/* =================================================================
12. EDITORIAL DESIGN SYSTEM v11v12 ("paperflat & inkmono")
Appended LAST deliberately: later rules of equal specificity win,
so this section restyles typography / color / spacing WITHOUT
editing sections 1-11. (itThis evensection re-pointsis sectionthe SINGLE COLOR 11'sAUTHORITY --wt-*
every color variablestoken fromlives herein — a laterits :root; wins).sections Delete1-11 theare wholestructure.
v12: ONE font (STIX Two Text), ONE ink (#0d0d0d for all text AND
section to revert.
lines), coral for interaction only, square corners, flat controls.
v11: full-sheet cleanup — sections 7/8 stripped to structure (this
sectionThe isv11 thewarm-gray-ramp single+ colorserif/sans authority);split TOC blockwas consolidated away
2026-07 — see git history for the old system.
(numbers in a fixed right-aligned gutter, "0." on Beginning,
inline chevron, no rails).
================================================================= */
 
/* ── WebfontWebfonts: SourcePT Serif 4is (variable;THE ONEsite fileface covers(static 400-600)./700 + italics —
deliberately NO 600: semibold requests snap to true 700, giving
@font-face is safe anywhere in ResourceLoader output — never use
headers/totals/labels their firm contrast). STIX Two Text stays
@import here (gadget CSS is concatenated BEFORE Common.css and
breaksloaded it,as perglyph T165040)fallback. If the @font-face failsis tosafe load,anywhere Georgiain
ResourceLoader output — never use @import here (gadget CSS is
takes over seamlessly. Production hardening: copy the two woff2
concatenated BEFORE Common.css and breaks it, per T165040).
files to the S3 bucket and swap the URLs. ── */
Georgia is the offline fallback. Production hardening: self-host
the woff2 files on the S3 bucket. ── */
@font-face {
font-family: "SourcePT Serif 4";
font-style: normal;
font-weight: 400 600;
font-display: swap;
src: url(https://fonts.gstatic.com/s/sourceserif4ptserif/v14v19/vEFF2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6kDXr4EJRVQgYoZZY2vCFuvAFWzr8.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "SourcePT Serif 4";
font-style: normal;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ptserif/v19/EJRSQgYoZZY2vCFuvAnt66qSVys.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "PT Serif";
font-style: italic;
font-weight: 400 600;
font-display: swap;
src: url(https://fonts.gstatic.com/s/sourceserif4ptserif/v14v19/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pRl9tDMQCEJRTQgYoZZY2vCFuvAFT_r21cg.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "PT Serif";
font-style: italic;
font-weight: 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ptserif/v19/EJRQQgYoZZY2vCFuvAFT9gaQZynfoA.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "STIX Two Text";
font-style: normal;
font-weight: 400 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/stixtwotext/v18/YA9Vr02F12Xkf5whdwKf11l0p76Miw.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "STIX Two Text";
font-style: italic;
font-weight: 400 700;
font-display: swap;
src: url(https://fonts.gstatic.com/s/stixtwotext/v18/YA9Lr02F12Xkf5whdwKf11l0p7u8idfU.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
 
/* ── Design knobs — the v12 FLAT MONO system. ONE font, ONE ink, ONE
accent:
ONE gray ramp (3 grays + 2 hairlines), ONE small size, ONE sans.
--ed-font = STIX Two Text everywhere (prose, headings, data,
The --wt-* lines re-point section 11's table palette onto the
chrome). There is no serif/sans split anymore.
same warm ramp (this :root is later, so it wins the tie). ── */
--text-dark = THE ink: all text AND all lines/borders/frames.
Hierarchy is carried by size, weight, and space —
never by gray shades.
--ed-accent = coral, INTERACTION ONLY: link-underline hover,
focus rings, control hover borders.
--ed-underline = the one non-ink gray: resting link underlines,
quiet by design so the coral hover reads as a jump.
ONE body size, ONE small size. h3+ have NO rules (h1 carries the one
dark title rule). Historical note: v11 ran a warm 3-text/3-line gray
ramp and a serif/sans split — collapsed 2026-07 (see git history for
the old values). ── */
:root {
--ed-seriffont: "SourcePT Serif", "STIX Two 4Text", Georgia, "Times New Roman", serif;
--text-dark: #0d0d0d; /* THE ink: all text + all lines */
--ed-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Inter", Helvetica, Arial, sans-serif; /* = Vector/Codex chrome stack */
--ed-ink: #2b2926; /* text, headings, strong rules */
--ed-secondary: #66605c; /* labels, standfirst, TOC, footer links */
--ed-faint: #807973; /* page refs, list markers, footer body */
--ed-hairline: #e7e2db; /* light warm line (infobox frame) */
--ed-hairline-strong: #d6d0c8; /* stronger warm line (panel frame) */
--ed-link: #0d7680; /* interactive teal: links, focus, send */
--ed-underline: #ccc1b7; /* resting link underline tint */
--ed-accent: #f07662; /* house coral — hoverinteraction underline, sparingonly */
--ed-paper: #fbfaf7fff; /* page canvas (set #fff to disable the tint) */
--ed-infobox-w: 18.5rem; /* infobox total width (border-box). */NB: prose
is FULL WIDTH (default MediaWiki flow around
--ed-measure: calc(100% - var(--ed-infobox-w)); /* prose ends ON the infobox border */
--ed-body: 1rem; /* body size (16px the float) — the "90%old zoom"--ed-measure preference)prose */cap
was retired 2026-07 */
--ed-small: 0.8125rem; /* THE small size: tables, infobox, TOC, footer */
--ed-body: 1.0625rem; /* body size — 17px, user-validated with PT Serif
(inherited from the STIX x-height compensation;
kept deliberately: "renders fine") */
--ed-small: 0.875rem; /* THE small size: tables, infobox, TOC, footer — 14px */
--ed-h-ratio: 1.15; /* HEADING LADDER — GEOMETRIC: each level is the
one below × this ratio (h6 = body ×1, h5 ×r,
h4 ×r², h3 ×r³, h2 ×r⁴ ≈ 17/19.6/22.5/25.9/
29.7px). A constant RATIO, not a constant
increment: size perception is ratio-based, so
an arithmetic ladder (+0.2 each) compresses at
the top — h2/h3 would sit only 12% apart while
h5/h6 sat 20% apart. h6 is anchored AT body
size (it is the chunk/unit heading, and table
captions twin it); h1 stays off the ladder at
2.4rem — page identity, with the one dark rule
(leaves h1/h2 ≈ 1.29 of separation).
Expressed as repeated multiplication of
--ed-body, NOT em: an em resolves against a
parent's size and would silently scale inside
tables/divs. */
--ed-title-gap: 2.1rem; /* CALIBRATION: moves the title rule DOWN */
--ed-listheading-indentgap: 1.2rem4rem; /* per-levelspace indentBEFORE =h2 AND h3 — the marker-to-textSAME for both (rem, not stepem,
(rem,so NOTthe emtwo gaps anstay emequal offsetin wouldpx resolvedespite different heading
againstsizes); each~2x marker'sthe ownold font-sizeh3 space (was 1.8em ≈ 32px) */
--ed-list-indent: var(--ed-body); /* per-level indent = marker-to-text step, tied to the
BODY size (1em = 16px) — a clean typographic ratio that the
table's first-column labels also align to (see section 12).
Still rem-based (via --ed-body), NOT em — an em offset would
resolve against each marker's own font-size. */
 
/* table header fill — white: headers carry no tint; the header-row rule
/* section 11's table palette, warmed onto the same ramp.
+ semibold text do the work. NB: row-hover does NOT read this token
--wt-rule is the table FRAME: deliberately lighter than the ink
(white would kill the highlight) — hover uses a literal neutral gray. */
h2 rules so tables sit below section structure in the hierarchy */
--wt-borderth-bg: #ece8e1fff;
--wt-rule: #b3aca3;
--wt-edge: var(--wt-border); /* ONE hairline tone for interior edges */
--wt-th-bg: #f3efe8;
--wt-th-text: var(--ed-secondary);
}
 
/* ── Canvas: warm paper everywhere — page, the header band Vector
paints white on its own, the TOC column, and the TOC's
scroll-fade overlay ── */
Line 1,281 ⟶ 1,400:
background-color: transparent !important;
}
/* Scrollbars: webkit-styled — square thumb, NO arrow buttons, transparent
track. Deliberately NO standard scrollbar-width/color in this sheet:
modern Chrome ignores every ::-webkit-scrollbar-* rule on an element that
also has a standard scrollbar property set, so the two systems cannot mix
(cost two debugging rounds). EXCEPTION — the sticky TOC scroller: Vector
pins a standard scrollbar prop on it directly, locking it to the
uncontrollable standard path (no square corners, no button removal
possible there) — so its bar is HIDDEN outright instead; wheel/trackpad
scrolling is unaffected. Firefox gets UA-default scrollbars. */
#vector-toc, .vector-toc { scrollbar-width: none !important; }
::-webkit-scrollbar { width: 5px !important; height: 5px !important; } /* discreet but still draggable */
::-webkit-scrollbar-track { background: transparent !important; }
::-webkit-scrollbar-button { /* no arrow buttons */
display: none !important;
width: 0 !important;
height: 0 !important;
}
::-webkit-scrollbar-thumb {
background: var(--text-dark) !important;
border-radius: 0 !important; /* square, like the buttons */
}
::-webkit-scrollbar-corner { background: transparent !important; }
/* Minerva (mobile skin) paints its own white wrappers over body */
#mw-mf-page-center, .mw-body { background-color: var(--ed-paper) !important; }
Line 1,298 ⟶ 1,439:
.vector-column-end { display: none !important; }
 
/* ── MobileONE (Minerva)font keepsfor ONEeverything: lightinterface linechrome, toneprose, inand tablesdata all everyshare
--ed-font (form controls don't inherit it — they get it explicitly
structural table line consumes --wt-rule, so one override
simplifieswhere frame,they're header rule, and side rails at oncestyled) ── */
.skin-minervabody { font--wt-rulefamily: var(--wted-borderfont); }
 
/* ── Tagline ("Unleashing intelligence", the .mw-logo::after): NO underline
/* ── ONE sans: the whole interface (header, search, tagline, buttons,
and NO hover effect — it reads as branding, not a link (resting ink is
footer) and all data share the Codex stack; prose re-asserts the
serifset belowin §3; the logo still navigates home on click). ── */
body { font-family: var(--ed-sans); }
 
/* ── Logo on the titleTOC axis:. pushMeasured it right byon the TOClive columnDOM +(1120px gridviewport):
TOC label x=48, header-start x=44, Vector's default .mw-logo
gap at Vector's own grid breakpoints, so the logo + tagline sit
exactlymargin-left:20px aboveput the pagelogo titleat x=64. Below44 1120px+ the4 TOC= column48 does→ margin 4px.
Empirical at this breakpoint — re-measure if Vector's grid padding
not exist, so no offset. ── */
ever changes. (The old title-axis push is removed.) ── */
@media (min-width: 1120px) { .mw-logo { margin-left: calc(12.25rem + 24px); } }
.vector-header-start .mw-logo,
@media (min-width: 1680px) { .mw-logo { margin-left: calc(15.5rem + 24px); } }
.mw-logo { margin-left: 4px !important; } /* !important: Vector pins its own
20px on a more specific selector */
 
/* ── Prose voice: serif, warm ink (Minerva has no .mw-body-content —
Line 1,319 ⟶ 1,461:
.mw-body-content,
.skin-minerva #bodyContent.content {
font-family: var(--ed-seriffont);
font-size: var(--ed-body);
line-height: 1.6;
color: var(--edtext-inkdark);
font-variant-numeric: lining-nums;
}
/* prose runs FULL WIDTH (default MediaWiki flow, wrapping around the
/* readable measure for prose; data/tables stay full width */
floated infobox) — the old --ed-measure cap is retired */
.mw-parser-output > p,
.mw-parser-output > ul,
.mw-parser-output > ol,
.mw-parser-output > dl { max-width: var(--ed-measure); }
/* nested paragraphs too (hand-written page structures); table cells released */
.mw-parser-output p { max-width: var(--ed-measure); }
.mw-parser-output table p { max-width: none; }
/* guards: the data voice stays sans at the ONE small size — otherwise the
serif body size would silently scale section 11's 0.85em tables (and
every em-based column width) */
table.wikitable, .infobox {
font-family: var(--ed-sansfont);
font-size: var(--ed-small);
color: var(--text-dark); /* the data voice shares the one ink */
}
/* lighter bold in tables: the browser default 700 (header th + the <b>/<strong>
subtotal rows) reads too heavy in the sans data voice — 600 semibold is ample
emphasis */
table.wikitable th,
table.wikitable b,
table.wikitable strong { font-weight: 600; color: var(--text-dark); } /* emphasized cells: dark + semibold */
 
/* ── The table BLOCK ──
Line 1,345 ⟶ 1,488:
in a FINTABLE only the sticky first column stays opaque (it
must cover scrolling content) in the paper color; hover warms.
2. Full frame in --wt-ruleink. Sides: the RIGHT rail is a plain
border on the last-column cells. On a NEUTRAL table the LEFT
rail is a plain table border (nothing is sticky); on a
Line 1,356 ⟶ 1,499:
of "financial table", repeated verbatim.
3. The table's outer margins move to the scroll WRAPPER so the
horizontal scrollbar hugs the bottom rule,. and── the scrollbar*/
itself goes thin + warm. ── */
table.wikitable,
table.wikitable td,
table.wikitable caption { background-color: transparent; }
/* row hover comes from §11 (#f8f9fa); the frozen first column carries its
table.wikitable > tbody > tr:hover > td { background-color: #f2ede5; }
own paper bg (below) at higher specificity, so it needs its OWN hover
rule to highlight with the row */
table.wikitable.fintable > tbody > tr:hover > td:first-child,
table.wikitable:has(.col, .col-wide) > tbody > tr:hover > td:first-child {
background-color: #f8f9fa;
}
 
table.wikitable.fintable td:first-child,
Line 1,372 ⟶ 1,520:
table.wikitable:has(.col, .col-wide) td:first-child {
border-left: none;
box-shadow: inset 1px 0 0 var(--wttext-ruledark), /* left rail — sticks with the cell */
1px 0 0 var(--wttext-edgedark); /* right edge of the frozen column */
}
/* LEFT + RIGHT frame edges drawn on the CELLS, matching the top/bottom
edges (section 11). The left edge MUST be on the first cell, not only
the table: with border-collapse a cell border outranks the table border.
Fintable overrides first-child border-left → none + box-shadow rail
(higher specificity, above). NB: in the v11 multi-shade system these
collapse ties could pick the WRONG (lighter) line — with one ink every
tie resolves to the same color, so the old !important right-edge
enforcement rule is gone. */
.wikitable th:first-child,
.wikitable td:first-child { border-left: 1px solid var(--text-dark); }
.wikitable th:last-child,
.wikitable td:last-child { border-right: 1px solid var(--wttext-ruledark); }
 
/* row labels MEET the bullets: the first column's text starts at the SAME indent
table.wikitable { margin: 0; border-left: 1px solid var(--wt-rule); }
as list text (both = --ed-list-indent), so table row-labels and bullet text read
on ONE axis. The table frame + the bullet dots already share x=0, so this lands
the second axis too. Tied to the same variable → they can never drift apart. */
.wikitable th:first-child,
.wikitable td:first-child { padding-left: var(--ed-list-indent); }
/* Row-label indent depth — a wt-indent-N class on the label cell (emitted by
wikitable.py from the INDENT_TOKEN sentinel: spreadsheet Excel-outline levels and
SEC source padding-left/nbsp). The em step lives here (--wt-indent-step) so it is
tunable without re-rendering; additive on the base indent so each depth reads
clearly deeper. `table.wikitable td.wt-indent-N` (0,0,2,2) outranks the
:first-child base (0,0,2,1); an already-published page's inline padding-left,
if any, still wins over these until it is re-rendered. */
table.wikitable td.wt-indent-1 { padding-left: calc(var(--ed-list-indent) + var(--wt-indent-step)); }
table.wikitable td.wt-indent-2 { padding-left: calc(var(--ed-list-indent) + var(--wt-indent-step) * 2); }
table.wikitable td.wt-indent-3 { padding-left: calc(var(--ed-list-indent) + var(--wt-indent-step) * 3); }
table.wikitable td.wt-indent-4 { padding-left: calc(var(--ed-list-indent) + var(--wt-indent-step) * 4); }
 
table.wikitable { margin: 0; border-left: 1px solid var(--text-dark); }
table.wikitable.fintable,
table.wikitable:has(.col, .col-wide) { border-left: none; }
 
/* caption = the table's TITLE:outer onemargins sizelive step aboveon the 13pxscroll WRAPPER (the cells,emitter withwraps
every table in <div style="overflow-x:auto">): top margin gives air
a systematic data glyph (swap the emoji here to change it everywhere) */
before the eyebrow caption + separates consecutive tables; the scrollbar
goes thin and quiet in the header-row tint */
.mw-parser-output div[style*="overflow-x"],
.copy-table-scroll {
margin: 1em 0 2em; /* reduced top gap before tables (was 1.8em) */
/* no standard scrollbar props here — they would knock these wrappers off
the webkit path (see the scrollbar block) */
}
/* the copy-table gadget nests .copy-table-scroll INSIDE the emitter's overflow-x
div (a block-formatting context, so margins can't collapse through it) — zero
the inner top margin so the space before a table isn't counted twice */
.mw-parser-output div[style*="overflow-x"] > .copy-table-scroll { margin-top: 0 !important; }
 
/* caption = the table's TITLE in the h6 voice (bold body text, no
uppercase/letter-spacing — the old eyebrow treatment is retired here). */
table.wikitable caption {
colorfont-family: var(--ed-inkfont);
font-size: 0.875remvar(--ed-body);
font-weight: 600700;
color: var(--text-dark);
}
text-align: left;
table.wikitable caption::before {
padding-bottom: 0.5em; /* CALIBRATION: caption→grid air (~8.5px at 17px;
content: "📊";
was 0.2em = too tight per user) */
margin-right: 0.45em;
font-size: 0.9em;
}
 
/* intro sentence → SAME as body text (serif, body size, --text-dark, upright):
/* standfirst — the italic intro sentence (FT: sans, calm). Anchored to the
a sans lead reads oddly at the top of serif prose. The source is ''italic'',
generated infobox-then-intro pattern so hand-written pages keep real italics */
so we only reset font-style to upright and let the family/size/colour/line-
height inherit the surrounding body prose. Anchored to the generated
infobox-then-intro pattern. */
.mw-parser-output > .infobox ~ p:first-of-type > i,
.mw-parser-output > table.infobox + p > i {
font-family: var(--ed-sans);
font-style: normal;
font-size: 0.97em;
line-height: 1.55;
color: var(--ed-secondary);
}
 
Line 1,426 ⟶ 1,615:
.mw-parser-output li > ul { margin-top: 0.3em; }
 
/* per-level markers drawn as ::before at EXACT positions: each marker's LEFT edge
LEFT edge sits on its parent's text axis (level 1 on the heading axis), because
axis), because left: -indent lands on the container edge, which IS the parent text x.
ONE glyph (the round bullet) at EVERY level — depth is carried by
the parent text x. Shapes: bullet / house triangle (drivers, echoes
theindentation TOCalone prefix) / hairline en dash;(the per-level fontpadding-sizeleft +above). */
line-height keep the three optically equal and vertically centered */
.mw-parser-output ul { list-style: none !important; }
.mw-parser-output ul > li { position: relative; }
Line 1,438 ⟶ 1,626:
position: absolute;
left: calc(-1 * var(--ed-list-indent));
color: var(--edtext-faintdark); /* markers match the body text */
font-family: var(--ed-sansfont);
font-size: 0.95em;
line-height: 1.68;
}
.mw-parser-output ul ul > li::before { content: "\25B8"; font-size: 0.7em; line-height: 2.29; }
.mw-parser-output ul ul ul > li::before { content: "\2013"; font-size: 0.95em; line-height: 1.68; }
 
/* page-reference superscripts — present everywhere, must whisper.
Line 1,452 ⟶ 1,638:
font-size: 68%;
line-height: 0;
font-family: var(--ed-sansfont);
color: var(--edtext-faintdark);
}
 
Line 1,459 ⟶ 1,645:
knob lands its rule on the CONTENTS rule's line ── */
h1#firstHeading, .mw-first-heading {
font-family: var(--ed-seriffont);
font-size: 2.4rem;
line-height: 1.15;
font-weight: 400;
letter-spacing: -0.01em;
color: var(--edtext-inkdark) !important;
border-bottom: 2px solid var(--edtext-inkdark) !important;
margin-top: var(--ed-title-gap) !important;
padding-bottom: 0.3em;
Line 1,472 ⟶ 1,658:
/* breadcrumb under the title rule — the shared eyebrow treatment */
#contentSub .subpages {
font-family: var(--ed-sansfont);
font-size: 0.75remvar(--ed-small);
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--edtext-secondarydark);
margin-bottom: 1.4em;
}
#contentSub .subpages a,
#contentSub .subpages a:visited { color: var(--edtext-secondarydark) !important; }
/* breadcrumb links join the house link convention (it sits among plain
text, so it must look clickable like body links do) */
#contentSub .subpages a {
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
#contentSub .subpages a:hover {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
 
/* ── Section headings: sans semibold on the house rules. Scoped to
Line 1,489 ⟶ 1,687:
.mw-body-content h2, .mw-body-content .mw-heading2, .section-heading,
.skin-minerva .content h2 {
font-family: var(--ed-sansfont);
font-size: calc(var(--ed-body) * var(--ed-h-ratio) * var(--ed-h-ratio)
font-size: 1.4rem;
* var(--ed-h-ratio) * var(--ed-h-ratio)); /* r⁴ ≈ 30px */
line-height: 1.25;
font-weight: 600;
letter-spacing: -0.005em;
color: var(--edtext-inkdark) !important;
border-bottom: 1px solid var(--ed-ink)none !important; /* NO rule — size/weight/space carry the boundary;
`none` must stay explicit or the skin's default
margin-top: 2.2em;
gray h2 border resurfaces. The h1 rule is now the
page's ONE dark heading rule. */
margin-top: var(--ed-heading-gap); /* same space before h2 and h3 */
margin-bottom: 0.7em;
padding-bottom: 0.3em;
}
.mw-body-content h3,
.skin-minerva .content h3 {
font-family: var(--ed-sansfont);
font-size: calc(var(--ed-body) * var(--ed-h-ratio) * var(--ed-h-ratio)
font-size: 1.08rem;
* var(--ed-h-ratio)); /* r³ ≈ 26px */
font-weight: 600;
color: var(--edtext-inkdark) !important;
/* NO underline — h3 is bold sans text only (the ONE dark heading rule is h1) */
margin-top: 1.8em;
margin-top: var(--ed-heading-gap); /* doubled vs the old 1.8em; same as h2 */
margin-bottom: 0.5em;
margin-bottom: 0.6em;
}
/* h4/h5: their own rungs on the ladder — at body size they were
.mw-body-content h4, .mw-body-content h5, .mw-body-content h6 {
indistinguishable from bold prose (and from h6) once the one-font
font-family: var(--ed-sans);
consolidation erased the old serif/sans distinction. Shared 2rem gap
font-size: 1rem;
above = half the h2/h3 gap (same shared-gap logic). */
font-weight: 600;
.mw-body-content h4, .mw-body-content h5 {
color: var(--ed-ink) !important;
font-family: var(--ed-font);
font-weight: 700;
color: var(--text-dark) !important;
margin-top: 2rem;
margin-bottom: 0.4em;
}
.mw-body-content h4 {
font-size: calc(var(--ed-body) * var(--ed-h-ratio) * var(--ed-h-ratio)); /* r² ≈ 22px */
}
.mw-body-content h5 {
font-size: calc(var(--ed-body) * var(--ed-h-ratio)); /* r ≈ 20px */
}
/* h6 = bold BODY text (serif, body size), not a sans heading */
.mw-body-content h6 {
font-family: var(--ed-font);
font-size: var(--ed-body);
font-weight: 700;
color: var(--text-dark) !important;
}
/* h6 spacing: NORMAL paragraph spacing before (0.5em, Vector's p
default), LESS after. The old "MORE before" (1.8em) predates the
chunk-page marker: the marker line now precedes every h6 and carries
the visual separation itself, so a wide h6 top margin double-spaced
the sections (user rule 2026-07-20). This wiki wraps headings in a
.mw-heading<N> div that owns the layout margin (cf. the .mw-heading2
rule above), so the margin MUST sit on the wrapper — also on the
bare h6 as a fallback for un-wrapped DOM. */
.mw-body-content h6,
.mw-body-content .mw-heading6 {
margin: 0.5em 0 0.2em !important;
}
/* pull the block right after an h6 up close, so "less space after" holds even
before a table. The emitter wraps every table in an overflow-x div (1.8em top
margin); the copy-table gadget later injects .copy-table-scroll INSIDE it
(also 1.8em) — the overflow div is a block-formatting context, so that inner
margin can't collapse away. Reset both wrappers, plus a following paragraph. */
.mw-body-content .mw-heading6 + div[style*="overflow-x"],
.mw-body-content h6 + div[style*="overflow-x"],
.mw-body-content .mw-heading6 + div[style*="overflow-x"] > .copy-table-scroll,
.mw-body-content h6 + div[style*="overflow-x"] > .copy-table-scroll,
.mw-body-content .mw-heading6 + p,
.mw-body-content h6 + p {
margin-top: 0.2em !important;
}
/* the inner spans are pinned #202122 !important by old skin CSS — make
Line 1,519 ⟶ 1,765:
.mw-headline, .mw-page-title-main { color: inherit !important; }
 
/* ── Links: FTdark teal;ink contentlike linksbody carrytext a resting tintthe underline thatalone marks them
warms(was toFT teal; the houseresting coraltint onunderline hoverstill ──warms */to coral on
hover) ── */
a, a:visited,
.mw-parser-output a, .mw-parser-output a:visited,
.mw-body-content a.external, .mw-body-content a.external:visited,
.mw-collapsible-toggle-default .mw-collapsible-text {
color: var(--edtext-linkdark) !important;
}
.mw-parser-output a {
Line 1,541 ⟶ 1,788:
a.mw-ui-button, a.mw-ui-button:visited { color: #fff !important; }
.mw-editsection, .mw-editsection a, .mw-editsection a:visited {
color: var(--edtext-secondarydark) !important;
text-decoration: none;
opacity: 0.7;
Line 1,552 ⟶ 1,799:
.cdx-text-input__input:focus,
.cdx-text-input__input:enabled:focus {
border-color: var(--ed-linkaccent) !important; /* = the link hover-underline color */
box-shadow: inset 0 0 0 1px var(--ed-linkaccent) !important;
}
.cdx-button:enabled:focus,
.cdx-button--fake-button:focus {
box-shadow: inset 0 0 0 2px var(--ed-linkaccent) !important;
}
:focus-visible { outline-color: var(--ed-linkaccent); }
 
/* ── Header search. Resting border / font / radius come from the GENERIC
/* ── TOC sidebar — consolidated final design.
Codex input rules below — only the search-specific pieces live here. ── */
Geometry: every list item reserves a number GUTTER via padding;
/* search bar on the BODY-TEXT axis. Measured on the live DOM (1120px
MediaWiki's own section numbers (Vector ships them display:none)
viewport): form x=294, title/body axis x=264 → pull 30px left (24px is
are re-shown ABSOLUTELY into the gutter, right-aligned so the
Codex's typeahead inset inside #p-search + 6px container offset). The
dots form one column ("9." pads left, "10." fills the box); the
typeahead dropdown lives inside the form, so suggestions move with it.
::after adds the dot. Entry text — first line AND wrapped lines —
Calibrated against the rendered logo+tagline width — re-measure if the
starts at the padding edge by construction. "Beginning" (the one
tagline or its font ever changes. */
entry MediaWiki leaves unnumbered) gets a generated "0." in the
#p-search #searchform { margin-left: -30px; }
same geometry. Nested lists sit FLUSH in the parent's padding box:
.cdx-search-input { border-radius: 0 !important; } /* the outer assembly layer */
level-2 numbers start at the level-1 text axis (the numbers carry
/* the bar hovers as ONE unit — pointing at the attached Search button warms
the hierarchy — no rails). The expand/collapse control is the
the input border too. !important is required: the generic input rules pin
house triangle ▸/▾ INLINE after the heading text. The CONTENTS
border-color with !important, and only equal importance + higher
header is inset onto the single-digit axis via MARGIN (a border
specificity beats them. */
travels with margins, not paddings).
.cdx-search-input:hover .cdx-text-input__input {
CALIBRATION knobs: --toc-numb-gutter (text column start; the box
border-color: var(--ed-accent) !important;
gutter−0.35rem must fit "22." or the dot wraps), level-2's wider
}
token, --toc-header-inset, and the 0.22rem row rhythm. ── */
.cdx-search-input .cdx-search-input__end-button,
.vector-toc {
.cdx-search-input .cdx-search-input__end-button:hover,
font-family: var(--ed-sans);
.cdx-search-input .cdx-search-input__end-button:active,
--toc-numb-gutter: 1.6rem;
.cdx-search-input .cdx-search-input__end-button:focus {
--toc-header-inset: 0.6rem;
background-color: var(--text-dark) !important;
border-color: var(--text-dark) !important;
color: #fff !important;
box-shadow: none !important;
border-radius: 0 !important; /* square corners */
font-family: var(--ed-font); /* buttons don't inherit the page font */
}
/* ── ALL Codex form inputs (Special:UserLogin etc.) follow the search-bar
design: square, ink resting border, coral on hover; the generic
:focus rule above already paints the thick coral focus. The AI
composer's borderless-input exemption later in this section still
wins via !important. ── */
/* Codex pins input colors on :enabled state selectors — restate at that
specificity with !important or the gray/rounded defaults win the tie.
The AI composer exemption still outranks all of these (higher
specificity + !important). */
.cdx-text-input, /* the WRAPPER carries its own 2px
radius — measured on #wpName1 */
.cdx-text-input__input,
.cdx-text-input__input:enabled {
border-radius: 0 !important;
}
.cdx-text-input__input,
.cdx-text-input__input:enabled {
border-color: var(--text-dark) !important;
font-family: var(--ed-font);
}
.cdx-text-input__input:hover,
.cdx-text-input__input:enabled:hover { border-color: var(--ed-accent) !important; }
/* Codex checkboxes ("Keep me logged in"): ink border, square; checked fill
goes ink too — Codex's progressive blue would break the mono theme */
.cdx-checkbox__icon {
border-color: var(--text-dark) !important;
border-radius: 0 !important;
}
.cdx-checkbox__input:checked + .cdx-checkbox__icon {
background-color: var(--text-dark) !important;
border-color: var(--text-dark) !important;
}
/* form links ("Help with logging in", "Forgot your password?") follow the
house link convention — special-page forms sit outside .mw-parser-output */
.mw-htmlform a {
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
.mw-htmlform a:hover {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
/* primary action buttons (e.g. the "Log in" submit) = the Search button:
flat ink, white label, square, every state pinned so Codex's progressive
blue never flashes through */
.cdx-button--weight-primary.cdx-button--action-progressive,
.cdx-button--weight-primary.cdx-button--action-progressive:hover,
.cdx-button--weight-primary.cdx-button--action-progressive:active,
.cdx-button--weight-primary.cdx-button--action-progressive:focus,
.cdx-button--weight-primary.cdx-button--action-progressive:enabled:hover,
.cdx-button--weight-primary.cdx-button--action-progressive:enabled:active {
background-color: var(--text-dark) !important;
border-color: var(--text-dark) !important;
color: #fff !important;
border-radius: 0 !important;
font-family: var(--ed-font);
}
/* the TOC "hide" / "move to sidebar" pill (pin/unpin) joins the same flat
treatment — one class covers both buttons */
.vector-pinnable-header-toggle-button,
.vector-pinnable-header-toggle-button:hover,
.vector-pinnable-header-toggle-button:active,
.vector-pinnable-header-toggle-button:focus {
background-color: var(--text-dark) !important;
border-color: var(--text-dark) !important;
color: #fff !important;
box-shadow: none !important;
border-radius: 0 !important; /* square corners */
font-family: var(--ed-font); /* buttons don't inherit the page font */
font-size: var(--ed-small); /* joins the ONE small size */
}
 
/* ── TOC sidebar — flat left-aligned design, NO section numbers.
.vector-toc .vector-toc-list-item {
Every entry, ANY level, starts on ONE left axis. Depth is carried by
position: relative; /* the number's anchor */
an inline en-dash marker generated per Vector level class: top level
padding: 0.22rem 0 0.22rem var(--toc-numb-gutter) !important;
bare, children "–", grandchildren "––" — flowing straight into the
font-size: var(--ed-small); /* li, link text and the abspos number must
title as one text run. NO indentation, NO gutter, NO absolute
share ONE font size: the number's static
positioning. Titles wrap under themselves (the marker is its own
position is computed from the LI's line
flex item, so wrapped lines align after it). Expand/collapse is the
metrics — a larger li strut seats the
house triangle ▸/▾ INLINE after the heading. The CONTENTS header
number ~1px above the 13px text */
left-aligns with the same axis. ── */
.vector-toc {
font-family: var(--ed-font);
--toc-header-inset: 0; /* CONTENTS label sits on the entry axis */
}
 
Line 1,598 ⟶ 1,928:
rule only), inset onto the number axis */
.vector-toc .vector-pinnable-header {
border-bottom: 1px solid var(--edtext-inkdark) !important; /* = the table header-row divider */
padding-top: 0.35rem;
padding-bottom: calc(0.95rem - 3px); /* calibrated against the title rule:
-2px measured (157 vs 159), then -1px
user fine-tune */
margin-bottom: 0.9rem;
padding-left: 0 !important;
margin-left: var(--toc-header-inset) !important;
}
.vector-toc .vector-pinnable-header-label { /* the shared uppercase eyebrow */
font-size: 0.75remvar(--ed-small);
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--edtext-secondarydark) !important;
margin-left: 0;
}
 
/* entries: quietONE sansink at theall ONElevels small size;depth inkis oncarried by the hover/activenumbers. */Hover
feedback = the house link convention (grey underline → coral); the
current section = the one bold row. */
.vector-toc .vector-toc-link,
.vector-toc .vector-toc-link:visited {
color: var(--edtext-secondarydark) !important;
font-size: var(--ed-small);
text-decoration: none; /* the underline lives on the TITLE SPAN below,
so the depth dash marker stays bare */
}
.vector-toc .vector-toc-link:hovertext {> colorspan: varnot(.vector-toc-ed-inknumb) !important; }{
text-decoration: underline;
.vector-toc .vector-toc-list-item-active > .vector-toc-link { color: var(--ed-ink) !important; }
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
.vector-toc .vector-toc-link:hover .vector-toc-text > span:not(.vector-toc-numb) {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
.vector-toc .vector-toc-list-item-active > .vector-toc-link {
font-weight: 500 !important; /* the "current" cue (one bold row) */
}
/* NB: hiding h6 from the TOC is done in Common.js (pruneTocH6) — MediaWiki's
TOC encodes only a compacted nesting depth (vector-toc-level-N), NOT the
original heading tag, so CSS cannot reliably target h6. */
 
/* lists flush on the component edge; rhythmhanging +indent number guttercarried on theevery li */
.vector-toc .vector-toc-contents,
.vector-toc .vector-toc-list {
Line 1,632 ⟶ 1,981:
}
.vector-toc .vector-toc-list-item {
/* ROW RHYTHM: vertical spacing lives on padding-TOP (ONE gap per row) — so it
position: relative; /* the number's anchor */
takes the FULL wikitable rhythm (2 × --wt-pad-y = the table's top+bottom cell
padding: 0.22rem 0 0.22rem var(--toc-numb-gutter) !important;
padding) to give the same visual gap between rows. The li is a flex ROW so
the chevron toggle sits in-flow right after the title; the sublist wraps
onto its own row below (flex-basis:100%). */
display: flex;
flex-wrap: wrap;
align-items: baseline;
padding: calc(var(--wt-pad-y) * 2) 0 0 0 !important;
margin: 0 !important;
font-size: var(--ed-small);
line-height: 1.5; /* = the infobox / wikitable line-height */
}
/* level-2+ sits flush under level-1 (markers aligned on one axis); flex-basis
.vector-toc .vector-toc-list-item > .vector-toc-list { margin-top: 0.1rem; }
100% drops the sublist onto its own row below the parent's title + chevron */
 
.vector-toc .vector-toc-list-item > .vector-toc-list {
/* the numbers */
flex: 0 0 100%;
.vector-toc .vector-toc-numb {
margin: 0 !important;
display: block; /* defeat Vector's display:none */
position: absolute;
left: 0;
width: calc(var(--toc-numb-gutter) - 0.35rem); /* 0.35rem = number→text gap */
text-align: right;
white-space: nowrap; /* the dot must never wrap inside the box */
font-variant-numeric: tabular-nums;
}
.vector-toc .vector-toc-numb::after { content: "."; }
 
/* "0."HANG-UNDER-TITLE: forthe Beginningdepth marker styledand likethe atitle numbershare INSIDEa theflex row, linkso (the lititle is
a wrapping block whose 2nd+ lines align under the TITLE (after the number).
body-size and bolds when active; pin size/weight, re-bold on active) */
Because the marker is its own flex item, this holds for any marker width
.vector-toc #toc-mw-content-text::before {
(one dash or two), which a fixed text-indent could not. The link is a flex item
content: "0.";
of the row; grow:0 so a short title doesn't stretch (the chevron stays right
position: absolute;
after it), shrink:1 + min-width:0 so a long title wraps. */
left: 0;
.vector-toc .vector-toc-link { flex: 1 1 auto; min-width: 0; }
width: calc(var(--toc-numb-gutter) - 0.35rem);
.vector-toc .vector-toc-list-item:has(> .vector-toc-toggle) > .vector-toc-link {
text-align: right;
max-width: calc(100% - 1.5em);
white-space: nowrap;
font-variant-numeric: tabular-nums;
color: var(--ed-secondary);
font-size: var(--ed-small);
font-weight: 400;
}
.vector-toc #toc-mw-content-text.vector-toc-list-item-active::beforetext {
display: flex;
color: var(--ed-ink);
fontalign-weightitems: 700baseline;
padding: 0 !important; /* Vector ships .vector-toc-text{padding:6px 0} — 12px of
EXTRA gap per row on top of the li's rhythm padding,
which made the TOC ~25px apart vs the table's 13px.
Zeroed so the li's 2×--wt-pad-y is the ONE rhythm. */
}
/* NO section numbers — Vector ships .vector-toc-numb display:none and we no
longer re-show it. Depth is carried by TREE markers instead, generated as
the first flex item of the text row off Vector's per-level li classes:
a CSS BORDER-DRAWN squared elbow (└ shape) — vertical stub into a
horizontal arm, ONE continuous 1px ink stroke by construction. Glyph
attempts ("|–" pipes, U+2514 └ from a fallback font) were rejected: two
fonts never join their strokes. Depth = the ARM LENGTH (child short,
grandchild longer). Top-level entries carry no marker. */
.vector-toc .vector-toc-level-2 > .vector-toc-link .vector-toc-text::before,
.vector-toc .vector-toc-level-3 > .vector-toc-link .vector-toc-text::before,
.vector-toc .vector-toc-level-4 > .vector-toc-link .vector-toc-text::before {
content: "";
flex: 0 0 auto;
height: 0.55em; /* vertical stub height */
border-left: 1px solid currentColor;
border-bottom: 1px solid currentColor;
position: relative;
bottom: 0.28em; /* CALIBRATION: lifts the arm off the text
baseline onto the dash axis (an empty flex
item baseline-aligns its bottom edge) */
margin-right: 0.4em;
}
.vector-toc .vector-toc-level-2 > .vector-toc-link .vector-toc-text::before { width: 0.6em; }
.vector-toc .vector-toc-level-3 > .vector-toc-link .vector-toc-text::before { width: 1.05em; }
.vector-toc .vector-toc-level-4 > .vector-toc-link .vector-toc-text::before { width: 1.5em; }
/* the title span is unclassed in Vector's DOM; it is the wrapping block */
.vector-toc .vector-toc-text > span:not(.vector-toc-numb) {
flex: 1 1 auto;
min-width: 0; /* allow the title to wrap inside the row */
}
 
/* chevron: thean entryin-flow textdisclosure goestriangle inlineright soAFTER the siblingtitle — a flex toggleitem buttonof
flowsthe rightrow, afterbaseline-aligned to the labelfirst ("Outlook 3 ▾")line. The Codex icon is replaced by a
replaced by a ::before glyph switched on the li's expanded state; font-size:0 hides the
screen-reader span without removing it. All button chrome (background, border,
font-size:0 on the button hides its screen-reader span visually
focus ring) is stripped so only the bare ▸/▾ glyph ever shows. */
without removing it for assistive tech. */
.vector-toc .vector-toc-link,
.vector-toc .vector-toc-text { display: inline; }
.vector-toc .vector-toc-toggle {
position: static !important; /* ← ADD THIS */
displayflex: inline0 !important0 auto;
margin: 0 0 0 0.35em !important;
min-width: 0 !important;
min-height: 0 !important;
width: auto !important;
height: auto !important;
marginpadding: 0 0 0 0.3em !important;
padding: 0 0.2em !important;
border: none !important;
background: none !important;
box-shadow: none !important; /* kill Codex's teal focus ring (the "blue rectangle") */
font-size: 0;
outline: none !important;
/* NB: do NOT put font-size:0 on the button — as a baseline-aligned flex item
that collapses its baseline to the top and floats the glyph ABOVE the line.
Keep the inherited font-size; hide the inner spans instead (below). */
}
/* Codex re-applies the ring / background on every interaction state — neutralise
them all so only the bare ▸/▾ glyph ever shows (these come AFTER the section's
.cdx-button:focus rule, so they win the tie). */
.vector-toc .vector-toc-toggle:hover,
.vector-toc .vector-toc-toggle:focus,
.vector-toc .vector-toc-toggle:focus-visible,
.vector-toc .vector-toc-toggle:active {
background: none !important;
border: none !important;
box-shadow: none !important;
outline: none !important;
}
/* hide the Codex icon span and zero the screen-reader label span (font-size:0,
not display:none, so assistive tech keeps it); the ::before glyph below is the
only visible chevron */
.vector-toc .vector-toc-toggle .vector-icon { display: none; }
.vector-toc .vector-toc-toggle > span { font-size: 0; }
.vector-toc .vector-toc-toggle::before {
content: "▸"; /* collapsed — the house triangle */
font-size: 0.65rem;
color: var(--edtext-faintdark);
}
.vector-toc .vector-toc-list-item-expanded > .vector-toc-toggle::before {
content: "▾"; /* expanded */
}
.vector-toc .vector-toc-toggle:hover::before { color: var(--ed-ink); }
 
/* ── Infobox: the page's ONE white card, in the data voice; its width
ENFORCED with !important so inline widths cannot break it — and
is the SAME token the prose measure subtracts, ENFORCED with
pinned class-generically so ANY infobox markup (table or div)
!important so inline widths cannot break the axis — and pinned
class-genericallyobeys. soProse ANYflows infoboxfull-width markuparound (tablethe orfloat div)(default obeysMediaWiki). ── */
.mw-parser-output .infobox { /* class-generic: any infobox markup */
width: var(--ed-infobox-w) !important;
Line 1,708 ⟶ 2,107:
}
.mw-parser-output table.infobox {
font-family: var(--ed-sansfont);
font-size: var(--ed-small);
background-color: #fff !important;
border: 1px solid var(--edtext-hairlinedark) !important; /* infobox OUTER border = medium */
border-spacing: 0; /* kill §1's 3px so the row rhythm is EXACTLY the
cell padding — shared with the wikitable below */
padding: 0.55em 0.9em 0.75em;
line-height: 1.5;
}
.infobox .infobox-above { /* the shared uppercase eyebrow */
background-color: #fff !important; /* beats the template's inline #cee0f2 */
color: var(--edtext-secondarydark) !important; /* beats inline color:inherit */
text-align: left !important;
font-size: 0.75remvar(--ed-small); /* the shared eyebrow size */
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
border-bottom: 1px solid var(--edtext-inkdark); /* header-row divider — kept LIGHT (looks good) */
padding: 0.2em 0.2em 0.55em;
}
.infobox .infobox-label {
color: var(--edtext-secondarydark);
font-weight: 600; /* semibold labels, like the band variant and table headers */
font-weight: 400;
padding: 0.22emvar(--wt-pad-y) 0.8em 0.22emvar(--wt-pad-y) 0.2em; /* row rhythm = the wikitable's */
}
.infobox .infobox-data { color: var(--text-dark); padding: var(--wt-pad-y) 0.2em; }
 
/* ── Infobox BAND variant — Template:Infobox doc archive `wide=yes` wraps
the card in .ed-infobox-band. Same card language, re-flowed as a
full-width horizontal "dateline" strip for TABLE-FIRST pages
(financial supplements): no float, label-OVER-value pairs in a
responsive grid, content resumes full-width right below.
DESKTOP-ONLY enhancement: below 769px — and on Minerva, excluded via
body:not(.skin-minerva) because the host pins a 1120px viewport meta
on phones so width queries alone can't target them — every band rule
goes inert and the infobox falls back to the DEFAULT design (which
the existing mobile rules already render full-width). ── */
@media (min-width: 769px) {
body:not(.skin-minerva) .ed-infobox-band .infobox,
body:not(.skin-minerva) .ed-infobox-band table.infobox {
float: none !important;
clear: none !important;
width: 100% !important;
margin: 0.8em 0 1.8em !important;
/* inner text on the BULLET-TEXT axis (= the wikitable row-label axis):
1px frame + this padding = --ed-list-indent, so "Organization" starts
exactly where list text and table labels start */
padding-left: calc(var(--ed-list-indent) - 1px);
padding-right: calc(var(--ed-list-indent) - 1px);
}
body:not(.skin-minerva) .ed-infobox-band .infobox > tbody {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
gap: 0.7em 1.6em;
}
body:not(.skin-minerva) .ed-infobox-band .infobox > tbody > tr {
display: block;
min-width: 0;
}
/* the DOCUMENT INFO eyebrow row spans the full band */
body:not(.skin-minerva) .ed-infobox-band .infobox > tbody > tr:has(.infobox-above) {
grid-column: 1 / -1;
}
body:not(.skin-minerva) .ed-infobox-band .infobox .infobox-above {
display: block;
padding-left: 0; /* the card variant insets the eyebrow 0.2em — in the
band the field cells have zero padding, so the
eyebrow must drop its inset to share their axis */
padding-right: 0;
}
/* each field = its two table cells stacked: small muted label over value */
body:not(.skin-minerva) .ed-infobox-band .infobox > tbody > tr > th.infobox-label,
body:not(.skin-minerva) .ed-infobox-band .infobox > tbody > tr > td.infobox-data {
display: block;
padding: 0;
overflow-wrap: anywhere;
}
body:not(.skin-minerva) .ed-infobox-band .infobox > tbody > tr > th.infobox-label {
font-size: var(--ed-small); /* the ONE small size — semibold weight alone
distinguishes labels from values */
font-weight: 600;
color: var(--text-dark);
margin-bottom: 0.15em;
}
}
.infobox .infobox-data { color: var(--ed-ink); padding: 0.22em 0.2em; }
 
/* ── Blockquotes: coralink bar, serif italic. (future-proofingThe quote TEXT sits on the emitterbody-
currentlytext rendersaxis quotes(x=0); asthe ">bar ..."HANGS LEFT of it like the list items)markers ──do */
the negative margin pulls the whole box left by exactly the inset
(border 3px + padding), so bar and bullets share the hanging gutter
and the text aligns with paragraphs. The !important overrides
MediaWiki/Parsoid core styles that otherwise indent the blockquote. ── */
.mw-parser-output blockquote {
border-left: 3px solid var(--edtext-accentdark);
padding: 0.2em 0 0.2em 1.2emcalc(var(--ed-list-indent) - 3px);
margin: 1.2em 0;
colormargin-left: calc(-1 * var(--ed-secondarylist-indent)) !important;
color: var(--text-dark);
font-style: italic;
}
/* the attribution line ("(Name, title)") ships in <small> — §1 shrinks it
to 85%; keep the whole quote ONE size */
.mw-parser-output blockquote small { font-size: 100%; }
 
/* ── Thumbnails/framed images on the theme: ONE ink hairline frame on a
white ground (replaces MediaWiki's gray border + #f8f9fa fill); the
image itself loses its inner border (the figure frame is the line).
Caption in the data voice. Covers Parsoid figures + legacy .thumb. ── */
.mw-parser-output figure[typeof~="mw:File/Thumb"],
.mw-parser-output figure[typeof~="mw:File/Frame"],
.thumbinner {
border: 1px solid var(--text-dark) !important;
border-radius: 0 !important;
background-color: #fff !important;
}
.mw-parser-output figure[typeof~="mw:File/Thumb"] img.mw-file-element,
.mw-parser-output figure[typeof~="mw:File/Frame"] img.mw-file-element,
.thumbinner img { border: none !important; background-color: #fff; }
.mw-parser-output figure[typeof~="mw:File/Thumb"] > figcaption,
.mw-parser-output figure[typeof~="mw:File/Frame"] > figcaption,
.thumbcaption {
background-color: #fff;
color: var(--text-dark);
font-family: var(--ed-font);
font-size: var(--ed-small);
border: none !important; /* MW core frames the caption in gray #c8ccd1 —
the figure's ink frame is the only line */
}
 
Line 1,751 ⟶ 2,244:
}
#footer, .mw-footer, .minerva-footer {
font-family: var(--ed-sansfont);
color: var(--edtext-faintdark);
border-top: 1px solid var(--edtext-inkdark) !important;
}
#footer li, .mw-footer li { font-size: var(--ed-small); }
#footer a, #footer a:visited,
.mw-footer a, .mw-footer a:visited { color: var(--edtext-secondarydark) !important; }
/* footer links follow the house link convention: grey resting underline
warming to coral on hover (the .mw-parser-output rule doesn't reach here) */
#footer a, .mw-footer a {
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
#footer a:hover, .mw-footer a:hover {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
 
/* ── AI assistant panel on the theme: warm card, serif answers,
teal send button (later !important wins the ties vs section 8) ── */
.ext-aiassistant-panel { border: 1px solid var(--edtext-hairline-strongdark) !important; }
/* ONE sans for the whole panel UI (the extension ships its own stack);
the assistant-message serif rule below this still wins for answers */
Line 1,767 ⟶ 2,272:
.ext-aiassistant-panel input,
.ext-aiassistant-panel textarea,
.ext-aiassistant-panel button { font-family: var(--ed-sansfont) !important; }
.ext-aiassistant-header { border-bottom: 1px solid var(--edtext-hairlinedark) !important; }
.ext-aiassistant-message-user .ext-aiassistant-message__content {
background-color: var(--edtext-inkdark) !important;
}
.ext-aiassistant-message-assistant {
font-family: var(--ed-seriffont) !important;
color: var(--edtext-inkdark) !important;
}
/* whole panel on white — header and body included (the extension tints them) */
.ext-aiassistant-panel,
.ext-aiassistant-header,
.ext-aiassistant-body { background-color: #fff !important; }
.ext-aiassistant-footer {
border-top: 1px solid var(--ed-hairline)none !important; /* the composer's own frame is the line here —
a footer border doubles it into a fake 2px */
background-color: var(--ed-paper) !important;
background-color: #fff !important;
/* inset the composer from the panel edges — flush, its 1px frame sits
against the panel's 1px border and reads as 2px on left/right/bottom */
padding: 12px !important;
}
/* the composer is the "search bar" of the panel — same mechanism: resting
/* ONE focus ring around the whole composer (input + send button); the
ink border, coral on hover, coral + inner ring (reads as 2px) on focus.
text field itself stays borderless — the panel's input is exempted
The inner text field stays borderless; the frame lives on the composer. */
from the generic Codex focus rule above */
.ext-aiassistant-panel .cdx-text-input__input,
.ext-aiassistant-panel .cdx-text-input__input:focus,
Line 1,791 ⟶ 2,304:
outline: none !important;
}
.ext-aiassistant-prompt-composer { box-shadow: none !important; }
border: 1px solid var(--text-dark) !important;
.ext-aiassistant-prompt-composer:focus-within {
outlineborder-radius: 1px solid var(--ed-link)0 !important;
outline-offset: -1px;
box-shadow: none !important;
outline: none !important;
}
.ext-aiassistant-prompt-composer__sendcomposer:not(:disabled)hover {
backgroundborder-color: var(--ed-linkaccent) !important;
}
border-color: var(--ed-link) !important;
.ext-aiassistant-prompt-composer:focus-within {
border-color: var(--ed-accent) !important;
box-shadow: inset 0 0 0 1px var(--ed-accent) !important; /* = search focus */
outline: none !important;
}
/* the composer pads 20px on the sides but 10px at the bottom (section 8) —
pull the send button 10px right so its gap to the right line equals its
gap to the bottom line */
.ext-aiassistant-prompt-composer__send { margin-right: -10px !important; }
/* send button: flat ink, white arrow, SAME in every state — disabled
included — like the Search button. The :disabled selectors must be
restated at equal specificity to beat section 8's grey disabled icon. */
.ext-aiassistant-prompt-composer__send,
.ext-aiassistant-prompt-composer__send:hover,
.ext-aiassistant-prompt-composer__send:focus,
.ext-aiassistant-prompt-composer__send:disabled {
background-color: var(--edtext-hairlinedark) !important;
border-color: var(--edtext-hairlinedark) !important;
}
.ext-aiassistant-prompt-composer__send .cdx-icon,
.ext-aiassistant-prompt-composer__send .cdx-icon svg,
.ext-aiassistant-prompt-composer__send:disabled .cdx-icon svg {
color: #fff !important;
fill: #fff !important;
}
.ext-aiassistant-panel .cdx-button--weight-quiet:not(.cdx-button--icon-only)::before {
color: var(--edtext-linkdark) !important;
}
/* citation chips in the theme's interactive tealink, like article links */
.ext-aiassistant-cite,
.ext-aiassistant-cite a { color: var(--edtext-linkdark) !important; }
 
/* ── Collapsible inlineInline footnotes ({{footnote}} → <span class="ed-fn" title="…">).
A small dotted-underline "note" chip after the term. The note lives
MW 1.43's sanitizer REJECTS <details>/<summary> in wikitext
in the title="" attribute, so on DESKTOP the browser's NATIVE tooltip
(verified live: tags render as literal text), so this is spans +
shows it on hover — and a native tooltip is rendered above the whole
a tiny MediaWiki:Common.js toggle (adds/removes .ed-fn-open on
page, so it can never be covered by the frozen table column or clipped
chip click). Readers see a small dotted-underline "note" chip;
by the chiptable's textscroll is(the CSSbug content, NOTan in-page thecard DOMkept texthitting). ClickingOn TOUCH
devices (no hover) a CSS bubble is synthesised from attr(title) on
expands the note inline in the secondary voice, wrapped in
CSS-generatedtap/focus. NO parensJavaScript. The literalnote "(footnote:is "ALSO /kept in ")"a wrappershidden
stay"(footnote: in…)" thespan DOMso insidethe always-hiddenbot spans,reads soit from the bot'sDOM (Docling HTMLignores
retrievaltitle reads exactly the pre-template formatattributes) — readers and RAG see different things from one
see different things from the same markup. ── */
.ed-fn-chip { cursor: pointerhelp; }
.ed-fn-chip::after {
content: "note";
font-family: var(--ed-sansfont);
font-size: 0.7em;
vertical-align: super;
color: var(--edtext-faintdark);
/* the house link convention: grey resting underline → coral on hover */
text-decoration: underline dotted;
text-underline-offsetdecoration: 2pxunderline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
white-space: nowrap;
}
.ed-fn.ed-fn-open >:hover .ed-fn-chip::after { color: var(--ed-link); }
text-decoration-color: var(--ed-accent);
.ed-fn-pre, .ed-fn-close { display: none; } /* DOM text for the bot only */
text-decoration-thickness: 2px;
.ed-fn-body { display: none; } /* collapsed by default */
}
.ed-fn.ed-fn-open > .ed-fn-body {
 
display: inline;
/* in the DOM for the bot; never shown to readers as inline text */
color: var(--ed-secondary);
.ed-fn-body { display: none; }
 
/* The touch note banner. Created by MediaWiki:Common.js and appended to
<body> — so it lives in the ROOT stacking context and NO table sticky column
(or any overlay) can ever cover it, which a CSS ::after on the in-table cue
could not guarantee. Full-width, pinned to the top, white on near-black. The
z-index is belt-and-suspenders; being a child of <body> is what truly wins.
Desktop keeps the browser's native title tooltip (the cue still carries
title=""); this banner only appears on touch. */
.ed-fn-banner {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 2147483647;
box-sizing: border-box;
padding: calc(0.9em + env(safe-area-inset-top)) 1.2em 0.9em;
background: rgba(20, 18, 16, 0.92); /* near-black, slightly transparent */
color: #fff;
font-family: var(--ed-font);
font-size: 0.95rem;
line-height: 1.5;
text-align: left;
/* pre-line: collapse runs of spaces but KEEP newlines, so a multi-point
footnote ("• a&#10;• b") shows each bullet on its own line. */
white-space: pre-line;
}
 
/* ── Reference-preview bubble (Popups extension; .rt-* = the Reference
Tooltips gadget variant, covered in case it's the active one) on the
theme: ink frame, square corners. The extension draws its gray outline
as a 1px ring INSIDE box-shadow (not a border) — so the shadow is
re-declared with only its soft depth layer, and a real ink border is
added. The pointer triangle is a border-drawn pseudo-element, recolored
per direction class. ── */
.mwe-popups {
border: none !important; /* the frame lives on the CONTAINER — unclipped,
it overpaints the root's bottom border */
border-radius: 0 !important;
box-shadow: 0 30px 90px -20px rgba(0, 0, 0, 0.3) !important;
}
.mwe-popups .mwe-popups-container {
border: 1px solid var(--text-dark) !important;
border-radius: 0 !important;
background: #fff !important;
box-sizing: border-box !important;
}
/* NO pointer triangle — a 1px diagonal outline anti-aliases to a washed-out
gray no matter its color, so the tail is dropped for a clean square
bubble (matches the footnote popover, which has no pointer either).
TWO mechanisms to kill: the legacy :before/:after border-triangles AND
the clip-path polygon this Popups version carves the tail (and fake
rounded corners) into the container with. */
.mwe-popups:before,
.mwe-popups:after { display: none !important; }
.mwe-popups .mwe-popups-container { clip-path: none !important; }
 
/* The desktop hover popover (also created in Common.js, appended to <body>).
A small light card beside the cue — white, coral left rule, serif — in the
editorial voice. pointer-events:none so it never steals the hover it reports. */
.ed-fn-popover {
position: fixed;
z-index: 2147483647;
max-width: min(28rem, 90vw);
box-sizing: border-box;
padding: 0.6em 0.8em;
background: #fff;
color: var(--text-dark);
border: 1px solid var(--text-dark); /* flat: one hairline ink frame, no
coral spine, square corners */
border-radius: 0;
box-shadow: 0 4px 16px rgba(43, 41, 38, 0.18);
font-family: var(--ed-font);
font-size: 0.9rem;
line-height: 1.45;
text-align: left;
/* pre-line: keep newlines so a multi-point footnote ("• a&#10;• b") shows
each bullet on its own line (matches .ed-fn-banner on mobile). */
white-space: pre-line;
pointer-events: none;
}
.ed-fn.ed-fn-open > .ed-fn-body::before { content: " ("; }
.ed-fn.ed-fn-open > .ed-fn-body::after { content: ")"; }
/* no-JS safety net: if site JS ever fails to load, notes stay readable */
.client-nojs .ed-fn-body { display: inline; color: var(--ed-secondary); }
.client-nojs .ed-fn-chip { display: none; }
 
/* ── Mobile ── */
@media screen and (max-width: 768px) {
:root.mw-parser-output .infobox { --ed-measurewidth: 100% !important; } /* infobox is full-width on mobile */
.mw-parser-output .infobox { width: 100% !important; }
h1#firstHeading, .mw-first-heading { font-size: 1.7rem; }
/* the WHOLE ladder tightens on narrow screens via one ratio override.
.mw-body-content h2, .mw-body-content .mw-heading2 { font-size: 1.22rem; }
(Was an h2-only 1.22rem override, which INVERTED the hierarchy: h3
.ext-aiassistant-prompt-composer { border-bottom: 1px solid var(--ed-hairline) !important; }
kept its desktop size and rendered bigger than h2.) */
:root { --ed-h-ratio: 1.08; }
.ext-aiassistant-prompt-composer { border-bottom: 1px solid var(--text-dark) !important; }
/* restate the mobile keyboard clearance — the desktop 12px inset above
would otherwise override section 9's padding-bottom (later source wins) */
.ext-aiassistant-footer {
padding-bottom: calc(70px + env(safe-area-inset-bottom)) !important;
}
}
 
/* ── Datacheck review controls — Module:ReportedTable status badge + action buttons ──
The Status column shows the stored verdict (the value); the Confirm / Reject / Correct
columns each hold one .rt-btn the Common.js gadget fills. Active verdict = filled. ── */
.rt-status {
display: inline-block;
padding: 1px 9px;
border-radius: 999px;
font-family: var(--ed-font);
font-size: 0.82em;
white-space: nowrap;
background: var(--wt-th-bg);
color: var(--text-dark);
}
.rt-status-confirmed { background: #e6f3ea; color: #137333; }
.rt-status-rejected { background: #fbeaea; color: #a3001d; }
.rt-status-overridden { background: #faf0dc; color: #8a5300; }
.rt-status-validated { background: #e6f3ea; color: #137333; }
.rt-status-redo { background: #faf0dc; color: #8a5300; }
 
.rt-btn {
font-family: var(--ed-font);
font-size: 0.95em;
line-height: 1;
padding: 5px 12px;
border: 1px solid var(--text-dark);
border-radius: 5px;
background: #fff;
color: var(--text-dark);
cursor: pointer;
}
.rt-btn:hover { background: var(--wt-th-bg); border-color: var(--text-dark); }
.rt-btn:active { transform: translateY(0.5px); }
.rt-btn.is-active.rt-btn--confirm { background: #137333; border-color: #137333; color: #fff; }
.rt-btn.is-active.rt-btn--reject { background: #a3001d; border-color: #a3001d; color: #fff; }
.rt-btn.is-active.rt-btn--override { background: #8a5300; border-color: #8a5300; color: #fff; }
 
/* ── Key figures box ({{Indexing}} f/v pairs, Template:Indexing): a VISUAL
SIBLING of the page infobox — same width token, medium border, white
ground, small-sans data voice, uppercase eyebrow header — but a
per-section card (titled "Key facts & figures") floated beside a unit instead
of at the top of the page. Rendered as <table class="key-figures">
(NOT .wikitable: Common.css forces .wikitable{width:100% !important},
which is exactly why .infobox is also not a wikitable). Declarations
mirror .infobox / .infobox-above / .infobox-label / .infobox-data.
Emitted right after a unit's h6; prose wraps to its left. ── */
.mw-parser-output .key-figures {
box-sizing: border-box;
width: var(--ed-infobox-w);
border: 1px solid var(--text-dark); /* = infobox OUTER border (medium) */
border-collapse: separate; /* the INFOBOX box model: separate + table
padding (collapse ignores table padding) —
this is what insets the title divider from
the card edges, like DOCUMENT INFO */
border-spacing: 0; /* = .infobox (row rhythm = cell padding only) */
padding: 0.55em 0.9em 0.75em; /* = table.infobox padding */
background: #fff;
font-family: var(--ed-font);
font-size: var(--ed-small);
line-height: 1.5;
}
@media (min-width: 640px) {
.mw-parser-output .key-figures { float: right; clear: right; margin: 0.5em 0 0.5em 1em; }
}
@media (max-width: 640px) {
.mw-parser-output .key-figures { float: none; width: 100%; margin: 0.6em 0; }
}
.key-figures .key-figures-above { /* = .infobox-above eyebrow — an INSIDE cell now */
text-align: left;
color: var(--text-dark);
font-size: var(--ed-small);
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
border-bottom: 1px solid var(--text-dark); /* the ONE divider, under the title */
padding: 0.2em 0.2em 0.55em; /* = .infobox-above padding */
}
.key-figures th { /* = .infobox-label */
text-align: left;
color: var(--text-dark);
font-weight: 600; /* semibold labels — tracks .infobox-label */
padding: var(--wt-pad-y) 0.8em var(--wt-pad-y) 0.2em; /* = .infobox-label (wikitable rhythm) */
vertical-align: top;
}
.key-figures td { /* = .infobox-data (left-aligned value) */
text-align: left;
color: var(--text-dark);
padding: var(--wt-pad-y) 0.2em; /* = .infobox-data (wikitable rhythm) */
vertical-align: top;
}
 
/* ── Proofread loop — Original-transcript page furniture (Template:Pdf page,
Template:Fn ref, Template:Fn note, chart-description blocks). The page
IS the source of truth; these mark machine-emitted structure the
deriver maps back to the Original .md. One ink, hairlines, coral on
interaction only. ── */
 
/* PDF page marker: a quiet LEFT-aligned "[p. N]" folio deep-linking the
source PDF at that page (#page=N) — no rule; the link's resting-grey /
coral-on-hover underline is the only ornament (house link convention).
Left, not right: right-side placement collided with the infobox and
other right floats; on the left the marker is always alone on its
line (user rule 2026-07-20). */
.ed-pdfpage {
/* same true-center trick as .ed-chunk: shrink-wrap + auto margins
center on the full body width even beside the infobox float */
display: block;
width: max-content;
margin: 1.4em auto 0.9em;
font-size: var(--ed-small);
line-height: 1.7;
}
.ed-pdfpage a,
.mw-parser-output .ed-pdfpage a.external {
color: var(--text-dark);
background-image: none; /* no external-link arrow on the folio */
padding-right: 0;
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
/* hover must carry the SAME strengthened selector as the resting rule
above — a bare `.ed-pdfpage a:hover` (0,2,1) loses to the resting
`.mw-parser-output .ed-pdfpage a.external` (0,3,1) and the coral
never shows */
.ed-pdfpage a:hover,
.mw-parser-output .ed-pdfpage a.external:hover {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
 
/* Chunk/page provenance marker on SUMMARY pages (Template:Chunk):
"[c. 20; p. 3]" LEFT-aligned on its own line above the chunk heading,
p. 3 linking the Document: transcript's page anchor — same quiet
folio treatment as .ed-pdfpage. Left, not floated right: floats
collided with the infobox / {{Indexing}} key-figures boxes (user
rule 2026-07-20). The link is INTERNAL (no a.external specificity
war), but the strengthened selector is kept for symmetry/safety. */
.ed-chunk {
/* center on the FULL body width, floats ignored: text-align centers
within the float-narrowed line box (drifted left beside the
infobox / key-figures boxes); a shrink-wrapped block with auto
margins centers against the containing block itself. */
display: block;
width: max-content;
margin: 0 auto;
font-size: var(--ed-small);
line-height: 1.7;
}
.ed-chunk a,
.mw-parser-output .ed-chunk a {
color: var(--text-dark);
background-image: none;
padding-right: 0;
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
.ed-chunk a:hover,
.mw-parser-output .ed-chunk a:hover {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
 
/* Footnote reference: the PRINTED marker as the superscript cue (vs the
generic "note" chip of Template:Footnote) — same hover machinery. */
sup.ed-fn-ref {
font-size: 0.75em;
color: var(--text-dark);
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
white-space: nowrap;
}
.ed-fn:hover sup.ed-fn-ref {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
 
/* Footnote definition line ({{fn note}}): small, hanging indent on the
(N) marker — a printed footnote block, not body prose. */
.ed-fn-note {
font-size: var(--ed-small);
line-height: 1.55;
margin: 0.15em 0;
padding-left: 1.7em;
text-indent: -1.7em;
}
.ed-fn-note-marker { font-weight: 600; }
 
/* Chart/image description block: the transcript's verbatim record of a
figure — set off by a left rail, small size, never mistaken for prose. */
.ed-chart-desc {
border-left: 1px solid var(--text-dark);
padding-left: 0.9em;
margin: 1em 0;
font-size: var(--ed-small);
line-height: 1.55;
}