MediaWiki:Timeless.css

From OpenTreeID Help

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Table of contents, relocated to the right rail by MediaWiki:Common.js */
#p-toc ul {
	list-style: none;
	margin: 0;
	padding-left: 0;
	font-size: 0.9em;
	line-height: 1.5;
}

#p-toc ul ul {
	padding-left: 0.9em;
}

#p-toc li {
	margin: 0.2em 0;
}

#p-toc .tocnumber {
	color: #72777d;
	padding-right: 0.4em;
}

#p-toc .toctogglespan {
	display: none;
}

/* Keep the rail (contents, page tools, categories) in view while reading. */
@media screen and (min-width: 1100px) {
	#mw-related-navigation {
		position: sticky;
		top: 0.5em;
		align-self: flex-start;
		max-height: calc( 100vh - 1em );
		overflow-y: auto;
	}
}

/* ---------------------------------------------------------------------------
   Roboto, matching squidweb.com. Self-hosted from /assets/fonts/ (shipped in
   the image) rather than Google Fonts: hotlinking would send every reader's IP
   to Google, and the box is meant to work without outbound internet.
   latin-ext is loaded because the wiki ships DE/ES/FR as well as EN.
   --------------------------------------------------------------------------- */
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url('/assets/fonts/roboto-400-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url('/assets/fonts/roboto-400-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 500;
	font-display: swap;
	src: url('/assets/fonts/roboto-500-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 500;
	font-display: swap;
	src: url('/assets/fonts/roboto-500-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url('/assets/fonts/roboto-700-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url('/assets/fonts/roboto-700-latin-ext.woff2') format('woff2');
	unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

body,
.mw-body,
.mw-body-content,
#mw-site-navigation,
#mw-related-navigation,
#p-personal,
#personal,
.sidebar-chunk,
#mw-content-text {
	font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
}

/* Timeless sets headings and the wordmark in Linux Libertine (a serif) with
   higher specificity than a bare h1..h6 selector, so those need to be matched
   at the same level or they stay serif while the body text turns sans. */
.mw-body h1, .mw-body h2, .mw-body h3, .mw-body h4, .mw-body h5, .mw-body h6,
.mw-body-content h1, .mw-body-content h2, .mw-body-content h3,
.mw-body-content h4, .mw-body-content h5, .mw-body-content h6,
#mw-content-text h1, #mw-content-text h2, #mw-content-text h3,
#mw-content-text h4, #mw-content-text h5, #mw-content-text h6,
#firstHeading,
.mw-heading, .mw-heading1, .mw-heading2, .mw-heading3, .mw-heading4,
#p-logo-text a,
.mw-parser-output h1, .mw-parser-output h2, .mw-parser-output h3,
.mw-parser-output h4, .mw-parser-output h5, .mw-parser-output h6 {
	font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
}

/* ---------------------------------------------------------------------------
   Language bar: es/fr write their own language names lowercase ("español",
   "français") while de/nl/en capitalise, so the row reads inconsistently.
   Capitalise for display only — the underlying autonyms stay correct.
   --------------------------------------------------------------------------- */
.mw-pt-languages-list li a,
.mw-pt-languages-list li span,
.uls-language-list a {
	text-transform: capitalize;
}

/* ---------------------------------------------------------------------------
   Left sidebar: tighten the gaps between nav blocks. Timeless spaces portlets
   for menus with many entries; "Get started" holds a single link, so the
   default margin reads as a hole underneath it.
   --------------------------------------------------------------------------- */
#mw-site-navigation .sidebar-inner .mw-portlet {
	margin-bottom: 0.75em;
}

#mw-site-navigation .sidebar-inner .mw-portlet:last-child {
	margin-bottom: 0;
}

#mw-site-navigation .mw-portlet-body ul {
	margin-bottom: 0;
}

#mw-site-navigation .mw-portlet-body li {
	margin: 0.15em 0;
}

#mw-site-navigation .sidebar-chunk h3 {
	margin-bottom: 0.3em;
}

/* ---------------------------------------------------------------------------
   Left sidebar scrolls with the page, same as the right rail above. The module
   list is longer than a viewport, so without this the lower entries are simply
   unreachable while reading a long article.
   --------------------------------------------------------------------------- */
@media screen and (min-width: 1100px) {
	#mw-site-navigation {
		position: sticky;
		top: 0.5em;
		align-self: flex-start;
		max-height: calc( 100vh - 1em );
		overflow-y: auto;
		overscroll-behavior: contain;
	}
}

/* ---------------------------------------------------------------------------
   Wanda assistant — Trello 4TyPgtP9 "Cleanup Wanda".

   Hide the two settings blocks readers should not have to reason about: the
   "Remember conversation" toggle and the "Sources:" row (Wiki / Wikidata /
   LLM Knowledge / Cargo / External Wiki). Only "Wiki" is meaningful here and it
   is on by default; the checkboxes stay checked in the DOM, so hiding them
   changes appearance only, not which sources are queried.

   Everything is scoped to the Wanda panel on purpose: .cdx-* are MediaWiki's
   Codex design-system classes used across the whole site, so an unscoped rule
   would hide checkboxes and restyle buttons far outside this widget.
   --------------------------------------------------------------------------- */
.wanda-floating-chat .chat-input-container > .cdx-checkbox,
.wanda-floating-window .chat-input-container > .cdx-checkbox,
.wanda-floating-chat .wanda-sources-row,
.wanda-floating-window .wanda-sources-row {
	display: none;
}

/* Send is the button you press to get an answer, and it was small next to the
   message box. */
.wanda-floating-chat .cdx-button--action-progressive.cdx-button--weight-primary,
.wanda-floating-window .cdx-button--action-progressive.cdx-button--weight-primary {
	min-width: 6rem;
	font-size: 1.05em;
	font-weight: 600;
	letter-spacing: 0.01em;
}
/* ===========================================================================
   Trello 4TyPgtP9 — visual pass against the PO mockup (2026-08-05)

   Layout rules are inside the min-width:1100px block at the bottom. Below that
   Timeless switches to a compact two-row header with the navigation collapsed
   into dropdowns, and desktop numbers push that second row out of the header.
   Colour, type and the Wanda panel are safe at every width and stay out here.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   Timeless paints a red / blue / green tricolour under the header and a green
   line under the content — MediaWiki's palette, not ours. All four become the
   brand cyan of the logo.
   --------------------------------------------------------------------------- */
.color-left,
.color-middle,
.color-right {
	background-color: #00ADEE;
}

#mw-content-container {
	border-bottom-color: #00ADEE;
}

/* The user name in the header was the last serif left in the chrome: Timeless
   sets #personal h2 in Linux Libertine. */
#personal h2,
#personal h2 span {
	font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
	font-size: 1.05rem;
}

/* The article is a card: rounded and lifted off the background. */
#mw-content {
	padding: 2rem 2.5rem 3rem;
	border-bottom: 0;
	border-radius: 10px;
	box-shadow: 0 1px 2px rgba( 9, 30, 66, 0.08 ), 0 4px 12px rgba( 9, 30, 66, 0.06 );
}

/* Page behind the cards: a cooler grey, and without Timeless' cat watermark. */
#mw-content-container {
	background-color: #eef1f5;
	background-image: none;
}

/* The search field is a rounded box in the mockup, not a square one. */
#simpleSearch,
#searchInput,
#searchInput-container {
	border-radius: 6px;
}

/* ---------------------------------------------------------------------------
   Wanda.

   The octopus is cropped out of the wide lockup with background-size and
   -position rather than shipping a second asset. In the 240x62 SVG the mark is
   the left 84.2 units and it uses the full height, so: SVG width = 240 x
   (icon / 84.2), left inset = the disc's padding, top inset = whatever centres
   the resulting 62-unit-tall strip. The wordmark starts only 8% past the mark,
   so the inset has to stay under 0.08 x the icon or the "S" bleeds into the
   disc.
   --------------------------------------------------------------------------- */

/* Launcher: white disc with the mark, instead of the 💬 emoji on blue.
   56px mark in a 64px disc → 160px wide SVG at 4px / 11.4px. background-origin
   has to be the border box: by default the offsets start inside the 2px border,
   which pushed the octopus 2px right and 2px down and left it lopsided. */
.wanda-floating-button {
	font-size: 0;
	background: #fff url( '/assets/logo/opentreeid-logo-dark.svg' ) no-repeat 4px 11.4px / 160px auto;
	background-origin: border-box;
	border: 2px solid #00ADEE;
	box-shadow: 0 4px 12px rgba( 0, 173, 238, 0.35 );
}

/* Panel header: avatar, then "Wanda" over the subtitle.
   32px mark in a 36px disc → 91.2px wide SVG at 2px / 6.2px. */
.wanda-chat-header {
	align-items: center;
	gap: 0.75rem;
	padding: 14px 16px;
	border-radius: 12px 12px 0 0;
}

.wanda-chat-header::before {
	content: "";
	flex: 0 0 auto;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	background: #fff url( '/assets/logo/opentreeid-logo-dark.svg' ) no-repeat 2px 6.2px / 91.2px auto;
}

/* The name belongs next to the avatar; the close button keeps the far right. */
.wanda-chat-header > span {
	margin-right: auto;
	font-size: 1.15rem;
	font-weight: 700;
	line-height: 1.2;
}

.wanda-chat-header > span::after {
	content: "AI Wiki Assistant";
	display: block;
	font-size: 0.8rem;
	font-weight: 400;
	opacity: 0.9;
}

/* The greeting sat on grey while the rest of the panel is white. */
.wanda-floating-chat {
	background: #fff;
}

/* The two emoji bullets under the greeting repeat what the greeting says. */
.wanda-floating-chat .chat-instructions ul {
	display: none;
}

/* Every assistant needs this line, and Wanda ships no message for it. */
.wanda-floating-window::after {
	content: "Wanda can make mistakes. Please check important information.";
	padding: 0 16px 12px;
	font-size: 0.72rem;
	line-height: 1.3;
	color: #72777d;
	text-align: center;
}

/* Logged-out visitors reach exactly two pages — the "Login required" notice and
   the login form — and Wanda answers neither: the API refuses anonymous
   requests (readapidenied), so the launcher would only produce an error. */
.mw-special-Badtitle .wanda-floating-chat-wrapper,
.mw-special-Userlogin .wanda-floating-chat-wrapper {
	display: none;
}

/* ---------------------------------------------------------------------------
   Desktop layout, following the mockup: the lockup in the header, a taller
   header bar over a thinner accent line, a centred search field, the left
   navigation sitting straight on the page, and the right-hand rail as white
   cards lined up with the top of the article.
   --------------------------------------------------------------------------- */
@media screen and (min-width: 1100px) {

	/* Logo moves out of the left sidebar and into the header. Timeless has no
	   logo slot there — only a text wordmark (#p-banner) — so the lockup rides
	   in as a background on that link. The sitename text is sized to 0 rather
	   than removed: it stays in the accessibility tree as the link's name, and
	   "Wiki" is drawn after the divider, because the lockup already says
	   "SquidWeb". */
	#mw-site-navigation #p-logo {
		display: none;
	}

	/* #p-logo-text in front: Timeless sizes a "long" sitename (OpenTreeID Help
	   is one, SquidWeb Wiki is not) with #p-logo-text a.long, which outranks
	   the bare #p-banner selector and brought the text back. */
	#p-logo-text #p-banner.mw-wiki-title {
		display: flex;
		align-items: center;
		font-size: 0;
		line-height: 1;
	}

	/* Timeless gives #p-logo-text the sidebar's fixed width, which is narrower
	   than lockup + divider + "Wiki" — the logo was being flex-shrunk to 129px
	   and rendered small and low. Let the block size to its content and take the
	   lockup out of the shrinking. */
	#p-logo-text {
		width: auto;
	}

	#p-banner.mw-wiki-title::before {
		content: "";
		flex: 0 0 auto;
		width: 150px;
		height: 38px;
		padding-right: 0.7rem;
		border-right: 1px solid #c8ccd1;
		background: url( '/assets/logo/opentreeid-logo-dark.svg' ) no-repeat left center / contain;
		/* so the padding for the divider does not enlarge the image */
		background-origin: content-box;
	}

	#p-banner.mw-wiki-title::after {
		/* The empty alt text keeps the link's accessible name at "OpenTreeID
		   Help" instead of "OpenTreeID Help Help". */
		content: "Help" / "";
		margin-left: 0.7rem;
		/* "Wiki" sits on the baseline of the lockup's own wordmark, which runs
		   along the bottom of the SVG — centred on the flex line it floats above
		   the SQUIDWEB letters. Offset, not margin: a margin grows the flex line
		   and drags the lockup down with it, so it only ever closes half the
		   gap. */
		position: relative;
		top: 11px;
		font-size: 1.5rem;
		font-variant: normal;
		font-weight: 400;
		color: #042734;
	}

	#mw-header-container {
		height: 62px;
		padding-top: 12px;
	}

	#p-search {
		max-width: 780px;
		margin: 0 auto;
	}

	/* #user-tools is a fixed-width column and the user chip only fills half of
	   it, so the name floated 130px short of the margin the cards below line up
	   with. */
	#user-tools {
		text-align: right;
	}

	/* Timeless pins the accent bar to its own header height and wins on
	   specificity from #mw-wrapper — so match it, or the bar stays at 47px and
	   disappears behind the taller header. Its thickness comes from the
	   children, not the bar itself. */
	#mw-wrapper > .color-bar,
	#mw-wrapper > .color-bar .color-middle-container,
	#mw-wrapper > .color-bar .color-left,
	#mw-wrapper > .color-bar .color-middle,
	#mw-wrapper > .color-bar .color-right {
		height: 4px;
	}

	/* color-left/right are floated back up over the middle container by its
	   negative bottom margin, which Timeless sets to the old 5.3px bar height.
	   Thinning the bar without moving that leaves them riding high, and the dark
	   body colour shows through in the strip beside the article. */
	#mw-wrapper > .color-bar .color-middle-container {
		margin-bottom: -4px;
	}

	#mw-wrapper > .color-bar {
		top: 62px;
	}

	#mw-content-container {
		margin-top: 66px;
	}

	/* One gutter for the whole page: the lockup, the navigation text and the
	   right-hand cards all start 32px in from their edge. Timeless uses 15px on
	   the outside and insets the navigation separately, so the logo, the nav and
	   the rail each began at a different x. */
	#mw-header,
	#mw-content-block {
		padding-left: 32px;
		padding-right: 32px;
	}

	#mw-content-block {
		padding-top: 2rem;
	}

	/* Left navigation: no card behind it. The card's own top inset is what
	   pushed "Get started" below the top of the article; without a card it is
	   just a hole. */
	#mw-site-navigation .sidebar-chunk {
		background: transparent;
		border: 0;
		box-shadow: none;
		margin-top: 0;
		padding-top: 0;
		padding-left: 0;
	}

	/* Timeless insets the first chunk, which left the rail hanging below the top
	   of the article instead of lining up with it. */
	#mw-related-navigation .sidebar-chunk:first-child {
		margin-top: 0;
	}

	#mw-related-navigation .sidebar-chunk {
		background: #fff;
		border: 0;
		border-radius: 10px;
		box-shadow: 0 1px 2px rgba( 9, 30, 66, 0.08 ), 0 4px 12px rgba( 9, 30, 66, 0.06 );
		padding-bottom: 0.9rem;
	}

	/* Both rails scroll with the page (see the sticky rules above); the
	   scrollbar gutter that came with it cut a grey strip between the
	   navigation and the article. */
	#mw-site-navigation,
	#mw-related-navigation {
		scrollbar-width: none;
	}

	#mw-site-navigation::-webkit-scrollbar,
	#mw-related-navigation::-webkit-scrollbar {
		width: 0;
		height: 0;
	}
}

/* ---------------------------------------------------------------------------
   Hide the Page / Discussion namespace tabs — Trello 4TyPgtP9 "Hide Page/
   Discussion buttons". Readers only ever view articles here and the talk
   namespace is unused; the tabs just add chrome. Editing tools stay in the
   right-hand rail, which this does not touch.
   --------------------------------------------------------------------------- */
#p-namespaces {
	display: none;
}