MediaWiki:Common.css: Difference between revisions
Appearance
Content deleted Content added
No edit summary |
No edit summary |
||
| Line 1,720: | Line 1,720: | ||
The li selector carries +1 specificity so it beats the geometry |
The li selector carries +1 specificity so it beats the geometry |
||
block's `padding-left: 0 !important` regardless of paste order. ── */ |
block's `padding-left: 0 !important` regardless of paste order. ── */ |
||
.vector-toc { --toc-numb-gutter: 1. |
.vector-toc { --toc-numb-gutter: 1.6rem; } /* box = gutter - gap must FIT |
||
"22." (~20px @13px tabular) |
"22." (~20px @13px tabular) |
||
or the ::after dot wraps |
or the ::after dot wraps — |
||
this is the MINIMUM for an |
|||
| ⚫ | |||
aligned dot column */ |
|||
| ⚫ | |||
.vector-toc .vector-toc-contents .vector-toc-list-item, |
.vector-toc .vector-toc-contents .vector-toc-list-item, |
||
.vector-toc .vector-toc-list-item { |
.vector-toc .vector-toc-list-item { |
||
| Line 1,734: | Line 1,736: | ||
position: absolute; /* anchored to the li */ |
position: absolute; /* anchored to the li */ |
||
left: 0; |
left: 0; |
||
width: calc(var(--toc-numb-gutter) - 0. |
width: calc(var(--toc-numb-gutter) - 0.35rem); /* 0.35rem = number→text gap */ |
||
text-align: right; /* dots form one column; "9." pads LEFT */ |
text-align: right; /* dots form one column; "9." pads LEFT */ |
||
white-space: nowrap; /* the dot must NEVER wrap inside the box */ |
white-space: nowrap; /* the dot must NEVER wrap inside the box */ |
||
Revision as of 00:28, 13 June 2026
/* =================================================================
Common.css — Global styles for all skins
Applies read-only mode, branding, navigation, and AI assistant.
Logged-in overrides live in MediaWiki:Group-user.css
================================================================= */
/* =================================================================
1. BASE MEDIAWIKI OVERRIDES (Fonts, Quotes, Math, References)
================================================================= */
cite, dfn { font-style: inherit; }
q { quotes: '"' '"' "'" "'"; }
blockquote {
overflow: hidden;
margin: 1em 0;
padding: 0 40px;
}
small { font-size: 85%; }
.mw-body-content sub, .mw-body-content sup { font-size: 80%; }
.ns-talk .mw-body-content dd { margin-top: 0.4em; margin-bottom: 0.4em; }
/* --- Collapsible elements --- */
.client-js .collapsible:not(.mw-made-collapsible).collapsed > tbody > tr:not(:first-child),
.client-js .outercollapse .innercollapse.mw-collapsible:not(.mw-made-collapsible) > p,
.client-js .outercollapse .innercollapse.mw-collapsible:not(.mw-made-collapsible) > table,
.client-js .outercollapse .innercollapse.mw-collapsible:not(.mw-made-collapsible) > thead + tbody,
.client-js .outercollapse .innercollapse.mw-collapsible:not(.mw-made-collapsible) tr:not(:first-child),
.client-js .outercollapse .innercollapse.mw-collapsible:not(.mw-made-collapsible) .mw-collapsible-content,
#editpage-specialchars {
display: none;
}
.references { margin-bottom: 0.5em; }
/* --- Cite link styling --- */
span[rel="mw:referencedBy"] { counter-reset: mw-ref-linkback 0; }
span[rel="mw:referencedBy"] > a::before {
content: counter(mw-ref-linkback, lower-alpha);
font-size: 80%; font-weight: bold; font-style: italic;
}
a[rel="mw:referencedBy"]::before { font-weight: bold; content: "^"; }
span[rel="mw:referencedBy"]::before { content: "^ "; }
.mw-parser-output .mw-collapsible-toggle:not(.mw-ui-button) {
font-weight: normal; padding-right: 0.2em; padding-left: 0.2em;
}
.mw-collapsible-leftside-toggle .mw-collapsible-toggle { float: left; }
/* --- PDF icons --- */
.mw-parser-output a[href$=".pdf"].external,
.mw-parser-output a[href*=".pdf?"].external,
.mw-parser-output a[href*=".pdf#"].external,
.mw-parser-output a[href$=".PDF"].external,
.mw-parser-output a[href*=".PDF?"].external,
.mw-parser-output a[href*=".PDF#"].external {
background: url("//upload.wikimedia.org/wikipedia/commons/4/4d/Icon_pdf_file.png") no-repeat right;
padding: 8px 18px 8px 0;
}
/* --- Warnings and notices --- */
.mw-warning-with-logexcerpt.mw-warning-with-logexcerpt.mw-warning-with-logexcerpt,
div.mw-lag-warn-high, div.mw-cascadeprotectedwarning, div#mw-protect-cascadeon {
clear: both; margin: 0.2em 0; border: 1px solid #bb7070;
background-color: var(--background-color-error-subtle, #ffdbdb);
padding: 0.25em 0.9em; box-sizing: border-box;
}
.mw-contributions-blocked-notice-partial .mw-warning-with-logexcerpt.mw-warning-with-logexcerpt {
border-color: #fc3; background-color: var(--background-color-warning-subtle, #fef6e7);
}
@media (min-width: 640px) {
figure[typeof~="mw:File/Thumb"], figure[typeof~="mw:File/Frame"], .thumbinner { min-width: 100px; }
}
#mw-subcategories, #mw-pages, #mw-category-media, #filehistory, #wikiPreview, #wikiDiff { clear: both; }
/* --- Permission groups (hidden by default) --- */
.checkuser-show, .sysop-show, .abusefilter-show, .abusefilter-helper-show,
.patroller-show, .templateeditor-show, .extendedmover-show, .extendedconfirmed-show,
.autoconfirmed-show, .user-show { display: none; }
.ve-ui-mwNoticesPopupTool-item .editnotice-redlink,
.ve-ui-mwNoticesPopupTool-item .mbox-image,
.ve-ui-mwNoticesPopupTool-item .mbox-imageright { display: none !important; }
ul.permissions-errors { margin: 0; }
ul.permissions-errors > li { list-style: none; }
/* --- Math rendering --- */
span.mwe-math-mathml-inline { font-size: 118%; }
.mwe-math-fallback-image-display, .mwe-math-mathml-display {
margin-left: 1.6em !important; margin-top: 0.6em; margin-bottom: 0.6em;
}
.mwe-math-mathml-display math { display: inline; }
@media screen {
body:not(.ns-0):not(.ns-2):not(.ns-100) .gallerybox .thumb img {
background: #fff url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat;
}
#siteSub { display: block; }
.references { font-size: 90%; }
}
.flaggedrevs_draft_synced, .flaggedrevs_stable_synced, #t-upload,
.mw-special-Book #coll-downloadbox { display: none; }
/* --- Infoboxes --- */
.infobox {
border: 1px solid #a2a9b1; color: black; padding: 0.2em;
font-size: 88%; line-height: 1.5em; border-spacing: 3px;
}
@media screen { .infobox { background-color: #f8f9fa; } }
@media (max-width: 640px) { .infobox { width: 100%; } .infobox .nowrap { white-space: normal; } }
@media (min-width: 640px) {
.infobox { margin: 0.5em 0 0.5em 1em; float: right; clear: right; width: 22em; }
}
.infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data,
.infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar,
.infobox th, .infobox td { vertical-align: top; }
.infobox-label, .infobox-data, .infobox th, .infobox td { text-align: left; }
.infobox .infobox-above, .infobox .infobox-title, .infobox caption {
font-size: 125%; font-weight: bold; text-align: center; padding: 0.2em;
}
.infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image,
.infobox .infobox-full-data, .infobox .infobox-below { text-align: center; }
.infobox .infobox-navbar { text-align: right; }
/* --- Text utilities --- */
.nounderlines a, .IPA a:link, .IPA a:visited { text-decoration: none !important; }
.nowrap, .nowraplinks a { white-space: nowrap; }
.wrap, .wraplinks a { white-space: normal; }
span.texhtml {
font-family: "Nimbus Roman No9 L", "Times New Roman", Times, serif;
font-size: 118%; line-height: 1;
font-variant-numeric: lining-nums tabular-nums; font-kerning: none;
}
span.texhtml span.texhtml { font-size: 100%; }
@media (min-width: 640px) { span.texhtml { white-space: nowrap; } }
@media (max-width: 640px) {
.flagicon a > img, .flagicon noscript > img { max-width: none !important; }
}
@media screen { .nochecker .gallerybox .thumb img { background-image: none; } }
/* --- YouTube embeds --- */
.mw-parser-output iframe[src*="youtube.com"],
.mw-parser-output iframe[src*="youtube-nocookie.com"] {
width: 100% !important; max-width: 320px; height: auto !important;
aspect-ratio: 16 / 9; display: block; margin: 0 auto;
}
/* =================================================================
2. LAYOUT & SPACING
================================================================= */
/* --- Content width & readability --- */
#content {
max-width: 900px;
margin: 0 auto;
line-height: 1.6;
}
/* --- Header reset (invisible container for floating buttons) --- */
.header-container.header-chrome {
position: fixed !important;
top: 0 !important; left: 0 !important; right: 0 !important;
height: 60px !important;
z-index: 1000 !important;
pointer-events: none !important;
}
/* Transparent header (Minerva) */
.header-container.header-chrome,
.minerva-header {
background: transparent !important;
background-color: transparent !important;
border: none !important;
box-shadow: none !important;
}
.header-container .navigation-drawer { display: none !important; }
/* --- Top margin resets (remove white gap) --- */
body.skin-minerva { padding-top: 0 !important; }
#content,
#content.mw-body,
.mw-body {
margin-top: 0 !important;
padding-top: 0 !important;
}
.banner-container,
#siteNotice {
padding: 0 !important;
margin: 0 !important;
}
.pre-content,
.page-heading,
.firstHeading {
margin-top: 0 !important;
padding-top: 0 !important;
}
/* Push title down so it clears the invisible header */
.pre-content.heading-holder {
padding-top: 70px !important; /* 60px header + 10px visual space */
display: block !important;
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
}
/* =================================================================
3. BRANDING (Logo, Tagline — Desktop Header & Mobile Footer)
================================================================= */
/* --- Desktop: hide logo wordmark, inject tagline --- */
.mw-logo-container { display: none !important; }
.mw-logo-wordmark {
display: none !important;
visibility: hidden !important;
width: 0 !important;
}
.mw-logo:hover,
.mw-logo:active,
.mw-logo:focus { text-decoration: none !important; }
.mw-logo::after {
content: "Unleashing \A intelligence";
font-size: 0.875em;
font-weight: 700;
line-height: 1.4;
color: #202122 !important;
text-decoration: none !important;
cursor: pointer;
display: block;
white-space: pre;
margin-left: 3px;
text-align: left;
position: relative;
top: 3px;
}
@media screen and (max-width: 900px) {
.mw-logo::after { display: none !important; }
}
/* --- Mobile footer: logo image + tagline --- */
.minerva-footer-logo {
font-size: 0 !important;
color: transparent !important;
display: block !important;
text-align: left !important;
margin-bottom: 20px !important;
}
.minerva-footer-logo::before {
content: "" !important;
display: block !important;
background-image: url("https://pro-wiki.s3.eu-central-1.amazonaws.com/2776118/Logo.png");
width: 160px;
height: 50px;
background-repeat: no-repeat !important;
background-size: contain !important;
background-position: left center !important;
margin-bottom: 6px !important;
}
.minerva-footer-logo::after {
content: "Unleashing intelligence" !important;
font-size: 0.875rem !important;
font-weight: 700 !important;
line-height: 1.4 !important;
color: #202122 !important;
display: block !important;
white-space: pre-wrap !important;
}
/* Force hidden Minerva footer links to appear */
body.skin-minerva #footer-places-about,
body.skin-minerva #footer-places-disclaimers {
display: inline-block !important;
}
/* --- Fullscreen logo (fits content width) --- */
.fullscreen-logo {
width: 100% !important;
padding: 0 !important;
margin: 0 auto !important;
max-width: 900px !important;
}
.fullscreen-logo figure,
.fullscreen-logo .mw-default-size,
.fullscreen-logo .mw-halign-center {
max-width: 100% !important;
width: 100% !important;
margin: 0 !important;
padding: 0 !important;
}
.fullscreen-logo figure > span {
display: block !important;
width: 100% !important;
}
.fullscreen-logo img.mw-file-element {
display: block !important;
width: 100% !important;
max-width: 100% !important;
height: auto !important;
min-width: 0 !important;
}
/* =================================================================
4. CAPSACH MOBILE TOC OVERLAY
================================================================= */
/* --- Base state (JS toggles visibility) --- */
#cps-open-toc {
position: fixed;
display: none;
}
/* --- Full-screen scrim --- */
#cps-toc-overlay {
position: fixed; inset: 0;
background: rgba(0,0,0,0.4);
display: none;
z-index: 1004;
}
#cps-toc-overlay.is-open { display: block; }
/* --- Dropdown panel --- */
#cps-toc-panel {
position: fixed;
top: 0 !important;
left: 0 !important;
right: 0 !important;
margin: 0 auto !important;
bottom: auto !important;
width: 100% !important;
max-width: 900px !important;
max-height: calc(100vh - 60px) !important;
border-radius: 0 !important;
background: #ffffff !important;
color: #202122 !important;
box-shadow: 0 10px 30px rgba(0,0,0,0.15) !important;
padding: 15px !important;
box-sizing: border-box !important;
overflow-y: auto !important;
-webkit-overflow-scrolling: touch;
z-index: 1005 !important;
display: none;
}
.is-open #cps-toc-panel,
#cps-toc-overlay.is-open + #cps-toc-panel,
#cps-toc-panel[style*="display: block"] {
display: block !important;
}
/* --- Panel header reset --- */
#cps-toc-header {
background: transparent !important;
padding: 0 !important;
margin: 0 !important;
border: none !important;
min-height: 0 !important;
}
/* --- Title bar (grey block) --- */
#cps-toc-panel > h2,
#cps-toc-title {
background-color: #F8F9FA !important;
margin: -15px -15px 15px !important;
padding: 20px 0 !important;
border-bottom: 1px solid #eaecf0 !important;
display: block !important;
width: auto !important;
text-align: center !important;
color: #202122 !important;
font-size: 18px !important;
font-family: sans-serif !important;
font-weight: bold !important;
}
/* Hide close button and duplicate headings */
#cps-toc-close,
#cps-toc-panel .toctitle,
#cps-toc-panel #mw-toc-heading,
#cps-toc-panel h2 {
display: none !important;
}
/* --- TOC list --- */
#cps-toc-list { list-style: none; margin: 0; padding: 0; }
#cps-toc-list li { margin: 0; }
#cps-toc-list a {
display: block; padding: 12px 10px;
border-bottom: 1px solid #f8f8f8;
text-decoration: none;
color: #202122;
font-size: 15px;
line-height: 1.4;
}
#cps-toc-list a:active {
background: #f0f0f0;
color: #3366cc;
}
/* Indentation levels */
#cps-toc-list li[data-level="3"] { padding-left: 15px; }
#cps-toc-list li[data-level="4"] { padding-left: 30px; }
#cps-toc-list li[data-level="5"] { padding-left: 45px; }
/* "Contents" header link — bold, orange, dark border */
#cps-toc-list a[href="#mw-toc-heading"] {
font-weight: bold !important;
color: #f07662 !important;
border-bottom: 1px solid #202122 !important;
}
/* Arrow prefix (▸) for level 2 and 3 items */
#cps-toc-list li[data-level="2"] a::before,
#cps-toc-list li[data-level="3"] a::before {
content: "▸" !important;
color: #202122 !important;
margin-right: 8px;
display: inline-block;
}
/* Remove arrow from "Contents" header (technically level 2) */
#cps-toc-list li[data-level="2"] a[href="#mw-toc-heading"]::before {
display: none !important;
content: "" !important;
}
/* Hide default in-article TOC */
.toc,
#toc,
.mw-parser-output #toc,
.client-js .mw-content-ltr .toc {
display: none !important;
}
/* =================================================================
5. FLOATING BOTTOM BUTTONS (Search, Home, ToC, Email)
================================================================= */
/* --- Shared styles (all 4 buttons + search input) --- */
.branding-box,
#searchIcon,
#cps-open-toc,
#custom-email-btn,
body.mw-mf-search-mode .minerva-header .search-box input {
background-color: rgba(0, 0, 0, 0.2) !important;
opacity: 1 !important;
border-radius: 50% !important;
border: none !important;
box-shadow: none !important;
backdrop-filter: none !important;
pointer-events: auto !important;
box-sizing: border-box !important;
width: 44px !important;
height: 44px !important;
min-width: 44px !important;
max-width: 44px !important;
padding: 0 !important;
margin: 0 !important;
position: fixed !important;
top: auto !important;
bottom: calc(15px + env(safe-area-inset-bottom)) !important;
transform: translateZ(0);
will-change: transform;
left: 50% !important;
right: auto !important;
display: flex !important;
align-items: center;
justify-content: center;
z-index: 1002 !important;
}
/* --- Individual positions --- */
/* Search (far left, offset -150px) */
#searchIcon {
margin-left: -150px !important;
z-index: 1003 !important;
}
#searchIcon .minerva-icon {
font-size: 24px !important;
color: #fff !important;
fill: #fff !important;
filter: brightness(0) invert(1);
}
/* Home (left of center, offset -86px) */
.branding-box {
margin-left: -86px !important;
flex: 0 0 44px !important;
}
.branding-box::after {
content: "⌂";
font-size: 30px !important;
color: #fff !important;
-webkit-text-stroke: 0.5px #fff !important;
margin-top: -6px !important;
line-height: 1 !important;
}
.branding-box a { opacity: 0 !important; position: absolute; inset: 0; }
/* ToC (center, offset -22px) */
#cps-open-toc { margin-left: -22px !important; }
#cps-open-toc .icon {
font-size: 30px !important;
line-height: 1 !important;
margin-bottom: 3px !important;
color: #fff !important;
}
#cps-open-toc .label { display: none !important; }
/* Email (right of center, offset +42px) */
#custom-email-btn { margin-left: 42px !important; }
#custom-email-btn::after {
content: "\2709\FE0E"; /* Text-mode envelope glyph */
font-size: 26px !important;
line-height: 1 !important;
margin-top: -2px !important;
color: transparent !important;
text-shadow: 0 0 0 #fff !important;
}
/* --- Search input (expanded state) --- */
body:not(.mw-mf-search-mode) .minerva-header .search-box {
display: none !important;
}
body.mw-mf-search-mode .minerva-header .search-box {
display: block !important;
position: fixed !important;
top: 8px !important;
height: 44px !important;
z-index: 1001 !important;
left: 10px !important;
right: 10px !important;
width: auto !important;
padding: 0 !important; margin: 0 !important;
background: transparent !important;
border-radius: 0 !important;
}
body.mw-mf-search-mode .minerva-header .search-box input {
width: 100% !important;
font-size: 16px !important;
color: #fff !important;
-webkit-text-fill-color: #fff !important;
padding-left: 55px !important;
padding-right: 55px !important;
position: static !important;
margin: 0 !important;
}
.minerva-header .search-box .search-box-icon-overlay { display: none !important; }
body.mw-mf-search-mode .minerva-header .search-box input::placeholder {
color: rgba(255, 255, 255, 0.7) !important;
-webkit-text-fill-color: rgba(255, 255, 255, 0.7) !important;
}
.search-box .search-box-cancel {
display: block !important;
position: absolute !important;
top: 0 !important; right: 0 !important;
width: 44px !important; height: 44px !important;
line-height: 44px !important;
text-align: center !important;
color: #fff !important;
z-index: 1004 !important;
}
/* =================================================================
6. GLOBAL HIDE (Read-Only Mode)
Hidden for everyone; un-hidden in MediaWiki:Group-user.css
================================================================= */
/* --- User links (includes Vector 2022 sticky header IDs) --- */
#vector-user-links,
#p-personal,
#pt-login,
#pt-login-2,
#pt-createaccount,
#pt-createaccount-2,
#pt-userpage,
#pt-mytalk,
#pt-preferences,
#pt-watchlist,
#pt-mycontris,
#pt-logout {
display: none !important;
}
/* --- Tools (sidebar, dropdowns, tabs) --- */
#p-tb,
#vector-page-tools,
#vector-page-tools-dropdown,
.vector-p-tb,
#ca-viewsource,
#ca-history,
#ca-talk {
display: none !important;
}
/* --- Categories --- */
#catlinks,
.catlinks,
.mw-normal-catlinks {
display: none !important;
}
/* --- Page actions (Language, Watch, Edit, etc.) --- */
#p-views,
.page-actions-menu__list,
.page-actions-menu {
display: none !important;
}
/* --- Vector 2022 page toolbar & pre-content --- */
.vector-page-toolbar { display: none !important; }
.vector-body-before-content { display: none !important; }
/* --- Language selector & main menu --- */
#p-vector-user-menu-preferences { display: none !important; }
.vector-main-menu-landmark { display: none !important; }
/* --- Color theme (anonymous only) --- */
body:not(.group-user) #skin-client-prefs-skin-theme { display: none !important; }
/* --- Mobile: history bar --- */
.last-modified-bar,
a.last-modified-bar {
display: none !important;
visibility: hidden !important;
}
.last-modified-bar__text,
.modified-enhancement,
.minerva-icon--modified-history {
display: none !important;
}
/* --- Mobile: user/login menu --- */
.minerva-user-menu { display: none !important; }
.toggle-list__toggle#minerva-user-menu-toggle { display: none !important; }
.minerva-icon--userAvatarOutline { display: none !important; }
/* --- Mobile: sidebar items --- */
#mw-mf-page-left a[href*="Special:RecentChanges"],
#mw-mf-page-left a[data-event-name="recentchanges"],
#mw-mf-page-left a[href*="Special:SpecialPages"],
#mw-mf-page-left a[href*="Community_portal"] {
display: none !important;
}
/* =================================================================
7. TYPOGRAPHY & LINKS
================================================================= */
/* --- Heading colors --- */
.mw-heading1, h1,
.mw-heading2, h2,
h3, h4, h5, h6,
.firstHeading,
.mw-page-title-main,
.page-heading,
.section-heading,
.vector-sticky-header-context-bar-primary,
.mw-headline,
.vector-pinnable-header-label {
color: #202122 !important;
}
/* --- Heading borders --- */
.mw-heading1, h1,
.mw-heading2, h2,
.section-heading {
border-bottom: 1px solid #202122 !important;
margin-bottom: 0.6em;
}
.mw-first-heading {
border-bottom: 2px solid #202122 !important;
margin-bottom: 0.5em;
}
/* Remove Vector 2022 default title underline */
.vector-page-titlebar::after {
background-color: transparent !important;
display: none !important;
height: 0 !important;
}
/* Contents sidebar heading (no border) */
h2.vector-pinnable-header-label { border-bottom: none !important; }
/* --- Link colors (legacy blue #1d70b8) --- */
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: #000099 !important;
}
/* Red links (missing pages) */
a.new,
a.new:visited { color: #d73333 !important; }
/* UI buttons stay white */
a.mw-ui-button,
a.mw-ui-button:visited { color: #fff !important; }
/* --- Edit section links --- */
.mw-editsection, .mw-editsection a {
color: #202122 !important;
opacity: 0.7;
}
/* --- Footer borders --- */
#footer,
.mw-footer,
.minerva-footer,
.printfooter {
border-top: 1px solid #202122 !important;
}
#footer-icons { display: none !important; }
.minerva-footer .footer-content,
.minerva-footer .branding-box,
.minerva-footer-logo,
#footer-info,
#footer-places {
border: none !important;
}
/* Mobile section expand icon */
.skin-minerva .section-heading .mw-ui-icon-wikimedia-expand-small {
filter: grayscale(1) brightness(0.2);
}
/* --- Navigation menu paragraphs --- */
.navigation-menu .infobox-data p {
font-size: 1em !important;
margin: 0 !important;
padding: 0 !important;
}
/* --- Main page menu --- */
.main-page-menu {
line-height: 1.8;
margin-bottom: 0;
font-size: 1em;
}
/* --- Read pill (inline badge) --- */
.read-pill {
display: inline;
white-space: nowrap;
padding: 1px 0.4em;
position: relative;
top: -1px;
border-radius: 4px;
margin: 0 0.2em 0 0;
font-size: 0.85em;
font-weight: 500;
color: #202122 !important;
-webkit-box-decoration-break: clone;
box-decoration-break: clone;
}
.read-pill a,
.read-pill a:visited {
color: #202122 !important;
text-decoration: none !important;
}
.read-pill a.new {
color: red !important;
padding: 0 4px;
border-radius: 3px;
}
/* --- Minerva bullet indentation fix --- */
body.skin-minerva .mw-parser-output ul,
body.skin-minerva .collapsible-block ul {
padding-left: 1em;
margin-left: 0;
}
body.skin-minerva .mw-parser-output ul ul,
body.skin-minerva .collapsible-block ul ul {
padding-left: 1em;
}
/* =================================================================
8. AI ASSISTANT PANEL
================================================================= */
/* --- Z-index: sits behind floating buttons (z-index 1002) --- */
.ext-aiassistant,
.ext-aiassistant-panel {
z-index: 1001 !important;
}
/* --- Panel shell --- */
.ext-aiassistant-panel {
border: 1px solid #202122 !important;
box-shadow: none !important;
}
/* --- Header --- */
.ext-aiassistant-header {
border-bottom: 1px solid #202122 !important;
margin-left: 0 !important;
margin-right: 0 !important;
padding-left: 12px !important;
padding-right: 12px !important;
}
/* --- Message area --- */
.ext-aiassistant-body {
padding-left: 20px !important;
padding-right: 20px !important;
box-sizing: border-box !important;
}
.ext-aiassistant-message {
margin-left: 0 !important;
margin-right: 0 !important;
}
.ext-aiassistant-message + .ext-aiassistant-message {
margin-top: 0 !important;
}
/* --- User bubble --- */
.ext-aiassistant-message-user {
margin-left: 100px !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.ext-aiassistant-message-user .ext-aiassistant-message__content {
background-color: #202122 !important;
color: white !important;
border-radius: 18px !important;
border: none !important;
padding: 6px 12px !important;
}
.ext-aiassistant-message-user .ext-aiassistant-message__content p {
color: white !important;
margin: 0 !important;
}
/* --- Assistant typography (matches article style) --- */
.ext-aiassistant-message-assistant {
font-family: sans-serif !important;
font-size: 1em !important;
color: #202122 !important;
overflow-wrap: break-word !important;
white-space: normal !important;
max-width: 100% !important;
}
.ext-aiassistant-message-assistant p {
margin: 0 0 0.6em !important;
}
.ext-aiassistant-message-assistant p,
.ext-aiassistant-message-assistant li,
.ext-aiassistant-message-assistant ul,
.ext-aiassistant-message-assistant ol {
line-height: 1.6 !important;
}
.ext-aiassistant-message-assistant ul,
.ext-aiassistant-message-assistant ol {
margin: 0.3em 0 0.6em !important;
margin-left: 0 !important;
padding-top: 0 !important;
}
.ext-aiassistant-message-assistant ul {
list-style-type: disc !important;
padding-left: 1.2em !important;
}
.ext-aiassistant-message-assistant ul ul {
list-style-type: disc !important;
padding-left: 1.5em !important;
}
.ext-aiassistant-message-assistant li {
margin-bottom: 0.2em !important;
white-space: normal !important;
}
.ext-aiassistant-message-assistant pre,
.ext-aiassistant-message-assistant code {
white-space: pre-wrap !important;
word-wrap: break-word !important;
font-family: inherit !important;
background: transparent !important;
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
/* --- Action buttons (copy, source) --- */
.ext-aiassistant-message-assistant .ext-aiassistant-actions {
display: flex !important;
flex-direction: row-reverse !important;
}
.ext-aiassistant-message-user .ext-aiassistant-actions {
display: flex !important;
justify-content: flex-end !important;
}
/* --- Citations --- */
.ext-aiassistant-cite {
line-height: 1 !important;
font-size: 80% !important;
vertical-align: super !important;
}
/* --- Sources --- */
.ext-aiassistant-sources {
background: transparent !important;
border: none !important;
box-shadow: none !important;
padding: 0 !important;
margin-bottom: 12px !important;
}
/* --- "New Chat" label --- */
.ext-aiassistant-panel .cdx-button--weight-quiet:not(.cdx-button--icon-only) {
font-size: 0 !important;
}
.ext-aiassistant-panel .cdx-button--weight-quiet:not(.cdx-button--icon-only)::before {
content: "New" !important;
font-size: 0.875rem !important;
font-weight: bold !important;
color: #202122 !important;
visibility: visible !important;
}
/* --- Footer + Composer --- */
.ext-aiassistant-footer {
border-top: 1px solid #202122 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
padding: 0 !important;
box-sizing: border-box !important;
background-color: #f8f9fa !important;
}
.ext-aiassistant-prompt-composer {
margin: 0 !important;
width: 100% !important;
background-color: #fff !important;
padding: 10px 20px !important;
border: none !important;
border-radius: 0 !important;
}
.ext-aiassistant-prompt-composer__toolbar {
display: flex !important;
align-items: center !important;
}
/* --- Composer focus --- */
.ext-aiassistant-prompt-composer:focus-within .ext-aiassistant-prompt-composer__input,
.ext-aiassistant-prompt-composer__input:focus {
border-color: #202122 !important;
outline: none !important;
box-shadow: none !important;
}
/* --- Send button --- */
.ext-aiassistant-prompt-composer__send {
border-radius: 50% !important;
width: 32px !important;
height: 32px !important;
min-width: 0 !important;
padding: 0 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
margin-left: 4px !important;
}
.ext-aiassistant-prompt-composer__send:not(:disabled) {
background-color: #202122 !important;
border-color: #202122 !important;
color: #ffffff !important;
}
.ext-aiassistant-prompt-composer__send:disabled {
background-color: #EAECF0 !important;
border-color: #EAECF0 !important;
}
.ext-aiassistant-prompt-composer__send:disabled .cdx-icon svg {
fill: #72777d !important;
}
/* =================================================================
9. RESPONSIVE OVERRIDES
================================================================= */
/* --- Mobile (max-width: 768px) --- */
@media screen and (max-width: 768px) {
/* AI assistant: fullscreen mode */
.ext-aiassistant-panel {
position: fixed !important;
box-sizing: border-box !important;
width: 100% !important;
height: 100% !important;
max-width: none !important;
max-height: none !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
bottom: 0 !important;
border-radius: 0 !important;
margin: 0 !important;
}
.ext-aiassistant-body {
height: auto !important;
flex-grow: 1 !important;
}
/* Push input above sticky buttons */
.ext-aiassistant-footer {
padding-bottom: calc(70px + env(safe-area-inset-bottom)) !important;
}
/* Add a line to separate with the sticky buttons */
.ext-aiassistant-prompt-composer {
border-bottom: 1px solid #202122 !important;
border-radius: 0 !important;
padding-bottom: 10px !important;
}
/* Prevent iOS zoom on AI input */
.ext-aiassistant-panel input,
.ext-aiassistant-panel textarea,
.ext-aiassistant-panel .cdx-text-input__input {
font-size: 16px !important;
}
/* Prevent horizontal scroll */
html, body {
overflow-x: hidden !important;
width: 100% !important;
position: relative;
}
/* Hide AI shortcut hint */
.ext-aiassistant-shortcut-hint { display: none !important; }
}
/* --- Tablet (min-width: 768px) --- */
@media screen and (min-width: 768px) {
/* Lock home button shape */
.branding-box {
width: 44px !important;
min-width: 44px !important;
max-width: 44px !important;
flex: 0 0 44px !important;
margin-left: -86px !important;
}
/* Keep ToC centered */
#cps-open-toc {
display: flex !important;
visibility: visible !important;
opacity: 1 !important;
z-index: 9999 !important;
margin-left: -22px !important;
background-color: rgba(0, 0, 0, 0.2) !important;
width: 44px !important;
height: 44px !important;
border-radius: 50% !important;
}
}
/* --- Desktop (min-width: 1000px) --- */
@media screen and (min-width: 1000px) {
/* Wider content column */
#content { max-width: 1200px !important; }
/* Match logo to wider content */
.fullscreen-logo { max-width: 100% !important; }
.fullscreen-logo img.mw-file-element {
max-width: min(100%, 1200px) !important;
margin: 0 auto !important;
}
/* Hide ToC button on desktop Vector 2022 (full sidebar available) */
body.skin-vector-2022 #cps-open-toc { display: none !important; }
}
/* =================================================================
10. PRINT STYLES
================================================================= */
@media print {
/* --- Hide floating buttons, overlays, and AI assistant --- */
#searchIcon,
.branding-box,
#cps-open-toc,
#custom-email-btn,
#cps-toc-panel,
#cps-toc-overlay,
.minerva-header .search-box,
.ext-aiassistant,
.ext-aiassistant-panel,
.ext-aiassistant-trigger {
display: none !important;
}
/* --- Hide standard MediaWiki UI elements to free up space --- */
#mw-navigation,
#footer,
.printfooter,
.mw-editsection {
display: none !important;
}
/* --- Font consistency for lists --- */
.mw-parser-output ul,
.mw-parser-output ol,
.mw-parser-output li {
font-family: inherit !important;
}
/* --- Remove underlines specifically from internal links in print --- */
.mw-parser-output a:not(.external),
.mw-parser-output a:not(.external):visited {
text-decoration: none !important;
}
}
/* ============================================================================
SECTION 11 — WIKITABLES: table TYPES
- .wikitable = NEUTRAL default: themed (frame, caption, header
tint, hairlines, hover) but free-form — columns
flex, labels wrap, nothing frozen.
- .wikitable.fintable = FINANCIAL bundle: frozen nowrap first column +
data-column width floors. The bot emits the class
automatically on numeric-dense tables; add it by
hand to get the same behavior on a manual table.
- Future table types = one new class, one new bundle below.
- .wt-freeze-2 = add-on modifier: freeze columns 1+2 (mark column 1
col-xs so column 2 knows where to stick).
============================================================================ */
:root {
/* column size scale — markers map to these; an UNMARKED column flexes */
--wt-xs: 3em;
--wt-s: 6em;
--wt-m: 9em;
--wt-l: 15em;
--wt-xl: 24em;
--wt-xxl: 39em;
/* palette (section 12 re-points these onto the warm ramp) */
--wt-border: #eceef1;
--wt-rule: #72777d;
--wt-edge: #dadde1;
--wt-th-bg: #f6f7f9;
--wt-th-text: #54595d;
--wt-pad-y: 0.5em;
}
/* ── Theme: EVERY wikitable, any type ── */
.wikitable { width: 100% !important; }
table.wikitable {
font-size: 0.85em;
background-color: #fff;
border: 1px solid var(--wt-border);
font-variant-numeric: tabular-nums;
margin-top: 0.3em;
margin-bottom: 2em;
}
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: 1px solid var(--wt-border);
padding: var(--wt-pad-y) 0.6em;
}
table.wikitable > * > tr > th {
background-color: var(--wt-th-bg);
color: var(--wt-th-text);
}
table.wikitable > * > tr:first-child > th,
table.wikitable > * > tr:first-child > td { border-top: 1px solid var(--wt-rule); }
table.wikitable > * > tr:has(> th):has(+ tr > td) > th { border-bottom: 1px solid var(--wt-rule); }
table.wikitable > * > tr:last-child > td,
table.wikitable > * > tr:last-child > th { border-bottom: 1px solid var(--wt-rule); }
table.wikitable > tbody > tr:hover > td { background-color: #f8f9fa; }
table.wikitable td p { font-size: inherit !important; }
/* ── Column size scale: usable on ANY table type ── */
.wikitable th.col-xs, .wikitable td.col-xs { width: var(--wt-xs); min-width: var(--wt-xs); }
.wikitable th.col-s, .wikitable td.col-s { width: var(--wt-s); min-width: var(--wt-s); }
.wikitable th.col-m, .wikitable td.col-m { width: var(--wt-m); min-width: var(--wt-m); }
.wikitable th.col-l, .wikitable td.col-l { width: var(--wt-l); min-width: var(--wt-l); }
.wikitable th.col-xl, .wikitable td.col-xl { width: var(--wt-xl); min-width: var(--wt-xl); }
.wikitable th.col-xxl, .wikitable td.col-xxl { width: var(--wt-xxl); min-width: var(--wt-xxl); }
/* legacy marker names on published pages = aliases of s / m */
.wikitable th.col, .wikitable td.col { width: var(--wt-s); min-width: var(--wt-s); }
.wikitable th.col-wide, .wikitable td.col-wide { width: var(--wt-m); min-width: var(--wt-m); }
/* ── FINTABLE bundle — THE definition of "financial table" on this wiki.
Applies to .fintable (emitter-typed numeric-dense tables) and, via
:has(), to every already-published bot table — they all carry the
legacy col/col-wide markers, so the back catalogue upgrades with NO
re-publishing. The bridge is scoped to the LEGACY marker names only:
col-s/col-m on a neutral hand table does NOT trigger financial
behavior. Repeat this selector group verbatim wherever fintable
scoping is needed (section 12 uses it too). ── */
/* data-column floor (legacy pages can have unmarked data columns) */
table.wikitable.fintable th:not(:first-child),
table.wikitable.fintable td:not(:first-child),
table.wikitable:has(.col, .col-wide) th:not(:first-child),
table.wikitable:has(.col, .col-wide) td:not(:first-child) { min-width: var(--wt-s); }
/* frozen row-label column */
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: nowrap;
min-width: 16em;
position: sticky;
left: 0;
z-index: 1;
box-shadow: 1px 0 0 var(--wt-edge);
}
table.wikitable.fintable td:first-child,
table.wikitable:has(.col, .col-wide) td:first-child { background-color: #fff; }
table.wikitable.fintable th:first-child,
table.wikitable:has(.col, .col-wide) th:first-child { background-color: var(--wt-th-bg); }
/* ── wt-freeze-2 add-on: freeze columns 1+2. Mark column 1 col-xs — column
2 sticks exactly one xs step in. Comes AFTER the fintable bundle so
its column-1 width exception wins the tie. ── */
table.wikitable.wt-freeze-2 th:first-child,
table.wikitable.wt-freeze-2 td:first-child {
min-width: var(--wt-xs); /* overrides the fintable 16em label column */
white-space: normal;
position: sticky;
left: 0;
z-index: 1;
}
table.wikitable.wt-freeze-2 th:nth-child(2),
table.wikitable.wt-freeze-2 td:nth-child(2) {
position: sticky;
left: var(--wt-xs);
z-index: 1;
box-shadow: 1px 0 0 var(--wt-edge);
background-color: #fff;
}
table.wikitable.wt-freeze-2 th:nth-child(2) { background-color: var(--wt-th-bg); }
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); }
@media screen and (max-width: 719px) {
table.wikitable { border: none !important; }
table.wikitable > tr > th,
table.wikitable > tr > td,
table.wikitable > tbody > tr > th,
table.wikitable > tbody > tr > td {
border: 1px solid var(--wt-border);
}
}
/* =================================================================
12. EDITORIAL DESIGN SYSTEM v10 ("paper & ink")
Appended LAST deliberately: later rules of equal specificity win,
so this section restyles typography / color / spacing WITHOUT
editing sections 1-11 (it even re-points section 11's --wt-*
color variables from here — a later :root wins). Delete the whole
section to revert.
v10: markers drawn at EXACT positions — each level's marker sits on
its parent's text axis (level 1 on the heading axis); shapes
bullet / triangle / en dash, optically equal sizes.
================================================================= */
/* ── Webfont: Source Serif 4 (variable; ONE file covers 400-600).
@font-face is safe anywhere in ResourceLoader output — never use
@import here (gadget CSS is concatenated BEFORE Common.css and
breaks it, per T165040). If the font fails to load, Georgia
takes over seamlessly. Production hardening: copy the two woff2
files to the S3 bucket and swap the URLs. ── */
@font-face {
font-family: "Source Serif 4";
font-style: normal;
font-weight: 400 600;
font-display: swap;
src: url(https://fonts.gstatic.com/s/sourceserif4/v14/vEFF2_tTDB4M7-auWDN0ahZJW3IX2ih5nk3AucvUHf6kDXr4.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: "Source Serif 4";
font-style: italic;
font-weight: 400 600;
font-display: swap;
src: url(https://fonts.gstatic.com/s/sourceserif4/v14/vEF02_tTDB4M7-auWDN0ahZJW1ge6NmXpVAHV83Bfb_US2D2QYxoUKIkn98pRl9tDMQC.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.
ONE gray ramp (3 grays + 2 hairlines), ONE small size, ONE sans.
The --wt-* lines re-point section 11's table palette onto the
same warm ramp (this :root is later, so it wins the tie). ── */
:root {
--ed-serif: "Source Serif 4", Georgia, "Times New Roman", serif;
--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 — hover underline, sparing */
--ed-paper: #fbfaf7; /* page canvas (set #fff to disable the tint) */
--ed-infobox-w: 18.5rem; /* infobox total width (border-box) */
--ed-measure: calc(100% - var(--ed-infobox-w)); /* prose ends ON the infobox border */
--ed-body: 1rem; /* body size (16px — the "90% zoom" preference) */
--ed-small: 0.8125rem; /* THE small size: tables, infobox, TOC, footer */
--ed-title-gap: 2.1rem; /* CALIBRATION: moves the title rule DOWN */
--ed-list-indent: 1.2rem; /* per-level indent = the marker-to-text step
(rem, NOT em — an em offset would resolve
against each marker's own font-size) */
/* section 11's table palette, warmed onto the same ramp.
--wt-rule is the table FRAME: deliberately lighter than the ink
h2 rules so tables sit below section structure in the hierarchy */
--wt-border: #ece8e1;
--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 ── */
body, .mw-page-container { background-color: var(--ed-paper) !important; }
.vector-header-container .mw-header,
.vector-header-container .vector-sticky-header {
background-color: var(--ed-paper) !important;
}
#vector-toc, .vector-toc, .vector-pinned-container {
background-color: transparent !important;
}
/* Minerva (mobile skin) paints its own white wrappers over body */
#mw-mf-page-center, .mw-body { background-color: var(--ed-paper) !important; }
.vector-sticky-pinned-container::after {
background: linear-gradient(transparent, var(--ed-paper)) !important;
}
@media print { body, .mw-page-container { background-color: #fff !important; } }
/* ── Visitor chrome: Appearance UI hidden for EVERYONE here, re-shown
for logged-in users in MediaWiki:Group-user.css (the wiki's
read-only-mode architecture — Group-user.css only loads when
logged in, so no body-class dependency) ── */
.vector-appearance-landmark,
#vector-appearance-dropdown,
#vector-appearance-pinned-container,
#vector-appearance,
.vector-column-end { display: none !important; }
/* ── Mobile (Minerva) keeps ONE light line tone in tables — every
structural table line consumes --wt-rule, so one override
simplifies frame, header rule, and side rails at once ── */
.skin-minerva { --wt-rule: var(--wt-border); }
/* ── ONE sans: the whole interface (header, search, tagline, buttons,
footer) and all data share the Codex stack; prose re-asserts the
serif below ── */
body { font-family: var(--ed-sans); }
/* ── Logo on the title axis: push it right by the TOC column + grid
gap at Vector's own grid breakpoints, so the logo + tagline sit
exactly above the page title. Below 1120px the TOC column does
not exist, so no offset. ── */
@media (min-width: 1120px) { .mw-logo { margin-left: calc(12.25rem + 24px); } }
@media (min-width: 1680px) { .mw-logo { margin-left: calc(15.5rem + 24px); } }
/* ── Prose voice: serif, warm ink (Minerva has no .mw-body-content —
its wrapper is #bodyContent.content) ── */
.mw-body-content,
.skin-minerva #bodyContent.content {
font-family: var(--ed-serif);
font-size: var(--ed-body);
line-height: 1.6;
color: var(--ed-ink);
font-variant-numeric: lining-nums;
}
/* readable measure for prose; data/tables stay full width */
.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-sans);
font-size: var(--ed-small);
}
/* ── The table BLOCK ──
1. Printed ON the paper (not white cards): surfaces transparent;
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-rule. 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
FINTABLE it must be a box-shadow on the sticky first-column
cells — with border-collapse, borders on sticky cells do not
move when the cell sticks (they vanish on horizontal scroll),
but shadows travel with the cell — and the table's own left
border is disabled so the rail is the only line there.
The fintable selector group below is section 11's definition
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; }
table.wikitable > tbody > tr:hover > td { background-color: #f2ede5; }
table.wikitable.fintable td:first-child,
table.wikitable:has(.col, .col-wide) td:first-child {
background-color: var(--ed-paper);
}
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 {
border-left: none;
box-shadow: inset 1px 0 0 var(--wt-rule), /* left rail — sticks with the cell */
1px 0 0 var(--wt-edge); /* right edge of the frozen column */
}
.wikitable th:last-child,
.wikitable td:last-child { border-right: 1px solid var(--wt-rule); }
table.wikitable { margin: 0; border-left: 1px solid var(--wt-rule); }
table.wikitable.fintable,
table.wikitable:has(.col, .col-wide) { border-left: none; }
/* caption = the table's TITLE: one size step above the 13px cells, with
a systematic data glyph (swap the emoji here to change it everywhere) */
table.wikitable caption {
color: var(--ed-ink);
font-size: 0.875rem;
font-weight: 600;
}
table.wikitable caption::before {
content: "📊";
margin-right: 0.45em;
font-size: 0.9em;
}
/* standfirst — the italic intro sentence (FT: sans, calm). Anchored to the
generated infobox-then-intro pattern so hand-written pages keep real italics */
.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);
}
/* ── List geometry — ONE definition for both skins: text hangs at
--ed-list-indent per level; the markers are positioned EXACTLY
below (see the ::before block). !important + the Minerva-qualified
selectors beat section 7's mobile rules and the skin defaults;
table-cell lists keep section 11's own rule (higher specificity). ── */
.mw-parser-output ul,
.mw-parser-output ol,
body.skin-minerva .mw-parser-output ul,
body.skin-minerva .collapsible-block ul {
margin-left: 0 !important;
padding-left: var(--ed-list-indent) !important;
}
.mw-parser-output ol { padding-left: 1.4em !important; } /* numbers need more room */
/* list rhythm: air between points, predictable nesting */
.mw-parser-output ul { margin-top: 0.4em; }
.mw-parser-output li { margin-bottom: 0.45em; }
.mw-parser-output li li { margin-top: 0.3em; margin-bottom: 0.3em; }
.mw-parser-output li > ul { margin-top: 0.3em; }
/* per-level markers drawn as ::before at EXACT positions: each marker's
LEFT edge sits on its parent's text axis (level 1 on the heading
axis), because left: -indent lands on the container edge, which IS
the parent text x. Shapes: bullet / house triangle (drivers, echoes
the TOC prefix) / hairline en dash; per-level font-size +
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; }
.mw-parser-output ul > li::before {
content: "\2022";
position: absolute;
left: calc(-1 * var(--ed-list-indent));
color: var(--ed-faint);
font-family: var(--ed-sans);
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-height:0 stops them inflating the line box */
.mw-body-content sup,
.skin-minerva .content sup {
font-size: 68%;
line-height: 0;
font-family: var(--ed-sans);
color: var(--ed-faint);
}
/* ── Title block: serif display, REGULAR weight, large; the title-gap
knob lands its rule on the CONTENTS rule's line ── */
h1#firstHeading, .mw-first-heading {
font-family: var(--ed-serif);
font-size: 2.4rem;
line-height: 1.15;
font-weight: 400;
letter-spacing: -0.01em;
color: var(--ed-ink) !important;
border-bottom: 2px solid var(--ed-ink) !important;
margin-top: var(--ed-title-gap) !important;
padding-bottom: 0.3em;
margin-bottom: 0.35em;
}
/* breadcrumb under the title rule — the shared eyebrow treatment */
#contentSub .subpages {
font-family: var(--ed-sans);
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ed-secondary);
margin-bottom: 1.4em;
}
#contentSub .subpages a,
#contentSub .subpages a:visited { color: var(--ed-secondary) !important; }
/* ── Section headings: sans semibold on the house rules. Scoped to
.mw-body-content — Vector's own typography rules are
class-qualified (0,1,1), so bare h2/h3 selectors would LOSE.
Minerva's content wrapper is .content. ── */
.mw-body-content h2, .mw-body-content .mw-heading2, .section-heading,
.skin-minerva .content h2 {
font-family: var(--ed-sans);
font-size: 1.4rem;
line-height: 1.25;
font-weight: 600;
letter-spacing: -0.005em;
color: var(--ed-ink) !important;
border-bottom: 1px solid var(--ed-ink) !important;
margin-top: 2.2em;
margin-bottom: 0.7em;
padding-bottom: 0.3em;
}
.mw-body-content h3,
.skin-minerva .content h3 {
font-family: var(--ed-sans);
font-size: 1.08rem;
font-weight: 600;
color: var(--ed-ink) !important;
margin-top: 1.8em;
margin-bottom: 0.5em;
}
.mw-body-content h4, .mw-body-content h5, .mw-body-content h6 {
font-family: var(--ed-sans);
font-size: 1rem;
font-weight: 600;
color: var(--ed-ink) !important;
}
/* the inner spans are pinned #202122 !important by section 7 — make them
follow their heading's ink instead */
.mw-headline, .mw-page-title-main { color: inherit !important; }
/* ── Links: FT teal; content links carry a resting tint underline that
warms to the house 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(--ed-link) !important;
}
.mw-parser-output a {
text-decoration: underline;
text-decoration-color: var(--ed-underline);
text-decoration-thickness: 1px;
text-underline-offset: 0.18em;
}
.mw-parser-output a:hover {
text-decoration-color: var(--ed-accent);
text-decoration-thickness: 2px;
}
/* exceptions re-stated AFTER the generic rules so they keep winning */
a.new, a.new:visited { color: #d73333 !important; }
a.mw-ui-button, a.mw-ui-button:visited { color: #fff !important; }
.mw-editsection, .mw-editsection a, .mw-editsection a:visited {
color: var(--ed-secondary) !important;
text-decoration: none;
}
/* ── Focus/active states join the interactive teal — Codex paints them
in its own progressive blue (#36c) otherwise. The generic
.cdx-text-input rule covers the header search box; the AI chat
input is exempted further below (its ring sits on the composer). ── */
.cdx-text-input__input:focus,
.cdx-text-input__input:enabled:focus {
border-color: var(--ed-link) !important;
box-shadow: inset 0 0 0 1px var(--ed-link) !important;
}
.cdx-button:enabled:focus,
.cdx-button--fake-button:focus {
box-shadow: inset 0 0 0 2px var(--ed-link) !important;
}
:focus-visible { outline-color: var(--ed-link); }
/* ── TOC sidebar: quiet sans at the ONE small size; "CONTENTS" label at
the title's text level, its 1px ink rule on the title rule's line.
padding-top moves the LABEL and the rule together; padding-bottom
moves the RULE only — fine-tune in 0.05rem steps. ── */
.vector-toc { font-family: var(--ed-sans); }
.vector-toc .vector-pinnable-header {
border-bottom: 1px solid var(--ed-ink) !important;
padding-top: 0.35rem; /* CALIBRATION: moves the LABEL and the rule together */
padding-bottom: 0.95rem; /* CALIBRATION: moves the RULE only */
margin-bottom: 0.9rem;
}
.vector-toc .vector-pinnable-header-label {
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ed-secondary) !important;
}
.vector-toc .vector-toc-link,
.vector-toc .vector-toc-link:visited {
color: var(--ed-secondary) !important;
font-size: var(--ed-small);
text-decoration: none;
}
.vector-toc .vector-toc-link:hover { color: var(--ed-ink) !important; }
.vector-toc .vector-toc-list-item-active > .vector-toc-link { color: var(--ed-ink) !important; }
/* ── TOC section numbers (v3, absolute-marker pattern — the same trick
as the article list markers). MediaWiki computes the numbers
(1, 2, 2.1 …); Vector ships them display:none. The li reserves a
gutter via padding; the number is absolutely positioned INTO the
gutter (left:0, top:auto keeps it on its own first line). Entry
text — first line AND wrapped lines — starts at the padding edge
by construction, so alignment cannot drift; no inline-block, no
negative text-indent, no whitespace-node gaps. Gutter token in
REM; level-2 widens its own token ("2.1." is wider than "9.").
The li selector carries +1 specificity so it beats the geometry
block's `padding-left: 0 !important` regardless of paste order. ── */
.vector-toc { --toc-numb-gutter: 1.6rem; } /* box = gutter - gap must FIT
"22." (~20px @13px tabular)
or the ::after dot wraps —
this is the MINIMUM for an
aligned dot column */
.vector-toc .vector-toc-list-item.vector-toc-level-2 { --toc-numb-gutter: 2.2rem; }
.vector-toc .vector-toc-contents .vector-toc-list-item,
.vector-toc .vector-toc-list-item {
position: relative; /* the number's anchor (self-contained) */
padding-left: var(--toc-numb-gutter) !important;
text-indent: 0; /* neutralize any earlier hanging-indent rule */
}
.vector-toc .vector-toc-numb {
display: block; /* defeat Vector's display:none on the numb */
position: absolute; /* anchored to the li */
left: 0;
width: calc(var(--toc-numb-gutter) - 0.35rem); /* 0.35rem = number→text gap */
text-align: right; /* dots form one column; "9." pads LEFT */
white-space: nowrap; /* the dot must NEVER wrap inside the box */
font-variant-numeric: tabular-nums;
}
.vector-toc .vector-toc-numb::after { content: "."; } /* "1." not "1" */
/* ── TOC geometry: ONE left edge + nested rails + inline chevron.
Vector indents every list item to reserve a LEFT gutter for the
toggle chevron, breaking the contents column's left line. Instead:
the AXIS is the component's own left edge — list items AND the
CONTENTS header are both pinned to it (alignment by construction,
no Vector padding values to chase). Each nested list carries a
hairline rail sitting exactly ON its parent's text axis (the
nested ul's left edge IS the parent text x once the li padding is
zeroed) — the same geometry as the prose list markers, stepped by
the same --ed-list-indent token. The rail of the subtree being
read tints to ink (active trail). The expand/collapse control is
the house triangle ▸/▾ INLINE after the heading text — it travels
with the label (nothing floats at the article-side edge) and
scales with the text. ── */
.vector-toc .vector-pinnable-header {
padding-left: 0 !important; /* CONTENTS on the same edge as the entries */
margin-left: 0 !important;
}
.vector-toc .vector-pinnable-header-label { margin-left: 0; }
.vector-toc .vector-toc-contents,
.vector-toc .vector-toc-list {
margin: 0;
padding: 0;
list-style: none;
}
.vector-toc .vector-toc-list-item {
position: relative;
padding-left: 0 !important; /* kill Vector's left chevron gutter */
padding-top: 0.22rem; /* CALIBRATION: row rhythm (moved off the */
padding-bottom: 0.22rem; /* now-inline .vector-toc-text padding) */
}
.vector-toc { --toc-rail-inset: 0.25rem; } /* CALIBRATION: rail bisects the
parent's first letter (≈ half a
capital at the TOC text size) */
.vector-toc .vector-toc-list-item > .vector-toc-list {
margin-left: var(--toc-rail-inset);
border-left: 1px solid var(--ed-hairline);
padding-left: calc(var(--ed-list-indent) - var(--toc-rail-inset) - 1px);
margin-top: 0.1rem;
}
.vector-toc .vector-toc-list:has(.vector-toc-list-item-active) {
border-left-color: var(--ed-ink); /* active trail */
}
/* chevron: the entry text goes inline so the sibling toggle button
flows right after the label ("Outlook 3 ▾"). The Codex icon is
replaced by a ::before glyph switched on the li's expanded state;
font-size:0 on the button hides its screen-reader span visually
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;
display: inline !important;
min-width: 0 !important;
min-height: 0 !important;
width: auto !important;
height: auto !important;
margin: 0 0 0 0.3em !important;
padding: 0 0.2em !important;
border: none !important;
background: none !important;
font-size: 0;
}
.vector-toc .vector-toc-toggle .vector-icon { display: none; }
.vector-toc .vector-toc-toggle::before {
content: "▸"; /* collapsed — the house triangle */
font-size: 0.65rem;
color: var(--ed-faint);
}
.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
is the SAME token the prose measure subtracts, ENFORCED with
!important so inline widths cannot break the axis — and pinned
class-generically so ANY infobox markup (table or div) obeys. ── */
.mw-parser-output .infobox { /* class-generic: any infobox markup */
width: var(--ed-infobox-w) !important;
box-sizing: border-box;
}
.mw-parser-output table.infobox {
font-family: var(--ed-sans);
font-size: var(--ed-small);
background-color: #fff !important;
border: 1px solid var(--ed-hairline) !important;
padding: 0.55em 0.9em 0.75em;
line-height: 1.5;
}
.infobox .infobox-above {
background-color: #fff !important; /* beats the template's inline #cee0f2 */
color: var(--ed-secondary) !important; /* beats inline color:inherit */
text-align: left !important;
font-size: 0.75rem; /* the shared eyebrow size */
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
border-bottom: 1px solid var(--ed-ink);
padding: 0.2em 0.2em 0.55em;
}
.infobox .infobox-label {
color: var(--ed-secondary);
font-weight: 400;
padding: 0.22em 0.8em 0.22em 0.2em;
}
.infobox .infobox-data { color: var(--ed-ink); padding: 0.22em 0.2em; }
/* ── Blockquotes: coral bar, serif italic (future-proofing — the emitter
currently renders quotes as "> ..." list items) ── */
.mw-parser-output blockquote {
border-left: 3px solid var(--ed-accent);
padding: 0.2em 0 0.2em 1.2em;
margin: 1.2em 0;
color: var(--ed-secondary);
font-style: italic;
}
/* ── Footer + page-bottom cleanup. Vector ships `.mw-footer li
{ font-size: 0.75em }`, which COMPOUNDS with any footer size —
the rem on the li kills the compounding; footer now matches
the TOC exactly ── */
@media screen {
.printfooter { display: none; } /* "Retrieved from ..." clutter; stays in print */
}
#footer, .mw-footer {
font-family: var(--ed-sans);
color: var(--ed-faint);
border-top: 1px solid var(--ed-ink) !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(--ed-secondary) !important; }
/* ── 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(--ed-hairline-strong) !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 */
.ext-aiassistant-panel,
.ext-aiassistant-panel input,
.ext-aiassistant-panel textarea,
.ext-aiassistant-panel button { font-family: var(--ed-sans) !important; }
.ext-aiassistant-header { border-bottom: 1px solid var(--ed-hairline) !important; }
.ext-aiassistant-message-user .ext-aiassistant-message__content {
background-color: var(--ed-ink) !important;
}
.ext-aiassistant-message-assistant {
font-family: var(--ed-serif) !important;
color: var(--ed-ink) !important;
}
.ext-aiassistant-footer {
border-top: 1px solid var(--ed-hairline) !important;
background-color: var(--ed-paper) !important;
}
/* ONE focus ring around the whole composer (input + send button); the
text field itself stays borderless — the panel's input is exempted
from the generic Codex focus rule above */
.ext-aiassistant-panel .cdx-text-input__input,
.ext-aiassistant-panel .cdx-text-input__input:focus,
.ext-aiassistant-prompt-composer__input,
.ext-aiassistant-prompt-composer__input:focus {
border-color: transparent !important;
box-shadow: none !important;
outline: none !important;
}
.ext-aiassistant-prompt-composer { box-shadow: none !important; }
.ext-aiassistant-prompt-composer:focus-within {
outline: 1px solid var(--ed-link) !important;
outline-offset: -1px;
box-shadow: none !important;
}
.ext-aiassistant-prompt-composer__send:not(:disabled) {
background-color: var(--ed-link) !important;
border-color: var(--ed-link) !important;
}
.ext-aiassistant-prompt-composer__send:disabled {
background-color: var(--ed-hairline) !important;
border-color: var(--ed-hairline) !important;
}
.ext-aiassistant-panel .cdx-button--weight-quiet:not(.cdx-button--icon-only)::before {
color: var(--ed-link) !important;
}
/* citation chips in the theme's interactive teal, like article links */
.ext-aiassistant-cite,
.ext-aiassistant-cite a { color: var(--ed-link) !important; }
/* ── Collapsible inline footnotes ({{footnote}} → <span class="ed-fn">).
MW 1.43's sanitizer REJECTS <details>/<summary> in wikitext
(verified live: tags render as literal text), so this is spans +
a tiny MediaWiki:Common.js toggle (adds/removes .ed-fn-open on
chip click). Readers see a small dotted-underline "note" chip;
the chip text is CSS content, NOT in the DOM text. Clicking
expands the note inline in the secondary voice, wrapped in
CSS-generated parens. The literal "(footnote: " / ")" wrappers
stay in the DOM inside always-hidden spans, so the bot's HTML
retrieval reads exactly the pre-template format — readers and RAG
see different things from the same markup. ── */
.ed-fn-chip { cursor: pointer; }
.ed-fn-chip::after {
content: "note";
font-family: var(--ed-sans);
font-size: 0.7em;
vertical-align: super;
color: var(--ed-faint);
text-decoration: underline dotted;
text-underline-offset: 2px;
}
.ed-fn.ed-fn-open > .ed-fn-chip::after { color: var(--ed-link); }
.ed-fn-pre, .ed-fn-close { display: none; } /* DOM text for the bot only */
.ed-fn-body { display: none; } /* collapsed by default */
.ed-fn.ed-fn-open > .ed-fn-body {
display: inline;
color: var(--ed-secondary);
}
.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 { --ed-measure: 100%; } /* infobox is full-width on mobile */
.mw-parser-output .infobox { width: 100% !important; }
h1#firstHeading, .mw-first-heading { font-size: 1.7rem; }
.mw-body-content h2, .mw-body-content .mw-heading2 { font-size: 1.22rem; }
.ext-aiassistant-prompt-composer { border-bottom: 1px solid var(--ed-hairline) !important; }
}