<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://interfaces3.hunter.cryptograss.live/index.php?action=history&amp;feed=atom&amp;title=User%3AMagent%2FCommon.js_without_the_player</id>
	<title>User:Magent/Common.js without the player - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://interfaces3.hunter.cryptograss.live/index.php?action=history&amp;feed=atom&amp;title=User%3AMagent%2FCommon.js_without_the_player"/>
	<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=User:Magent/Common.js_without_the_player&amp;action=history"/>
	<updated>2026-11-15T06:58:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://interfaces3.hunter.cryptograss.live/index.php?title=User:Magent/Common.js_without_the_player&amp;diff=8906&amp;oldid=prev</id>
		<title>Magent: Common.js with the player removed — step 2 of pickipedia#124</title>
		<link rel="alternate" type="text/html" href="https://interfaces3.hunter.cryptograss.live/index.php?title=User:Magent/Common.js_without_the_player&amp;diff=8906&amp;oldid=prev"/>
		<updated>2026-09-21T23:20:20Z</updated>

		<summary type="html">&lt;p&gt;Common.js with the player removed — step 2 of pickipedia#124&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
* Blue Railroad Submission - Date to Block Height Converter&lt;br /&gt;
* Adds a datepicker that converts dates to Ethereum block heights&lt;br /&gt;
* Also shows time ago for news templates&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on the Blue Railroad Submission form&lt;br /&gt;
    if (!document.querySelector(&amp;#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&amp;#039;)) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Reference point: known block and timestamp&lt;br /&gt;
    // Post-merge average block time is ~12.12 seconds&lt;br /&gt;
    const AVG_BLOCK_TIME = 12.12;&lt;br /&gt;
    &lt;br /&gt;
    // Get current block from footer (format: &amp;quot;24,328,442&amp;quot;)&lt;br /&gt;
    function getCurrentBlockFromFooter() {&lt;br /&gt;
        const footerLink = document.querySelector(&amp;#039;a[href*=&amp;quot;etherscan.io/block/&amp;quot;]&amp;#039;);&lt;br /&gt;
        if (footerLink) {&lt;br /&gt;
            const match = footerLink.href.match(/block\/(\d+)/);&lt;br /&gt;
            if (match) return parseInt(match[1]);&lt;br /&gt;
        }&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Calculate block height from date&lt;br /&gt;
    function dateToBlockHeight(targetDate, refBlock, refTimestamp) {&lt;br /&gt;
        const targetTimestamp = targetDate.getTime() / 1000;&lt;br /&gt;
        const secondsDiff = refTimestamp - targetTimestamp;&lt;br /&gt;
        const blocksDiff = Math.round(secondsDiff / AVG_BLOCK_TIME);&lt;br /&gt;
        return refBlock - blocksDiff;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Add the datepicker UI&lt;br /&gt;
    function addDatePicker() {&lt;br /&gt;
        const blockInput = document.querySelector(&amp;#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&amp;#039;);&lt;br /&gt;
        if (!blockInput) return;&lt;br /&gt;
        &lt;br /&gt;
        const container = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
        container.style.marginTop = &amp;#039;8px&amp;#039;;&lt;br /&gt;
        container.innerHTML = `&lt;br /&gt;
            &amp;lt;label style=&amp;quot;display: block; margin-bottom: 4px; font-size: 0.9em;&amp;quot;&amp;gt;&lt;br /&gt;
                Or pick a date/time:&lt;br /&gt;
            &amp;lt;/label&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;datetime-local&amp;quot; id=&amp;quot;br-datepicker&amp;quot; style=&amp;quot;padding: 4px; margin-right: 8px;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;br-convert-btn&amp;quot; style=&amp;quot;padding: 4px 12px; cursor: pointer;&amp;quot;&amp;gt;&lt;br /&gt;
                Convert to Block&lt;br /&gt;
            &amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;span id=&amp;quot;br-status&amp;quot; style=&amp;quot;margin-left: 8px; font-size: 0.9em; color: #666;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        `;&lt;br /&gt;
        &lt;br /&gt;
        blockInput.parentNode.appendChild(container);&lt;br /&gt;
        &lt;br /&gt;
        const datePicker = document.getElementById(&amp;#039;br-datepicker&amp;#039;);&lt;br /&gt;
        const convertBtn = document.getElementById(&amp;#039;br-convert-btn&amp;#039;);&lt;br /&gt;
        const status = document.getElementById(&amp;#039;br-status&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Set default to now&lt;br /&gt;
        const now = new Date();&lt;br /&gt;
        datePicker.value = now.toISOString().slice(0, 16);&lt;br /&gt;
        &lt;br /&gt;
        convertBtn.addEventListener(&amp;#039;click&amp;#039;, function() {&lt;br /&gt;
            const selectedDate = new Date(datePicker.value);&lt;br /&gt;
            if (isNaN(selectedDate.getTime())) {&lt;br /&gt;
                status.textContent = &amp;#039;Invalid date&amp;#039;;&lt;br /&gt;
                status.style.color = &amp;#039;red&amp;#039;;&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            const currentBlock = getCurrentBlockFromFooter();&lt;br /&gt;
            if (!currentBlock) {&lt;br /&gt;
                status.textContent = &amp;#039;Could not find reference block&amp;#039;;&lt;br /&gt;
                status.style.color = &amp;#039;red&amp;#039;;&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            const currentTimestamp = Date.now() / 1000;&lt;br /&gt;
            const estimatedBlock = dateToBlockHeight(selectedDate, currentBlock, currentTimestamp);&lt;br /&gt;
            &lt;br /&gt;
            if (estimatedBlock &amp;gt; currentBlock) {&lt;br /&gt;
                status.textContent = &amp;#039;Date is in the future!&amp;#039;;&lt;br /&gt;
                status.style.color = &amp;#039;orange&amp;#039;;&lt;br /&gt;
            } else {&lt;br /&gt;
                status.textContent = &amp;#039;~estimated&amp;#039;;&lt;br /&gt;
                status.style.color = &amp;#039;green&amp;#039;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            blockInput.value = estimatedBlock;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Run when DOM is ready&lt;br /&gt;
    if (document.readyState === &amp;#039;loading&amp;#039;) {&lt;br /&gt;
        document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, addDatePicker);&lt;br /&gt;
    } else {&lt;br /&gt;
        addDatePicker();&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * TimeAgo — shows &amp;quot;X blocks ago&amp;quot; for transcluded templates.&lt;br /&gt;
 *&lt;br /&gt;
 * Usage in wikitext:&lt;br /&gt;
 *   &amp;lt;span class=&amp;quot;timeago&amp;quot; data-lastmod-page=&amp;quot;Template:NewsShorts&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * Fetches the last revision timestamp from the API and renders&lt;br /&gt;
 * a block-based relative time string using Ethereum block heights.&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    // Post-merge average block time is ~12.12 seconds&lt;br /&gt;
    var AVG_BLOCK_TIME = 12.12;&lt;br /&gt;
&lt;br /&gt;
    var spans = document.querySelectorAll(&amp;#039;.timeago[data-lastmod-page]&amp;#039;);&lt;br /&gt;
    if (!spans.length) return;&lt;br /&gt;
&lt;br /&gt;
    // Format number with commas (e.g., 1234567 -&amp;gt; &amp;quot;1,234,567&amp;quot;)&lt;br /&gt;
    function formatNumber(num) {&lt;br /&gt;
        return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &amp;#039;,&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Collect unique page titles&lt;br /&gt;
    var titles = [];&lt;br /&gt;
    spans.forEach(function(span) {&lt;br /&gt;
        var t = span.getAttribute(&amp;#039;data-lastmod-page&amp;#039;);&lt;br /&gt;
        if (t &amp;amp;&amp;amp; titles.indexOf(t) === -1) titles.push(t);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Batch query the API (up to 50 titles per request)&lt;br /&gt;
    var api = mw.config.get(&amp;#039;wgScriptPath&amp;#039;) + &amp;#039;/api.php&amp;#039;;&lt;br /&gt;
    var url = api + &amp;#039;?action=query&amp;amp;prop=revisions&amp;amp;rvprop=timestamp&amp;amp;format=json&amp;amp;titles=&amp;#039; +&lt;br /&gt;
        encodeURIComponent(titles.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
    fetch(url).then(function(r) { return r.json(); }).then(function(data) {&lt;br /&gt;
        var pages = data.query &amp;amp;&amp;amp; data.query.pages || {};&lt;br /&gt;
        var timestamps = {};&lt;br /&gt;
&lt;br /&gt;
        Object.keys(pages).forEach(function(id) {&lt;br /&gt;
            var page = pages[id];&lt;br /&gt;
            if (page.revisions &amp;amp;&amp;amp; page.revisions[0]) {&lt;br /&gt;
                timestamps[page.title] = new Date(page.revisions[0].timestamp);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        spans.forEach(function(span) {&lt;br /&gt;
            var title = span.getAttribute(&amp;#039;data-lastmod-page&amp;#039;);&lt;br /&gt;
            var ts = timestamps[title];&lt;br /&gt;
            if (!ts) {&lt;br /&gt;
                span.textContent = &amp;#039;&amp;#039;;&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            span.textContent = formatBlocksAgo(ts);&lt;br /&gt;
            span.title = ts.toLocaleString();&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function formatBlocksAgo(date) {&lt;br /&gt;
        var secondsAgo = Math.floor((Date.now() - date.getTime()) / 1000);&lt;br /&gt;
        var blocksAgo = Math.round(secondsAgo / AVG_BLOCK_TIME);&lt;br /&gt;
&lt;br /&gt;
        if (blocksAgo &amp;lt; 1) {&lt;br /&gt;
            return &amp;#039;this block&amp;#039;;&lt;br /&gt;
        } else if (blocksAgo === 1) {&lt;br /&gt;
            return &amp;#039;1 block ago&amp;#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            return formatNumber(blocksAgo) + &amp;#039; blocks ago&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * The HLS video player used to live here.&lt;br /&gt;
 *&lt;br /&gt;
 * It now ships with the PickiPediaReleases extension, as&lt;br /&gt;
 * resources/ext.pickipediaReleases.videoPlayer.js, loaded on every page by&lt;br /&gt;
 * the BeforePageDisplay hook. Changing it is a pull request now: reviewed,&lt;br /&gt;
 * syntax-checked, deployed by Jenkins — rather than several hundred lines&lt;br /&gt;
 * pasted into this box, which is how the whole of this file went down for&lt;br /&gt;
 * 23 minutes on 15 September 2026.&lt;br /&gt;
 *&lt;br /&gt;
 * See cryptograss/pickipedia#124 and Cryptograss:Video player decisions.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * Instrument form — validation + page name computation (v24772700)&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    console.log(&amp;#039;PickiPedia Common.js instrument module v24772700 loaded&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    mw.hook(&amp;#039;pf.formValidation&amp;#039;).add(function(args) {&lt;br /&gt;
        var nickname = document.querySelector(&amp;#039;input[name=&amp;quot;Instrument[nickname]&amp;quot;]&amp;#039;);&lt;br /&gt;
        if (!nickname) return;&lt;br /&gt;
&lt;br /&gt;
        var make = document.querySelector(&amp;#039;input[name=&amp;quot;Instrument[make]&amp;quot;]&amp;#039;);&lt;br /&gt;
        var model = document.querySelector(&amp;#039;input[name=&amp;quot;Instrument[model]&amp;quot;]&amp;#039;);&lt;br /&gt;
        var serial = document.querySelector(&amp;#039;input[name=&amp;quot;Instrument[serial]&amp;quot;]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        var nickVal = nickname.value.trim();&lt;br /&gt;
        var makeVal = make ? make.value.trim() : &amp;#039;&amp;#039;;&lt;br /&gt;
        var modelVal = model ? model.value.trim() : &amp;#039;&amp;#039;;&lt;br /&gt;
        var serialVal = serial ? serial.value.trim() : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        var hasNickname = nickVal !== &amp;#039;&amp;#039;;&lt;br /&gt;
        var hasMakerComplete = makeVal !== &amp;#039;&amp;#039; &amp;amp;&amp;amp; modelVal !== &amp;#039;&amp;#039; &amp;amp;&amp;amp; serialVal !== &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if (!hasNickname &amp;amp;&amp;amp; !hasMakerComplete) {&lt;br /&gt;
            args.numErrors += 1;&lt;br /&gt;
            if (makeVal !== &amp;#039;&amp;#039; || modelVal !== &amp;#039;&amp;#039; || serialVal !== &amp;#039;&amp;#039;) {&lt;br /&gt;
                alert(&amp;#039;Maker identification requires all three: make, model, and serial number. Or provide a nickname instead.&amp;#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                alert(&amp;#039;Please provide either a nickname or maker identification (make, model, and serial number).&amp;#039;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If no nickname, fill it from make/model/serial for page naming&lt;br /&gt;
        if (!hasNickname) {&lt;br /&gt;
            nickname.value = makeVal + &amp;#039; &amp;#039; + modelVal + &amp;#039; &amp;#039; + serialVal;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — User-subpage zine/Substack styling&lt;br /&gt;
 *&lt;br /&gt;
 * Layout:&lt;br /&gt;
 *   - corner logo (absolute-positioned upper-left of viewport,&lt;br /&gt;
 *     OUTSIDE all wiki wrappers — does not push content down)&lt;br /&gt;
 *   - non-sticky topbar (just nav) at top of body&lt;br /&gt;
 *   - hero block with title (top), then USER:Username kicker below,&lt;br /&gt;
 *     optional dek + meta&lt;br /&gt;
 *   - light/dark mode toggle (persisted in localStorage)&lt;br /&gt;
 *&lt;br /&gt;
 * Variant from HTML comment marker `pickipedia:variant=letter|masthead`&lt;br /&gt;
 * or category membership; default letter.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
(function () {&lt;br /&gt;
  &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &amp;#039;undefined&amp;#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;);&lt;br /&gt;
  var pageName = mw.config.get(&amp;#039;wgPageName&amp;#039;) || &amp;#039;&amp;#039;;&lt;br /&gt;
  var title    = mw.config.get(&amp;#039;wgTitle&amp;#039;) || &amp;#039;&amp;#039;;&lt;br /&gt;
  var action   = mw.config.get(&amp;#039;wgAction&amp;#039;) || &amp;#039;view&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 2) return;&lt;br /&gt;
  if (action !== &amp;#039;view&amp;#039;) return;&lt;br /&gt;
  if (title.indexOf(&amp;#039;/&amp;#039;) === -1) return;&lt;br /&gt;
&lt;br /&gt;
  var slash    = title.indexOf(&amp;#039;/&amp;#039;);&lt;br /&gt;
  var username = title.slice(0, slash).replace(/_/g, &amp;#039; &amp;#039;);&lt;br /&gt;
  var subpage  = title.slice(slash + 1).replace(/_/g, &amp;#039; &amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&amp;#039;pickipedia-userpost&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  var variant = &amp;#039;letter&amp;#039;;&lt;br /&gt;
  var content = document.querySelector(&amp;#039;.mw-parser-output&amp;#039;);&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var html = content.innerHTML || &amp;#039;&amp;#039;;&lt;br /&gt;
    var m = html.match(/pickipedia:variant\s*=\s*(letter|masthead)/i);&lt;br /&gt;
    if (m) variant = m[1].toLowerCase();&lt;br /&gt;
  }&lt;br /&gt;
  var cats = mw.config.get(&amp;#039;wgCategories&amp;#039;) || [];&lt;br /&gt;
  if (cats.indexOf(&amp;#039;Masthead style&amp;#039;) !== -1) variant = &amp;#039;masthead&amp;#039;;&lt;br /&gt;
  if (cats.indexOf(&amp;#039;Letter style&amp;#039;) !== -1) variant = &amp;#039;letter&amp;#039;;&lt;br /&gt;
  body.classList.add(&amp;#039;pickipedia-variant-&amp;#039; + variant);&lt;br /&gt;
&lt;br /&gt;
  var STORAGE_KEY = &amp;#039;pickipedia-mode&amp;#039;;&lt;br /&gt;
  var saved = null;&lt;br /&gt;
  try { saved = localStorage.getItem(STORAGE_KEY); } catch (e) {}&lt;br /&gt;
  if (saved === &amp;#039;dark&amp;#039;) body.classList.add(&amp;#039;pickipedia-dark&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  var LOGO_URL = &amp;#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Corner logo: stand-alone body child, absolute-positioned. ----------&lt;br /&gt;
  var cornerLogo = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
  cornerLogo.className = &amp;#039;pp-corner-logo&amp;#039;;&lt;br /&gt;
  cornerLogo.href = &amp;#039;/wiki/Main_Page&amp;#039;;&lt;br /&gt;
  cornerLogo.title = &amp;#039;PickiPedia home&amp;#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &amp;#039;&amp;lt;img src=&amp;quot;&amp;#039; + LOGO_URL + &amp;#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  document.body.insertBefore(cornerLogo, document.body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Topbar (nav only) ----------&lt;br /&gt;
  var topbar = document.createElement(&amp;#039;header&amp;#039;);&lt;br /&gt;
  topbar.className = &amp;#039;pickipedia-topbar&amp;#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &amp;#039;&amp;lt;nav class=&amp;quot;pickipedia-topbar-nav&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + mw.util.getUrl(pageName, { action: &amp;#039;edit&amp;#039; }) + &amp;#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + mw.util.getUrl(pageName, { action: &amp;#039;history&amp;#039; }) + &amp;#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + mw.util.getUrl(&amp;#039;Talk:&amp;#039; + pageName) + &amp;#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
    &amp;#039;&amp;lt;/nav&amp;gt;&amp;#039;;&lt;br /&gt;
  document.body.insertBefore(topbar, cornerLogo.nextSibling);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Hero ----------&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var dek = &amp;#039;&amp;#039;;&lt;br /&gt;
    var dekEl = content.querySelector(&amp;#039;.pp-dek-source&amp;#039;);&lt;br /&gt;
    if (dekEl) {&lt;br /&gt;
      dek = dekEl.innerHTML;&lt;br /&gt;
      dekEl.remove();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var kickerHtml = &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + mw.util.getUrl(&amp;#039;User:&amp;#039; + username.replace(/ /g, &amp;#039;_&amp;#039;)) +&lt;br /&gt;
                     &amp;#039;&amp;quot;&amp;gt;User:&amp;#039; + escapeHtml(username) + &amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
    var kickerEl = content.querySelector(&amp;#039;.pp-kicker-source&amp;#039;);&lt;br /&gt;
    if (kickerEl) {&lt;br /&gt;
      kickerHtml = escapeHtml(kickerEl.textContent.trim());&lt;br /&gt;
      kickerEl.remove();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var lastMod = &amp;#039;&amp;#039;;&lt;br /&gt;
    var lastModEl = document.getElementById(&amp;#039;footer-info-lastmod&amp;#039;);&lt;br /&gt;
    if (lastModEl) lastMod = lastModEl.textContent.replace(/^\s*This page was last (edited|modified) on\s*/i, &amp;#039;&amp;#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    var hero = document.createElement(&amp;#039;header&amp;#039;);&lt;br /&gt;
    hero.className = &amp;#039;pickipedia-hero&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if (variant === &amp;#039;masthead&amp;#039;) {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &amp;#039;&amp;lt;div class=&amp;quot;pp-topbar&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&amp;#039; + kickerHtml + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;div class=&amp;quot;pp-topbar-rule&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
          (lastMod ? &amp;#039;&amp;lt;div class=&amp;quot;pp-topbar-vol&amp;quot;&amp;gt;&amp;#039; + escapeHtml(lastMod) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; : &amp;#039;&amp;#039;) +&lt;br /&gt;
        &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;div class=&amp;quot;pp-titlewrap&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&amp;#039; + escapeHtml(subpage) + &amp;#039;&amp;lt;/h1&amp;gt;&amp;#039; +&lt;br /&gt;
          (dek ? &amp;#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&amp;#039; + dek + &amp;#039;&amp;lt;/p&amp;gt;&amp;#039; : &amp;#039;&amp;#039;) +&lt;br /&gt;
        &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
      // Letter variant: title first, then kicker, then optional dek/meta.&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &amp;#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&amp;#039; + escapeHtml(subpage) + &amp;#039;&amp;lt;/h1&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&amp;#039; + kickerHtml + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
        (dek ? &amp;#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&amp;#039; + dek + &amp;#039;&amp;lt;/p&amp;gt;&amp;#039; : &amp;#039;&amp;#039;) +&lt;br /&gt;
        (lastMod ? &amp;#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;Last edited &amp;#039; + escapeHtml(lastMod) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; : &amp;#039;&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    content.parentNode.insertBefore(hero, content);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // ---------- Light/dark toggle ----------&lt;br /&gt;
  var toggle = document.createElement(&amp;#039;button&amp;#039;);&lt;br /&gt;
  toggle.className = &amp;#039;pickipedia-mode&amp;#039;;&lt;br /&gt;
  toggle.type = &amp;#039;button&amp;#039;;&lt;br /&gt;
  toggle.textContent = body.classList.contains(&amp;#039;pickipedia-dark&amp;#039;) ? &amp;#039;☼ Light&amp;#039; : &amp;#039;☾ Dark&amp;#039;;&lt;br /&gt;
  toggle.addEventListener(&amp;#039;click&amp;#039;, function () {&lt;br /&gt;
    var dark = body.classList.toggle(&amp;#039;pickipedia-dark&amp;#039;);&lt;br /&gt;
    toggle.textContent = dark ? &amp;#039;☼ Light&amp;#039; : &amp;#039;☾ Dark&amp;#039;;&lt;br /&gt;
    try { localStorage.setItem(STORAGE_KEY, dark ? &amp;#039;dark&amp;#039; : &amp;#039;light&amp;#039;); } catch (e) {}&lt;br /&gt;
  });&lt;br /&gt;
  document.body.appendChild(toggle);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &amp;#039;&amp;#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &amp;#039;&amp;amp;amp;&amp;#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &amp;#039;&amp;amp;lt;&amp;#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &amp;#039;&amp;amp;gt;&amp;#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &amp;#039;&amp;amp;quot;&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
</feed>