MediaWiki:Common.css: Difference between revisions

Content deleted Content added
No edit summary
No edit summary
 
(22 intermediate revisions by the same user not shown)
Line 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 {
Line 1,112 ⟶ 1,133:
table.wikitable > * > tr:first-child > th,
table.wikitable > * > tr:first-child > td { border-top: 1px solid var(--text-dark); }
/* 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(--text-dark); }
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(--text-dark); }
Line 1,245 ⟶ 1,271:
================================================================= */
 
/* ── WebfontWebfonts: STIXPT TwoSerif Textis (variable;THE ONEsite fileface covers(static 400-/700 + includesitalics —
deliberately NO 600: semibold requests snap to true 700, giving
true 700 bolds, which Source Serif 4's 400-600 range did not).
headers/totals/labels their firm contrast). STIX Two Text stays
@font-face is safe anywhere in ResourceLoader output — never use
loaded as glyph fallback. @font-face is safe anywhere in
@import here (gadget CSS is concatenated BEFORE Common.css and
ResourceLoader output — never use @import here (gadget CSS is
breaks it, per T165040). If the font fails to load, Georgia
concatenated BEFORE Common.css and breaks it, per T165040).
takes over seamlessly. Production hardening: copy the two woff2
filesGeorgia tois the S3offline bucketfallback. and swap the URLs.Production ──hardening: */self-host
the woff2 files on the S3 bucket. ── */
@font-face {
font-family: "PT Serif";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ptserif/v19/EJRVQgYoZZY2vCFuvAFWzr8.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: 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;
font-display: swap;
src: url(https://fonts.gstatic.com/s/ptserif/v19/EJRTQgYoZZY2vCFuvAFT_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";
Line 1,285 ⟶ 1,344:
the old values). ── */
:root {
--ed-font: "PT Serif", "STIX Two Text", Georgia, "Times New Roman", serif;
--text-dark: #0d0d0d; /* THE ink: all text + all lines */
--ed-underline: #ccc1b7; /* resting link underline tint */
--ed-accent: #f07662; /* house coral — interaction only */
--ed-paper: #fff; /* page canvas */
--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)) * 0.9); /* prose stops ~10% short of
the infoboxfloat)tighterthe readableold line + a gutter before the--ed-measure cardprose */cap
--ed-body: 1.0625rem; /* body size 17px: STIX Two Text has a smaller was retired 2026-07 */
--ed-body: 1.0625rem; /* body size 17px, xuser-heightvalidated thanwith the old SourcePT Serif 4, so +1px
restores(inherited from the same optical size (wasSTIX 1rem)x-height */compensation;
kept deliberately: "renders fine") */
--ed-small: 0.875rem; /* THE small size: tables, infobox, TOC, footer —
--ed-small: 0.875rem; /* THE small size: tables, infobox, TOC, footer — 14px */
14px, same optical compensation (was 0.8125rem) */
--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-heading-gap: 4rem; /* space BEFORE h2 AND h3 — the SAME for both (rem, not em,
Line 1,369 ⟶ 1,444:
body { font-family: var(--ed-font); }
 
/* ── Tagline ("Unleashing intelligence", the .mw-logo::after): NO underline
unusualand onNO ahover taglineeffecthoverit feedbackreads isas thebranding, textnot itselfa warminglink to(resting ink is
coral (resting ink is set in §3; the logo still navigates home on click). ── */
.mw-logo:hover::after { color: var(--ed-accent) !important; }
 
/* ── Logo on the TOC axis. Measured on the live DOM (1120px viewport):
Line 1,393 ⟶ 1,467:
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
Line 1,505 ⟶ 1,573:
.mw-parser-output div[style*="overflow-x"] > .copy-table-scroll { margin-top: 0 !important; }
 
/* caption = the table's TITLE asin athe quieth6 EYEBROWvoice (thebold body sharedtext, kickerno
uppercase/letter-spacing — the old eyebrow treatment is retired here). */
treatment — breadcrumb / infobox header): uppercase sans, letter-spaced,
secondary ink, with air below before the grid. No glyph. */
table.wikitable caption {
font-family: var(--ed-font);
font-size: var(--ed-smallbody);
font-weight: 600700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--text-dark);
text-align: left;
padding-bottom: 0.7em5em; /* CALIBRATION: caption→grid air (~8.5px at 17px;
was 0.2em = too tight per user) */
}
 
Line 1,622 ⟶ 1,688:
.skin-minerva .content h2 {
font-family: var(--ed-font);
font-size: 1.875rem;calc(var(--ed-body) * var(--ed-h-ratio) /* 30px */var(--ed-h-ratio)
* var(--ed-h-ratio) * var(--ed-h-ratio)); /* r⁴ ≈ 30px */
line-height: 1.25;
font-weight: 600;
Line 1,637 ⟶ 1,704:
.skin-minerva .content h3 {
font-family: var(--ed-font);
font-size: 1.5rem;calc(var(--ed-body) * var(--ed-h-ratio) /* 24px */var(--ed-h-ratio)
* var(--ed-h-ratio)); /* r³ ≈ 26px */
font-weight: 600;
color: var(--text-dark) !important;
Line 1,644 ⟶ 1,712:
margin-bottom: 0.6em;
}
/* h4/h5: their own rungs on the ladder — at body size they were
indistinguishable from bold prose (and from h6) once the one-font
consolidation erased the old serif/sans distinction. Shared 2rem gap
above = half the h2/h3 gap (same shared-gap logic). */
.mw-body-content h4, .mw-body-content h5 {
font-family: var(--ed-font);
font-weight: 700;
font-size: var(--ed-body); /* body-size headings track the body token */
font-weight: 600;
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 */
Line 1,657 ⟶ 1,736:
color: var(--text-dark) !important;
}
/* h6 spacing: MORENORMAL paragraph spacing before, LESS after(0.5em, This wiki wraps headings inVector's ap
default), LESS after. The old "MORE before" (1.8em) predates the
.mw-heading<N> div that owns the layout margin (cf. the .mw-heading2 rule
chunk-page marker: the marker line now precedes every h6 and carries
above), so the margin MUST sit on the wrapper — also on the bare h6 as a
the visual separation itself, so a wide h6 top margin double-spaced
fallback for un-wrapped DOM. */
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: 10.8em5em 0 0.2em !important;
}
/* pull the block right after an h6 up close, so "less space after" holds even
Line 1,911 ⟶ 1,994:
line-height: 1.5; /* = the infobox / wikitable line-height */
}
/* level-2+ sits flush under level-1 (numbersmarkers aligned on one axis); flex-basis
100% drops the sublist onto its own row below the parent's title + chevron */
.vector-toc .vector-toc-list-item > .vector-toc-list {
Line 1,937 ⟶ 2,020:
}
/* NO section numbers — Vector ships .vector-toc-numb display:none and we no
longer re-show it. Depth is carried by DASHTREE markers instead:, angenerated en dashas
the first flex item of the text row off Vector's per-level li classes:
per nesting level ("–" children, "––" grandchildren), generated as the
a CSS BORDER-DRAWN squared elbow (└ shape) — vertical stub into a
first flex item of the text row (the slot the number used to occupy) off
horizontal arm, ONE continuous 1px ink stroke by construction. Glyph
Vector's per-level li classes. Top-level entries carry no marker. */
attempts ("|–" pipes, U+2514 └ from a fallback font) were rejected: two
.vector-toc .vector-toc-level-2 > .vector-toc-link .vector-toc-text::before { content: "\2013"; }
fonts never join their strokes. Depth = the ARM LENGTH (child short,
.vector-toc .vector-toc-level-3 > .vector-toc-link .vector-toc-text::before { content: "\2013\2013"; }
grandchild longer). Top-level entries carry no marker. */
.vector-toc .vector-toc-level-4 > .vector-toc-link .vector-toc-text::before { content: "\2013\2013\2013"; }
.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;
white-space: nowrap;
letter-spacing: -0.08em; /* consecutive en dashes read as one rule */
}
.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) {
Line 2,006 ⟶ 2,098:
}
 
/* ── 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 2,059 ⟶ 2,151:
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 {
Line 2,073 ⟶ 2,170:
grid-column: 1 / -1;
}
body:not(.skin-minerva) .ed-infobox-band .infobox .infobox-above { display: block; }
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,
Line 2,088 ⟶ 2,191:
margin-bottom: 0.15em;
}
/* no floated card on band pages → the prose measure is released */
body:not(.skin-minerva) .mw-parser-output:has(.ed-infobox-band) { --ed-measure: 100%; }
}
 
Line 2,359 ⟶ 2,460:
/* ── 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
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
Line 2,467 ⟶ 2,570:
interaction only. ── */
 
/* PDF page marker: a quiet rightLEFT-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
margin: 1.4em 0 0.9em;
center on the full body width even beside the infobox float */
text-align: right;
display: block;
width: max-content;
margin: 1.4em auto 0.9em;
font-size: var(--ed-small);
line-height: 1.7;
Line 2,486 ⟶ 2,595:
text-underline-offset: 0.18em;
}
/* hover must carry the SAME strengthened selector as the resting rule
.ed-pdfpage a:hover {
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;