<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://utopiawiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sonja+says</id>
	<title>Utopia Game - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://utopiawiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sonja+says"/>
	<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php/Special:Contributions/Sonja_says"/>
	<updated>2026-04-04T12:07:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=931</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=931"/>
		<updated>2026-02-19T17:38:00Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  // Tick warning threshold&lt;br /&gt;
  const TICK_SOON_MINUTES = 5;&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
      if (!firstTabId) return;&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      if (!tabId) return;&lt;br /&gt;
&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    // --- CLOCK ---&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // --- GAME DATE (Tick warning 5 minutes before the hour) ---&lt;br /&gt;
    const msUntilNextHour = 3600000 - (now % 3600000);&lt;br /&gt;
    const thresholdMs = TICK_SOON_MINUTES * 60 * 1000;&lt;br /&gt;
    const shouldWarn = msUntilNextHour &amp;gt; 0 &amp;amp;&amp;amp; msUntilNextHour &amp;lt;= thresholdMs;&lt;br /&gt;
    const minutesLeft = Math.ceil(msUntilNextHour / 60000);&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      if (shouldWarn) {&lt;br /&gt;
        el.textContent = `TICK SOON (${minutesLeft}m)`;&lt;br /&gt;
        el.classList.add(&#039;pulse-red&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        el.textContent = computeGameString(now);&lt;br /&gt;
        el.classList.remove(&#039;pulse-red&#039;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // --- COUNTDOWN ---&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return;&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    updateAll();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $(initAll);&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=930</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=930"/>
		<updated>2026-02-19T17:37:21Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  // Tick warning threshold&lt;br /&gt;
  const TICK_SOON_MINUTES = 45;&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
      if (!firstTabId) return;&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      if (!tabId) return;&lt;br /&gt;
&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    // --- CLOCK ---&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // --- GAME DATE (Tick warning 45 minutes before the hour) ---&lt;br /&gt;
    const msUntilNextHour = 3600000 - (now % 3600000);&lt;br /&gt;
    const thresholdMs = TICK_SOON_MINUTES * 60 * 1000;&lt;br /&gt;
    const shouldWarn = msUntilNextHour &amp;gt; 0 &amp;amp;&amp;amp; msUntilNextHour &amp;lt;= thresholdMs;&lt;br /&gt;
    const minutesLeft = Math.ceil(msUntilNextHour / 60000);&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      if (shouldWarn) {&lt;br /&gt;
        el.textContent = `TICK SOON (${minutesLeft}m)`;&lt;br /&gt;
        el.classList.add(&#039;pulse-red&#039;);&lt;br /&gt;
      } else {&lt;br /&gt;
        el.textContent = computeGameString(now);&lt;br /&gt;
        el.classList.remove(&#039;pulse-red&#039;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // --- COUNTDOWN ---&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return;&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    updateAll();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $(initAll);&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=929</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=929"/>
		<updated>2026-02-19T17:35:12Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
  const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
  // --- CLOCK ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
    // --- GAME DATE (Tick warning 45 minutes before the hour) ---&lt;br /&gt;
  const msUntilNextHour = 3600000 - (now % 3600000);&lt;br /&gt;
  const thresholdMs = 45 * 60 * 1000;&lt;br /&gt;
  const shouldWarn = msUntilNextHour &amp;gt; 0 &amp;amp;&amp;amp; msUntilNextHour &amp;lt;= thresholdMs;&lt;br /&gt;
&lt;br /&gt;
  const minutesLeft = Math.ceil(msUntilNextHour / 60000);&lt;br /&gt;
&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    if (shouldWarn) {&lt;br /&gt;
      el.textContent = `TICK SOON (${minutesLeft}m)`;&lt;br /&gt;
      el.classList.add(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      el.textContent = computeGameString(now);&lt;br /&gt;
      el.classList.remove(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=928</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=928"/>
		<updated>2026-02-19T17:30:53Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Time widgets (works in BOTH main header + sticky header)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.time-widgets {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nice pill styling */&lt;br /&gt;
.time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MAIN header: center the bar within the header end area */&lt;br /&gt;
.vector-header .vector-header-end {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  flex: 1 1 auto !important;&lt;br /&gt;
  justify-content: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header: keep your current behavior (Discord left, widgets center) */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets.time-widgets,&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Optional: hide labels when cramped */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  .time-widgets .header-widget__label { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide bar entirely on very small screens */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #main-time-widgets,&lt;br /&gt;
  #sticky-time-widgets { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes pulseRed {&lt;br /&gt;
  0%   { transform: scale(1); opacity: 1; }&lt;br /&gt;
  50%  { transform: scale(1.06); opacity: 0.85; }&lt;br /&gt;
  100% { transform: scale(1); opacity: 1; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pulse-red {&lt;br /&gt;
  color: #ff4d4d !important;&lt;br /&gt;
  font-weight: 800 !important;&lt;br /&gt;
  animation: pulseRed 0.9s ease-in-out infinite !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=927</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=927"/>
		<updated>2026-02-19T17:22:46Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
  const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
  // --- CLOCK ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
    // --- GAME DATE (Tick warning 45 minutes before the hour) ---&lt;br /&gt;
  const msUntilNextHour = 3600000 - (now % 3600000);&lt;br /&gt;
  const thresholdMs = 45 * 60 * 1000;&lt;br /&gt;
  const shouldWarn = msUntilNextHour &amp;gt; 0 &amp;amp;&amp;amp; msUntilNextHour &amp;lt;= thresholdMs;&lt;br /&gt;
&lt;br /&gt;
  const minutesLeft = Math.ceil(msUntilNextHour / 60000);&lt;br /&gt;
&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    if (shouldWarn) {&lt;br /&gt;
      el.textContent = `TICK SOON (${minutesLeft}m)`;&lt;br /&gt;
      el.classList.add(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      el.textContent = computeGameString(now);&lt;br /&gt;
      el.classList.remove(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=926</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=926"/>
		<updated>2026-02-19T17:21:08Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
  const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
  // --- CLOCK ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // --- GAME DATE (Tick warning 45 minutes before the hour) ---&lt;br /&gt;
  const msUntilNextHour = 3600000 - (now % 3600000);&lt;br /&gt;
  const thresholdMs = 45 * 60 * 1000;&lt;br /&gt;
  const shouldWarn = msUntilNextHour &amp;gt; 0 &amp;amp;&amp;amp; msUntilNextHour &amp;lt;= thresholdMs;&lt;br /&gt;
&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    if (shouldWarn) {&lt;br /&gt;
      el.textContent = &amp;quot;TICK SOON&amp;quot;;&lt;br /&gt;
      el.classList.add(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      el.textContent = computeGameString(now);&lt;br /&gt;
      el.classList.remove(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=925</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=925"/>
		<updated>2026-02-19T17:18:47Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    // ---- Pulse logic (45 minutes before the tick) ----&lt;br /&gt;
  const msUntilNextHour = 3600000 - (now % 3600000);&lt;br /&gt;
  const thresholdMs = 45 * 60 * 1000;&lt;br /&gt;
&lt;br /&gt;
  const shouldWarn = msUntilNextHour &amp;gt; 0 &amp;amp;&amp;amp; msUntilNextHour &amp;lt;= thresholdMs;&lt;br /&gt;
&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    if (shouldWarn) {&lt;br /&gt;
      el.textContent = &amp;quot;TICK SOON&amp;quot;;&lt;br /&gt;
      el.classList.add(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      el.textContent = computeGameString(now);&lt;br /&gt;
      el.classList.remove(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=924</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=924"/>
		<updated>2026-02-19T17:14:45Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
  const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
  // --- CLOCK ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // --- GAME DATE ---&lt;br /&gt;
  const gameString = computeGameString(now);&lt;br /&gt;
&lt;br /&gt;
  // how many ms until next hour&lt;br /&gt;
  const d = new Date(now);&lt;br /&gt;
  const msUntilNextHour =&lt;br /&gt;
    3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
  const fiveMinutesMs = 45 * 60 * 1000;&lt;br /&gt;
&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = gameString;&lt;br /&gt;
&lt;br /&gt;
    // pulse red if within last 5 minutes before tick&lt;br /&gt;
    if (msUntilNextHour &amp;lt;= fiveMinutesMs) {&lt;br /&gt;
      el.classList.add(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      el.classList.remove(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=923</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=923"/>
		<updated>2026-02-19T17:13:50Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Time widgets (works in BOTH main header + sticky header)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.time-widgets {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nice pill styling */&lt;br /&gt;
.time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MAIN header: center the bar within the header end area */&lt;br /&gt;
.vector-header .vector-header-end {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  flex: 1 1 auto !important;&lt;br /&gt;
  justify-content: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header: keep your current behavior (Discord left, widgets center) */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets.time-widgets,&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Optional: hide labels when cramped */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  .time-widgets .header-widget__label { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide bar entirely on very small screens */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #main-time-widgets,&lt;br /&gt;
  #sticky-time-widgets { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes pulseRed {&lt;br /&gt;
  0%   { color: #FFC300; transform: scale(1); }&lt;br /&gt;
  50%  { color: #ff2a2a; transform: scale(1.08); }&lt;br /&gt;
  100% { color: #FFC300; transform: scale(1); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pulse-red {&lt;br /&gt;
  animation: pulseRed 1s infinite;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=922</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=922"/>
		<updated>2026-02-19T17:13:25Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
  const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
  // --- CLOCK ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // --- GAME DATE ---&lt;br /&gt;
  const gameString = computeGameString(now);&lt;br /&gt;
&lt;br /&gt;
  // how many ms until next hour&lt;br /&gt;
  const d = new Date(now);&lt;br /&gt;
  const msUntilNextHour =&lt;br /&gt;
    3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
  const fiveMinutesMs = 5 * 60 * 1000;&lt;br /&gt;
&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = gameString;&lt;br /&gt;
&lt;br /&gt;
    // pulse red if within last 5 minutes before tick&lt;br /&gt;
    if (msUntilNextHour &amp;lt;= fiveMinutesMs) {&lt;br /&gt;
      el.classList.add(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      el.classList.remove(&amp;quot;pulse-red&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // --- COUNTDOWN ---&lt;br /&gt;
  document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
    el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=921</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=921"/>
		<updated>2026-02-19T17:10:23Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Time widgets (works in BOTH main header + sticky header)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.time-widgets {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nice pill styling */&lt;br /&gt;
.time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MAIN header: center the bar within the header end area */&lt;br /&gt;
.vector-header .vector-header-end {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  flex: 1 1 auto !important;&lt;br /&gt;
  justify-content: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header: keep your current behavior (Discord left, widgets center) */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets.time-widgets,&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Optional: hide labels when cramped */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  .time-widgets .header-widget__label { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide bar entirely on very small screens */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #main-time-widgets,&lt;br /&gt;
  #sticky-time-widgets { display: none !important; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=920</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=920"/>
		<updated>2026-02-19T17:08:14Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      const $container = $(this);&lt;br /&gt;
      const $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      const firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      const $button = $(this);&lt;br /&gt;
      const tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      const $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    const existing = document.getElementById(id);&lt;br /&gt;
    if (existing) return existing;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets in header end area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // already present?&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = computeGameString(now);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build + Boot (FIXED)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: Discord is separate (left), widgets in bar&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord is inside the bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function startTickerOnce() {&lt;br /&gt;
    if (window.__timeWidgetsIntervalId) return; // already ticking&lt;br /&gt;
    updateAll();&lt;br /&gt;
    window.__timeWidgetsIntervalId = setInterval(updateAll, 1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function initAll() {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
    startTickerOnce();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Initial page load&lt;br /&gt;
  $(initAll);&lt;br /&gt;
&lt;br /&gt;
  // Vector 2022 navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(initAll);&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(initAll); // harmless extra safety&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=919</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=919"/>
		<updated>2026-02-19T16:59:32Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Time widgets (works in BOTH main header + sticky header)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.time-widgets {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nice pill styling */&lt;br /&gt;
.time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MAIN header: center the bar within the header end area */&lt;br /&gt;
.vector-header .vector-header-end {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  flex: 1 1 auto !important;&lt;br /&gt;
  justify-content: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header: keep your current behavior (Discord left, widgets center) */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets.time-widgets {&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: hide labels when cramped */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  .time-widgets .header-widget__label { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide bar entirely on very small screens */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #main-time-widgets,&lt;br /&gt;
  #sticky-time-widgets { display: none !important; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=918</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=918"/>
		<updated>2026-02-19T16:57:25Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=917</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=917"/>
		<updated>2026-02-19T16:56:48Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Time widgets (works in BOTH main header + sticky header)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.time-widgets {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nice pill styling */&lt;br /&gt;
.time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MAIN header: center the bar within the header end area */&lt;br /&gt;
.vector-header .vector-header-end {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  flex: 1 1 auto !important;&lt;br /&gt;
  justify-content: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header: keep your current behavior (Discord left, widgets center) */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets.time-widgets {&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: hide labels when cramped */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  .time-widgets .header-widget__label { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide bar entirely on very small screens */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #main-time-widgets,&lt;br /&gt;
  #sticky-time-widgets { display: none !important; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=916</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=916"/>
		<updated>2026-02-19T16:56:09Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Time widgets (works in BOTH main header + sticky header)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.time-widgets {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 12px !important;&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Nice pill styling */&lt;br /&gt;
.time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MAIN header: center the bar within the header end area */&lt;br /&gt;
.vector-header .vector-header-end {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#main-time-widgets.time-widgets {&lt;br /&gt;
  flex: 1 1 auto !important;&lt;br /&gt;
  justify-content: center !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header: keep your current behavior (Discord left, widgets center) */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets.time-widgets {&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: hide labels when cramped */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  .time-widgets .header-widget__label { display: none !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide bar entirely on very small screens */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #main-time-widgets,&lt;br /&gt;
  #sticky-time-widgets { display: none !important; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=915</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=915"/>
		<updated>2026-02-19T16:55:36Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
(function () {&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     CONFIG&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Tabs (your existing code)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  $(document).ready(function () {&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
      var $container = $(this);&lt;br /&gt;
      var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
      var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
      $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
      var $button = $(this);&lt;br /&gt;
      var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
      var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
      $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
      $button.addClass(&#039;active&#039;);&lt;br /&gt;
      $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Helpers: find/create containers in BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
&lt;br /&gt;
  function ensureDiscordLink(container, id) {&lt;br /&gt;
    if (!container) return null;&lt;br /&gt;
    if (document.getElementById(id)) return document.getElementById(id);&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = id;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet sticky-discord-link&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    container.prepend(link);&lt;br /&gt;
    return link;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Sticky header: insert our widget bar inside sticky icons row&lt;br /&gt;
  function getStickyBar() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    // Keep Discord where it was (far-left in sticky icons)&lt;br /&gt;
    const discord = ensureDiscordLink(icons, &#039;custom-sticky-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put widgets immediately AFTER Discord (so Discord stays at the left)&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Main header: put our widgets between search and username area&lt;br /&gt;
  function getMainBar() {&lt;br /&gt;
    const header = document.querySelector(&#039;.vector-header&#039;);&lt;br /&gt;
    if (!header) return null;&lt;br /&gt;
&lt;br /&gt;
    // &amp;quot;End&amp;quot; is where user menu lives; we can safely insert at the start of it&lt;br /&gt;
    const headerEnd = header.querySelector(&#039;.vector-header-end&#039;);&lt;br /&gt;
    if (!headerEnd) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;main-time-widgets&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;main-time-widgets&#039;;&lt;br /&gt;
    bar.className = &#039;time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Add Discord + widgets inside the same main bar&lt;br /&gt;
    headerEnd.prepend(bar);&lt;br /&gt;
    ensureDiscordLink(bar, &#039;main-discord-link&#039;);&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Build widgets inside a bar (no duplicates)&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function ensureWidget(bar, role, labelText) {&lt;br /&gt;
    if (!bar) return;&lt;br /&gt;
&lt;br /&gt;
    // If this bar already has this role, skip&lt;br /&gt;
    if (bar.querySelector(`[data-role=&amp;quot;${role}&amp;quot;]`)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.className = &#039;header-widget&#039;;&lt;br /&gt;
    wrap.dataset.widget = role;&lt;br /&gt;
&lt;br /&gt;
    if (labelText) {&lt;br /&gt;
      const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
      label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
      label.textContent = labelText;&lt;br /&gt;
      wrap.appendChild(label);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = role;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    bar.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Calculations / formatting&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour (1..24)&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours (Jan..Jul cycle)&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    // Update ALL widgets in BOTH headers by role&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;clock&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;game&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = computeGameString(now);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelectorAll(&#039;[data-role=&amp;quot;countdown&amp;quot;]&#039;).forEach((el) =&amp;gt; {&lt;br /&gt;
      el.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* =========================================================&lt;br /&gt;
     Boot: create + update widgets for BOTH headers&lt;br /&gt;
     ========================================================= */&lt;br /&gt;
&lt;br /&gt;
  function buildBarsIfPossible() {&lt;br /&gt;
    const stickyBar = getStickyBar();&lt;br /&gt;
    const mainBar = getMainBar();&lt;br /&gt;
&lt;br /&gt;
    // Sticky: no Discord inside bar (Discord is separate link to the left)&lt;br /&gt;
    if (stickyBar) {&lt;br /&gt;
      ensureWidget(stickyBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(stickyBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Main: Discord lives INSIDE bar (first), then widgets&lt;br /&gt;
    if (mainBar) {&lt;br /&gt;
      ensureWidget(mainBar, &#039;clock&#039;, &#039;UTC:&#039;);&lt;br /&gt;
      ensureWidget(mainBar, &#039;game&#039;, null);&lt;br /&gt;
      ensureWidget(mainBar, &#039;countdown&#039;, &#039;Age ends in:&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateAll();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fires reliably for header DOM&lt;br /&gt;
  mw.hook(&#039;skin.ready&#039;).add(function () {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
&lt;br /&gt;
    if (!window.__timeWidgetsStarted) {&lt;br /&gt;
      window.__timeWidgetsStarted = true;&lt;br /&gt;
      setInterval(updateAll, 1000);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Fires on page navigation/content swaps&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    buildBarsIfPossible();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Stances&amp;diff=914</id>
		<title>Stances</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Stances&amp;diff=914"/>
		<updated>2026-02-19T16:40:21Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- start content --&amp;gt;&lt;br /&gt;
					&amp;lt;div id=&amp;quot;mw-content-text&amp;quot; lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot; class=&amp;quot;mw-content-ltr&amp;quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;As of Age 112, stances have been removed from the game. This information, though outdated, will be retained for historical purposes.&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;A kingdom&#039;s Stance is an unilateral statement to the world of the kingdom&#039;s intentions and is controlled by the Monarch or Steward. A stance differs from Relations with other kingdoms.&amp;lt;br /&amp;gt;&lt;br /&gt;
You may not change your stance if you have changed it within the last 48 hours. 48 full Ticks must pass before it can be changed. A Kingdom in Aggressive or Peaceful Stance will automatically revert to Normal at the expiration of the 48nd tick.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Stance effects are negated in War&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Stances may not be changed during Protection&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;cell-spacing:5px; border:none; vertical-align: middle; text-align:center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border:1px solid #625230; background:#0f1a2b; color:#ffffff; text-align:center;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#001D3D; color:#FFC300; text-align:center; padding:8px; font-size:1.2em;&amp;quot; |&lt;br /&gt;
Stances&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#003566; color:#ffffff; padding:6px; width:33%;&amp;quot; | Normal&lt;br /&gt;
! style=&amp;quot;background:#003566; color:#ffffff; padding:6px; width:33%;&amp;quot; | Aggressive&lt;br /&gt;
! style=&amp;quot;background:#003566; color:#ffffff; padding:6px; width:33%;&amp;quot; | Peaceful&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:8px; text-align:left;&amp;quot; |&lt;br /&gt;
* No Effects&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:8px; text-align:left;&amp;quot; |&lt;br /&gt;
* +10% Battle Gains&lt;br /&gt;
* -10% Attack Time&lt;br /&gt;
* -50% Hostility Generation&lt;br /&gt;
* +15% Military Wages&lt;br /&gt;
* +10% Training Cost&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:8px; text-align:left;&amp;quot; |&lt;br /&gt;
* +15% Income&lt;br /&gt;
* +20% Food Production&lt;br /&gt;
* +20% Rune Production&lt;br /&gt;
* +20% Birth Rate&lt;br /&gt;
* -15% Offensive Military Efficiency&lt;br /&gt;
* -20% Outgoing Instant Spell damage and Sabotage Operation damage&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;background:#001D3D; height:6px;&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;span class=&amp;quot;mw-headline&amp;quot; id=&amp;quot;Changelog&amp;quot;&amp;gt;Changelog&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Age 73: Fortified Stance Removed - replaced by a new stance called &amp;quot;Prosperous&amp;quot;. Prosperous stance is almost identical to Fortified. Attacks into Prosperous will have no gains penalty; Attacks while your Kingdom is Prosperous have reduced gains of -20% (instead of -50%) and scientists gain experience during Prosperous.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Age 105: Stances reintroduced.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Age 106: Stances updated to reflect forum changes on 6 May 2024.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Age 107: Stances and minimum duration updated.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Age 111: Aggressive stance effects updated.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Age 112: Stances removed.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=913</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=913"/>
		<updated>2026-02-19T16:37:49Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=912</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=912"/>
		<updated>2026-02-19T16:37:20Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active TOC item — gold background + dark text */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link {&lt;br /&gt;
  background-color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Vector 2022 TOC: active (highlighted) item = gold background + dark text */&lt;br /&gt;
#vector-toc li.vector-toc-list-item-active &amp;gt; a.vector-toc-link {&lt;br /&gt;
  background-color: #FFD60A !important;&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
&lt;br /&gt;
  /* in case Vector uses effects that keep text light */&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  mix-blend-mode: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc li.vector-toc-list-item-active &amp;gt; a.vector-toc-link * {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  mix-blend-mode: normal !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Science&amp;diff=911</id>
		<title>Science</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Science&amp;diff=911"/>
		<updated>2026-02-19T16:37:02Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: /* Re-assigning Scientists */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sciences are the study of knowledge and create our pathway into the future. By studying the laws that govern our being and understanding the effects of these laws, we can strengthen ourselves in all that we do. The mystery of magic and thievery, our military prowess, even our methods of production can all be enhanced through the power of study with an investment in time devoted to those fields. The students of our province will lead us into the future with your careful direction.&lt;br /&gt;
&lt;br /&gt;
Mastering the Arts &amp;amp; Sciences makes your people stronger, smarter, and more efficient. You can grow in strength without growing in size. &lt;br /&gt;
&lt;br /&gt;
Details on the benefits of different sciences can be found below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Table of Contents goes here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Science Categories, Types and Effects==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Science Category&lt;br /&gt;
!Type&lt;br /&gt;
!Effect&lt;br /&gt;
!Multiplier&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Economy&#039;&#039;&#039; || Alchemy ||Income || ~0.0724&lt;br /&gt;
|-&lt;br /&gt;
|   || Tools || Building Effectiveness || ~0.0524&lt;br /&gt;
|-&lt;br /&gt;
|   || Housing || Population Limits || ~0.0262&lt;br /&gt;
|-&lt;br /&gt;
|   || Production || Food &amp;amp; Rune Production || ~0.2172&lt;br /&gt;
|-&lt;br /&gt;
|   || Bookkeeping || Wage Reduction || ~0.068&lt;br /&gt;
|-&lt;br /&gt;
|   || Artisan || Construction Time Reduction, Construction &amp;amp; Raze Cost Reduction || ~0.0478&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || Strategy || Defensive Military Efficiency || ~0.0367&lt;br /&gt;
|-&lt;br /&gt;
|   || Siege || Battle Gains || ~0.0262&lt;br /&gt;
|-&lt;br /&gt;
|   || Tactics || Offensive Military Efficiency || ~0.0367&lt;br /&gt;
|-&lt;br /&gt;
|   || Valor || Reduced Military Train Time &amp;amp; Increased Dragon Slaying Strength || ~0.0582&lt;br /&gt;
|-&lt;br /&gt;
|   || Heroism || Draft Speed &amp;amp; Draft Costs Reduction || ~0.0418&lt;br /&gt;
|-&lt;br /&gt;
|   || Resilience || Reduced Military Casualties || ~0.0489&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Arcane Arts&#039;&#039;&#039; || Crime || Thievery Effectiveness || ~0.1557&lt;br /&gt;
|-&lt;br /&gt;
|   || Channeling ||Magic Effectiveness || ~0.1875&lt;br /&gt;
|-&lt;br /&gt;
|   || Shielding || Reduced Damage from Enemy Thievery and Magic Instant Operations || ~0.0314&lt;br /&gt;
|-&lt;br /&gt;
|   || Sorcery || Increased Magic Instant Damage || ~0.0314&lt;br /&gt;
|-&lt;br /&gt;
|   || Cunning || Increased Thievery Operation Damage || ~0.0314&lt;br /&gt;
|-&lt;br /&gt;
|   || Finesse || Reduced Wizards and Thieves lost on Failed Spells and Operations || ~0.0965&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Science Formula ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Science Bonus =&amp;lt;/b&amp;gt; ( # of Books in Type )^(1/2.125) * Science Multiplier * [[Races and Personalities|Race]] Mod * [[Races and Personalities|Personality]] Mod * [[Mystics#Amnesia|Amnesia Effect]] * [[Mystics#Scientific Insights|Scientific Insights]] Mod * [[Growth#Libraries|Libraries]] Mod&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scientists and Books==&lt;br /&gt;
&lt;br /&gt;
*Each province starts with a set number of Scientists assigned to the three science Categories (&amp;lt;b&amp;gt;Economy, Military, Arcane Arts&amp;lt;/b&amp;gt;). &amp;lt;br&amp;gt;&lt;br /&gt;
*Scientists start out as Recruits, then as they progress they provide incrementally greater benefits with each progression. &amp;lt;br&amp;gt;&lt;br /&gt;
*Scientist experience is based on how many Books they have produced in that category. &amp;lt;br&amp;gt;&lt;br /&gt;
*Scientists have no Networth value.&lt;br /&gt;
*Scientists can be re-assigned at any time, but revert to Recruit level when doing so. &amp;lt;br&amp;gt;&lt;br /&gt;
*Every tick each province builds progress towards a new scientist. Universities increase the rate of this progress.&lt;br /&gt;
*Scientists produce a set number of books each tick in the Category they are allocated (&amp;lt;b&amp;gt;Economy, Military, Arcane Arts&amp;lt;/b&amp;gt;), based on their rank. Schools increase this effect.&amp;lt;br&amp;gt;&lt;br /&gt;
*Books can be allocated to any science Type within the Category they have been produced.&amp;lt;br&amp;gt;&lt;br /&gt;
*Allocated books go into effect instantly.&lt;br /&gt;
*Inactive provinces do not produce Books.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--*Science over 5000 BPA will slowly decay outside War.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scientist Spawn Rate Formula ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Scientists Spawn Rate =&amp;lt;/b&amp;gt; 2 * [[Races and Personalities|Race]] Mod * [[Growth#Effects_of_Buildings|Universities Effect]] * [[Mystics#Revelation|Revelation]] Mod&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each province starts with a set number of scientists assigned to the various science categories. Scientists start out as Recruits that provide no bonus, then as they progress ther provide incrementally greater benefits with each progression.&lt;br /&gt;
&lt;br /&gt;
*Recruit -&amp;gt; Novice = 3 Utopian days (3 hours)&lt;br /&gt;
*Novice -&amp;gt; Graduate = 72 Utopian days (3 days)&lt;br /&gt;
*Graduate -&amp;gt; Professor = 96 Utopian days (4 days)&lt;br /&gt;
&lt;br /&gt;
Scientists can be re-assigned at any time, but revert to Recruit level when doing so. &amp;lt;br&amp;gt;&lt;br /&gt;
Every tick each province builds progress towards a new random scientist. Universities increase the rate of this progress.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Modifier Type&lt;br /&gt;
!Multiplier&lt;br /&gt;
|-&lt;br /&gt;
| Race: [[Races and Personalities|Human]] || 1.25&lt;br /&gt;
|-&lt;br /&gt;
| Spell: [[Mystics#Revelation|Revelation]] || 1.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Scientist Ranks and Production ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Rank&lt;br /&gt;
!Experience&lt;br /&gt;
!Book Production&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Recruit&#039;&#039;&#039; || 0-1439 || 60&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Novice&#039;&#039;&#039; || 1440-5279 || 80&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Graduate&#039;&#039;&#039; || 5280-12479 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Professor&#039;&#039;&#039; || 12480+ || 120&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Re-assigning Scientists ===&lt;br /&gt;
&lt;br /&gt;
Re-assigning scientists drops them back to a recruit.  &amp;lt;!--Refer to this forum post for a discussion on this topic: http://forums.utopia-game.com/showthread.php?639982-A-Question-About-Ticks-amp-Buildings--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Science Bonus ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Science Bonus =&amp;lt;/b&amp;gt; [ &#039;&#039;MIN&#039;&#039;( Science Multiplier * Skill points , Cap ) + &#039;&#039;MAX&#039;&#039;( 0, Science Multiplier * Skill points - Cap ) * Diminishing Return Factor ] * [[Races and Personalities|Race]] Mod * [[Races and Personalities|Personality]] Mod * [[Mystics#Scientific_Insights|Scientific Insights]] Mod &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Modifier Type&lt;br /&gt;
!Multiplier&lt;br /&gt;
!Science Category&lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Heretic]] || 1.3 || Crime &lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Heretic]] || 1.3 || Channeling&lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Rogue]] || 1.5 || Crime &lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Mystic]] || 1.75 || Channeling&lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Sage]] || 1.3 || All  &lt;br /&gt;
|-&lt;br /&gt;
| Spell: [[Mystics#Scientific_Insights|Scientific Insights]] || 1.1 || All&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Scientist Networth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Networth Per Scientist =&amp;lt;/b&amp;gt; ~1.7gc * tick of experience&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Professors experience caps at 72 hours&lt;br /&gt;
* A maxed-out professor will provide ~413gc Networth&lt;br /&gt;
&lt;br /&gt;
=== Book Networth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
NW = Books * 0.000006 * Current Land&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Age 69 - Age 76 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abduct Attacks&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
*Through combat, you can abduct scientists from another province. Universities protect a province from abduction. &#039;&#039;&#039;Note: Abduct attack has been removed in Age 77.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Changelog&#039;&#039;&#039;&lt;br /&gt;
*Age 69: The new science system is introduced.&lt;br /&gt;
*Age 70: Professors experience capped at 72 hours (a maxed-out professor will provide ~624gc Networth). Tools cap increased from 15% to 20%, housing and military cap from 10% to 15%, food from 100% to 200%, channeling from 100% to 125%. Additional scientist rank added: Recruit.&lt;br /&gt;
*Age 71: Approximately +50% scientists will be required to reach maximum effects (see table below). Production Science maximum will be 120% (down from 200%) and it will increase both Food and Rune production.&lt;br /&gt;
*Age 72: Scientists are generated on a flat ratio (7.5) similar to wizards instead of via RNG.&lt;br /&gt;
*Age 73: Science will no longer have a hard maximum for all categories. Science will scale in a linear fashion up to the previously stated maximums as normal. Once this point is reached additional scientists will yield diminishing returns.&lt;br /&gt;
*Age 74: Scientist experience will now show on the Science page and in the Spy on Sciences.&lt;br /&gt;
*Age 76: The number of scientists required for soft cap will be the same number for all categories: 35.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old scientist multipliers and caps, during Age 76:&#039;&#039;&#039;&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Category&#039;&#039;&#039; || &#039;&#039;&#039;Effect&#039;&#039;&#039; || &#039;&#039;&#039; Multiplier&#039;&#039;&#039; || &#039;&#039;&#039;Soft Cap&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Alchemy&#039;&#039;&#039; || Income || 0.428 || 30% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools&#039;&#039;&#039; || Building Effectiveness || 0.287 || 20% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Housing&#039;&#039;&#039; || Population Limits || 0.215 || 15% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Production&#039;&#039;&#039; || Food &amp;amp; Rune Production || 1.714 || 120% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || Military Efficiency || 0.215 || 15% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crime&#039;&#039;&#039; || Thievery Effectiveness || 1.428 || 100% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Channeling&#039;&#039;&#039; || Magic Effectiveness || 1.785 || 125% &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old scientist multipliers and caps, Age 71 - Age 75:&#039;&#039;&#039;&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Category&#039;&#039;&#039; || &#039;&#039;&#039;Effect&#039;&#039;&#039; || &#039;&#039;&#039; Multiplier&#039;&#039;&#039; || &#039;&#039;&#039;Cap&#039;&#039;&#039; || &#039;&#039;&#039;Scientist Cap&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Alchemy&#039;&#039;&#039; || Income || 0.5 || 30% || 30&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools&#039;&#039;&#039; || Building Effectiveness || 0.33 || 20% || 31&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Housing&#039;&#039;&#039; || Population Limits || 0.2 || 15% || 38&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Production&#039;&#039;&#039; || Food &amp;amp; Rune Production || 2 || 120% || 30&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || Military Efficiency || 0.2 || 15% || 38&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crime&#039;&#039;&#039; || Thievery Effectiveness || 1.65 || 100% || 31&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Channeling&#039;&#039;&#039; || Magic Effectiveness || 2 || 125% || 32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*&lt;br /&gt;
&lt;br /&gt;
=== Age ?? to Age 68 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: These formulas apply to the old books system of science. In Age 69, books were replaced by scientists.&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;From Ages ?? to 68 Science formulas worked as follows:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Science Effects&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;b&amp;gt;Books per Acre =&amp;lt;/b&amp;gt; Books / MAX(Acres,300)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;b&amp;gt;Science Bonus =&amp;lt;/b&amp;gt; [[Races and Personalities|Race]] Mod * [[Races and Personalities|Personality]] Mod * Science Multiplier * &#039;&#039;SQRT&#039;&#039;( Books per Acre ) * [[Growth|Library Effect]]&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Category&#039;&#039;&#039; || &#039;&#039;&#039;Multiplier&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Alchemy&#039;&#039;&#039; || 1.4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools&#039;&#039;&#039; || 1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Housing&#039;&#039;&#039; || 0.65&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Food&#039;&#039;&#039; || 8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Thievery&#039;&#039;&#039; || 6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Channeling&#039;&#039;&#039; || 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Science Costs&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;b&amp;gt;Science Cost =&amp;lt;/b&amp;gt; Raw Cost (&#039;&#039;Table Below&#039;&#039;) * [[Races and Personalities|Race]] Mod * [[Growth|Schools Effect]]&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Rate&#039;&#039;&#039; || &#039;&#039;&#039;BPA&#039;&#039;&#039; || &#039;&#039;&#039;GC / Book&#039;&#039;&#039; || &#039;&#039;&#039;GC / Acre&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;No Research&#039;&#039;&#039; || 0 || 0 || 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Minimal&#039;&#039;&#039; || 0.3 || 6 || 1.8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Limited&#039;&#039;&#039; || 0.4 || 7 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sustained&#039;&#039;&#039; || 0.5 || 9 || 4.5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Active&#039;&#039;&#039; || 0.7 || 13 || 9.1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Focused&#039;&#039;&#039; || 0.9 || 17 || 15.3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Accelerated&#039;&#039;&#039; || 1.2 || 22 || 26.4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Intensive&#039;&#039;&#039; || 1.5 || 27 || 40.5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Rushed&#039;&#039;&#039; || 2.0 || 36 || 72.0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extreme&#039;&#039;&#039; || 3.0 || 50 || 150.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=910</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=910"/>
		<updated>2026-02-19T16:35:39Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active TOC item — gold background + dark text */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link {&lt;br /&gt;
  background-color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link,&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=909</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=909"/>
		<updated>2026-02-19T16:34:08Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: Undo revision 906 by Sonja says (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=908</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=908"/>
		<updated>2026-02-19T16:31:39Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: Undo revision 907 by Sonja says (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TOC hover = gold background + black text */&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:hover,&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:focus {&lt;br /&gt;
  background-color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:hover .vector-toc-text,&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:focus .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=907</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=907"/>
		<updated>2026-02-19T16:30:30Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=906</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=906"/>
		<updated>2026-02-19T16:29:09Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TOC hover = gold background + black text */&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:hover,&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:focus {&lt;br /&gt;
  background-color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:hover .vector-toc-text,&lt;br /&gt;
#vector-toc .vector-toc-list-item &amp;gt; a.vector-toc-link:focus .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=905</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=905"/>
		<updated>2026-02-19T16:25:08Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=904</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=904"/>
		<updated>2026-02-19T16:24:44Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=903</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=903"/>
		<updated>2026-02-19T16:24:00Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Formula Boxes&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .formula-box {&lt;br /&gt;
  display: inline-block !important;&lt;br /&gt;
  width: fit-content !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Science&amp;diff=902</id>
		<title>Science</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Science&amp;diff=902"/>
		<updated>2026-02-19T16:19:23Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: /* Re-assigning Scientists */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sciences are the study of knowledge and create our pathway into the future. By studying the laws that govern our being and understanding the effects of these laws, we can strengthen ourselves in all that we do. The mystery of magic and thievery, our military prowess, even our methods of production can all be enhanced through the power of study with an investment in time devoted to those fields. The students of our province will lead us into the future with your careful direction.&lt;br /&gt;
&lt;br /&gt;
Mastering the Arts &amp;amp; Sciences makes your people stronger, smarter, and more efficient. You can grow in strength without growing in size. &lt;br /&gt;
&lt;br /&gt;
Details on the benefits of different sciences can be found below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Table of Contents goes here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Science Categories, Types and Effects==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Science Category&lt;br /&gt;
!Type&lt;br /&gt;
!Effect&lt;br /&gt;
!Multiplier&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Economy&#039;&#039;&#039; || Alchemy ||Income || ~0.0724&lt;br /&gt;
|-&lt;br /&gt;
|   || Tools || Building Effectiveness || ~0.0524&lt;br /&gt;
|-&lt;br /&gt;
|   || Housing || Population Limits || ~0.0262&lt;br /&gt;
|-&lt;br /&gt;
|   || Production || Food &amp;amp; Rune Production || ~0.2172&lt;br /&gt;
|-&lt;br /&gt;
|   || Bookkeeping || Wage Reduction || ~0.068&lt;br /&gt;
|-&lt;br /&gt;
|   || Artisan || Construction Time Reduction, Construction &amp;amp; Raze Cost Reduction || ~0.0478&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || Strategy || Defensive Military Efficiency || ~0.0367&lt;br /&gt;
|-&lt;br /&gt;
|   || Siege || Battle Gains || ~0.0262&lt;br /&gt;
|-&lt;br /&gt;
|   || Tactics || Offensive Military Efficiency || ~0.0367&lt;br /&gt;
|-&lt;br /&gt;
|   || Valor || Reduced Military Train Time &amp;amp; Increased Dragon Slaying Strength || ~0.0582&lt;br /&gt;
|-&lt;br /&gt;
|   || Heroism || Draft Speed &amp;amp; Draft Costs Reduction || ~0.0418&lt;br /&gt;
|-&lt;br /&gt;
|   || Resilience || Reduced Military Casualties || ~0.0489&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Arcane Arts&#039;&#039;&#039; || Crime || Thievery Effectiveness || ~0.1557&lt;br /&gt;
|-&lt;br /&gt;
|   || Channeling ||Magic Effectiveness || ~0.1875&lt;br /&gt;
|-&lt;br /&gt;
|   || Shielding || Reduced Damage from Enemy Thievery and Magic Instant Operations || ~0.0314&lt;br /&gt;
|-&lt;br /&gt;
|   || Sorcery || Increased Magic Instant Damage || ~0.0314&lt;br /&gt;
|-&lt;br /&gt;
|   || Cunning || Increased Thievery Operation Damage || ~0.0314&lt;br /&gt;
|-&lt;br /&gt;
|   || Finesse || Reduced Wizards and Thieves lost on Failed Spells and Operations || ~0.0965&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Science Formula ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Science Bonus =&amp;lt;/b&amp;gt; ( # of Books in Type )^(1/2.125) * Science Multiplier * [[Races and Personalities|Race]] Mod * [[Races and Personalities|Personality]] Mod * [[Mystics#Amnesia|Amnesia Effect]] * [[Mystics#Scientific Insights|Scientific Insights]] Mod * [[Growth#Libraries|Libraries]] Mod&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scientists and Books==&lt;br /&gt;
&lt;br /&gt;
*Each province starts with a set number of Scientists assigned to the three science Categories (&amp;lt;b&amp;gt;Economy, Military, Arcane Arts&amp;lt;/b&amp;gt;). &amp;lt;br&amp;gt;&lt;br /&gt;
*Scientists start out as Recruits, then as they progress they provide incrementally greater benefits with each progression. &amp;lt;br&amp;gt;&lt;br /&gt;
*Scientist experience is based on how many Books they have produced in that category. &amp;lt;br&amp;gt;&lt;br /&gt;
*Scientists have no Networth value.&lt;br /&gt;
*Scientists can be re-assigned at any time, but revert to Recruit level when doing so. &amp;lt;br&amp;gt;&lt;br /&gt;
*Every tick each province builds progress towards a new scientist. Universities increase the rate of this progress.&lt;br /&gt;
*Scientists produce a set number of books each tick in the Category they are allocated (&amp;lt;b&amp;gt;Economy, Military, Arcane Arts&amp;lt;/b&amp;gt;), based on their rank. Schools increase this effect.&amp;lt;br&amp;gt;&lt;br /&gt;
*Books can be allocated to any science Type within the Category they have been produced.&amp;lt;br&amp;gt;&lt;br /&gt;
*Allocated books go into effect instantly.&lt;br /&gt;
*Inactive provinces do not produce Books.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--*Science over 5000 BPA will slowly decay outside War.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scientist Spawn Rate Formula ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Scientists Spawn Rate =&amp;lt;/b&amp;gt; 2 * [[Races and Personalities|Race]] Mod * [[Growth#Effects_of_Buildings|Universities Effect]] * [[Mystics#Revelation|Revelation]] Mod&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each province starts with a set number of scientists assigned to the various science categories. Scientists start out as Recruits that provide no bonus, then as they progress ther provide incrementally greater benefits with each progression.&lt;br /&gt;
&lt;br /&gt;
*Recruit -&amp;gt; Novice = 3 Utopian days (3 hours)&lt;br /&gt;
*Novice -&amp;gt; Graduate = 72 Utopian days (3 days)&lt;br /&gt;
*Graduate -&amp;gt; Professor = 96 Utopian days (4 days)&lt;br /&gt;
&lt;br /&gt;
Scientists can be re-assigned at any time, but revert to Recruit level when doing so. &amp;lt;br&amp;gt;&lt;br /&gt;
Every tick each province builds progress towards a new random scientist. Universities increase the rate of this progress.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Modifier Type&lt;br /&gt;
!Multiplier&lt;br /&gt;
|-&lt;br /&gt;
| Race: [[Races and Personalities|Human]] || 1.25&lt;br /&gt;
|-&lt;br /&gt;
| Spell: [[Mystics#Revelation|Revelation]] || 1.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Scientist Ranks and Production ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Rank&lt;br /&gt;
!Experience&lt;br /&gt;
!Book Production&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Recruit&#039;&#039;&#039; || 0-1439 || 60&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Novice&#039;&#039;&#039; || 1440-5279 || 80&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Graduate&#039;&#039;&#039; || 5280-12479 || 100&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Professor&#039;&#039;&#039; || 12480+ || 120&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Re-assigning Scientists ===&lt;br /&gt;
&lt;br /&gt;
Re-assigning scientists drops them back to a recruit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Refer to this forum post for a discussion on this topic: http://forums.utopia-game.com/showthread.php?639982-A-Question-About-Ticks-amp-Buildings--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Science Bonus ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Science Bonus =&amp;lt;/b&amp;gt; [ &#039;&#039;MIN&#039;&#039;( Science Multiplier * Skill points , Cap ) + &#039;&#039;MAX&#039;&#039;( 0, Science Multiplier * Skill points - Cap ) * Diminishing Return Factor ] * [[Races and Personalities|Race]] Mod * [[Races and Personalities|Personality]] Mod * [[Mystics#Scientific_Insights|Scientific Insights]] Mod &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Modifier Type&lt;br /&gt;
!Multiplier&lt;br /&gt;
!Science Category&lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Heretic]] || 1.3 || Crime &lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Heretic]] || 1.3 || Channeling&lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Rogue]] || 1.5 || Crime &lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Mystic]] || 1.75 || Channeling&lt;br /&gt;
|-&lt;br /&gt;
| Personality: [[Races and Personalities|Sage]] || 1.3 || All  &lt;br /&gt;
|-&lt;br /&gt;
| Spell: [[Mystics#Scientific_Insights|Scientific Insights]] || 1.1 || All&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Scientist Networth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Networth Per Scientist =&amp;lt;/b&amp;gt; ~1.7gc * tick of experience&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Professors experience caps at 72 hours&lt;br /&gt;
* A maxed-out professor will provide ~413gc Networth&lt;br /&gt;
&lt;br /&gt;
=== Book Networth ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
NW = Books * 0.000006 * Current Land&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Age 69 - Age 76 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abduct Attacks&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
*Through combat, you can abduct scientists from another province. Universities protect a province from abduction. &#039;&#039;&#039;Note: Abduct attack has been removed in Age 77.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Changelog&#039;&#039;&#039;&lt;br /&gt;
*Age 69: The new science system is introduced.&lt;br /&gt;
*Age 70: Professors experience capped at 72 hours (a maxed-out professor will provide ~624gc Networth). Tools cap increased from 15% to 20%, housing and military cap from 10% to 15%, food from 100% to 200%, channeling from 100% to 125%. Additional scientist rank added: Recruit.&lt;br /&gt;
*Age 71: Approximately +50% scientists will be required to reach maximum effects (see table below). Production Science maximum will be 120% (down from 200%) and it will increase both Food and Rune production.&lt;br /&gt;
*Age 72: Scientists are generated on a flat ratio (7.5) similar to wizards instead of via RNG.&lt;br /&gt;
*Age 73: Science will no longer have a hard maximum for all categories. Science will scale in a linear fashion up to the previously stated maximums as normal. Once this point is reached additional scientists will yield diminishing returns.&lt;br /&gt;
*Age 74: Scientist experience will now show on the Science page and in the Spy on Sciences.&lt;br /&gt;
*Age 76: The number of scientists required for soft cap will be the same number for all categories: 35.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old scientist multipliers and caps, during Age 76:&#039;&#039;&#039;&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Category&#039;&#039;&#039; || &#039;&#039;&#039;Effect&#039;&#039;&#039; || &#039;&#039;&#039; Multiplier&#039;&#039;&#039; || &#039;&#039;&#039;Soft Cap&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Alchemy&#039;&#039;&#039; || Income || 0.428 || 30% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools&#039;&#039;&#039; || Building Effectiveness || 0.287 || 20% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Housing&#039;&#039;&#039; || Population Limits || 0.215 || 15% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Production&#039;&#039;&#039; || Food &amp;amp; Rune Production || 1.714 || 120% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || Military Efficiency || 0.215 || 15% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crime&#039;&#039;&#039; || Thievery Effectiveness || 1.428 || 100% &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Channeling&#039;&#039;&#039; || Magic Effectiveness || 1.785 || 125% &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old scientist multipliers and caps, Age 71 - Age 75:&#039;&#039;&#039;&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Category&#039;&#039;&#039; || &#039;&#039;&#039;Effect&#039;&#039;&#039; || &#039;&#039;&#039; Multiplier&#039;&#039;&#039; || &#039;&#039;&#039;Cap&#039;&#039;&#039; || &#039;&#039;&#039;Scientist Cap&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Alchemy&#039;&#039;&#039; || Income || 0.5 || 30% || 30&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools&#039;&#039;&#039; || Building Effectiveness || 0.33 || 20% || 31&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Housing&#039;&#039;&#039; || Population Limits || 0.2 || 15% || 38&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Production&#039;&#039;&#039; || Food &amp;amp; Rune Production || 2 || 120% || 30&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || Military Efficiency || 0.2 || 15% || 38&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Crime&#039;&#039;&#039; || Thievery Effectiveness || 1.65 || 100% || 31&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Channeling&#039;&#039;&#039; || Magic Effectiveness || 2 || 125% || 32&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*&lt;br /&gt;
&lt;br /&gt;
=== Age ?? to Age 68 ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: These formulas apply to the old books system of science. In Age 69, books were replaced by scientists.&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;From Ages ?? to 68 Science formulas worked as follows:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Science Effects&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;b&amp;gt;Books per Acre =&amp;lt;/b&amp;gt; Books / MAX(Acres,300)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;b&amp;gt;Science Bonus =&amp;lt;/b&amp;gt; [[Races and Personalities|Race]] Mod * [[Races and Personalities|Personality]] Mod * Science Multiplier * &#039;&#039;SQRT&#039;&#039;( Books per Acre ) * [[Growth|Library Effect]]&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Category&#039;&#039;&#039; || &#039;&#039;&#039;Multiplier&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Alchemy&#039;&#039;&#039; || 1.4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools&#039;&#039;&#039; || 1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Housing&#039;&#039;&#039; || 0.65&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Food&#039;&#039;&#039; || 8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Military&#039;&#039;&#039; || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Thievery&#039;&#039;&#039; || 6&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Channeling&#039;&#039;&#039; || 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Science Costs&#039;&#039;&#039;&lt;br /&gt;
 &amp;lt;b&amp;gt;Science Cost =&amp;lt;/b&amp;gt; Raw Cost (&#039;&#039;Table Below&#039;&#039;) * [[Races and Personalities|Race]] Mod * [[Growth|Schools Effect]]&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;4&amp;quot; &lt;br /&gt;
|-bgcolor=&amp;quot;#dedeff&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Science Rate&#039;&#039;&#039; || &#039;&#039;&#039;BPA&#039;&#039;&#039; || &#039;&#039;&#039;GC / Book&#039;&#039;&#039; || &#039;&#039;&#039;GC / Acre&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;No Research&#039;&#039;&#039; || 0 || 0 || 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Minimal&#039;&#039;&#039; || 0.3 || 6 || 1.8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Limited&#039;&#039;&#039; || 0.4 || 7 || 2.8&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sustained&#039;&#039;&#039; || 0.5 || 9 || 4.5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Active&#039;&#039;&#039; || 0.7 || 13 || 9.1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Focused&#039;&#039;&#039; || 0.9 || 17 || 15.3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Accelerated&#039;&#039;&#039; || 1.2 || 22 || 26.4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Intensive&#039;&#039;&#039; || 1.5 || 27 || 40.5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Rushed&#039;&#039;&#039; || 2.0 || 36 || 72.0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extreme&#039;&#039;&#039; || 3.0 || 50 || 150.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=901</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=901"/>
		<updated>2026-02-19T16:15:39Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Draft Cost Formula&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  display: inline-block !important;  /* shrink to fit */&lt;br /&gt;
  width: auto !important;            /* no full width */&lt;br /&gt;
  max-width: 100% !important;        /* prevent overflow */&lt;br /&gt;
&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=900</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=900"/>
		<updated>2026-02-19T16:14:22Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: auto !important;          /* stop full-width */&lt;br /&gt;
  display: inline-table !important;/* shrink-wrap to content */&lt;br /&gt;
  max-width: 100% !important;      /* don’t overflow the page */&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Draft Cost Formula&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Politics&amp;diff=899</id>
		<title>Politics</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Politics&amp;diff=899"/>
		<updated>2026-02-19T16:11:20Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: /* The Steward */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Overview ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;King&#039;&#039;&#039; or &#039;&#039;&#039;Queen&#039;&#039;&#039; of a kingdom is its official representative within the larger world. Being the &#039;&#039;&#039;Monarch&#039;&#039;&#039; of a kingdom is quite a responsibility, and kingdoms should work to elect an experienced and capable leader. Selecting a Monarch is a simple process of voting - it is essential that all provinces participate and make their voice heard. The quality and actions of your Monarch will impact your experience and enjoyment in Utopia, and it is important to elect someone with strong communication and diplomatic skills.&lt;br /&gt;
&lt;br /&gt;
A strongly united kingdom is vital to your long-term success on Utopia. Deciding on -- and listening to -- your King or Queen is an important first step, and your vote is important. Remember that a good King or Queen is not necessarily the best or most active player in your Kingdom -- it is the one with the best diplomatic ability and the one most willing to put the kingdom&#039;s goals ahead of his or her own. Take advantage of the Public Forum to discuss the vital issues of your Kingdom&#039;s future with your fellow provinces and vote for a King or Queen to lead your kingdom to glory.&lt;br /&gt;
&lt;br /&gt;
The politics page allows you to vote for a King or Queen, and displays the following:&lt;br /&gt;
	&lt;br /&gt;
* The kingdom&#039;s current Monarch&lt;br /&gt;
* Minimum Votes Needed to be Elected&lt;br /&gt;
* Political Standings of your kingdom, i.e who has voted and how many votes they have&lt;br /&gt;
&lt;br /&gt;
=== Monarchy: Getting Elected ===&lt;br /&gt;
&lt;br /&gt;
If you wish to become the Monarch of your kingdom, there are a few different ways to achieve your goal. &lt;br /&gt;
&lt;br /&gt;
First, you may be voted in by your fellow provinces. In order to be elected, you must maintain over fifty percent of the votes of other leaders, and if there are more than six provinces in the kingdom you must also clear lead of at least 2 votes than the runner up. If you are not popular, this will likely not happen. Thus, diplomacy is absolutely essential. Treat others with respect, maximize their value and importance in the kingdom. These are not only ways to earn the Monarchy, but also ideal ways to lead your kingdom to glory.&lt;br /&gt;
&lt;br /&gt;
Each province in your kingdom begins with one vote. However, you can obtain additional votes and strengthen your standing through [[Honour|Nobility]]. By Utopian Law, every province is guaranteed a minimum of one vote and no more than 10 votes.&lt;br /&gt;
&lt;br /&gt;
The second way to gain monarchy is to seize control of it - that is, if you have more than 50% of the total networth in the kingdom and there are at least two other provinces - your vote is all that matters. Whoever you choose to be Monarch will be elected. Unfortunately, to do this, you may have to attack your fellow kingdom provinces, weakening your kingdom&#039;s stature throughout the world. Most often, this is a strategy for failure, as you will find it difficult to lead those who do not wish to be led, but the option is yours.&lt;br /&gt;
&lt;br /&gt;
=== Monarchy: The Monarch&#039;s responsibilities and duties ===&lt;br /&gt;
&lt;br /&gt;
A Monarch must be committed to ruling with a fair hand. Seek input from your provinces, or you may quickly find yourself out of office. Each kingdom must find a Monarch to grow, but more importantly, they must find a fair and noble Monarch to lead them to glory.&lt;br /&gt;
&lt;br /&gt;
It will also be your responsibility to maintain the Kingdom Council Forums, to keep them clean, and to make them a useful service to the various rulers across your kingdom. You will represent your kingdom to the world, and your actions will reflect on the provinces you represent. Diplomacy and tact will be vital to any kind of long-term successes. As Monarch, it is your duty to maintain relations with other kingdoms and organize projects such as the nurturing of a Dragon.&lt;br /&gt;
&lt;br /&gt;
=== The Steward ===&lt;br /&gt;
A monarch can nominate two other players to the position of Royal Steward. These players can conduct many of the duties performed by the Monarch such as:&lt;br /&gt;
&lt;br /&gt;
*Changing stances&lt;br /&gt;
*Declaring war&lt;br /&gt;
*Conducting Ceasefires&lt;br /&gt;
*Editing the Royal Commands&lt;br /&gt;
*Managing the kingdom forums&lt;br /&gt;
*Starting/Cancelling a dragon&lt;br /&gt;
*Sending a dragon&lt;br /&gt;
&lt;br /&gt;
NOTE: If the monarch has another player set to mentor or sit them, they WILL be able to perform these functions.&lt;br /&gt;
&lt;br /&gt;
=== Inactive Provinces ===&lt;br /&gt;
As the Monarch you have the power to destroy inactive provinces just as you could invite another leader to take over! &lt;br /&gt;
&lt;br /&gt;
* Prerequisites &lt;br /&gt;
** First, 48 Ticks must pass from their last logoff and they will be labeled as inactive&lt;br /&gt;
** Second, 48 Ticks must pass for Monarch to be able to force delete/abandon of the province&lt;br /&gt;
*** wol tick = 1 hour&lt;br /&gt;
*** abandon will force the inactive leader out&lt;br /&gt;
*** delete will destroy the province completely&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Politics&amp;diff=898</id>
		<title>Politics</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Politics&amp;diff=898"/>
		<updated>2026-02-19T16:10:45Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: /* The Steward */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Overview ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;King&#039;&#039;&#039; or &#039;&#039;&#039;Queen&#039;&#039;&#039; of a kingdom is its official representative within the larger world. Being the &#039;&#039;&#039;Monarch&#039;&#039;&#039; of a kingdom is quite a responsibility, and kingdoms should work to elect an experienced and capable leader. Selecting a Monarch is a simple process of voting - it is essential that all provinces participate and make their voice heard. The quality and actions of your Monarch will impact your experience and enjoyment in Utopia, and it is important to elect someone with strong communication and diplomatic skills.&lt;br /&gt;
&lt;br /&gt;
A strongly united kingdom is vital to your long-term success on Utopia. Deciding on -- and listening to -- your King or Queen is an important first step, and your vote is important. Remember that a good King or Queen is not necessarily the best or most active player in your Kingdom -- it is the one with the best diplomatic ability and the one most willing to put the kingdom&#039;s goals ahead of his or her own. Take advantage of the Public Forum to discuss the vital issues of your Kingdom&#039;s future with your fellow provinces and vote for a King or Queen to lead your kingdom to glory.&lt;br /&gt;
&lt;br /&gt;
The politics page allows you to vote for a King or Queen, and displays the following:&lt;br /&gt;
	&lt;br /&gt;
* The kingdom&#039;s current Monarch&lt;br /&gt;
* Minimum Votes Needed to be Elected&lt;br /&gt;
* Political Standings of your kingdom, i.e who has voted and how many votes they have&lt;br /&gt;
&lt;br /&gt;
=== Monarchy: Getting Elected ===&lt;br /&gt;
&lt;br /&gt;
If you wish to become the Monarch of your kingdom, there are a few different ways to achieve your goal. &lt;br /&gt;
&lt;br /&gt;
First, you may be voted in by your fellow provinces. In order to be elected, you must maintain over fifty percent of the votes of other leaders, and if there are more than six provinces in the kingdom you must also clear lead of at least 2 votes than the runner up. If you are not popular, this will likely not happen. Thus, diplomacy is absolutely essential. Treat others with respect, maximize their value and importance in the kingdom. These are not only ways to earn the Monarchy, but also ideal ways to lead your kingdom to glory.&lt;br /&gt;
&lt;br /&gt;
Each province in your kingdom begins with one vote. However, you can obtain additional votes and strengthen your standing through [[Honour|Nobility]]. By Utopian Law, every province is guaranteed a minimum of one vote and no more than 10 votes.&lt;br /&gt;
&lt;br /&gt;
The second way to gain monarchy is to seize control of it - that is, if you have more than 50% of the total networth in the kingdom and there are at least two other provinces - your vote is all that matters. Whoever you choose to be Monarch will be elected. Unfortunately, to do this, you may have to attack your fellow kingdom provinces, weakening your kingdom&#039;s stature throughout the world. Most often, this is a strategy for failure, as you will find it difficult to lead those who do not wish to be led, but the option is yours.&lt;br /&gt;
&lt;br /&gt;
=== Monarchy: The Monarch&#039;s responsibilities and duties ===&lt;br /&gt;
&lt;br /&gt;
A Monarch must be committed to ruling with a fair hand. Seek input from your provinces, or you may quickly find yourself out of office. Each kingdom must find a Monarch to grow, but more importantly, they must find a fair and noble Monarch to lead them to glory.&lt;br /&gt;
&lt;br /&gt;
It will also be your responsibility to maintain the Kingdom Council Forums, to keep them clean, and to make them a useful service to the various rulers across your kingdom. You will represent your kingdom to the world, and your actions will reflect on the provinces you represent. Diplomacy and tact will be vital to any kind of long-term successes. As Monarch, it is your duty to maintain relations with other kingdoms and organize projects such as the nurturing of a Dragon.&lt;br /&gt;
&lt;br /&gt;
=== The Steward ===&lt;br /&gt;
A monarch can nominate two other players to the position of Royal Steward. These players can conduct many of the duties performed by the Monarch such as:&lt;br /&gt;
&lt;br /&gt;
-Changing stances&lt;br /&gt;
-Declaring war&lt;br /&gt;
-Conducting Ceasefires&lt;br /&gt;
-Editing the Royal Commands&lt;br /&gt;
-Managing the kingdom forums&lt;br /&gt;
-Starting/Cancelling a dragon&lt;br /&gt;
-Sending a dragon&lt;br /&gt;
&lt;br /&gt;
NOTE: If the monarch has another player set to mentor or sit them, they WILL be able to perform these functions.&lt;br /&gt;
&lt;br /&gt;
=== Inactive Provinces ===&lt;br /&gt;
As the Monarch you have the power to destroy inactive provinces just as you could invite another leader to take over! &lt;br /&gt;
&lt;br /&gt;
* Prerequisites &lt;br /&gt;
** First, 48 Ticks must pass from their last logoff and they will be labeled as inactive&lt;br /&gt;
** Second, 48 Ticks must pass for Monarch to be able to force delete/abandon of the province&lt;br /&gt;
*** wol tick = 1 hour&lt;br /&gt;
*** abandon will force the inactive leader out&lt;br /&gt;
*** delete will destroy the province completely&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Ritual&amp;diff=897</id>
		<title>Ritual</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Ritual&amp;diff=897"/>
		<updated>2026-02-19T16:08:48Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: /* Completing A Ritual */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Age114 Rituals Title.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kingdom Rituals&#039;&#039;&#039; (KR) are a new mechanic introduced in [[Age_72|Age 72]] that serves as a kingdom-wide bonus. The [[Politics|Monarch]] or [[Politics|Steward]] can begin a ritual.&lt;br /&gt;
&lt;br /&gt;
==Kingdom Ritual Page==&lt;br /&gt;
&lt;br /&gt;
The Kingdom Ritual page will also display various information such as:&lt;br /&gt;
*current active KR type and strength&lt;br /&gt;
*current mana level and the rune cost to cast on the ritual&lt;br /&gt;
*the activation efficiency of the ritual currently being cast&lt;br /&gt;
&lt;br /&gt;
For enemies: an active Kingdom Ritual will be displayed via Spy on Throne, where you will see which KR is active and current strength&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#FFC300&amp;quot;&amp;gt;Types of Kingdom Rituals&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
There are 7 kinds of Kingdom Rituals:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:1px solid #625230; background:#0f1a2b; color:#ffffff;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#001D3D; color:#FFC300; text-align:center; padding:8px; font-size:1.2em;&amp;quot; |&lt;br /&gt;
Kingdom Rituals&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;5%&amp;quot;  style=&amp;quot;background:#003566; color:#ffffff; text-align:left; padding:6px;&amp;quot; | Ritual&lt;br /&gt;
! width=&amp;quot;95%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:left; padding:6px;&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Ascendency&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +50% Wizard Production  &lt;br /&gt;
* -50% Wizard Losses on Failed Spells  &lt;br /&gt;
* -25% Book Generation&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Barrier&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +20% Birth Rates  &lt;br /&gt;
* -25% Damage from Enemy Instant Magic &amp;amp; Thievery Ops  &lt;br /&gt;
* -20% Massacre Damage  &lt;br /&gt;
* -10% Battle (Resource) Losses&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Expedient&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +20% Building Efficiency  &lt;br /&gt;
* -25% Military Wages  &lt;br /&gt;
* -25% Construction Cost  &lt;br /&gt;
* -25% Construction Time&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Haste&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* -10% Attack Time  &lt;br /&gt;
* -25% Training Time  &lt;br /&gt;
* -25% Construction Time&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Havoc&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +20% Offensive WPA  &lt;br /&gt;
* +20% Offensive TPA  &lt;br /&gt;
* +20% Spell Damage  &lt;br /&gt;
* +20% Sabotage Damage&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Onslaught&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +10% Offensive Military Efficiency  &lt;br /&gt;
* +15% Enemy Military Casualties on Attacks&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Stalwart&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +5% Defensive Military Efficiency  &lt;br /&gt;
* -20% Military Casualties&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#FFC300&amp;quot;&amp;gt;Retired Rituals&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:1px solid #625230; background:#0f1a2b; color:#ffffff;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#001D3D; color:#FFC300; text-align:center; padding:8px; font-size:1.2em;&amp;quot; |&lt;br /&gt;
Kingdom Rituals&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;5%&amp;quot;  style=&amp;quot;background:#003566; color:#ffffff; text-align:left; padding:6px;&amp;quot; | Ritual&lt;br /&gt;
! width=&amp;quot;95%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:left; padding:6px;&amp;quot; | Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Affluent&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +15% Income  &lt;br /&gt;
* +20% Draft Rate&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Benediction&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +10% Building Efficiency  &lt;br /&gt;
* -20% Military Wages  &lt;br /&gt;
* +40% Birth Rate&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Expropriation&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +20% Honor Gains on Attacks  &lt;br /&gt;
* +20% Credits gained in Combat  &lt;br /&gt;
* +20% Enemy Military Casualties on Attacks&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; | Godspeed&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* -10% Attack Time  &lt;br /&gt;
* +10% Combat Gains&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Completing A Ritual==&lt;br /&gt;
&lt;br /&gt;
To complete the ritual, the Kingdom must successfully cast the ritual spell a minimum of 3 times the number of Provinces in the Kingdom (minimum 15 provinces for this calculation) within 48 hours of the ritual being started. &amp;lt;!--A ritual&#039;s full strength is reached at 80 casts.--&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Ritual can be overcasted, for increased effects.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
Ritual Effectiveness = 1 + (2*SQRT( X - MAX(45,KD_provs*3) )) /100&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where X = number of ritual casts, when X ≥ 3 times the number of Provinces in the Kingdom&lt;br /&gt;
&lt;br /&gt;
A ritual&#039;s strength diminishes by .25% per tick.&lt;br /&gt;
&lt;br /&gt;
The ritual spell has a difficulty similar to the most difficult self-spell, a very expensive rune cost (Cost Multiplier 6) and costs 2% Mana per cast.&amp;lt;br&amp;gt;&lt;br /&gt;
A successful ritual will last for a minimum of 48 (if destroyed by Abolish Ritual) and a maximum of 120 hours. While only one ritual can be active, another one can be started before the active ritual ends, very similar to Dragons. Once the ritual is completed, the previous ritual will be replaced.&lt;br /&gt;
&lt;br /&gt;
==Destroying A Ritual==&lt;br /&gt;
&lt;br /&gt;
Rituals are destroyable via the [[Mystics#Abolish_Ritual|Abolish Ritual]] spell. This spell reduces the strength of the Ritual by a flat rate of 2%. Abolish Ritual can only be cast on a single province a maximum of 10 times — in order to destroy a Ritual from 100% to 0%, you would need to cast the spell 10 times on 5 different provinces.&lt;br /&gt;
&lt;br /&gt;
Once a Ritual reaches 0% strength it will be removed, unless it has not reached it&#039;s minimum duration of 48 hours, at which point it will remain until the 48th tick and be removed at that time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Changelog===&lt;br /&gt;
* Age 106: Rituals updated to reflect forum changes on 6 May 2024.&lt;br /&gt;
* Age 107: Expedient ritual updated.&lt;br /&gt;
* Age 110: Ascendancy ritual added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Stances (Retired)==&lt;br /&gt;
As of [[Age 74]], stances have been removed from the game and have been replaced by [[Ritual|Rituals]]. This information, though outdated, will be retained for historical purposes here: &#039;&#039;&#039;[[Stances]]&#039;&#039;&#039;.&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=Dragons&amp;diff=896</id>
		<title>Dragons</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=Dragons&amp;diff=896"/>
		<updated>2026-02-19T16:08:12Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Age114 Dragons Title.png|center|link=]]&lt;br /&gt;
[[File:Age114 Dragons Cards.png|center|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dragons&#039;&#039;&#039; are creatures that help to disrupt the target Kingdom.&lt;br /&gt;
&lt;br /&gt;
[[Politics|Monarch]] and [[Politics|Stewards]] can choose which Dragon type and the target Kingdom.&lt;br /&gt;
&lt;br /&gt;
When Dragon project is chosen and started, provinces can donate money and food for funding.&lt;br /&gt;
&lt;br /&gt;
When the Dragon is sent to an opposing kingdom, it will wreak havoc on their lands. The Dragon will continue to do so for two full months (48 ticks) or until slain by the enemy kingdom&#039;s forces. &lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color: #FFC300&amp;quot;&amp;gt;Dragon&#039;s Behavior==&lt;br /&gt;
&amp;lt;!--* All dragons result in 10% lower income, 10% lower food production, the loss of 20% of new draftees, and destroy 3% of buildings every 6 ticks.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Troops will slay a dragon at their respective strength. Every soldier sent will destroy strength in the amount of its offense. If a soldier is 3/0, it will cause 3 damage per soldier towards the slaying of the dragon. If your elite is 14/4, it will cause 14 damage per troop towards the slaying of the dragon (before slay modifiers). &amp;lt;sup&amp;gt;[[Age 114]]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Troops sent to slay dragon are unaffected by any spells that increase unit damage, percent or flat rate increase such as [[Mystics#Bloodlust|Bloodlust]] or [[Mystics#Aggression|Aggression]]&lt;br /&gt;
&lt;br /&gt;
* All provinces can boost their dragon slaying strength by investing in &#039;&#039;&#039;Valor&#039;&#039;&#039; science.&lt;br /&gt;
&lt;br /&gt;
* Thieves, Wizards and Prisoners &#039;&#039;&#039;cannot&#039;&#039;&#039; be used to slay a dragon.&lt;br /&gt;
&lt;br /&gt;
* Some races or personalities may receive a bonus to dragon slaying strength of all troops (including soldiers).&lt;br /&gt;
&lt;br /&gt;
* Dragons will fly away on their own on the dawning of the 3rd (third) Utopian month; having lasted for a total of 48 utopian days.&lt;br /&gt;
&lt;br /&gt;
* Dragons send range is from 20% smaller to 25% larger in relation to kingdoms net worth. Dragon send range will be removed when targeting a Kingdom you are at war with.&lt;br /&gt;
&lt;br /&gt;
* Monarchs and Stewards have the option to start a dragon project. Once a dragon project is started a Fund Dragon menu link will appear in the navigation area for all qualified provinces to help funding the dragon project. When fully funded, only the &#039;&#039;&#039;Monarch&#039;&#039;&#039; or &#039;&#039;&#039;Steward(s)&#039;&#039;&#039; will have the ability to send the dragon.&lt;br /&gt;
&lt;br /&gt;
* Provinces in protection may not fund or slay a dragon.&lt;br /&gt;
&lt;br /&gt;
* Once a kingdom receives a Dragon, a menu link will appear in the affected players navigation area allowing them access to the Slay Dragon section.&lt;br /&gt;
&lt;br /&gt;
* A dragon will automatically be cancelled upon the commencement of a &#039;&#039;&#039;EOWCF&#039;&#039;&#039;. Dragons are automatically cancelled when a regular ceasefire or forced ceasefire happens.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#FFC300&amp;quot;&amp;gt;Dragon Types &amp;amp; Effects&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:1px solid #625230; background:#0f1a2b; color:#ffffff;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#001D3D; color:#FFC300; text-align:center; padding:8px; font-size:1.2em;&amp;quot; |&lt;br /&gt;
Dragon Type&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;12%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:center;&amp;quot; | Emerald&lt;br /&gt;
! width=&amp;quot;12%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:center;&amp;quot; | Ruby&lt;br /&gt;
! width=&amp;quot;12%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:center;&amp;quot; | Sapphire&lt;br /&gt;
! width=&amp;quot;12%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:center;&amp;quot; | Topaz&lt;br /&gt;
! width=&amp;quot;12%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:center;&amp;quot; | Celestite&lt;br /&gt;
! width=&amp;quot;12%&amp;quot; style=&amp;quot;background:#003566; color:#ffffff; text-align:center;&amp;quot; | Amethyst&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* +25% Military Losses in Combat  &lt;br /&gt;
* -20% Combat Gains  &lt;br /&gt;
* -40% Building and Specialist Credits Gained in Combat&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* -15% Military Efficiency  &lt;br /&gt;
* +30% Military Wages  &lt;br /&gt;
* Lose 30% of new drafted Soldiers&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* -30% Magic Effectiveness (WPA)  &lt;br /&gt;
* -30% Thievery Effectiveness (TPA)  &lt;br /&gt;
* +12.5% Instant Spell and Sabotage Damage Taken  &lt;br /&gt;
* -12.5% Instant and Sabotage Damage Dealt&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* -30% Building Efficiency  &lt;br /&gt;
* -25% Income  &lt;br /&gt;
* Destroys 4% of Buildings Instantly and Every 6 Ticks thereafter&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* –60% Birth Rates  &lt;br /&gt;
* –40% Hospital Effectiveness  &lt;br /&gt;
* +50% Build Cost and Time&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background:#0f1a2b; vertical-align:top; padding:6px;&amp;quot; |&lt;br /&gt;
* –40% Spell Success  &lt;br /&gt;
* –40% Thievery Success on sabotage  &lt;br /&gt;
* Enemy provinces suffer +25% thievery and wizard losses on failed spells/ops&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#001D3D; height:6px;&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color: #FFC300&amp;quot;&amp;gt;Dragon Cost==&lt;br /&gt;
Dragon Cost is determined at the time the Dragon is started. You can view the cost on the Dragon page.&lt;br /&gt;
&lt;br /&gt;
A simple summary:&lt;br /&gt;
*Sapphire / Topaz - Cheaper, health reduced&lt;br /&gt;
*Emerald / Ruby - Slightly more expensive, more health&lt;br /&gt;
&amp;lt;!--*Diamond - A lot more expensive, health increased significantly--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Dragon Gold Cost&amp;lt;/b&amp;gt; = (Dragon Type Cost Mod * Cost Metric)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Dragon Food Cost&amp;lt;/b&amp;gt; = (Dragon Type Cost Mod * Cost Metric) * 0.2&lt;br /&gt;
&amp;lt;!-- &amp;lt;b&amp;gt;Cost Metric =&amp;lt;/b&amp;gt; &#039;&#039;MAX&#039;&#039; ( Target Kingdom NW , Your Kingdom NW ) * 0.656 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Cost Metric =&amp;lt;/b&amp;gt; Target Kingdom NW * 0.656&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Dragon Type&lt;br /&gt;
!Cost Mod&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sapphire || 2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Topaz  || 2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Emerald || 2.4&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ruby || 2.4&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color: #FFC300&amp;quot;&amp;gt;Dragon HP==&lt;br /&gt;
Dragon HP is determined at the time the dragon is sent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula-box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Dragon HP =&amp;lt;/b&amp;gt; Dragon Type HP Mod * Relations Modifier * (Receiving Kingdom NW / 132)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Dragon Type&lt;br /&gt;
!HP Mod&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Sapphire || 7.0125&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Topaz  || 7.0125&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Emerald || 8.415&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ruby || 8.415&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!--| &#039;&#039;&#039;Diamond  || 9.5625&lt;br /&gt;
|-&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Relations&lt;br /&gt;
!Relations Modifier&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Relations: None || 0.5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Relations: [[Relations#Hostile|Unfriendly]] || 0.5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Relations: [[Relations#Hostile|Hostile]] || 0.75&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Relations: [[Relations#War|War]] || 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color: #FFC300&amp;quot;&amp;gt;Changelog==&lt;br /&gt;
[[Age 108]]&lt;br /&gt;
* Dragon HP increased 10%&lt;br /&gt;
* Elites now do damage to Dragons based on Off AND Def points&lt;br /&gt;
&lt;br /&gt;
[[Age 114]]&lt;br /&gt;
* Dragon HP decreased 10%&lt;br /&gt;
* Elites now do damage based on higher off or def value&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--===Historical Dragon data===&lt;br /&gt;
* Previously all dragons cost the same amount of GC and had the same Hit Points which were determined via: &lt;br /&gt;
 &amp;lt;b&amp;gt;Dragon Cost =&amp;lt;/b&amp;gt; &#039;&#039;MAX&#039;&#039; ( Target Kingdom NW , Your Kingdom NW ) * 1.25&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;b&amp;gt;Dragon HP =&amp;lt;/b&amp;gt; ( Receiving Kingdom NW / ~44 ) * Relations Mod&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=895</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=895"/>
		<updated>2026-02-19T15:58:18Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Tabs (unchanged)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
(function () {&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;; // change if desired&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  function ensureDiscordLink(icons) {&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function () {&lt;br /&gt;
  $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
    var $container = $(this);&lt;br /&gt;
    var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
    var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
    $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
    var $button = $(this);&lt;br /&gt;
    var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
    var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
    $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
    $button.addClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky Header Widgets (Discord + Clock | Game Date | Countdown)&lt;br /&gt;
   CLEAN + FIXED:&lt;br /&gt;
   - No CSS inside JS (your old paste had CSS at the bottom of JS)&lt;br /&gt;
   - No &amp;amp;nbsp; spacing hacks (spacing should be CSS)&lt;br /&gt;
   - One shared container for the 3 widgets&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
  // Container that will hold ONLY the three widgets (not Discord, not default icons)&lt;br /&gt;
  function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    // Make sure Discord is created first so we can insert after it&lt;br /&gt;
    ensureDiscordLink(icons);&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    const discord = document.getElementById(&#039;custom-sticky-link&#039;);&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, mid);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(mid);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureClock(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
    label.textContent = (CLOCK_TIMEZONE === &#039;Etc/UTC&#039;) ? &#039;UTC:&#039; : &#039;Time:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureGame(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;game&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureCountdown(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
    // Month cycles (Jan..Jul)&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    const clockVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;clock&amp;quot;]&#039;);&lt;br /&gt;
    if (clockVal) clockVal.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
&lt;br /&gt;
    const gameVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;game&amp;quot;]&#039;);&lt;br /&gt;
    if (gameVal) gameVal.textContent = computeGameString(now);&lt;br /&gt;
&lt;br /&gt;
    const countdownVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;countdown&amp;quot;]&#039;);&lt;br /&gt;
    if (countdownVal) countdownVal.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (!mid) return;&lt;br /&gt;
&lt;br /&gt;
    ensureClock(mid);&lt;br /&gt;
    ensureGame(mid);&lt;br /&gt;
    ensureCountdown(mid);&lt;br /&gt;
&lt;br /&gt;
    // Start update loop once&lt;br /&gt;
    if (!window.__stickyTimeWidgetsStarted) {&lt;br /&gt;
      window.__stickyTimeWidgetsStarted = true;&lt;br /&gt;
      updateAll();&lt;br /&gt;
      setInterval(updateAll, 1000);&lt;br /&gt;
    } else {&lt;br /&gt;
      // If navigating, ensure values refresh immediately&lt;br /&gt;
      updateAll();&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=894</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=894"/>
		<updated>2026-02-19T15:57:50Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Tabs (unchanged)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
$(document).ready(function () {&lt;br /&gt;
  $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
    var $container = $(this);&lt;br /&gt;
    var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
    var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
    $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
    var $button = $(this);&lt;br /&gt;
    var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
    var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
    $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
    $button.addClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky Header Widgets (Discord + Clock | Game Date | Countdown)&lt;br /&gt;
   CLEAN + FIXED:&lt;br /&gt;
   - No CSS inside JS (your old paste had CSS at the bottom of JS)&lt;br /&gt;
   - No &amp;amp;nbsp; spacing hacks (spacing should be CSS)&lt;br /&gt;
   - One shared container for the 3 widgets&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
  // Container that will hold ONLY the three widgets (not Discord, not default icons)&lt;br /&gt;
  function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    // Make sure Discord is created first so we can insert after it&lt;br /&gt;
    ensureDiscordLink(icons);&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    const discord = document.getElementById(&#039;custom-sticky-link&#039;);&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, mid);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(mid);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureClock(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
    label.textContent = (CLOCK_TIMEZONE === &#039;Etc/UTC&#039;) ? &#039;UTC:&#039; : &#039;Time:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureGame(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;game&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureCountdown(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
    // Month cycles (Jan..Jul)&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    const clockVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;clock&amp;quot;]&#039;);&lt;br /&gt;
    if (clockVal) clockVal.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
&lt;br /&gt;
    const gameVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;game&amp;quot;]&#039;);&lt;br /&gt;
    if (gameVal) gameVal.textContent = computeGameString(now);&lt;br /&gt;
&lt;br /&gt;
    const countdownVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;countdown&amp;quot;]&#039;);&lt;br /&gt;
    if (countdownVal) countdownVal.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (!mid) return;&lt;br /&gt;
&lt;br /&gt;
    ensureClock(mid);&lt;br /&gt;
    ensureGame(mid);&lt;br /&gt;
    ensureCountdown(mid);&lt;br /&gt;
&lt;br /&gt;
    // Start update loop once&lt;br /&gt;
    if (!window.__stickyTimeWidgetsStarted) {&lt;br /&gt;
      window.__stickyTimeWidgetsStarted = true;&lt;br /&gt;
      updateAll();&lt;br /&gt;
      setInterval(updateAll, 1000);&lt;br /&gt;
    } else {&lt;br /&gt;
      // If navigating, ensure values refresh immediately&lt;br /&gt;
      updateAll();&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
(function () {&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;; // change if desired&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  function ensureDiscordLink(icons) {&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=893</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=893"/>
		<updated>2026-02-19T15:53:59Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Tabs (unchanged)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
$(document).ready(function () {&lt;br /&gt;
  $(&#039;.wiki-tabs-container&#039;).each(function () {&lt;br /&gt;
    var $container = $(this);&lt;br /&gt;
    var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
    var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
    $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function () {&lt;br /&gt;
    var $button = $(this);&lt;br /&gt;
    var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
    var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
    $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
    $button.addClass(&#039;active&#039;);&lt;br /&gt;
    $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky Header Widgets (Discord + Clock | Game Date | Countdown)&lt;br /&gt;
   CLEAN + FIXED:&lt;br /&gt;
   - No CSS inside JS (your old paste had CSS at the bottom of JS)&lt;br /&gt;
   - No &amp;amp;nbsp; spacing hacks (spacing should be CSS)&lt;br /&gt;
   - One shared container for the 3 widgets&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
(function () {&lt;br /&gt;
  const DISCORD_URL = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Countdown target: Sat, 18 Apr 2026 00:00 UTC&lt;br /&gt;
  const COUNTDOWN_TARGET_UTC = Date.parse(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Clock timezone (same for everyone)&lt;br /&gt;
  const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;; // change if desired&lt;br /&gt;
&lt;br /&gt;
  // Game time anchor (real UTC -&amp;gt; game time)&lt;br /&gt;
  // At 2026-02-19 14:00:00 UTC, game time was Jan 21 YR2&lt;br /&gt;
  const GAME_ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
  const GAME_ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
  const GAME_ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
  const GAME_ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
  const GAME_MONTHS = [&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;, &#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
  const pad2 = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  function ensureDiscordLink(icons) {&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = DISCORD_URL;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className =&lt;br /&gt;
      &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Container that will hold ONLY the three widgets (not Discord, not default icons)&lt;br /&gt;
  function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    // Make sure Discord is created first so we can insert after it&lt;br /&gt;
    ensureDiscordLink(icons);&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    const discord = document.getElementById(&#039;custom-sticky-link&#039;);&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
      discord.insertAdjacentElement(&#039;afterend&#039;, mid);&lt;br /&gt;
    } else {&lt;br /&gt;
      icons.prepend(mid);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureClock(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
    label.textContent = (CLOCK_TIMEZONE === &#039;Etc/UTC&#039;) ? &#039;UTC:&#039; : &#039;Time:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureGame(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;game&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function ensureCountdown(mid) {&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown header-widget&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;header-widget__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;header-widget__value&#039;;&lt;br /&gt;
    value.dataset.role = &#039;countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
    mid.appendChild(wrap);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function formatRemaining(ms) {&lt;br /&gt;
    if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
&lt;br /&gt;
    const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
    const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
    const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
    const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
    const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
    if (days &amp;gt; 0) return `${days}d ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
    return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function computeGameString(nowMs) {&lt;br /&gt;
    const hoursPassed = Math.floor((nowMs - GAME_ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
    // Day increments every hour&lt;br /&gt;
    const dayIndex = (GAME_ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
    const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Month increments every 24 hours&lt;br /&gt;
    const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
    // Month cycles (Jan..Jul)&lt;br /&gt;
    const totalMonthIndex = GAME_ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
    const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
    // Year increments every 7 real days&lt;br /&gt;
    const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
    const year = GAME_ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
    return `Current Game Date: ${GAME_MONTHS[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const clockFmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
    timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
    hour: &#039;2-digit&#039;,&lt;br /&gt;
    minute: &#039;2-digit&#039;,&lt;br /&gt;
    second: &#039;2-digit&#039;,&lt;br /&gt;
    hour12: false&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  function updateAll() {&lt;br /&gt;
    const now = Date.now();&lt;br /&gt;
&lt;br /&gt;
    const clockVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;clock&amp;quot;]&#039;);&lt;br /&gt;
    if (clockVal) clockVal.textContent = clockFmt.format(new Date(now));&lt;br /&gt;
&lt;br /&gt;
    const gameVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;game&amp;quot;]&#039;);&lt;br /&gt;
    if (gameVal) gameVal.textContent = computeGameString(now);&lt;br /&gt;
&lt;br /&gt;
    const countdownVal = document.querySelector(&#039;#sticky-time-widgets [data-role=&amp;quot;countdown&amp;quot;]&#039;);&lt;br /&gt;
    if (countdownVal) countdownVal.textContent = formatRemaining(COUNTDOWN_TARGET_UTC - now);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (!mid) return;&lt;br /&gt;
&lt;br /&gt;
    ensureClock(mid);&lt;br /&gt;
    ensureGame(mid);&lt;br /&gt;
    ensureCountdown(mid);&lt;br /&gt;
&lt;br /&gt;
    // Start update loop once&lt;br /&gt;
    if (!window.__stickyTimeWidgetsStarted) {&lt;br /&gt;
      window.__stickyTimeWidgetsStarted = true;&lt;br /&gt;
      updateAll();&lt;br /&gt;
      setInterval(updateAll, 1000);&lt;br /&gt;
    } else {&lt;br /&gt;
      // If navigating, ensure values refresh immediately&lt;br /&gt;
      updateAll();&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=892</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.css&amp;diff=892"/>
		<updated>2026-02-19T15:53:56Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* =========================================================&lt;br /&gt;
   GLOBAL THEME – MediaWiki 1.45 / Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* ---------- Keyframes ---------- */&lt;br /&gt;
@keyframes gradient {&lt;br /&gt;
  0%   { background-position: 0% 50%; }&lt;br /&gt;
  50%  { background-position: 100% 50%; }&lt;br /&gt;
  100% { background-position: 0% 50%; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@keyframes float {&lt;br /&gt;
  0%   { transform: translateY(0px)   translateX(0px)   scale(1);   opacity: 0; }&lt;br /&gt;
  10%  { opacity: 1; }&lt;br /&gt;
  90%  { opacity: 1; }&lt;br /&gt;
  100% { transform: translateY(-100vh) translateX(30px)  scale(1.2); opacity: 0; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Animated gradient layer ---------- */&lt;br /&gt;
body::before {&lt;br /&gt;
  content: &#039;&#039;;&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -2;&lt;br /&gt;
  background: linear-gradient(-45deg, #000814, #001d3d, #000814, #003566);&lt;br /&gt;
  background-size: 400% 400%;&lt;br /&gt;
  animation: gradient 15s ease infinite;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base background reset ---------- */&lt;br /&gt;
html,&lt;br /&gt;
body,&lt;br /&gt;
.vector-feature-page-tools-disabled .mw-page-container,&lt;br /&gt;
.vector-feature-page-tools-enabled .mw-page-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Transparent content containers */&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Particle canvas ---------- */&lt;br /&gt;
#particle-canvas {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  inset: 0;&lt;br /&gt;
  z-index: -1;&lt;br /&gt;
  pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Base text ---------- */&lt;br /&gt;
body,&lt;br /&gt;
.mw-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body {&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Headings ---------- */&lt;br /&gt;
h1, h2, h3, h4, h5, h6,&lt;br /&gt;
.mw-headline,&lt;br /&gt;
#firstHeading,&lt;br /&gt;
.mw-page-title-main,&lt;br /&gt;
.page-Main_Page h1 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Logo ---------- */&lt;br /&gt;
.mw-logo-icon,&lt;br /&gt;
.mw-logo-icon img,&lt;br /&gt;
.mw-logo img,&lt;br /&gt;
.mw-logo a.mw-logo-container img {&lt;br /&gt;
  height: 100px !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  max-height: 100px !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-icon { background-size: auto 100px !important; }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .mw-logo-icon,&lt;br /&gt;
  .mw-logo-icon img,&lt;br /&gt;
  .mw-logo img,&lt;br /&gt;
  .mw-logo a.mw-logo-container img {&lt;br /&gt;
    height: 32px !important;&lt;br /&gt;
    max-height: 32px !important;&lt;br /&gt;
  }&lt;br /&gt;
  .mw-logo-icon { background-size: auto 32px !important; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Header ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
.vector-header,&lt;br /&gt;
#mw-header-container,&lt;br /&gt;
.mw-header {&lt;br /&gt;
  background: #000814 !important;&lt;br /&gt;
  border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Site name */&lt;br /&gt;
.mw-logo-wordmark,&lt;br /&gt;
.mw-logo-wordmark a {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-size: 1.8em !important;&lt;br /&gt;
  font-weight: bold !important;&lt;br /&gt;
  text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
.mw-logo-wordmark a:hover { color: #FFD60A !important; }&lt;br /&gt;
&lt;br /&gt;
/* Sidebar headings */&lt;br /&gt;
.vector-pinnable-header-label,&lt;br /&gt;
.vector-main-menu-heading,&lt;br /&gt;
.mw-portlet h3 {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   PAGE CONTENT LINKS&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output a { color: #4DA3FF !important; }&lt;br /&gt;
.mw-parser-output a:visited { color: #9B7CFF !important; }&lt;br /&gt;
.mw-parser-output a:hover { color: #6BB6FF !important; text-decoration: underline; }&lt;br /&gt;
.mw-parser-output a:active { color: #1F4FA3 !important; }&lt;br /&gt;
.mw-parser-output a.new,&lt;br /&gt;
.mw-parser-output a.new:visited { color: #CC2200 !important; }&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep only if something is overriding text colors inside articles */&lt;br /&gt;
/* .mw-parser-output { color: #fff !important; } */&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   GLOBAL TABLE THEME (ALL PAGES)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.mw-parser-output .wikitable {&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  border-collapse: collapse !important;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  background: #303030 !important;&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable caption {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  color: #fff !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
  border-bottom: 1px solid #555555 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable thead th {&lt;br /&gt;
  background: #000 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: 1px solid #666666 !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(odd) { background-color: #303030 !important; }&lt;br /&gt;
.mw-parser-output .wikitable tbody tr:nth-child(even) { background-color: #505050 !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-parser-output .wikitable tbody td {&lt;br /&gt;
  border: 1px solid #555555 !important;&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  padding: 0.5em 0.7em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   TABLE OF CONTENTS – Vector 2022&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
#vector-toc,&lt;br /&gt;
#toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 6px;&lt;br /&gt;
  padding: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-pinnable-header-label,&lt;br /&gt;
#toc .toctitle {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#vector-toc .vector-toc-text,&lt;br /&gt;
#toc a {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  opacity: 1 !important;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active item */&lt;br /&gt;
#vector-toc .vector-toc-list-item-active { background: transparent !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link { background-color: #FFD60A !important; }&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Expanded parent rules */&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 600 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded.vector-toc-list-item-active &amp;gt; a.vector-toc-link .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-level-1.vector-toc-list-item-expanded ul .vector-toc-text {&lt;br /&gt;
  color: #EAEAEA !important;&lt;br /&gt;
  font-weight: normal !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover */&lt;br /&gt;
#vector-toc .vector-toc-list-item:not(.vector-toc-list-item-active) &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
#vector-toc .vector-toc-list-item-active &amp;gt; a.vector-toc-link:hover .vector-toc-text {&lt;br /&gt;
  color: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove wrappers */&lt;br /&gt;
.vector-toc-container,&lt;br /&gt;
#vector-toc-pinned-container,&lt;br /&gt;
.vector-pinned-container {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Inline (article) TOC only */&lt;br /&gt;
.mw-parser-output &amp;gt; .toc {&lt;br /&gt;
  background: #001D3D !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Draft Cost Formula&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
.formula-box {&lt;br /&gt;
  background: #001D3D;&lt;br /&gt;
  border: 1px solid #FFC300;&lt;br /&gt;
  border-radius: 10px;&lt;br /&gt;
  padding: 0.8em 1em;&lt;br /&gt;
  margin: 0.75em 0;&lt;br /&gt;
  color: #EAEAEA;&lt;br /&gt;
  line-height: 1.6;&lt;br /&gt;
  white-space: normal;&lt;br /&gt;
  overflow-wrap: anywhere;&lt;br /&gt;
}&lt;br /&gt;
.formula-box a { color: #4DA3FF !important; }&lt;br /&gt;
.formula-box a:visited { color: #9B7CFF !important; }&lt;br /&gt;
&lt;br /&gt;
/* =========================&lt;br /&gt;
   Vector 2022 – RIGHT PAGE TOOLS: remove the fade/gradient&lt;br /&gt;
   ========================= */&lt;br /&gt;
.vector-page-tools::before,&lt;br /&gt;
.vector-page-tools::after,&lt;br /&gt;
.vector-page-tools-container::before,&lt;br /&gt;
.vector-page-tools-container::after,&lt;br /&gt;
.vector-page-tools-landmark::before,&lt;br /&gt;
.vector-page-tools-landmark::after,&lt;br /&gt;
.vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-sticky-pinned-container::after,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::before,&lt;br /&gt;
.vector-page-tools .vector-sticky-pinned-container::after {&lt;br /&gt;
  background: none !important;&lt;br /&gt;
  background-image: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  filter: none !important;&lt;br /&gt;
  backdrop-filter: none !important;&lt;br /&gt;
  mask-image: none !important;&lt;br /&gt;
  -webkit-mask-image: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Link Colors */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Footer Text and Icons */&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Change Navigation Icon/Link Colors */&lt;br /&gt;
#mw-panel .portal a,  &lt;br /&gt;
#mw-panel .portal a:visited {&lt;br /&gt;
     color: #FFC300 !important; /* Change to your desired color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== NAVIGATION ICONS - VECTOR 2022 ===== */&lt;br /&gt;
/* User menu icon (person icon) */&lt;br /&gt;
.vector-user-links .vector-icon,&lt;br /&gt;
.vector-user-menu-login .vector-icon,&lt;br /&gt;
.vector-user-menu-create-account .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Settings/hamburger menu icon */&lt;br /&gt;
.vector-main-menu-action-toggle .vector-icon,&lt;br /&gt;
.vector-page-tools-landmark .vector-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* All navigation icons */&lt;br /&gt;
.vector-icon,&lt;br /&gt;
.mw-ui-icon {&lt;br /&gt;
     filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User menu links (username) */&lt;br /&gt;
.vector-user-links a,&lt;br /&gt;
.vector-user-menu-logged-in .vector-user-links-main a {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ===== FOOTER LINKS - VECTOR 2022 ===== */&lt;br /&gt;
/* All footer links */&lt;br /&gt;
#footer a,&lt;br /&gt;
#footer a:link,&lt;br /&gt;
#footer a:visited,&lt;br /&gt;
.mw-footer a,&lt;br /&gt;
.mw-footer a:link,&lt;br /&gt;
.mw-footer a:visited,&lt;br /&gt;
footer a,&lt;br /&gt;
footer a:link,&lt;br /&gt;
footer a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer text color */&lt;br /&gt;
#footer,&lt;br /&gt;
#footer li,&lt;br /&gt;
.mw-footer,&lt;br /&gt;
.mw-footer li,&lt;br /&gt;
footer,&lt;br /&gt;
footer li {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Older footer selectors (keeping for compatibility) */&lt;br /&gt;
div#footer ul li a, &lt;br /&gt;
div#footer ul li a:visited {&lt;br /&gt;
     color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div#footer ul li {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   VECTOR 2022 – PAGE ACTIONS / TABS COLOR CONTROL&lt;br /&gt;
   Applies to: Main Page | Discussion | Read | Edit | History | Tools&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Default page action links (not active) */&lt;br /&gt;
.vector-page-toolbar a,&lt;br /&gt;
.vector-page-toolbar a:link,&lt;br /&gt;
.vector-page-toolbar a:visited,&lt;br /&gt;
.vector-page-toolbar .mw-ui-icon a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover state (optional subtle brighten) */&lt;br /&gt;
.vector-page-toolbar a:hover {&lt;br /&gt;
    color: #FFD60A !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ACTIVE / CURRENT TAB (e.g. Main Page, Edit when editing) */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive,&lt;br /&gt;
.vector-page-toolbar .mw-ui-button.mw-ui-progressive:visited {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Ensure active tab background doesn&#039;t force dark text */&lt;br /&gt;
.vector-page-toolbar .selected a,&lt;br /&gt;
.vector-page-toolbar .selected span {&lt;br /&gt;
    color: #FFFFFF !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Missing page links stay red */&lt;br /&gt;
.vector-page-toolbar a.new,&lt;br /&gt;
.vector-page-toolbar a.new:visited {&lt;br /&gt;
    color: #CC2200 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ============ NAVPILLS ============ */&lt;br /&gt;
/* Navpills styling */&lt;br /&gt;
.navpills-container {&lt;br /&gt;
    margin: 1.5em 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
    gap: 0.8em;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a span {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 0.7em 1.3em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    font-size: 1.05em;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpill-item a:hover span {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    color: #000814 !important;&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-2px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills {&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item {&lt;br /&gt;
        width: 100%;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    .navpill-item a span {&lt;br /&gt;
        display: block;&lt;br /&gt;
        text-align: center;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============ TABS ============ */&lt;br /&gt;
/* CSS-Only Tabs */&lt;br /&gt;
.wiki-tabs-container-css {&lt;br /&gt;
    margin: 2em 0;&lt;br /&gt;
    background: linear-gradient(180deg, #001D3D 0%, #000814 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    box-shadow: 0 4px 15px rgba(255, 195, 0, 0.2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide radio buttons */&lt;br /&gt;
.wiki-tab-radio {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Labels (Buttons) */&lt;br /&gt;
.wiki-tab-label {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 1em 1.5em;&lt;br /&gt;
    background: #001D3D;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    border-right: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: &#039;Palatino Linotype&#039;, &#039;Book Antiqua&#039;, Palatino, Georgia, serif;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    border-bottom: 2px solid #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-tab-label:hover {&lt;br /&gt;
    background: #003566;&lt;br /&gt;
    color: #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Active tab style */&lt;br /&gt;
.wiki-tab-radio:checked + .wiki-tab-label {&lt;br /&gt;
    background: #FFC300;&lt;br /&gt;
    color: #000814;&lt;br /&gt;
    border-bottom: 3px solid #FFD60A;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tab Content */&lt;br /&gt;
.wiki-tab-content {&lt;br /&gt;
    display: none;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    color: #FFFFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Show content when tab is checked */&lt;br /&gt;
.wiki-tab-radio:checked ~ .wiki-tab-content {&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Responsive */&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .wiki-tab-label {&lt;br /&gt;
        display: block;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        border-right: none;&lt;br /&gt;
        border-bottom: 1px solid rgba(255, 195, 0, 0.3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   STICKY HEADER FIX - Keep blue background when scrolling&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Sticky header container */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
    border-bottom: 2px solid #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header elements */&lt;br /&gt;
.vector-sticky-header-start,&lt;br /&gt;
.vector-sticky-header-end,&lt;br /&gt;
.vector-sticky-header-context-bar {&lt;br /&gt;
    background: #000814 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page title in sticky header */&lt;br /&gt;
.vector-sticky-header-context-bar-primary,&lt;br /&gt;
.vector-sticky-header .mw-page-title-main {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header buttons and icons */&lt;br /&gt;
.vector-sticky-header button,&lt;br /&gt;
.vector-sticky-header .vector-icon {&lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(85%) sepia(67%) saturate(1000%) hue-rotate(0deg) brightness(103%) contrast(101%) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Sticky header links */&lt;br /&gt;
.vector-sticky-header a {&lt;br /&gt;
    color: #FFC300 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race table text override */&lt;br /&gt;
.racebox td {&lt;br /&gt;
  color: black !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.racebox th {&lt;br /&gt;
  color: white !important; /* keeps your header colors */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Equal-width navpills grid */&lt;br /&gt;
.navpills-equal-grid .navpills {&lt;br /&gt;
    display: grid !important;&lt;br /&gt;
    grid-template-columns: repeat(3, 1fr) !important;&lt;br /&gt;
    gap: 1em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item {&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navpills-equal-grid .navpill-item a span {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
    width: 100% !important;&lt;br /&gt;
    text-align: center !important;&lt;br /&gt;
    padding: 0.5em !important;&lt;br /&gt;
    box-sizing: border-box !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 768px) {&lt;br /&gt;
    .navpills-equal-grid .navpills {&lt;br /&gt;
        grid-template-columns: 1fr !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Race card buttons with hover animation */&lt;br /&gt;
.race-card {&lt;br /&gt;
    display: block;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1.5em 1em;&lt;br /&gt;
    background: linear-gradient(135deg, #003566 0%, #001D3D 100%);&lt;br /&gt;
    border: 2px solid #FFC300;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
    box-shadow: 0 2px 8px rgba(255, 195, 0, 0.2);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover {&lt;br /&gt;
    background: linear-gradient(135deg, #FFC300 0%, #FFD60A 100%);&lt;br /&gt;
    border-color: #FFD60A;&lt;br /&gt;
    box-shadow: 0 4px 12px rgba(255, 195, 0, 0.4);&lt;br /&gt;
    transform: translateY(-4px);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover img {&lt;br /&gt;
    transform: scale(1.05);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card-name {&lt;br /&gt;
    margin-top: 0.8em;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: #FFC300;&lt;br /&gt;
    transition: color 0.3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.race-card:hover .race-card-name {&lt;br /&gt;
    color: #000814;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* =========================================================&lt;br /&gt;
   Sticky header: center ONLY the time widgets (safe flex method)&lt;br /&gt;
   Works with the CLEAN JS (header-widget classes)&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
/* Keep the icons row as a flex line */&lt;br /&gt;
.vector-sticky-header-icons {&lt;br /&gt;
  display: flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Center container (inserted by JS) */&lt;br /&gt;
#sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
  margin: 0 auto !important;           /* centers the widget group */&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 14px !important;               /* spacing between widgets */&lt;br /&gt;
  white-space: nowrap !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each widget pill */&lt;br /&gt;
#sticky-time-widgets .header-widget {&lt;br /&gt;
  display: inline-flex !important;&lt;br /&gt;
  align-items: center !important;&lt;br /&gt;
  gap: 6px !important;&lt;br /&gt;
  padding: 6px 10px !important;&lt;br /&gt;
  border: 1px solid #FFC300 !important;&lt;br /&gt;
  border-radius: 999px !important;&lt;br /&gt;
  background: linear-gradient(135deg, #003566 0%, #001D3D 100%) !important;&lt;br /&gt;
  box-shadow: 0 2px 8px rgba(255, 195, 0, 0.18) !important;&lt;br /&gt;
  line-height: 1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Labels + values */&lt;br /&gt;
#sticky-time-widgets .header-widget__label {&lt;br /&gt;
  color: #FFC300 !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#sticky-time-widgets .header-widget__value {&lt;br /&gt;
  color: #FFFFFF !important;&lt;br /&gt;
  font-weight: 700 !important;&lt;br /&gt;
  font-variant-numeric: tabular-nums; /* keeps timer width stable */&lt;br /&gt;
  font-size: 0.95em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If the header gets cramped, hide labels first */&lt;br /&gt;
@media (max-width: 1100px) {&lt;br /&gt;
  #sticky-time-widgets .header-widget__label {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If it gets REALLY cramped, hide the whole widget group */&lt;br /&gt;
@media (max-width: 860px) {&lt;br /&gt;
  #sticky-time-widgets.sticky-time-widgets {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=891</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=891"/>
		<updated>2026-02-19T15:36:06Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=890</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=890"/>
		<updated>2026-02-19T15:35:37Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=889</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=889"/>
		<updated>2026-02-19T15:32:07Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=888</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=888"/>
		<updated>2026-02-19T15:31:52Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: Undo revision 887 by Sonja says (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: 3-zone layout container (Clock | Game Date | Countdown)&lt;br /&gt;
// (Does NOT move your Discord link or default icons)&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeZones() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-bar&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-bar&#039;;&lt;br /&gt;
    bar.className = &#039;sticky-time-bar&#039;;&lt;br /&gt;
&lt;br /&gt;
    const left = document.createElement(&#039;span&#039;);&lt;br /&gt;
    left.id = &#039;sticky-time-left&#039;;&lt;br /&gt;
    left.className = &#039;sticky-time-left&#039;;&lt;br /&gt;
&lt;br /&gt;
    const center = document.createElement(&#039;span&#039;);&lt;br /&gt;
    center.id = &#039;sticky-time-center&#039;;&lt;br /&gt;
    center.className = &#039;sticky-time-center&#039;;&lt;br /&gt;
&lt;br /&gt;
    const right = document.createElement(&#039;span&#039;);&lt;br /&gt;
    right.id = &#039;sticky-time-right&#039;;&lt;br /&gt;
    right.className = &#039;sticky-time-right&#039;;&lt;br /&gt;
&lt;br /&gt;
    bar.appendChild(left);&lt;br /&gt;
    bar.appendChild(center);&lt;br /&gt;
    bar.appendChild(right);&lt;br /&gt;
&lt;br /&gt;
    // Insert AFTER your Discord link (so Discord stays far-left)&lt;br /&gt;
    const discord = document.getElementById(&#039;custom-sticky-link&#039;);&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
        discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
        icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const zones = getStickyTimeZones();&lt;br /&gt;
    if (zones) document.getElementById(&#039;sticky-time-left&#039;).appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const zones = getStickyTimeZones();&lt;br /&gt;
    if (zones) document.getElementById(&#039;sticky-time-right&#039;).appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const zones = getStickyTimeZones();&lt;br /&gt;
    if (zones) document.getElementById(&#039;sticky-time-center&#039;).appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=887</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=887"/>
		<updated>2026-02-19T15:31:15Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: Undo revision 886 by Sonja says (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=886</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=886"/>
		<updated>2026-02-19T15:30:48Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: 3-zone layout container (Clock | Game Date | Countdown)&lt;br /&gt;
// (Does NOT move your Discord link or default icons)&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeZones() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let bar = document.getElementById(&#039;sticky-time-bar&#039;);&lt;br /&gt;
    if (bar) return bar;&lt;br /&gt;
&lt;br /&gt;
    bar = document.createElement(&#039;span&#039;);&lt;br /&gt;
    bar.id = &#039;sticky-time-bar&#039;;&lt;br /&gt;
    bar.className = &#039;sticky-time-bar&#039;;&lt;br /&gt;
&lt;br /&gt;
    const left = document.createElement(&#039;span&#039;);&lt;br /&gt;
    left.id = &#039;sticky-time-left&#039;;&lt;br /&gt;
    left.className = &#039;sticky-time-left&#039;;&lt;br /&gt;
&lt;br /&gt;
    const center = document.createElement(&#039;span&#039;);&lt;br /&gt;
    center.id = &#039;sticky-time-center&#039;;&lt;br /&gt;
    center.className = &#039;sticky-time-center&#039;;&lt;br /&gt;
&lt;br /&gt;
    const right = document.createElement(&#039;span&#039;);&lt;br /&gt;
    right.id = &#039;sticky-time-right&#039;;&lt;br /&gt;
    right.className = &#039;sticky-time-right&#039;;&lt;br /&gt;
&lt;br /&gt;
    bar.appendChild(left);&lt;br /&gt;
    bar.appendChild(center);&lt;br /&gt;
    bar.appendChild(right);&lt;br /&gt;
&lt;br /&gt;
    // Insert AFTER your Discord link (so Discord stays far-left)&lt;br /&gt;
    const discord = document.getElementById(&#039;custom-sticky-link&#039;);&lt;br /&gt;
    if (discord &amp;amp;&amp;amp; discord.parentNode === icons) {&lt;br /&gt;
        discord.insertAdjacentElement(&#039;afterend&#039;, bar);&lt;br /&gt;
    } else {&lt;br /&gt;
        icons.prepend(bar);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return bar;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const zones = getStickyTimeZones();&lt;br /&gt;
    if (zones) document.getElementById(&#039;sticky-time-left&#039;).appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const zones = getStickyTimeZones();&lt;br /&gt;
    if (zones) document.getElementById(&#039;sticky-time-right&#039;).appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const zones = getStickyTimeZones();&lt;br /&gt;
    if (zones) document.getElementById(&#039;sticky-time-center&#039;).appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=885</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=885"/>
		<updated>2026-02-19T15:22:38Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=884</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=884"/>
		<updated>2026-02-19T15:20:18Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=883</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=883"/>
		<updated>2026-02-19T15:15:45Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.innerHTML = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
	<entry>
		<id>https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=882</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://utopiawiki.com/index.php?title=MediaWiki:Common.js&amp;diff=882"/>
		<updated>2026-02-19T15:13:37Z</updated>

		<summary type="html">&lt;p&gt;Sonja says: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
// Tab functionality&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Initialize tabs - show first tab by default&lt;br /&gt;
    $(&#039;.wiki-tabs-container&#039;).each(function() {&lt;br /&gt;
        var $container = $(this);&lt;br /&gt;
        var $firstButton = $container.find(&#039;.wiki-tab-button&#039;).first();&lt;br /&gt;
        var firstTabId = $firstButton.data(&#039;tab&#039;);&lt;br /&gt;
&lt;br /&gt;
        $firstButton.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + firstTabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Tab click handler&lt;br /&gt;
    $(&#039;.wiki-tab-button&#039;).on(&#039;click&#039;, function() {&lt;br /&gt;
        var $button = $(this);&lt;br /&gt;
        var tabId = $button.data(&#039;tab&#039;);&lt;br /&gt;
        var $container = $button.closest(&#039;.wiki-tabs-container&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Remove active class from all buttons and panes in this container&lt;br /&gt;
        $container.find(&#039;.wiki-tab-button&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;.wiki-tab-pane&#039;).removeClass(&#039;active&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        // Add active class to clicked button and corresponding pane&lt;br /&gt;
        $button.addClass(&#039;active&#039;);&lt;br /&gt;
        $container.find(&#039;#&#039; + tabId).addClass(&#039;active&#039;).show();&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky header: centered TIME widgets container (SAFE)&lt;br /&gt;
// - Centers ONLY the time widgets&lt;br /&gt;
// - Leaves your Discord link exactly where it is&lt;br /&gt;
// - Does NOT use absolute positioning&lt;br /&gt;
// =========================================================&lt;br /&gt;
function getStickyTimeContainer() {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return null;&lt;br /&gt;
&lt;br /&gt;
    let mid = document.getElementById(&#039;sticky-time-widgets&#039;);&lt;br /&gt;
    if (mid) return mid;&lt;br /&gt;
&lt;br /&gt;
    mid = document.createElement(&#039;span&#039;);&lt;br /&gt;
    mid.id = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
    mid.className = &#039;sticky-time-widgets&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Put container at the start; CSS will center it&lt;br /&gt;
    icons.prepend(mid);&lt;br /&gt;
&lt;br /&gt;
    return mid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Add Custom Sticky Header Link (Discord)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;custom-sticky-link&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
    link.id = &#039;custom-sticky-link&#039;;&lt;br /&gt;
    link.href = &#039;https://discord.gg/t2Rp2dRvze&#039;;&lt;br /&gt;
    link.target = &#039;_blank&#039;;&lt;br /&gt;
    link.className = &#039;cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet&#039;;&lt;br /&gt;
    link.textContent = &#039;Join Us on Discord!&#039;;&lt;br /&gt;
    link.style.marginLeft = &#039;10px&#039;;&lt;br /&gt;
    link.style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Keep it exactly where you had it&lt;br /&gt;
    icons.prepend(link);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Clock (timezone-stable, UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-clock&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const CLOCK_TIMEZONE = &#039;Etc/UTC&#039;;&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-clock&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-clock&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-clock__label&#039;;&lt;br /&gt;
    label.textContent = &#039;UTC:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-clock__value&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const fmt = new Intl.DateTimeFormat(&#039;en-GB&#039;, {&lt;br /&gt;
        timeZone: CLOCK_TIMEZONE,&lt;br /&gt;
        hour: &#039;2-digit&#039;,&lt;br /&gt;
        minute: &#039;2-digit&#039;,&lt;br /&gt;
        second: &#039;2-digit&#039;,&lt;br /&gt;
        hour12: false&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        value.textContent = fmt.format(new Date());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    setInterval(updateClock, 1000);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Floating particles&lt;br /&gt;
(function () {&lt;br /&gt;
  const canvas = document.createElement(&#039;canvas&#039;);&lt;br /&gt;
  canvas.id = &#039;particle-canvas&#039;;&lt;br /&gt;
  document.body.prepend(canvas);&lt;br /&gt;
&lt;br /&gt;
  const ctx = canvas.getContext(&#039;2d&#039;);&lt;br /&gt;
  const particles = [];&lt;br /&gt;
  const COUNT = 80;&lt;br /&gt;
&lt;br /&gt;
  const COLORS = [&lt;br /&gt;
    &#039;rgba(0, 53, 102,  0.9)&#039;,   // #003566&lt;br /&gt;
    &#039;rgba(0, 29,  61,  0.8)&#039;,   // #001d3d&lt;br /&gt;
    &#039;rgba(0,  8,  20,  0.7)&#039;,   // #000814&lt;br /&gt;
    &#039;rgba(255, 255, 255, 0.15)&#039; // subtle white glint&lt;br /&gt;
  ];&lt;br /&gt;
&lt;br /&gt;
  function resize() {&lt;br /&gt;
    canvas.width  = window.innerWidth;&lt;br /&gt;
    canvas.height = window.innerHeight;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomBetween(a, b) {&lt;br /&gt;
    return a + Math.random() * (b - a);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createParticle() {&lt;br /&gt;
    return {&lt;br /&gt;
      x:       randomBetween(0, canvas.width),&lt;br /&gt;
      y:       randomBetween(canvas.height * 0.2, canvas.height),&lt;br /&gt;
      radius:  randomBetween(1.5, 5),&lt;br /&gt;
      color:   COLORS[Math.floor(Math.random() * COLORS.length)],&lt;br /&gt;
      speedY:  randomBetween(0.2, 0.7),&lt;br /&gt;
      speedX:  randomBetween(-0.2, 0.2),&lt;br /&gt;
      opacity: 0,&lt;br /&gt;
      fadeIn:  randomBetween(0.003, 0.008),&lt;br /&gt;
      life:    randomBetween(0.4, 1)&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (let i = 0; i &amp;lt; COUNT; i++) {&lt;br /&gt;
    const p = createParticle();&lt;br /&gt;
    p.y = randomBetween(0, canvas.height);&lt;br /&gt;
    p.opacity = randomBetween(0, 1);&lt;br /&gt;
    particles.push(p);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function draw() {&lt;br /&gt;
    ctx.clearRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
&lt;br /&gt;
    particles.forEach((p, i) =&amp;gt; {&lt;br /&gt;
      if (p.life &amp;lt; 0.8) {&lt;br /&gt;
        p.opacity = Math.min(1, p.opacity + p.fadeIn);&lt;br /&gt;
      } else {&lt;br /&gt;
        p.opacity = Math.max(0, p.opacity - p.fadeIn * 0.5);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p.life += 0.001;&lt;br /&gt;
      p.y    -= p.speedY;&lt;br /&gt;
      p.x    += p.speedX;&lt;br /&gt;
&lt;br /&gt;
      if (p.y &amp;lt; -10 || p.life &amp;gt; 1.2) {&lt;br /&gt;
        particles[i] = createParticle();&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      ctx.beginPath();&lt;br /&gt;
      ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);&lt;br /&gt;
      ctx.globalAlpha = p.opacity;&lt;br /&gt;
      ctx.fillStyle   = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
&lt;br /&gt;
      ctx.shadowBlur  = 8;&lt;br /&gt;
      ctx.shadowColor = p.color;&lt;br /&gt;
      ctx.fill();&lt;br /&gt;
      ctx.shadowBlur  = 0;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    ctx.globalAlpha = 1;&lt;br /&gt;
    requestAnimationFrame(draw);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  resize();&lt;br /&gt;
  draw();&lt;br /&gt;
  window.addEventListener(&#039;resize&#039;, resize);&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Countdown Timer (to Apr 18, 2026 00:00 UTC)&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-countdown&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const target = new Date(&#039;2026-04-18T00:00:00Z&#039;);&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-countdown&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-countdown&#039;;&lt;br /&gt;
&lt;br /&gt;
    const label = document.createElement(&#039;span&#039;);&lt;br /&gt;
    label.className = &#039;sticky-countdown__label&#039;;&lt;br /&gt;
    label.textContent = &#039;Age ends in:&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-countdown__value&#039;;&lt;br /&gt;
    value.textContent = &#039;--:--:--&#039;;&lt;br /&gt;
&lt;br /&gt;
    wrap.appendChild(label);&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    const pad = (n) =&amp;gt; String(n).padStart(2, &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
    const formatRemaining = (ms) =&amp;gt; {&lt;br /&gt;
        if (ms &amp;lt;= 0) return &#039;00:00:00&#039;;&lt;br /&gt;
        const totalSeconds = Math.floor(ms / 1000);&lt;br /&gt;
&lt;br /&gt;
        const days = Math.floor(totalSeconds / 86400);&lt;br /&gt;
        const hours = Math.floor((totalSeconds % 86400) / 3600);&lt;br /&gt;
        const minutes = Math.floor((totalSeconds % 3600) / 60);&lt;br /&gt;
        const seconds = totalSeconds % 60;&lt;br /&gt;
&lt;br /&gt;
        if (days &amp;gt; 0) return `${days}d ${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
        return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    const update = () =&amp;gt; {&lt;br /&gt;
        const diff = target.getTime() - Date.now();&lt;br /&gt;
        value.textContent = formatRemaining(diff);&lt;br /&gt;
        wrap.classList.toggle(&#039;is-expired&#039;, diff &amp;lt;= 0);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
    const timerId = window.setInterval(update, 1000);&lt;br /&gt;
&lt;br /&gt;
    // Cleanup if removed&lt;br /&gt;
    const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
        if (!document.getElementById(&#039;sticky-countdown&#039;)) {&lt;br /&gt;
            clearInterval(timerId);&lt;br /&gt;
            observer.disconnect();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// =========================================================&lt;br /&gt;
// Sticky Header Game Time (GLOBAL FIXED CLOCK)&lt;br /&gt;
// Rules:&lt;br /&gt;
// - 1 real hour = 1 in-game day (1..24)&lt;br /&gt;
// - 1 real day = 1 in-game month (Jan..Jul cycle)&lt;br /&gt;
// - 1 real week (7 real days) = 1 in-game year&lt;br /&gt;
// Anchor given: at 2026-02-19 14:00:00 UTC =&amp;gt; Jan 21 YR2&lt;br /&gt;
// =========================================================&lt;br /&gt;
mw.hook(&#039;wikipage.content&#039;).add(function () {&lt;br /&gt;
    const icons = document.querySelector(&#039;.vector-sticky-header-icons&#039;);&lt;br /&gt;
    if (!icons) return;&lt;br /&gt;
&lt;br /&gt;
    if (document.getElementById(&#039;sticky-game-time&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
    const months = [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;];&lt;br /&gt;
&lt;br /&gt;
    const ANCHOR_REAL_UTC = Date.parse(&#039;2026-02-19T14:00:00Z&#039;);&lt;br /&gt;
    const ANCHOR_MONTH_INDEX = 0; // Jan&lt;br /&gt;
    const ANCHOR_DAY = 21;        // 1..24&lt;br /&gt;
    const ANCHOR_YEAR = 2;        // YR2&lt;br /&gt;
&lt;br /&gt;
    const wrap = document.createElement(&#039;span&#039;);&lt;br /&gt;
    wrap.id = &#039;sticky-game-time&#039;;&lt;br /&gt;
    wrap.className = &#039;sticky-game-time&#039;;&lt;br /&gt;
&lt;br /&gt;
    const value = document.createElement(&#039;span&#039;);&lt;br /&gt;
    value.className = &#039;sticky-game-time__value&#039;;&lt;br /&gt;
    wrap.appendChild(value);&lt;br /&gt;
&lt;br /&gt;
    const mid = getStickyTimeContainer();&lt;br /&gt;
    if (mid) mid.appendChild(wrap);&lt;br /&gt;
&lt;br /&gt;
    function computeGameString() {&lt;br /&gt;
        const hoursPassed = Math.floor((Date.now() - ANCHOR_REAL_UTC) / 3600000);&lt;br /&gt;
&lt;br /&gt;
        const dayIndex = (ANCHOR_DAY - 1) + hoursPassed;&lt;br /&gt;
        const dayNumber = ((dayIndex % 24) + 24) % 24 + 1;&lt;br /&gt;
&lt;br /&gt;
        const daysPassed = Math.floor(dayIndex / 24);&lt;br /&gt;
&lt;br /&gt;
        const totalMonthIndex = ANCHOR_MONTH_INDEX + daysPassed;&lt;br /&gt;
        const monthIndex = ((totalMonthIndex % 7) + 7) % 7;&lt;br /&gt;
&lt;br /&gt;
        const yearsPassed = Math.floor(totalMonthIndex / 7);&lt;br /&gt;
        const year = ANCHOR_YEAR + yearsPassed;&lt;br /&gt;
&lt;br /&gt;
        return `Current Game Date:&amp;amp;nbsp;&amp;amp;nbsp;${months[monthIndex]} ${dayNumber} YR${year}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function update() {&lt;br /&gt;
        value.textContent = computeGameString();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    update();&lt;br /&gt;
&lt;br /&gt;
    // Update on next hour boundary, then hourly&lt;br /&gt;
    const d = new Date();&lt;br /&gt;
    const msUntilNextHour =&lt;br /&gt;
        3600000 - (d.getMinutes() * 60000 + d.getSeconds() * 1000 + d.getMilliseconds());&lt;br /&gt;
&lt;br /&gt;
    setTimeout(function () {&lt;br /&gt;
        update();&lt;br /&gt;
        setInterval(update, 3600000);&lt;br /&gt;
    }, msUntilNextHour);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Sonja says</name></author>
	</entry>
</feed>