<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickipedia.skyler.hunter.cryptograss.live/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Magent</id>
	<title>PickiPedia - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://pickipedia.skyler.hunter.cryptograss.live/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Magent"/>
	<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/wiki/Special:Contributions/Magent"/>
	<updated>2026-10-15T04:39:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5395</id>
		<title>Sandbox Thumbnail Test</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5395"/>
		<updated>2026-08-11T18:44:43Z</updated>

		<summary type="html">&lt;p&gt;Magent: Fresh markers for testing the patched verify gadget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Thumbnail Test ==&lt;br /&gt;
&lt;br /&gt;
=== Standard wiki syntax (no highslide) ===&lt;br /&gt;
[[File:PXL_20250211_223356447.jpg|thumb|250px|Standard thumb - should use /images/thumb/]]&lt;br /&gt;
&lt;br /&gt;
=== hsgimg parser function ===&lt;br /&gt;
{{#hsgimg:&lt;br /&gt;
| source = File:PXL_20250211_223356447.jpg&lt;br /&gt;
| width = 250&lt;br /&gt;
| caption = hsgimg - currently uses full size&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ensemble (verified earlier) ===&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Kenny Feinstein&lt;br /&gt;
|Tommy Drinkard&lt;br /&gt;
|title=Verification test lineup&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Gadget test: block marker ===&lt;br /&gt;
&amp;lt;proposed by=&amp;quot;Magent&amp;quot;&amp;gt;&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Jesse Blue Eads&lt;br /&gt;
|Taylor Estes&lt;br /&gt;
|title=Gadget test lineup&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/proposed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Gadget test: prose marker with an escaped pipe ===&lt;br /&gt;
{{Bot_proposes|This claim mentions [[wikipedia:Stuart Duncan{{!}}Stuart Duncan]], so verifying it should restore the pipe rather than leave the escape behind.|by=Magent}}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5390</id>
		<title>Sandbox Thumbnail Test</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5390"/>
		<updated>2026-08-10T16:43:05Z</updated>

		<summary type="html">&lt;p&gt;Magent: End-to-end test of pickipedia-mcp#16: adding a template with no prose (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Thumbnail Test ==&lt;br /&gt;
&lt;br /&gt;
=== Standard wiki syntax (no highslide) ===&lt;br /&gt;
[[File:PXL_20250211_223356447.jpg|thumb|250px|Standard thumb - should use /images/thumb/]]&lt;br /&gt;
&lt;br /&gt;
=== hsgimg parser function ===&lt;br /&gt;
{{#hsgimg:&lt;br /&gt;
| source = File:PXL_20250211_223356447.jpg&lt;br /&gt;
| width = 250&lt;br /&gt;
| caption = hsgimg - currently uses full size&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Ensemble (test claim, added by bot) ===&lt;br /&gt;
&amp;lt;proposed by=&amp;quot;Magent&amp;quot;&amp;gt;&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Kenny Feinstein&lt;br /&gt;
|Tommy Drinkard&lt;br /&gt;
|title=Verification test lineup&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/proposed&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=User:Magent/Sandbox/Proposed_tag_test&amp;diff=5387</id>
		<title>User:Magent/Sandbox/Proposed tag test</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=User:Magent/Sandbox/Proposed_tag_test&amp;diff=5387"/>
		<updated>2026-08-10T13:36:27Z</updated>

		<summary type="html">&lt;p&gt;Magent: Fix test page: heading contained a literal &amp;lt;proposed&amp;gt; tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tag rendering test ==&lt;br /&gt;
&lt;br /&gt;
Block form, wrapping a template that knows nothing about verification:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;proposed by=&amp;quot;Magent&amp;quot; source=&amp;quot;watertower.band&amp;quot;&amp;gt;&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Kenny Feinstein&lt;br /&gt;
|Tommy Drinkard&lt;br /&gt;
|title=Water Tower (test)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/proposed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inline form: the band formed in &amp;lt;proposed by=&amp;quot;Magent&amp;quot;&amp;gt;2005&amp;lt;/proposed&amp;gt; according to their own site.&lt;br /&gt;
&lt;br /&gt;
A File link whose pipes would previously have needed escaping:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;proposed by=&amp;quot;Magent&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PXL_20250211_223356447.jpg|thumb|250px|Standard thumb]]&lt;br /&gt;
&amp;lt;/proposed&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=User:Magent/Sandbox/Proposed_tag_test&amp;diff=5386</id>
		<title>User:Magent/Sandbox/Proposed tag test</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=User:Magent/Sandbox/Proposed_tag_test&amp;diff=5386"/>
		<updated>2026-08-10T13:35:13Z</updated>

		<summary type="html">&lt;p&gt;Magent: Test &amp;lt;proposed&amp;gt; tag rendering (pickipedia#88)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;proposed&amp;gt; tag test ==&lt;br /&gt;
&lt;br /&gt;
Block form, wrapping a template that knows nothing about verification:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;proposed by=&amp;quot;Magent&amp;quot; source=&amp;quot;watertower.band&amp;quot;&amp;gt;&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Kenny Feinstein&lt;br /&gt;
|Tommy Drinkard&lt;br /&gt;
|title=Water Tower (test)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/proposed&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inline form: the band formed in &amp;lt;proposed by=&amp;quot;Magent&amp;quot;&amp;gt;2005&amp;lt;/proposed&amp;gt; according to their own site.&lt;br /&gt;
&lt;br /&gt;
A File link whose pipes would previously have needed escaping to {{!}}:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;proposed by=&amp;quot;Magent&amp;quot;&amp;gt;&lt;br /&gt;
[[File:PXL_20250211_223356447.jpg|thumb|250px|Standard thumb]]&lt;br /&gt;
&amp;lt;/proposed&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5385</id>
		<title>Sandbox Thumbnail Test</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5385"/>
		<updated>2026-08-10T13:34:49Z</updated>

		<summary type="html">&lt;p&gt;Magent: Revert verification test edit - restoring revision 280&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Thumbnail Test ==&lt;br /&gt;
&lt;br /&gt;
=== Standard wiki syntax (no highslide) ===&lt;br /&gt;
[[File:PXL_20250211_223356447.jpg|thumb|250px|Standard thumb - should use /images/thumb/]]&lt;br /&gt;
&lt;br /&gt;
=== hsgimg parser function ===&lt;br /&gt;
{{#hsgimg:&lt;br /&gt;
| source = File:PXL_20250211_223356447.jpg&lt;br /&gt;
| width = 250&lt;br /&gt;
| caption = hsgimg - currently uses full size&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5384</id>
		<title>Sandbox Thumbnail Test</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5384"/>
		<updated>2026-08-09T15:25:57Z</updated>

		<summary type="html">&lt;p&gt;Magent: Verification test for pickipedia#43 — will be reverted immediately (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Thumbnail Test ==&lt;br /&gt;
&lt;br /&gt;
=== Standard wiki syntax (no highslide) ===&lt;br /&gt;
[[File:PXL_20250211_223356447.jpg|thumb|250px|Standard thumb - should use /images/thumb/]]&lt;br /&gt;
&lt;br /&gt;
=== hsgimg parser function ===&lt;br /&gt;
{{#hsgimg:&lt;br /&gt;
| source = File:PXL_20250211_223356447.jpg&lt;br /&gt;
| width = 250&lt;br /&gt;
| caption = hsgimg - currently uses full size&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|This single sentence is the only new content in this edit.|by=Magent}}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Delivery-driver&amp;diff=5383</id>
		<title>Cryptograss:Delivery-driver</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Delivery-driver&amp;diff=5383"/>
		<updated>2026-08-05T20:16:13Z</updated>

		<summary type="html">&lt;p&gt;Magent: Rewrite in plain wikitext — the verification middleware wraps prose itself, and hand-written Bot_proposes nested badly (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox resource&lt;br /&gt;
| role = the courier&lt;br /&gt;
| type = Codebase (CLI)&lt;br /&gt;
| repo = https://github.com/magent-cryptograss/delivery-driver&lt;br /&gt;
| services = Album scanning, release manifests, torrent creation, IPFS pinning, video fetching&lt;br /&gt;
| namesake = The one who actually drives the van to [[Cryptograss:Delivery-kid|the kid]]}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|&#039;&#039;&#039;delivery-driver&#039;&#039;&#039; is the command-line tool that prepares a cryptograss release and hands it to [[Cryptograss:Delivery-kid{{!}}delivery-kid]] for distribution. Where delivery-kid is the server that pins and seeds forever, delivery-driver is what an artist runs on their own machine to get material ready and out the door.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|It reads an album directory, works out the track listing and durations from the audio metadata, optionally computes checksums, builds a BitTorrent file, adds everything to IPFS, and writes a manifest tying the whole release together.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;scan&amp;lt;/code&amp;gt; — read an album directory and print what was found: tracks, durations, formats, artwork. Changes nothing.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;release&amp;lt;/code&amp;gt; — the full run. Scan, add to IPFS, pin to Pinata, build the torrent, write the manifest. Each stage can be skipped with a flag.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;torrent&amp;lt;/code&amp;gt; — build only the BitTorrent file, with optional web seeds.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;ipfs&amp;lt;/code&amp;gt; — add an album directory to IPFS and report the CIDs.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; — pull a video down off a hosting service, with its metadata, ready to hand to [[Special:DeliverVideo]]. See below.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|A release run leaves behind a &amp;lt;code&amp;gt;.torrent&amp;lt;/code&amp;gt; file and a &amp;lt;code&amp;gt;-manifest.yaml&amp;lt;/code&amp;gt; carrying the album metadata, the IPFS CIDs both for the directory and per file, the torrent info hash and magnet link, and the checksums if they were computed.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Fetching video from a hosting service===&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|PickiPedia can already pull most video URLs server-side — paste a link into [[Special:DeliverVideo]] and delivery-kid fetches it for you. &#039;&#039;&#039;YouTube is the exception.&#039;&#039;&#039; It refuses our server&#039;s address outright, answering every request with a demand to prove you are not a robot. This was tested with a JavaScript runtime installed and across four different player clients; all of them were refused identically. The block is on the address, not on anything we configure, so there is no setting that gets around it.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|So YouTube has to be fetched from a machine it already trusts, which means the artist&#039;s own. That is what &amp;lt;code&amp;gt;delivery-driver fetch&amp;lt;/code&amp;gt; is for. Given a browser name, it borrows that browser&#039;s existing session, downloads the video, and tells you to drop the result into [[Special:DeliverVideo]] as though you had recorded it yourself.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|&#039;&#039;&#039;Your cookies stay on your laptop.&#039;&#039;&#039; Nothing is uploaded and cryptograss never holds them — this is deliberate rather than incidental. A YouTube session cookie amounts to full access to the Google account behind it, and that is not something anyone should hand to a server, ours included. It is also why there is no plan to add server-side cookie storage later.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|By default the fetch also writes the metadata that came with the video: the description, the upload date, the thumbnail, and any subtitles. Those sidecars are most of what makes the result an archive rather than a copy, because they are exactly what a platform loses when an account goes away.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|One video is fetched at a time unless a playlist is explicitly asked for. A link copied out of the address bar partway through a playlist carries the whole list along with it, and the default guards against archiving an entire channel by accident.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
&lt;br /&gt;
* {{Bot_proposes|Python 3.10 or newer.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|An IPFS daemon running locally, for anything touching IPFS. Torrent-only runs need no daemon.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;yt-dlp&amp;lt;/code&amp;gt;, for the fetch command only.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|A Pinata API token in the environment, if redundant pinning is wanted.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Status===&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|The repository currently lives in the magent fork rather than under the cryptograss organisation, so it will not be found by searching the org. Upstreaming it is unfinished business.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|The &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; command is proposed rather than landed — it sits on an open pull request at the time of writing. Everything above it has been in use longer. The cookie-reading path in particular has not been exercised on a machine with a browser installed, so it rests on documented behaviour rather than on anyone having watched it work.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|This page carries no ASCII art, unlike its sibling. Multi-line &amp;lt;code&amp;gt;pre&amp;lt;/code&amp;gt; blocks do not currently survive the bot-edit verification middleware, which is the same reason the infobox on [[Cryptograss:Delivery-kid{{!}}delivery-kid]] renders as raw template text.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
&lt;br /&gt;
* [[Cryptograss:Delivery-kid]]&lt;br /&gt;
* [[Cryptograss:Arthel]]&lt;br /&gt;
* [[Special:DeliverVideo]]&lt;br /&gt;
* [[Special:Releases]]&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Delivery-driver&amp;diff=5382</id>
		<title>Cryptograss:Delivery-driver</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Delivery-driver&amp;diff=5382"/>
		<updated>2026-08-05T20:14:01Z</updated>

		<summary type="html">&lt;p&gt;Magent: Create resource page for delivery-driver, companion to Cryptograss:Delivery-kid (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox resource&lt;br /&gt;
| image = &amp;lt;pre style=&amp;quot;font-size:10px; line-height:1.2; font-family:monospace;&amp;quot;&amp;gt;&lt;br /&gt;
{{Bot_proposes|_______      /       \____     /             \    &#039;---(o)-----(o)-&#039; &amp;lt;/pre&amp;gt;|by=Magent}}&lt;br /&gt;
| role = the courier&lt;br /&gt;
| type = Codebase (CLI)&lt;br /&gt;
| repo = https://github.com/magent-cryptograss/delivery-driver&lt;br /&gt;
| services = Album scanning, release manifests, torrent creation, IPFS pinning, video fetching&lt;br /&gt;
| namesake = The one who actually drives the van to [[Cryptograss:Delivery-kid|the kid]]&lt;br /&gt;
{{Bot_proposes|}}|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|&amp;lt;pre style=&amp;quot;font-size:8px; line-height:1.2;&amp;quot;&amp;gt;|by=Magent}}&lt;br /&gt;
# {{Bot_proposes|&amp;quot;&amp;quot;#      &amp;quot;                                           #           &amp;quot;|by=Magent}}&lt;br /&gt;
{{Bot_proposes|mmm#   mmm     #    mmm    m   m   mmm    m mm  m   m          mmm#   m mm  mmm    m   m   mmm    m mm|by=Magent}}&lt;br /&gt;
# {{Bot_proposes|&amp;quot; &amp;quot;#  #&amp;quot;  #    #      #    &amp;quot;m m&amp;quot;  #&amp;quot;  #   #&amp;quot;  &amp;quot; &amp;quot;m m&amp;quot;         #&amp;quot; &amp;quot;#   #&amp;quot;  &amp;quot;   #    &amp;quot;m m&amp;quot;  #&amp;quot;  #   #&amp;quot;  &amp;quot;|by=Magent}}&lt;br /&gt;
# {{Bot_proposes|#  #&amp;quot;&amp;quot;&amp;quot;&amp;quot;    #      #     #m#   #&amp;quot;&amp;quot;&amp;quot;&amp;quot;   #      #m#    &amp;quot;&amp;quot;&amp;quot;   #   #   #       #     #m#   #&amp;quot;&amp;quot;&amp;quot;&amp;quot;   #|by=Magent}}&lt;br /&gt;
{{Bot_proposes|&amp;quot;#m##  &amp;quot;#mm&amp;quot;    &amp;quot;mm  mm#mm    #    &amp;quot;#mm&amp;quot;   #      &amp;quot;#           &amp;quot;#m##   #     mm#mm    #    &amp;quot;#mm&amp;quot;   #                                                        m&amp;quot;                                                                                                       &amp;quot;&amp;quot;                                                      &amp;lt;/pre&amp;gt;|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|&#039;&#039;&#039;delivery-driver&#039;&#039;&#039; is the command-line tool that prepares a cryptograss release and hands it to [[Cryptograss:Delivery-kid{{!}}delivery-kid]] for distribution. Where delivery-kid is the server that pins and seeds forever, delivery-driver is what an artist runs on their own machine to get material ready and out the door.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|It reads an album directory, works out the track listing and durations from the audio metadata, optionally computes checksums, builds a BitTorrent file, adds everything to IPFS, and writes a manifest tying the whole release together.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;scan&amp;lt;/code&amp;gt; — {{Bot_proposes{{!}}read an album directory and print what was found: tracks, durations, formats, artwork. Changes nothing.{{!}}by=Magent}}|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;release&amp;lt;/code&amp;gt; — {{Bot_proposes{{!}}the full run. Scan, add to IPFS, pin to Pinata, build the torrent, write the manifest. Each stage can be skipped with a flag.{{!}}by=Magent}}|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;torrent&amp;lt;/code&amp;gt; — {{Bot_proposes{{!}}build only the BitTorrent file, with optional web seeds.{{!}}by=Magent}}|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;ipfs&amp;lt;/code&amp;gt; — {{Bot_proposes{{!}}add an album directory to IPFS and report the CIDs.{{!}}by=Magent}}|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; — {{Bot_proposes{{!}}pull a video down off a hosting service, with its metadata, ready to hand to [[Special:DeliverVideo]]. See below.{{!}}by=Magent}}|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|A release run leaves behind a &amp;lt;code&amp;gt;.torrent&amp;lt;/code&amp;gt; file and a &amp;lt;code&amp;gt;-manifest.yaml&amp;lt;/code&amp;gt; carrying the album metadata, the IPFS CIDs both for the directory and per file, the torrent info hash and magnet link, and the checksums if they were computed.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Fetching video from a hosting service===&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|PickiPedia can already pull most video URLs server-side — paste a link into [[Special:DeliverVideo]] and delivery-kid fetches it for you. &#039;&#039;&#039;YouTube is the exception.&#039;&#039;&#039; It refuses our server&#039;s address outright, answering every request with a demand to prove you are not a robot. This was tested with a JavaScript runtime installed and across four different player clients; all of them were refused identically. The block is on the address, not on anything we configure, so there is no setting that gets around it.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|So YouTube has to be fetched from a machine it already trusts, which means the artist&#039;s own. That is what &amp;lt;code&amp;gt;delivery-driver fetch&amp;lt;/code&amp;gt; is for. Given a browser name, it borrows that browser&#039;s existing session, downloads the video, and tells you to drop the result into [[Special:DeliverVideo]] as though you had recorded it yourself.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|&#039;&#039;&#039;Your cookies stay on your laptop.&#039;&#039;&#039; Nothing is uploaded and cryptograss never holds them — this is deliberate rather than incidental. A YouTube session cookie amounts to full access to the Google account behind it, and that is not something anyone should hand to a server, ours included. It is also why there is no plan to add server-side cookie storage later.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|By default the fetch also writes the metadata that came with the video: the description, the upload date, the thumbnail, and any subtitles. Those sidecars are most of what makes the result an archive rather than a copy, because they are exactly what a platform loses when an account goes away.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|One video is fetched at a time unless a playlist is explicitly asked for. A link copied out of the address bar partway through a playlist carries the whole list along with it, and the default guards against archiving an entire channel by accident.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
&lt;br /&gt;
* {{Bot_proposes|Python 3.10 or newer.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|An IPFS daemon running locally, for anything touching IPFS. Torrent-only runs need no daemon.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|&amp;lt;code&amp;gt;yt-dlp&amp;lt;/code&amp;gt;, for the fetch command only.|by=Magent}}&lt;br /&gt;
* {{Bot_proposes|A Pinata API token in the environment, if redundant pinning is wanted.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===Status===&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|The repository currently lives in the magent fork rather than under the cryptograss organisation, so it will not be found by searching the org. Upstreaming it is unfinished business.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
{{Bot_proposes|The &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; command is proposed rather than landed — it sits on an open pull request at the time of writing. Everything above it has been in use longer. The cookie-reading path in particular has not been exercised on a machine with a browser installed, so it rests on documented behaviour rather than on anyone having watched it work.|by=Magent}}&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
&lt;br /&gt;
* [[Cryptograss:Delivery-kid]]&lt;br /&gt;
* [[Cryptograss:Arthel]]&lt;br /&gt;
* [[Special:DeliverVideo]]&lt;br /&gt;
* [[Special:Releases]]&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:LatestPodcastEpisodes&amp;diff=5377</id>
		<title>Template:LatestPodcastEpisodes</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:LatestPodcastEpisodes&amp;diff=5377"/>
		<updated>2026-07-27T14:08:40Z</updated>

		<summary type="html">&lt;p&gt;Magent: Testing three image-embed patterns: bare URL, File:external|, and inline &amp;amp;lt;img&amp;amp;gt;. Once we know which works we&amp;#039;ll settle. (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- image embed tests --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Raw external URL:&#039;&#039;&#039;&lt;br /&gt;
https://storage.buzzsprout.com/i007fhs10e0rj1d5nsls8x81a2yt?.jpg&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Raw with explicit .jpg extension:&#039;&#039;&#039;&lt;br /&gt;
https://static.libsyn.com/p/assets/e/2/a/5/e2a502471c69bbb8/PickyFingers_Logo1_V2.2_ColorOptions-1.jpg&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. In a table cell:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| https://static.libsyn.com/p/assets/e/2/a/5/e2a502471c69bbb8/PickyFingers_Logo1_V2.2_ColorOptions-1.jpg&lt;br /&gt;
| some text&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:LatestPodcastEpisodes&amp;diff=5376</id>
		<title>Template:LatestPodcastEpisodes</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:LatestPodcastEpisodes&amp;diff=5376"/>
		<updated>2026-07-27T14:08:12Z</updated>

		<summary type="html">&lt;p&gt;Magent: POC v2: per-feed cap of 3, plus small cover-art icon per row. Feed set still only 3 podcasts (backfilling the others soon). (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Auto-generated by podcast-feed-aggregator — do not edit by hand. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Last refreshed: 2026-07-27T14:07:24 --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Discovery: enumerates Category:Podcasts, reads |rss= from each {{Podcast}} infobox --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== About this template ==&lt;br /&gt;
Merged, time-sorted stream of episodes across every podcast on Pickipedia. Auto-refreshed by the podcast-feed-aggregator cron.&lt;br /&gt;
&lt;br /&gt;
To add a podcast to the stream: use the {{tl|Podcast}} infobox with a valid &amp;lt;code&amp;gt;rss=&amp;lt;/code&amp;gt;. The template auto-adds the page to [[:Category:Podcasts]], which the aggregator enumerates.&lt;br /&gt;
&lt;br /&gt;
Rendering knobs:&lt;br /&gt;
* Per-row cover-art icon uses external &amp;lt;code&amp;gt;&amp;amp;lt;img&amp;amp;gt;&amp;lt;/code&amp;gt; — depends on wiki allowing external images&lt;br /&gt;
* Cap of 3 episodes per feed keeps any one podcast from crowding out others&lt;br /&gt;
* Styling controlled by &amp;lt;code&amp;gt;.community-podcast-feed&amp;lt;/code&amp;gt; in MediaWiki:Common.css&lt;br /&gt;
&lt;br /&gt;
== Preview ==&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;community-podcast-feed&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://static.libsyn.com/p/assets/e/2/a/5/e2a502471c69bbb8/PickyFingers_Logo1_V2.2_ColorOptions-1.jpg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://banjopodcast.libsyn.com/174-daniel-grindstaff #174 - Daniel Grindstaff] — [[The Picky Fingers Banjo Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-07-23&amp;quot;&amp;gt;4 days ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://storage.buzzsprout.com/i007fhs10e0rj1d5nsls8x81a2yt?.jpg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://www.buzzsprout.com/1660894/episodes/19531642-jerry-douglas-celebrating-boone-creek.mp3 Jerry Douglas - Celebrating Boone Creek] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-07-22&amp;quot;&amp;gt;5 days ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://storage.buzzsprout.com/i007fhs10e0rj1d5nsls8x81a2yt?.jpg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://www.buzzsprout.com/1660894/episodes/19497277-scott-billington-reissuing-classic-bluegrass-albums-for-craft-recordings.mp3 Scott Billington - Reissuing Classic Bluegrass Albums for Craft Recordings] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-07-15&amp;quot;&amp;gt;12 days ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://storage.buzzsprout.com/i007fhs10e0rj1d5nsls8x81a2yt?.jpg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://www.buzzsprout.com/1660894/episodes/19423013-bluegrass-briefing-july-2026.mp3 Bluegrass Briefing - July 2026] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-30&amp;quot;&amp;gt;3 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://media.rss.com/whatsthereasonforthis/20251009_101048_5b364e8950aa05f99f3e09c7c7224be8.png&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://rss.com/podcasts/whatsthereasonforthis/2939224 WTRFT S2E40 - Randy Steele - High Cold Wind] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-23&amp;quot;&amp;gt;4 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://static.libsyn.com/p/assets/e/2/a/5/e2a502471c69bbb8/PickyFingers_Logo1_V2.2_ColorOptions-1.jpg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://banjopodcast.libsyn.com/173-fit-for-a-dog-by-frank-evans #173 - &amp;quot;Fit For a Dog&amp;quot; by Frank Evans] — [[The Picky Fingers Banjo Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-10&amp;quot;&amp;gt;6 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://media.rss.com/whatsthereasonforthis/20251009_101048_5b364e8950aa05f99f3e09c7c7224be8.png&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://rss.com/podcasts/whatsthereasonforthis/2881359 WTRFT S2E39 - Front Porch] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-03&amp;quot;&amp;gt;7 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://media.rss.com/whatsthereasonforthis/20251009_101048_5b364e8950aa05f99f3e09c7c7224be8.png&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://rss.com/podcasts/whatsthereasonforthis/2864548 WTRFT S2E28 - Broken Compass Bluegrass] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-05-28&amp;quot;&amp;gt;2 months ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;img class=&amp;quot;community-podcast-feed-icon&amp;quot; src=&amp;quot;https://static.libsyn.com/p/assets/e/2/a/5/e2a502471c69bbb8/PickyFingers_Logo1_V2.2_ColorOptions-1.jpg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;/&amp;gt; [https://banjopodcast.libsyn.com/172-joe-larson #172 - Joe Larson] — [[The Picky Fingers Banjo Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-05-20&amp;quot;&amp;gt;2 months ago&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Infobox templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:LatestPodcastEpisodes&amp;diff=5375</id>
		<title>Template:LatestPodcastEpisodes</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:LatestPodcastEpisodes&amp;diff=5375"/>
		<updated>2026-07-27T13:58:41Z</updated>

		<summary type="html">&lt;p&gt;Magent: Initial POC draft — merged podcast RSS stream. Auto-refresh not yet wired; content will get overwritten by the aggregator once cron is set up. Justin: iterate on rendering/styling here. (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Auto-generated by podcast-feed-aggregator — do not edit by hand. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Last refreshed: 2026-07-27T13:57:36.647048+00:00 --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Discovery: enumerates Category:Podcasts, reads |rss= from each {{Podcast}} infobox --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== About this template ==&lt;br /&gt;
This template holds a merged, time-sorted stream of episodes across every podcast on Pickipedia. The generator lives in [[Magent:notes/podcast-feed-aggregator]] (to be written); it runs on cron and rewrites this page.&lt;br /&gt;
&lt;br /&gt;
To add a podcast to the stream: make sure its wiki page uses the {{tl|Podcast}} infobox with a valid &amp;lt;code&amp;gt;rss=&amp;lt;/code&amp;gt; URL. The template auto-adds the page to [[:Category:Podcasts]], which the aggregator enumerates.&lt;br /&gt;
&lt;br /&gt;
To adjust styling: edit CSS under the &amp;lt;code&amp;gt;community-podcast-feed&amp;lt;/code&amp;gt; class in MediaWiki:Common.css.&lt;br /&gt;
&lt;br /&gt;
== Preview ==&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;community-podcast-feed&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [https://banjopodcast.libsyn.com/174-daniel-grindstaff #174 - Daniel Grindstaff] — [[The Picky Fingers Banjo Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-07-23&amp;quot;&amp;gt;4 days ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19531642-jerry-douglas-celebrating-boone-creek.mp3 Jerry Douglas - Celebrating Boone Creek] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-07-22&amp;quot;&amp;gt;5 days ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19497277-scott-billington-reissuing-classic-bluegrass-albums-for-craft-recordings.mp3 Scott Billington - Reissuing Classic Bluegrass Albums for Craft Recordings] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-07-15&amp;quot;&amp;gt;12 days ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19423013-bluegrass-briefing-july-2026.mp3 Bluegrass Briefing - July 2026] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-30&amp;quot;&amp;gt;3 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19400480-bitesize-tristan-scroggins-on-authenticity-and-identity-in-bluegrass.mp3 Bitesize - Tristan Scroggins on Authenticity and Identity in Bluegrass] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-25&amp;quot;&amp;gt;4 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://rss.com/podcasts/whatsthereasonforthis/2939224 WTRFT S2E40 - Randy Steele - High Cold Wind] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-23&amp;quot;&amp;gt;4 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19359870-missy-raines-on-the-seldom-scene-act-two.mp3 Missy Raines on The Seldom Scene Act Two] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-17&amp;quot;&amp;gt;5 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://banjopodcast.libsyn.com/173-fit-for-a-dog-by-frank-evans #173 - &amp;quot;Fit For a Dog&amp;quot; by Frank Evans] — [[The Picky Fingers Banjo Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-10&amp;quot;&amp;gt;6 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19325145-bluegrass-briefing-june-2026.mp3 Bluegrass Briefing - June 2026] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-10&amp;quot;&amp;gt;6 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://rss.com/podcasts/whatsthereasonforthis/2881359 WTRFT S2E39 - Front Porch] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-03&amp;quot;&amp;gt;7 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19286588-renee-fleming-and-bela-fleck-the-fiddle-and-the-drum.mp3 Renée Fleming and Béla Fleck - The Fiddle and the Drum] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-06-03&amp;quot;&amp;gt;7 weeks ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://rss.com/podcasts/whatsthereasonforthis/2864548 WTRFT S2E28 - Broken Compass Bluegrass] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-05-28&amp;quot;&amp;gt;2 months ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://www.buzzsprout.com/1660894/episodes/19247509-the-tim-o-brien-songbook.mp3 The Tim O&#039;Brien Songbook] — [[Bluegrass Jam Along]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-05-27&amp;quot;&amp;gt;2 months ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://banjopodcast.libsyn.com/172-joe-larson #172 - Joe Larson] — [[The Picky Fingers Banjo Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-05-20&amp;quot;&amp;gt;2 months ago&amp;lt;/span&amp;gt;&lt;br /&gt;
* [https://rss.com/podcasts/whatsthereasonforthis/2839843 WTRFT S2E37 - Foggy Memory Boys] — [[What&#039;s The Reason For This Podcast]] &amp;lt;span class=&amp;quot;community-podcast-feed-when&amp;quot; title=&amp;quot;2026-05-19&amp;quot;&amp;gt;2 months ago&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Infobox templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:SetStone&amp;diff=5303</id>
		<title>Template:SetStone</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:SetStone&amp;diff=5303"/>
		<updated>2026-06-04T22:36:33Z</updated>

		<summary type="html">&lt;p&gt;Magent: Template:SetStone for display of set stone NFTs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SetStone&#039;&#039;&#039; - Display template for a Set Stone NFT representing ownership of a song from a specific set.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{SetStone&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|set=1&lt;br /&gt;
|shape=diamond&lt;br /&gt;
|color=ruby&lt;br /&gt;
|song=The Two Sisters&lt;br /&gt;
|price=0.05&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{SetStone&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|set=2&lt;br /&gt;
|shape=triangle&lt;br /&gt;
|color=emerald&lt;br /&gt;
|song=Power Underneath&lt;br /&gt;
|price=0.05&lt;br /&gt;
|owner=jMyles&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;show&#039;&#039;&#039; (required) - Wiki page of the show&lt;br /&gt;
* &#039;&#039;&#039;set&#039;&#039;&#039; (required) - Set number (1, 2, 3...)&lt;br /&gt;
* &#039;&#039;&#039;shape&#039;&#039;&#039; (optional) - Stone shape: &amp;lt;code&amp;gt;diamond&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triangle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;circle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;square&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hexagon&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; (optional) - Stone color: &amp;lt;code&amp;gt;ruby&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;emerald&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sapphire&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topaz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;diamond&amp;lt;/code&amp;gt; (clear), or any hex code with a leading &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;song&#039;&#039;&#039; (optional) - Song this stone represents&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Mint price in ETH (numeric only, the Ξ is added by the template)&lt;br /&gt;
* &#039;&#039;&#039;owner&#039;&#039;&#039; (optional) - Current holder of the stone&lt;br /&gt;
&lt;br /&gt;
=== SMW properties set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone of show&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set number&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone shape&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone color&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Song&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Show]]&lt;br /&gt;
* [[Template:TicketStub]]&lt;br /&gt;
* [[Category:Set stones]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;set-stone&amp;quot; style=&amp;quot;display: inline-block; width: 18em; padding: 0.8em 1em; margin: 0.5em 0.5em 0.5em 0; background: #fafaf3; border: 1px solid #c8c4b0; border-left: 3px solid {{#switch:{{{color|}}}|ruby=#cc4444|emerald=#44aa66|sapphire=#4477bb|topaz=#cca844|diamond=#bbb|#98b}}; font-family: Georgia, serif; box-shadow: 2px 2px 0 rgba(0,0,0,0.05); vertical-align: top; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, Consolas, monospace; font-size: 0.7em; letter-spacing: 0.18em; color: #888; text-transform: uppercase;&amp;quot;&amp;gt;Set Stone &amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; Set {{{set|?}}}{{#if:{{{shape|}}}|&amp;amp;nbsp;&amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; {{{shape}}}|}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.05em; margin: 0.4em 0 0.15em 0; font-weight: 600;&amp;quot;&amp;gt;{{#if:{{{song|}}}|{{{song}}}|&amp;lt;span style=&amp;quot;color:#aaa; font-style:italic; font-weight:400;&amp;quot;&amp;gt;song TBD&amp;lt;/span&amp;gt;}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-style: italic; color: #666; font-size: 0.85em;&amp;quot;&amp;gt;from [[{{{show}}}]]&amp;lt;/div&amp;gt;{{#if:{{{price|}}}|&amp;lt;div style=&amp;quot;margin-top: 0.5em; border-top: 1px dashed #c8c4b0; padding-top: 0.4em; font-family: &#039;SF Mono&#039;, monospace; font-size: 0.72em; letter-spacing: 0.1em; text-transform: uppercase; color: #555;&amp;quot;&amp;gt;Price &amp;lt;span style=&amp;quot;font-weight:600; color:#333;&amp;quot;&amp;gt;{{{price}}} Ξ&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;|}}{{#if:{{{owner|}}}|&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, monospace; font-size: 0.7em; color: #228b22; margin-top: 0.3em; letter-spacing: 0.1em; text-transform: uppercase;&amp;quot;&amp;gt;Held by &#039;&#039;&#039;{{{owner}}}&#039;&#039;&#039;&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Set stone of show={{{show}}}}}{{#set:Set number={{{set|}}}}}{{#set:Set stone shape={{{shape|}}}}}{{#set:Set stone color={{{color|}}}}}{{#if:{{{song|}}}|{{#set:Song={{{song}}}}}|}}[[Category:Set stones]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:TicketStub&amp;diff=5302</id>
		<title>Template:TicketStub</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:TicketStub&amp;diff=5302"/>
		<updated>2026-06-04T22:36:33Z</updated>

		<summary type="html">&lt;p&gt;Magent: Template:TicketStub for display of paper/digital ticket stubs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TicketStub&#039;&#039;&#039; - Display template for a physical paper ticket stub from a show.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{TicketStub&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|stubId=001&lt;br /&gt;
|status=unclaimed&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TicketStub&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|stubId=001&lt;br /&gt;
|status=claimed&lt;br /&gt;
|claimed_by=jMyles&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;show&#039;&#039;&#039; (required) - Wiki page of the show this stub belongs to (e.g., &amp;lt;code&amp;gt;Show:JustinHolmes-25255000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;stubId&#039;&#039;&#039; (required) - The token/serial number of this stub (e.g., &amp;lt;code&amp;gt;001&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;042&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;status&#039;&#039;&#039; (optional) - &amp;lt;code&amp;gt;unclaimed&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;claimed&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;claimed_by&#039;&#039;&#039; (optional) - Who currently holds the claimed stub&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039; (optional) - Show date, human-readable&lt;br /&gt;
* &#039;&#039;&#039;venue&#039;&#039;&#039; (optional) - Venue name, for stubs displayed away from the show page&lt;br /&gt;
&lt;br /&gt;
=== SMW properties set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Ticket stub of show&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Stub ID&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Stub status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Show]]&lt;br /&gt;
* [[Template:SetStone]]&lt;br /&gt;
* [[Category:Ticket stubs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;ticket-stub&amp;quot; style=&amp;quot;display: inline-block; width: 18em; padding: 0.8em 1em; margin: 0.5em 0.5em 0.5em 0; background: #fafaf3; border: 1px solid #c8c4b0; border-left: 3px solid #98b; font-family: Georgia, serif; box-shadow: 2px 2px 0 rgba(0,0,0,0.05); vertical-align: top;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, Consolas, monospace; font-size: 0.7em; letter-spacing: 0.18em; color: #888; text-transform: uppercase;&amp;quot;&amp;gt;Ticket Stub &amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; #{{{stubId}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.05em; margin: 0.4em 0 0.15em 0; font-weight: 600;&amp;quot;&amp;gt;[[{{{show}}}]]&amp;lt;/div&amp;gt;{{#if:{{{venue|}}}|&amp;lt;div style=&amp;quot;font-style: italic; color: #666; font-size: 0.85em; margin-bottom: 0.15em;&amp;quot;&amp;gt;{{{venue}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{date|}}}|&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, monospace; font-size: 0.7em; color: #777; text-transform: uppercase; letter-spacing: 0.12em; margin-top: 0.3em;&amp;quot;&amp;gt;{{{date}}}&amp;lt;/div&amp;gt;|}}&amp;lt;div style=&amp;quot;margin-top: 0.6em; border-top: 1px dashed #c8c4b0; padding-top: 0.4em; font-family: &#039;SF Mono&#039;, monospace; font-size: 0.72em; letter-spacing: 0.1em; text-transform: uppercase;&amp;quot;&amp;gt;{{#ifeq:{{{status|unclaimed}}}|claimed|&amp;lt;span style=&amp;quot;color: #228b22;&amp;quot;&amp;gt;&amp;amp;#10003; Claimed{{#if:{{{claimed_by|}}}| by &#039;&#039;&#039;{{{claimed_by}}}&#039;&#039;&#039;|}}&amp;lt;/span&amp;gt;|&amp;lt;span style=&amp;quot;color: #aaa;&amp;quot;&amp;gt;&amp;amp;#9675; Unclaimed&amp;lt;/span&amp;gt;}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;{{#set:Ticket stub of show={{{show}}}}}{{#set:Stub ID={{{stubId}}}}}{{#set:Stub status={{{status|unclaimed}}}}}[[Category:Ticket stubs]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Template:SetStone&amp;diff=5301</id>
		<title>Candidate:Template:SetStone</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Template:SetStone&amp;diff=5301"/>
		<updated>2026-06-04T22:00:15Z</updated>

		<summary type="html">&lt;p&gt;Magent: Draft Template:SetStone for display of set stone NFTs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SetStone&#039;&#039;&#039; - Display template for a Set Stone NFT representing ownership of a song from a specific set.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{SetStone&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|set=1&lt;br /&gt;
|shape=diamond&lt;br /&gt;
|color=ruby&lt;br /&gt;
|song=The Two Sisters&lt;br /&gt;
|price=0.05&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{SetStone&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|set=2&lt;br /&gt;
|shape=triangle&lt;br /&gt;
|color=emerald&lt;br /&gt;
|song=Power Underneath&lt;br /&gt;
|price=0.05&lt;br /&gt;
|owner=jMyles&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;show&#039;&#039;&#039; (required) - Wiki page of the show&lt;br /&gt;
* &#039;&#039;&#039;set&#039;&#039;&#039; (required) - Set number (1, 2, 3...)&lt;br /&gt;
* &#039;&#039;&#039;shape&#039;&#039;&#039; (optional) - Stone shape: &amp;lt;code&amp;gt;diamond&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triangle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;circle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;square&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hexagon&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; (optional) - Stone color: &amp;lt;code&amp;gt;ruby&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;emerald&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sapphire&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topaz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;diamond&amp;lt;/code&amp;gt; (clear), or any hex code with a leading &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;song&#039;&#039;&#039; (optional) - Song this stone represents&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Mint price in ETH (numeric only, the Ξ is added by the template)&lt;br /&gt;
* &#039;&#039;&#039;owner&#039;&#039;&#039; (optional) - Current holder of the stone&lt;br /&gt;
&lt;br /&gt;
=== SMW properties set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone of show&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set number&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone shape&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone color&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Song&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Show]]&lt;br /&gt;
* [[Template:TicketStub]]&lt;br /&gt;
* [[Category:Set stones]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;set-stone&amp;quot; style=&amp;quot;display: inline-block; width: 18em; padding: 0.8em 1em; margin: 0.5em 0.5em 0.5em 0; background: #fafaf3; border: 1px solid #c8c4b0; border-left: 3px solid {{#switch:{{{color|}}}|ruby=#cc4444|emerald=#44aa66|sapphire=#4477bb|topaz=#cca844|diamond=#bbb|#98b}}; font-family: Georgia, serif; box-shadow: 2px 2px 0 rgba(0,0,0,0.05); vertical-align: top; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, Consolas, monospace; font-size: 0.7em; letter-spacing: 0.18em; color: #888; text-transform: uppercase;&amp;quot;&amp;gt;Set Stone &amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; Set {{{set|?}}}{{#if:{{{shape|}}}|&amp;amp;nbsp;&amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; {{{shape}}}|}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.05em; margin: 0.4em 0 0.15em 0; font-weight: 600;&amp;quot;&amp;gt;{{#if:{{{song|}}}|{{{song}}}|&amp;lt;span style=&amp;quot;color:#aaa; font-style:italic; font-weight:400;&amp;quot;&amp;gt;song TBD&amp;lt;/span&amp;gt;}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-style: italic; color: #666; font-size: 0.85em;&amp;quot;&amp;gt;from [[{{{show}}}]]&amp;lt;/div&amp;gt;{{#if:{{{price|}}}|&amp;lt;div style=&amp;quot;margin-top: 0.5em; border-top: 1px dashed #c8c4b0; padding-top: 0.4em; font-family: &#039;SF Mono&#039;, monospace; font-size: 0.72em; letter-spacing: 0.1em; text-transform: uppercase; color: #555;&amp;quot;&amp;gt;Price &amp;lt;span style=&amp;quot;font-weight:600; color:#333;&amp;quot;&amp;gt;{{{price}}} Ξ&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;|}}{{#if:{{{owner|}}}|&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, monospace; font-size: 0.7em; color: #228b22; margin-top: 0.3em; letter-spacing: 0.1em; text-transform: uppercase;&amp;quot;&amp;gt;Held by &#039;&#039;&#039;{{{owner}}}&#039;&#039;&#039;&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Set stone of show={{{show}}}}}{{#set:Set number={{{set|}}}}}{{#set:Set stone shape={{{shape|}}}}}{{#set:Set stone color={{{color|}}}}}{{#if:{{{song|}}}|{{#set:Song={{{song}}}}}|}}[[Category:Set stones]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Template:SetStone&amp;diff=5300</id>
		<title>Candidate:Template:SetStone</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Template:SetStone&amp;diff=5300"/>
		<updated>2026-06-04T21:59:26Z</updated>

		<summary type="html">&lt;p&gt;Magent: Draft Template:SetStone for display of set stone NFTs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SetStone&#039;&#039;&#039; - Display template for a Set Stone NFT representing ownership of a song from a specific set.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{SetStone&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|set=1&lt;br /&gt;
|shape=diamond&lt;br /&gt;
|color=ruby&lt;br /&gt;
|song=The Two Sisters&lt;br /&gt;
|price=0.05&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{SetStone&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|set=2&lt;br /&gt;
|shape=triangle&lt;br /&gt;
|color=emerald&lt;br /&gt;
|song=Power Underneath&lt;br /&gt;
|price=0.05&lt;br /&gt;
|owner=jMyles&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;show&#039;&#039;&#039; (required) - Wiki page of the show&lt;br /&gt;
* &#039;&#039;&#039;set&#039;&#039;&#039; (required) - Set number (1, 2, 3...)&lt;br /&gt;
* &#039;&#039;&#039;shape&#039;&#039;&#039; (optional) - Stone shape: &amp;lt;code&amp;gt;diamond&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;triangle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;circle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;square&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hexagon&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; (optional) - Stone color: &amp;lt;code&amp;gt;ruby&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;emerald&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sapphire&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;topaz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;diamond&amp;lt;/code&amp;gt; (clear), or any hex code with a leading &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;song&#039;&#039;&#039; (optional) - Song this stone represents&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Mint price in ETH (numeric only, the Ξ is added by the template)&lt;br /&gt;
* &#039;&#039;&#039;owner&#039;&#039;&#039; (optional) - Current holder of the stone&lt;br /&gt;
&lt;br /&gt;
=== SMW properties set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone of show&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set number&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone shape&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Set stone color&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Song&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Show]]&lt;br /&gt;
* [[Template:TicketStub]]&lt;br /&gt;
* [[Category:Set stones]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;set-stone&amp;quot; style=&amp;quot;display: inline-block; width: 18em; padding: 0.8em 1em; margin: 0.5em 0.5em 0.5em 0; background: #fafaf3; border: 1px solid #c8c4b0; border-left: 3px solid {{#switch:{{{color|}}}|ruby=#cc4444|emerald=#44aa66|sapphire=#4477bb|topaz=#cca844|diamond=#bbb|#98b}}; font-family: Georgia, serif; box-shadow: 2px 2px 0 rgba(0,0,0,0.05); vertical-align: top; position: relative;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, Consolas, monospace; font-size: 0.7em; letter-spacing: 0.18em; color: #888; text-transform: uppercase;&amp;quot;&amp;gt;Set Stone &amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; Set {{{set|?}}}{{#if:{{{shape|}}}| &amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; {{{shape}}}|}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.05em; margin: 0.4em 0 0.15em 0; font-weight: 600;&amp;quot;&amp;gt;{{#if:{{{song|}}}|{{{song}}}|&amp;lt;span style=&amp;quot;color:#aaa; font-style:italic; font-weight:400;&amp;quot;&amp;gt;song TBD&amp;lt;/span&amp;gt;}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-style: italic; color: #666; font-size: 0.85em;&amp;quot;&amp;gt;from [[{{{show}}}]]&amp;lt;/div&amp;gt;{{#if:{{{price|}}}|&amp;lt;div style=&amp;quot;margin-top: 0.5em; border-top: 1px dashed #c8c4b0; padding-top: 0.4em; font-family: &#039;SF Mono&#039;, monospace; font-size: 0.72em; letter-spacing: 0.1em; text-transform: uppercase; color: #555;&amp;quot;&amp;gt;Price &amp;lt;span style=&amp;quot;font-weight:600; color:#333;&amp;quot;&amp;gt;{{{price}}} Ξ&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;|}}{{#if:{{{owner|}}}|&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, monospace; font-size: 0.7em; color: #228b22; margin-top: 0.3em; letter-spacing: 0.1em; text-transform: uppercase;&amp;quot;&amp;gt;Held by &#039;&#039;&#039;{{{owner}}}&#039;&#039;&#039;&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Set stone of show={{{show}}}}}{{#set:Set number={{{set|}}}}}{{#set:Set stone shape={{{shape|}}}}}{{#set:Set stone color={{{color|}}}}}{{#if:{{{song|}}}|{{#set:Song={{{song}}}}}|}}[[Category:Set stones]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Template:TicketStub&amp;diff=5299</id>
		<title>Candidate:Template:TicketStub</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Template:TicketStub&amp;diff=5299"/>
		<updated>2026-06-04T21:59:25Z</updated>

		<summary type="html">&lt;p&gt;Magent: Draft Template:TicketStub for display of paper/digital ticket stubs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TicketStub&#039;&#039;&#039; - Display template for a physical paper ticket stub from a show.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{TicketStub&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|stubId=001&lt;br /&gt;
|status=unclaimed&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{TicketStub&lt;br /&gt;
|show=Show:JustinHolmes-25255000&lt;br /&gt;
|stubId=001&lt;br /&gt;
|status=claimed&lt;br /&gt;
|claimed_by=jMyles&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;show&#039;&#039;&#039; (required) - Wiki page of the show this stub belongs to (e.g., &amp;lt;code&amp;gt;Show:JustinHolmes-25255000&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;stubId&#039;&#039;&#039; (required) - The token/serial number of this stub (e.g., &amp;lt;code&amp;gt;001&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;042&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;status&#039;&#039;&#039; (optional) - &amp;lt;code&amp;gt;unclaimed&amp;lt;/code&amp;gt; (default), &amp;lt;code&amp;gt;claimed&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;claimed_by&#039;&#039;&#039; (optional) - Who currently holds the claimed stub&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039; (optional) - Show date, human-readable&lt;br /&gt;
* &#039;&#039;&#039;venue&#039;&#039;&#039; (optional) - Venue name, for stubs displayed away from the show page&lt;br /&gt;
&lt;br /&gt;
=== SMW properties set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Ticket stub of show&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Stub ID&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Stub status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Show]]&lt;br /&gt;
* [[Template:SetStone]]&lt;br /&gt;
* [[Category:Ticket stubs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;ticket-stub&amp;quot; style=&amp;quot;display: inline-block; width: 18em; padding: 0.8em 1em; margin: 0.5em 0.5em 0.5em 0; background: #fafaf3; border: 1px solid #c8c4b0; border-left: 3px solid #98b; font-family: Georgia, serif; box-shadow: 2px 2px 0 rgba(0,0,0,0.05); vertical-align: top;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, Consolas, monospace; font-size: 0.7em; letter-spacing: 0.18em; color: #888; text-transform: uppercase;&amp;quot;&amp;gt;Ticket Stub &amp;lt;span style=&amp;quot;color:#bbb&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; #{{{stubId}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.05em; margin: 0.4em 0 0.15em 0; font-weight: 600;&amp;quot;&amp;gt;[[{{{show}}}]]&amp;lt;/div&amp;gt;{{#if:{{{venue|}}}|&amp;lt;div style=&amp;quot;font-style: italic; color: #666; font-size: 0.85em; margin-bottom: 0.15em;&amp;quot;&amp;gt;{{{venue}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{date|}}}|&amp;lt;div style=&amp;quot;font-family: &#039;SF Mono&#039;, monospace; font-size: 0.7em; color: #777; text-transform: uppercase; letter-spacing: 0.12em; margin-top: 0.3em;&amp;quot;&amp;gt;{{{date}}}&amp;lt;/div&amp;gt;|}}&amp;lt;div style=&amp;quot;margin-top: 0.6em; border-top: 1px dashed #c8c4b0; padding-top: 0.4em; font-family: &#039;SF Mono&#039;, monospace; font-size: 0.72em; letter-spacing: 0.1em; text-transform: uppercase;&amp;quot;&amp;gt;{{#ifeq:{{{status|unclaimed}}}|claimed|&amp;lt;span style=&amp;quot;color: #228b22;&amp;quot;&amp;gt;&amp;amp;#10003; Claimed{{#if:{{{claimed_by|}}}| by &#039;&#039;&#039;{{{claimed_by}}}&#039;&#039;&#039;|}}&amp;lt;/span&amp;gt;|&amp;lt;span style=&amp;quot;color: #aaa;&amp;quot;&amp;gt;&amp;amp;#9675; Unclaimed&amp;lt;/span&amp;gt;}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;{{#set:Ticket stub of show={{{show}}}}}{{#set:Stub ID={{{stubId}}}}}{{#set:Stub status={{{status|unclaimed}}}}}[[Category:Ticket stubs]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5296</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5296"/>
		<updated>2026-06-02T21:01:29Z</updated>

		<summary type="html">&lt;p&gt;Magent: v6: .pp-image-link styling to strip body-link gradient from the wrapping anchor&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
/* Human-readable date kicker — bigger than the technical kicker so it&lt;br /&gt;
   reads as the answer to &amp;quot;when is this show?&amp;quot;. */&lt;br /&gt;
.pickipedia-show .show-poster .pp-date-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin: 0 0 8px;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
/* Ensemble blocks ({{Ensemble|...}}) render in their source position on&lt;br /&gt;
   the page — typically right under {{Show}} — and float right next to&lt;br /&gt;
   the body content. The default Template:Ensemble inline styles give a&lt;br /&gt;
   gray-box infobox look; the rules below override those inline styles&lt;br /&gt;
   (with !important) to match the takeover palette. */&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  border-left: 2px solid var(--pp-accent) !important;&lt;br /&gt;
  width: 15em !important;&lt;br /&gt;
  padding: 4px 0 4px 16px !important;&lt;br /&gt;
  margin: 8px 0 16px 28px !important;&lt;br /&gt;
  float: right !important;&lt;br /&gt;
  clear: right !important;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox &amp;gt; div:first-child {&lt;br /&gt;
  /* Header row carries the band name (or &amp;quot;Ensemble&amp;quot; default). */&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  color: var(--pp-accent) !important;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: left !important;&lt;br /&gt;
  margin: 0 0 10px !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox &amp;gt; div:nth-child(2) {&lt;br /&gt;
  /* Member list — one per line (already separated by &amp;lt;br&amp;gt;), serif italic,&lt;br /&gt;
     instrument icons preserved. */&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 17px;&lt;br /&gt;
  line-height: 1.7 !important;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border-bottom-color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
/* The {{m|name|instrument}} icon is a tiny rotated image inline with&lt;br /&gt;
   the name. Slightly nudge it for vertical balance. */&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox img {&lt;br /&gt;
  vertical-align: baseline;&lt;br /&gt;
}&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  /* On mobile, stop floating and let it stack full-width above content. */&lt;br /&gt;
  .pickipedia-show.has-show-hero .ensemble-infobox {&lt;br /&gt;
    float: none !important;&lt;br /&gt;
    width: auto !important;&lt;br /&gt;
    margin: 8px 0 16px !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image {&lt;br /&gt;
  margin: 28px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
/* Clickable poster: image already shows a pointer cursor inside an&lt;br /&gt;
   &amp;lt;a&amp;gt;, but we strip the body-link underline-by-bg gradient that would&lt;br /&gt;
   bleed onto the image otherwise. */&lt;br /&gt;
.pickipedia-show .show-poster .pp-image .pp-image-link {&lt;br /&gt;
  display: block;&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* (Previously we absorbed ensemble infoboxes into the hero; now they&lt;br /&gt;
   render in source position, so no .is-absorbed hiding rule is needed.) */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Full-takeover layout for Show: pages with hero&lt;br /&gt;
 *&lt;br /&gt;
 * Only fires when .pickipedia-show AND .has-show-hero (i.e.,&lt;br /&gt;
 * Template:Show is present). Bare Show: pages keep their wiki&lt;br /&gt;
 * chrome — the setlist typography from the base section still&lt;br /&gt;
 * applies.&lt;br /&gt;
 *&lt;br /&gt;
 * The DOM additions (corner logo, topbar) are inserted by&lt;br /&gt;
 * Gadget-pickipedia-show.js. The patterns here mirror what&lt;br /&gt;
 * .pickipedia-userpost does, so future deduping into a shared&lt;br /&gt;
 * .pickipedia-publication base class stays straightforward.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #column-one,&lt;br /&gt;
.pickipedia-show.has-show-hero #sidebar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-panel,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-main-menu-container,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-toolbar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-navigation .portal,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-sidebar-container,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-views,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions-mobile,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-personal,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-logo,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-tools,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-footer,&lt;br /&gt;
.pickipedia-show.has-show-hero #footer,&lt;br /&gt;
.pickipedia-show.has-show-hero .printfooter,&lt;br /&gt;
.pickipedia-show.has-show-hero .catlinks,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-indicators,&lt;br /&gt;
.pickipedia-show.has-show-hero #siteSub,&lt;br /&gt;
.pickipedia-show.has-show-hero #contentSub,&lt;br /&gt;
.pickipedia-show.has-show-hero .subpages,&lt;br /&gt;
.pickipedia-show.has-show-hero #jump-to-nav,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #globalWrapper,&lt;br /&gt;
.pickipedia-show.has-show-hero #column-content,&lt;br /&gt;
.pickipedia-show.has-show-hero .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #content,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-body,&lt;br /&gt;
.pickipedia-show.has-show-hero #bodyContent,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-left,&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-right {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Centered content column ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output {&lt;br /&gt;
  max-width: 720px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 8px 24px 80px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 22px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a:hover { color: var(--pp-accent); }&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Setlist links shouldn&#039;t get the body-paragraph underline treatment —&lt;br /&gt;
 * they live inside numbered list items and already get serif styling. */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output ul li a {&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
    padding-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5295</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5295"/>
		<updated>2026-06-02T21:01:28Z</updated>

		<summary type="html">&lt;p&gt;Magent: v6: wrap poster image in anchor to File: page (uses same href as infobox)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists      = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue        = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var date         = fieldValue(&#039;Date&#039;);&lt;br /&gt;
  var showtime     = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var doors        = fieldValue(&#039;Doors&#039;);&lt;br /&gt;
  var show         = fieldValue(&#039;Show&#039;);&lt;br /&gt;
  var posterArtist = fieldValue(&#039;Poster art&#039;);&lt;br /&gt;
  var tickets      = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price        = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages         = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Big date kicker (human-readable) on its own line, above the smaller&lt;br /&gt;
  // technical kicker with block/doors/show.&lt;br /&gt;
  var dateKickerHtml = date&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-date-kicker&amp;quot;&amp;gt;&#039; + escapeHtml(date) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
  if (doors) kickerBits.push(&#039;Doors &#039; + doors);&lt;br /&gt;
  if (show)  kickerBits.push(&#039;Show &#039; + show);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Ensembles ({{Ensemble|...}} blocks) are intentionally NOT absorbed into&lt;br /&gt;
  // the hero — they render in their source position on the page so the&lt;br /&gt;
  // wikitext author controls placement. The CSS in this gadget restyles&lt;br /&gt;
  // the existing .ensemble-infobox to fit the takeover aesthetic (right-&lt;br /&gt;
  // floating, paper-themed, mono-caps title, instrument icons inline).&lt;br /&gt;
  var ensembleHtml = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Upgrade the poster thumbnail: Template:Show renders [[File:foo|220px]]&lt;br /&gt;
  // which gives us /images/thumb/.../220px-foo.png inside an &amp;lt;a&amp;gt; linking&lt;br /&gt;
  // to the File: page. We grab that anchor&#039;s href so clicking the big&lt;br /&gt;
  // hero poster takes the user to the File: page (where the upload&lt;br /&gt;
  // history, full-res download, and license info live). The thumbnail&lt;br /&gt;
  // URL gets upsized from /220px-/ to /800px- for a sharper render; CSS&lt;br /&gt;
  // scales it to fit the card. SVGs and other non-thumbnailed files&lt;br /&gt;
  // keep their original src.&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    var bigSrc = imageImg.src.replace(/\/(\d+)px-/, &#039;/800px-&#039;);&lt;br /&gt;
    var imageAnchor = imageImg.closest(&#039;a&#039;);&lt;br /&gt;
    var imageHref = imageAnchor ? imageAnchor.getAttribute(&#039;href&#039;) : &#039;&#039;;&lt;br /&gt;
    var imgTag = &#039;&amp;lt;img src=&amp;quot;&#039; + bigSrc + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
      escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    var wrapped = imageHref&lt;br /&gt;
      ? &#039;&amp;lt;a class=&amp;quot;pp-image-link&amp;quot; href=&amp;quot;&#039; + imageHref +&lt;br /&gt;
        &#039;&amp;quot; title=&amp;quot;View file details&amp;quot;&amp;gt;&#039; + imgTag + &#039;&amp;lt;/a&amp;gt;&#039;&lt;br /&gt;
      : imgTag;&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&#039; + wrapped +&lt;br /&gt;
      (posterArtist&lt;br /&gt;
        ? &#039;&amp;lt;p class=&amp;quot;pp-poster-credit&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pp-poster-credit-label&amp;quot;&amp;gt;Poster art by&amp;lt;/span&amp;gt; &#039; +&lt;br /&gt;
            escapeHtml(posterArtist) + &#039;&amp;lt;/p&amp;gt;&#039;&lt;br /&gt;
        : &#039;&#039;) +&lt;br /&gt;
      &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    dateKickerHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Full-takeover chrome: corner logo + slim topbar ----------&lt;br /&gt;
  // Only fires when the hero was built (Template:Show present). The CSS&lt;br /&gt;
  // chrome-hiding rules are gated by .has-show-hero so bare Show: pages&lt;br /&gt;
  // keep their wiki sidebar; if you want to make those takeover too,&lt;br /&gt;
  // remove the .has-show-hero gating from the CSS file.&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(cornerLogo, body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  var topbar = document.createElement(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-show-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-left&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Category:Shows&#039;) + &#039;&amp;quot;&amp;gt;← All shows&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-right&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(topbar, cornerLogo.nextSibling);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5289</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5289"/>
		<updated>2026-06-02T20:53:19Z</updated>

		<summary type="html">&lt;p&gt;Magent: v5: restyle .ensemble-infobox in place (right-float, vertical, paper-themed, icons inline)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
/* Human-readable date kicker — bigger than the technical kicker so it&lt;br /&gt;
   reads as the answer to &amp;quot;when is this show?&amp;quot;. */&lt;br /&gt;
.pickipedia-show .show-poster .pp-date-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin: 0 0 8px;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
/* Ensemble blocks ({{Ensemble|...}}) render in their source position on&lt;br /&gt;
   the page — typically right under {{Show}} — and float right next to&lt;br /&gt;
   the body content. The default Template:Ensemble inline styles give a&lt;br /&gt;
   gray-box infobox look; the rules below override those inline styles&lt;br /&gt;
   (with !important) to match the takeover palette. */&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox {&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  border-left: 2px solid var(--pp-accent) !important;&lt;br /&gt;
  width: 15em !important;&lt;br /&gt;
  padding: 4px 0 4px 16px !important;&lt;br /&gt;
  margin: 8px 0 16px 28px !important;&lt;br /&gt;
  float: right !important;&lt;br /&gt;
  clear: right !important;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox &amp;gt; div:first-child {&lt;br /&gt;
  /* Header row carries the band name (or &amp;quot;Ensemble&amp;quot; default). */&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
  color: var(--pp-accent) !important;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
  text-align: left !important;&lt;br /&gt;
  margin: 0 0 10px !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox &amp;gt; div:nth-child(2) {&lt;br /&gt;
  /* Member list — one per line (already separated by &amp;lt;br&amp;gt;), serif italic,&lt;br /&gt;
     instrument icons preserved. */&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 17px;&lt;br /&gt;
  line-height: 1.7 !important;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border-bottom-color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
/* The {{m|name|instrument}} icon is a tiny rotated image inline with&lt;br /&gt;
   the name. Slightly nudge it for vertical balance. */&lt;br /&gt;
.pickipedia-show.has-show-hero .ensemble-infobox img {&lt;br /&gt;
  vertical-align: baseline;&lt;br /&gt;
}&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  /* On mobile, stop floating and let it stack full-width above content. */&lt;br /&gt;
  .pickipedia-show.has-show-hero .ensemble-infobox {&lt;br /&gt;
    float: none !important;&lt;br /&gt;
    width: auto !important;&lt;br /&gt;
    margin: 8px 0 16px !important;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image {&lt;br /&gt;
  margin: 28px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* (Previously we absorbed ensemble infoboxes into the hero; now they&lt;br /&gt;
   render in source position, so no .is-absorbed hiding rule is needed.) */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Full-takeover layout for Show: pages with hero&lt;br /&gt;
 *&lt;br /&gt;
 * Only fires when .pickipedia-show AND .has-show-hero (i.e.,&lt;br /&gt;
 * Template:Show is present). Bare Show: pages keep their wiki&lt;br /&gt;
 * chrome — the setlist typography from the base section still&lt;br /&gt;
 * applies.&lt;br /&gt;
 *&lt;br /&gt;
 * The DOM additions (corner logo, topbar) are inserted by&lt;br /&gt;
 * Gadget-pickipedia-show.js. The patterns here mirror what&lt;br /&gt;
 * .pickipedia-userpost does, so future deduping into a shared&lt;br /&gt;
 * .pickipedia-publication base class stays straightforward.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #column-one,&lt;br /&gt;
.pickipedia-show.has-show-hero #sidebar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-panel,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-main-menu-container,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-toolbar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-navigation .portal,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-sidebar-container,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-views,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions-mobile,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-personal,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-logo,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-tools,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-footer,&lt;br /&gt;
.pickipedia-show.has-show-hero #footer,&lt;br /&gt;
.pickipedia-show.has-show-hero .printfooter,&lt;br /&gt;
.pickipedia-show.has-show-hero .catlinks,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-indicators,&lt;br /&gt;
.pickipedia-show.has-show-hero #siteSub,&lt;br /&gt;
.pickipedia-show.has-show-hero #contentSub,&lt;br /&gt;
.pickipedia-show.has-show-hero .subpages,&lt;br /&gt;
.pickipedia-show.has-show-hero #jump-to-nav,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #globalWrapper,&lt;br /&gt;
.pickipedia-show.has-show-hero #column-content,&lt;br /&gt;
.pickipedia-show.has-show-hero .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #content,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-body,&lt;br /&gt;
.pickipedia-show.has-show-hero #bodyContent,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-left,&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-right {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Centered content column ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output {&lt;br /&gt;
  max-width: 720px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 8px 24px 80px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 22px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a:hover { color: var(--pp-accent); }&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Setlist links shouldn&#039;t get the body-paragraph underline treatment —&lt;br /&gt;
 * they live inside numbered list items and already get serif styling. */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output ul li a {&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
    padding-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5288</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5288"/>
		<updated>2026-06-02T20:53:19Z</updated>

		<summary type="html">&lt;p&gt;Magent: v5: stop absorbing {{Ensemble}} — let it render in source position&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists      = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue        = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var date         = fieldValue(&#039;Date&#039;);&lt;br /&gt;
  var showtime     = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var doors        = fieldValue(&#039;Doors&#039;);&lt;br /&gt;
  var show         = fieldValue(&#039;Show&#039;);&lt;br /&gt;
  var posterArtist = fieldValue(&#039;Poster art&#039;);&lt;br /&gt;
  var tickets      = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price        = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages         = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Big date kicker (human-readable) on its own line, above the smaller&lt;br /&gt;
  // technical kicker with block/doors/show.&lt;br /&gt;
  var dateKickerHtml = date&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-date-kicker&amp;quot;&amp;gt;&#039; + escapeHtml(date) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
  if (doors) kickerBits.push(&#039;Doors &#039; + doors);&lt;br /&gt;
  if (show)  kickerBits.push(&#039;Show &#039; + show);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Ensembles ({{Ensemble|...}} blocks) are intentionally NOT absorbed into&lt;br /&gt;
  // the hero — they render in their source position on the page so the&lt;br /&gt;
  // wikitext author controls placement. The CSS in this gadget restyles&lt;br /&gt;
  // the existing .ensemble-infobox to fit the takeover aesthetic (right-&lt;br /&gt;
  // floating, paper-themed, mono-caps title, instrument icons inline).&lt;br /&gt;
  var ensembleHtml = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Upgrade the poster thumbnail: Template:Show renders [[File:foo|220px]]&lt;br /&gt;
  // which gives us /images/thumb/.../220px-foo.png. We replace the 220px&lt;br /&gt;
  // segment with 800px to request a larger thumbnail; CSS scales it to&lt;br /&gt;
  // fit the card. If the URL doesn&#039;t match the thumb pattern (e.g. SVG,&lt;br /&gt;
  // or non-thumbnailed file), we just use the original src.&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    var bigSrc = imageImg.src.replace(/\/(\d+)px-/, &#039;/800px-&#039;);&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + bigSrc +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      (posterArtist&lt;br /&gt;
        ? &#039;&amp;lt;p class=&amp;quot;pp-poster-credit&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pp-poster-credit-label&amp;quot;&amp;gt;Poster art by&amp;lt;/span&amp;gt; &#039; +&lt;br /&gt;
            escapeHtml(posterArtist) + &#039;&amp;lt;/p&amp;gt;&#039;&lt;br /&gt;
        : &#039;&#039;) +&lt;br /&gt;
      &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    dateKickerHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Full-takeover chrome: corner logo + slim topbar ----------&lt;br /&gt;
  // Only fires when the hero was built (Template:Show present). The CSS&lt;br /&gt;
  // chrome-hiding rules are gated by .has-show-hero so bare Show: pages&lt;br /&gt;
  // keep their wiki sidebar; if you want to make those takeover too,&lt;br /&gt;
  // remove the .has-show-hero gating from the CSS file.&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(cornerLogo, body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  var topbar = document.createElement(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-show-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-left&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Category:Shows&#039;) + &#039;&amp;quot;&amp;gt;← All shows&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-right&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(topbar, cornerLogo.nextSibling);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5285</id>
		<title>Show:JustinHolmes-25254342</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5285"/>
		<updated>2026-06-02T20:43:25Z</updated>

		<summary type="html">&lt;p&gt;Magent: Add date= field (with bot-marker comment at bottom; safe to strip)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Show&lt;br /&gt;
|artists=Justin Myles Holmes&lt;br /&gt;
|venue=The Bundy Museum&lt;br /&gt;
|blockheight=25247741&lt;br /&gt;
|date=Friday, June 5, 2026&lt;br /&gt;
|official_poster=6 5 26 BUNDY POSTER-rev2.png&lt;br /&gt;
|poster_artist=Skyler Golden and Justin Myles Holmes&lt;br /&gt;
|doors_time=7:00 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|price=10&lt;br /&gt;
|ages=All ages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Justin Holmes&lt;br /&gt;
|Skyler Golden&lt;br /&gt;
|Christina Docenko&lt;br /&gt;
|Paul Sanna&lt;br /&gt;
|Fibonacci Emery Holmes&lt;br /&gt;
|title=Justin Myles Holmes and The Immutable String Band&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot-verification marker; safe to remove when Justin reviews --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5284</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5284"/>
		<updated>2026-06-02T20:43:03Z</updated>

		<summary type="html">&lt;p&gt;Magent: v4: .pp-date-kicker, restructured .pp-ensemble (title + members tiers), icon nudges&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
/* Human-readable date kicker — bigger than the technical kicker so it&lt;br /&gt;
   reads as the answer to &amp;quot;when is this show?&amp;quot;. */&lt;br /&gt;
.pickipedia-show .show-poster .pp-date-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin: 0 0 8px;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  padding: 16px 0 0;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble + .pp-ensemble {&lt;br /&gt;
  /* Subsequent ensemble blocks (opener, sit-ins) — same separator but&lt;br /&gt;
     tighter top spacing since the first one already gave the section&lt;br /&gt;
     visual room. */&lt;br /&gt;
  margin-top: 14px;&lt;br /&gt;
  padding-top: 12px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble-title {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 6px;&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble-members {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 17px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble-members .pp-sep {&lt;br /&gt;
  color: var(--pp-rule);&lt;br /&gt;
  font-style: normal;&lt;br /&gt;
  margin: 0 4px;&lt;br /&gt;
}&lt;br /&gt;
/* Template:m emits a 9-18px instrument icon. Nudge it slightly so it&lt;br /&gt;
   sits clean next to the italicised name. */&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble-members img {&lt;br /&gt;
  vertical-align: baseline;&lt;br /&gt;
  margin: 0 0 0 3px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble-members a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble-members a:hover {&lt;br /&gt;
  border-bottom-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image {&lt;br /&gt;
  margin: 28px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide the floated ensemble infoboxes once the hero has absorbed them. */&lt;br /&gt;
.pickipedia-show .ensemble-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Full-takeover layout for Show: pages with hero&lt;br /&gt;
 *&lt;br /&gt;
 * Only fires when .pickipedia-show AND .has-show-hero (i.e.,&lt;br /&gt;
 * Template:Show is present). Bare Show: pages keep their wiki&lt;br /&gt;
 * chrome — the setlist typography from the base section still&lt;br /&gt;
 * applies.&lt;br /&gt;
 *&lt;br /&gt;
 * The DOM additions (corner logo, topbar) are inserted by&lt;br /&gt;
 * Gadget-pickipedia-show.js. The patterns here mirror what&lt;br /&gt;
 * .pickipedia-userpost does, so future deduping into a shared&lt;br /&gt;
 * .pickipedia-publication base class stays straightforward.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #column-one,&lt;br /&gt;
.pickipedia-show.has-show-hero #sidebar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-panel,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-main-menu-container,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-toolbar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-navigation .portal,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-sidebar-container,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-views,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions-mobile,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-personal,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-logo,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-tools,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-footer,&lt;br /&gt;
.pickipedia-show.has-show-hero #footer,&lt;br /&gt;
.pickipedia-show.has-show-hero .printfooter,&lt;br /&gt;
.pickipedia-show.has-show-hero .catlinks,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-indicators,&lt;br /&gt;
.pickipedia-show.has-show-hero #siteSub,&lt;br /&gt;
.pickipedia-show.has-show-hero #contentSub,&lt;br /&gt;
.pickipedia-show.has-show-hero .subpages,&lt;br /&gt;
.pickipedia-show.has-show-hero #jump-to-nav,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #globalWrapper,&lt;br /&gt;
.pickipedia-show.has-show-hero #column-content,&lt;br /&gt;
.pickipedia-show.has-show-hero .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #content,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-body,&lt;br /&gt;
.pickipedia-show.has-show-hero #bodyContent,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-left,&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-right {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Centered content column ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output {&lt;br /&gt;
  max-width: 720px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 8px 24px 80px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 22px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a:hover { color: var(--pp-accent); }&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Setlist links shouldn&#039;t get the body-paragraph underline treatment —&lt;br /&gt;
 * they live inside numbered list items and already get serif styling. */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output ul li a {&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
    padding-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5283</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5283"/>
		<updated>2026-06-02T20:43:03Z</updated>

		<summary type="html">&lt;p&gt;Magent: v4: date kicker; preserve ensemble HTML (icons + links); two-tier ensemble layout (band title + member list)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists      = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue        = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var date         = fieldValue(&#039;Date&#039;);&lt;br /&gt;
  var showtime     = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var doors        = fieldValue(&#039;Doors&#039;);&lt;br /&gt;
  var show         = fieldValue(&#039;Show&#039;);&lt;br /&gt;
  var posterArtist = fieldValue(&#039;Poster art&#039;);&lt;br /&gt;
  var tickets      = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price        = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages         = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Big date kicker (human-readable) on its own line, above the smaller&lt;br /&gt;
  // technical kicker with block/doors/show.&lt;br /&gt;
  var dateKickerHtml = date&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-date-kicker&amp;quot;&amp;gt;&#039; + escapeHtml(date) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
  if (doors) kickerBits.push(&#039;Doors &#039; + doors);&lt;br /&gt;
  if (show)  kickerBits.push(&#039;Show &#039; + show);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Ensembles: find every Template:Ensemble block on the page. Each renders&lt;br /&gt;
  // as a .ensemble-infobox with a colored header div (the band title) and&lt;br /&gt;
  // a body div with one musician per line (via Template:m, which inlines&lt;br /&gt;
  // a tiny instrument icon next to the linked musician name).&lt;br /&gt;
  //&lt;br /&gt;
  // We split on &amp;lt;br&amp;gt; and keep HTML chunks intact so the instrument icons&lt;br /&gt;
  // and User: links survive the absorb. Each ensemble renders as two&lt;br /&gt;
  // tiers: the band title on its own line (mono caps, accent), then the&lt;br /&gt;
  // member list below in serif italic with rule-dot separators.&lt;br /&gt;
  var ensembleBlocks = content.querySelectorAll(&#039;.ensemble-infobox&#039;);&lt;br /&gt;
  var ensembleHtml = &#039;&#039;;&lt;br /&gt;
  ensembleBlocks.forEach(function (eb) {&lt;br /&gt;
    var bandName = &#039;&#039;;&lt;br /&gt;
    var headerEl = eb.querySelector(&#039;div:first-child&#039;);&lt;br /&gt;
    if (headerEl) bandName = headerEl.textContent.trim();&lt;br /&gt;
&lt;br /&gt;
    var listEl = eb.querySelector(&#039;div:nth-child(2)&#039;);&lt;br /&gt;
    if (!listEl) return;&lt;br /&gt;
&lt;br /&gt;
    var members = listEl.innerHTML&lt;br /&gt;
      .split(/&amp;lt;br\s*\/?&amp;gt;/i)&lt;br /&gt;
      .map(function (chunk) { return chunk.trim(); })&lt;br /&gt;
      .filter(Boolean);&lt;br /&gt;
    if (!members.length) return;&lt;br /&gt;
&lt;br /&gt;
    var titleText = (bandName &amp;amp;&amp;amp; bandName.toLowerCase() !== &#039;ensemble&#039;)&lt;br /&gt;
      ? bandName : &#039;Featuring&#039;;&lt;br /&gt;
&lt;br /&gt;
    ensembleHtml +=&lt;br /&gt;
      &#039;&amp;lt;div class=&amp;quot;pp-ensemble&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;p class=&amp;quot;pp-ensemble-title&amp;quot;&amp;gt;&#039; + escapeHtml(titleText) + &#039;&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;p class=&amp;quot;pp-ensemble-members&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          members.join(&#039; &amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; &#039;) +&lt;br /&gt;
        &#039;&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    eb.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Upgrade the poster thumbnail: Template:Show renders [[File:foo|220px]]&lt;br /&gt;
  // which gives us /images/thumb/.../220px-foo.png. We replace the 220px&lt;br /&gt;
  // segment with 800px to request a larger thumbnail; CSS scales it to&lt;br /&gt;
  // fit the card. If the URL doesn&#039;t match the thumb pattern (e.g. SVG,&lt;br /&gt;
  // or non-thumbnailed file), we just use the original src.&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    var bigSrc = imageImg.src.replace(/\/(\d+)px-/, &#039;/800px-&#039;);&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + bigSrc +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      (posterArtist&lt;br /&gt;
        ? &#039;&amp;lt;p class=&amp;quot;pp-poster-credit&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pp-poster-credit-label&amp;quot;&amp;gt;Poster art by&amp;lt;/span&amp;gt; &#039; +&lt;br /&gt;
            escapeHtml(posterArtist) + &#039;&amp;lt;/p&amp;gt;&#039;&lt;br /&gt;
        : &#039;&#039;) +&lt;br /&gt;
      &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    dateKickerHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    ensembleHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Full-takeover chrome: corner logo + slim topbar ----------&lt;br /&gt;
  // Only fires when the hero was built (Template:Show present). The CSS&lt;br /&gt;
  // chrome-hiding rules are gated by .has-show-hero so bare Show: pages&lt;br /&gt;
  // keep their wiki sidebar; if you want to make those takeover too,&lt;br /&gt;
  // remove the .has-show-hero gating from the CSS file.&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(cornerLogo, body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  var topbar = document.createElement(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-show-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-left&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Category:Shows&#039;) + &#039;&amp;quot;&amp;gt;← All shows&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-right&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(topbar, cornerLogo.nextSibling);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5282</id>
		<title>Template:Show</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5282"/>
		<updated>2026-06-02T20:43:03Z</updated>

		<summary type="html">&lt;p&gt;Magent: Add &amp;#039;date&amp;#039; field (human-readable date string, alongside blockheight as canonical)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker (kept in noinclude so it doesn&#039;t transclude) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Show&#039;&#039;&#039; - Structured data template for performances/concerts.&lt;br /&gt;
&lt;br /&gt;
Uses Ethereum blockheight as the canonical timestamp anchor.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Show&lt;br /&gt;
|artists=Billy Strings&lt;br /&gt;
|venue=The Station Inn&lt;br /&gt;
|blockheight=24140272&lt;br /&gt;
|official_poster=Show-poster.jpg&lt;br /&gt;
|doors_time=7:30 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|ensemble=Billy Strings; Jarrod Walker; Royal Masat; Alex Hargreaves&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Tea&lt;br /&gt;
|source=stationinn.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must manually add &amp;lt;nowiki&amp;gt;[[Category:Shows]]&amp;lt;/nowiki&amp;gt; to pages using this template (SMW bug workaround).&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;artists&#039;&#039;&#039; (required) - Performing artist(s); the headlining name as it appears on the poster&lt;br /&gt;
* &#039;&#039;&#039;venue&#039;&#039;&#039; (required) - Venue name (should match a venue page)&lt;br /&gt;
* &#039;&#039;&#039;blockheight&#039;&#039;&#039; (required) - Ethereum block height when the show started/starts&lt;br /&gt;
* &#039;&#039;&#039;official_poster&#039;&#039;&#039; (optional) - Filename of the official show poster (e.g., &amp;quot;Show-poster.jpg&amp;quot;). Takes priority over &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;image&#039;&#039;&#039; (optional, deprecated) - Older alias for &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt; on new pages.&lt;br /&gt;
* &#039;&#039;&#039;date&#039;&#039;&#039; (optional) - Human-readable date string (e.g., &amp;quot;Friday, June 5, 2026&amp;quot;). The &amp;lt;code&amp;gt;blockheight&amp;lt;/code&amp;gt; is the canonical anchor; &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; is what humans want to read.&lt;br /&gt;
* &#039;&#039;&#039;doors_time&#039;&#039;&#039; (optional) - Door time as displayed text (e.g., &amp;quot;7:30 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;show_time&#039;&#039;&#039; (optional) - Show start time as displayed text (e.g., &amp;quot;8:00 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;poster_artist&#039;&#039;&#039; (optional) - Credit for the graphic designer who made the official poster&lt;br /&gt;
&lt;br /&gt;
For listing the musicians, use {{tl|Ensemble}} as a separate block on the page (one per band — headliner, openers, sit-ins).&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (optional) - Custom title for social sharing (defaults to &amp;quot;artists at venue - PickiPedia&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;status&#039;&#039;&#039; (optional) - &amp;quot;proposed&amp;quot; for bot-proposed, &amp;quot;verified&amp;quot; for human-verified, blank for unverified&lt;br /&gt;
* &#039;&#039;&#039;by&#039;&#039;&#039; (optional) - Who proposed/verified this&lt;br /&gt;
* &#039;&#039;&#039;source&#039;&#039;&#039; (optional) - Source for verification&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Ticket price&lt;br /&gt;
* &#039;&#039;&#039;tickets&#039;&#039;&#039; (optional) - Ticket purchase URL&lt;br /&gt;
* &#039;&#039;&#039;ages&#039;&#039;&#039; (optional) - Age restriction (e.g., &amp;quot;21+&amp;quot;, &amp;quot;All ages&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039; (optional) - Short description for social sharing cards&lt;br /&gt;
&lt;br /&gt;
=== SMW Properties Set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Artist&amp;lt;/code&amp;gt; - The artist(s)&lt;br /&gt;
* &amp;lt;code&amp;gt;Venue&amp;lt;/code&amp;gt; - The venue&lt;br /&gt;
* &amp;lt;code&amp;gt;Blockheight&amp;lt;/code&amp;gt; - The block height timestamp&lt;br /&gt;
* &amp;lt;code&amp;gt;Poster artist&amp;lt;/code&amp;gt; - Graphic designer credit, if provided&lt;br /&gt;
* &amp;lt;code&amp;gt;Verification status&amp;lt;/code&amp;gt; - proposed/verified/unverified&lt;br /&gt;
&lt;br /&gt;
For per-musician &amp;lt;code&amp;gt;Performer&amp;lt;/code&amp;gt; SMW properties, use {{tl|Ensemble}} — it sets them on a per-band basis.&lt;br /&gt;
&lt;br /&gt;
== Page naming ==&lt;br /&gt;
Show pages should be named: &amp;lt;code&amp;gt;Show:ArtistName-blockheight&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings-24140272&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings_DelMcCouryBand-24140500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Bot_proposes]]&lt;br /&gt;
* [[Template:Verified]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;show-infobox {{#ifeq:{{{status|}}}|proposed|bot-proposal|{{#ifeq:{{{status|}}}|verified|show-verified|show-unverified}}}}&amp;quot; style=&amp;quot;width: 22em; border: 1px solid #aaa; padding: 0.5em; margin: 0 0 1em 1em; float: right; clear: right; {{#ifeq:{{{status|}}}|proposed|background: #fff3cd; border-left: 3px solid #ffc107;|background: #f9f9f9;}}&amp;quot; data-source=&amp;quot;{{{source|}}}&amp;quot; data-proposed-by=&amp;quot;{{{by|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #98b; font-size: 1.1em; padding: 0.3em; text-align: center; margin: -0.5em -0.5em 0.5em -0.5em;&amp;quot;&amp;gt;{{{artists}}} at {{{venue}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{official_poster|{{{image|}}}}}}|&amp;lt;div style=&amp;quot;text-align: center; margin: 0.5em 0;&amp;quot;&amp;gt;[[File:{{{official_poster|{{{image|}}}}}}|220px]]&amp;lt;/div&amp;gt;|}}&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Artists:&amp;lt;/strong&amp;gt; {{{artists}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Venue:&amp;lt;/strong&amp;gt; [[{{{venue}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{date|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Date:&amp;lt;/strong&amp;gt; {{{date}}}&amp;lt;/div&amp;gt;|}}&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Showtime:&amp;lt;/strong&amp;gt; [https://etherscan.io/block/{{{blockheight}}} {{{blockheight}}}]&amp;lt;/div&amp;gt;{{#if:{{{doors_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Doors:&amp;lt;/strong&amp;gt; {{{doors_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{show_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Show:&amp;lt;/strong&amp;gt; {{{show_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{poster_artist|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Poster art:&amp;lt;/strong&amp;gt; {{{poster_artist}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{price|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Price:&amp;lt;/strong&amp;gt; ${{{price}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{tickets|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Tickets:&amp;lt;/strong&amp;gt; [{{{tickets}}} Buy tickets]&amp;lt;/div&amp;gt;|}}{{#if:{{{ages|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Ages:&amp;lt;/strong&amp;gt; {{{ages}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|proposed|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #856404;&amp;quot;&amp;gt;Proposed by {{{by|bot}}} via {{{source|unknown}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|verified|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #228b22;&amp;quot;&amp;gt;✓ Verified{{#if:{{{by|}}}| by {{{by}}}|}}&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Artist={{#replace:{{#replace:{{{artists}}}|]|}}|[|}}}}{{#set:Venue={{{venue}}}}}{{#set:Blockheight={{{blockheight}}}}}{{#if:{{{poster_artist|}}}|{{#set:Poster artist={{{poster_artist}}}}}|}}{{#set:Verification status={{#ifeq:{{{status|}}}|verified|verified|{{#ifeq:{{{status|}}}|proposed|proposed|unverified}}}}}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5278</id>
		<title>Show:JustinHolmes-25254342</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5278"/>
		<updated>2026-06-02T20:18:17Z</updated>

		<summary type="html">&lt;p&gt;Magent: Use {{Ensemble|...|title=The Cryptograss Conspiracy}} block; add poster_artist=Sky Stewart&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Show&lt;br /&gt;
|artists=Justin Holmes &amp;amp; The Cryptograss Conspiracy&lt;br /&gt;
|venue=The Cider Mill Stage&lt;br /&gt;
|blockheight=25255000&lt;br /&gt;
|official_poster=6 5 26 BUNDY POSTER-rev2.png&lt;br /&gt;
|poster_artist=Sky Stewart&lt;br /&gt;
|doors_time=7:30 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Magent&lt;br /&gt;
|source=in-conversation with Justin at Old Barn Market, Binghamton, 2026-06-02&lt;br /&gt;
|description=Friday-night bluegrass set in Binghamton — two sets with a PickiPedia Dispatch Live segment between&lt;br /&gt;
|tickets=https://example.com/tickets-PLACEHOLDER&lt;br /&gt;
|price=15&lt;br /&gt;
|ages=All ages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Ensemble&lt;br /&gt;
|Justin Holmes&lt;br /&gt;
|Sky Stewart&lt;br /&gt;
|TBD&lt;br /&gt;
|TBD&lt;br /&gt;
|title=The Cryptograss Conspiracy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A Friday-night [[bluegrass]] show in Binghamton, NY. Two sets plus a break, with the [[PickiPedia]] Dispatch Live segment between sets. Placeholder details — &#039;&#039;&#039;Justin to correct venue, blockheight, lineup, tickets URL, and price before show.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Set 0==&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
==Break==&lt;br /&gt;
* PickiPedia Dispatch Live&lt;br /&gt;
&lt;br /&gt;
==Set 1==&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5277</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5277"/>
		<updated>2026-06-02T20:18:17Z</updated>

		<summary type="html">&lt;p&gt;Magent: v3: bigger poster (width: 100% inside card), poster-credit styling, hide absorbed ensemble-infobox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.14em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble .pp-ensemble-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 8px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble .pp-sep { color: var(--pp-rule); margin: 0 4px; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image {&lt;br /&gt;
  margin: 28px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
  text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-poster-credit-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide the floated ensemble infoboxes once the hero has absorbed them. */&lt;br /&gt;
.pickipedia-show .ensemble-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Full-takeover layout for Show: pages with hero&lt;br /&gt;
 *&lt;br /&gt;
 * Only fires when .pickipedia-show AND .has-show-hero (i.e.,&lt;br /&gt;
 * Template:Show is present). Bare Show: pages keep their wiki&lt;br /&gt;
 * chrome — the setlist typography from the base section still&lt;br /&gt;
 * applies.&lt;br /&gt;
 *&lt;br /&gt;
 * The DOM additions (corner logo, topbar) are inserted by&lt;br /&gt;
 * Gadget-pickipedia-show.js. The patterns here mirror what&lt;br /&gt;
 * .pickipedia-userpost does, so future deduping into a shared&lt;br /&gt;
 * .pickipedia-publication base class stays straightforward.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #column-one,&lt;br /&gt;
.pickipedia-show.has-show-hero #sidebar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-panel,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-main-menu-container,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-toolbar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-navigation .portal,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-sidebar-container,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-views,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions-mobile,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-personal,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-logo,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-tools,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-footer,&lt;br /&gt;
.pickipedia-show.has-show-hero #footer,&lt;br /&gt;
.pickipedia-show.has-show-hero .printfooter,&lt;br /&gt;
.pickipedia-show.has-show-hero .catlinks,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-indicators,&lt;br /&gt;
.pickipedia-show.has-show-hero #siteSub,&lt;br /&gt;
.pickipedia-show.has-show-hero #contentSub,&lt;br /&gt;
.pickipedia-show.has-show-hero .subpages,&lt;br /&gt;
.pickipedia-show.has-show-hero #jump-to-nav,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #globalWrapper,&lt;br /&gt;
.pickipedia-show.has-show-hero #column-content,&lt;br /&gt;
.pickipedia-show.has-show-hero .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #content,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-body,&lt;br /&gt;
.pickipedia-show.has-show-hero #bodyContent,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-left,&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-right {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Centered content column ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output {&lt;br /&gt;
  max-width: 720px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 8px 24px 80px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 22px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a:hover { color: var(--pp-accent); }&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Setlist links shouldn&#039;t get the body-paragraph underline treatment —&lt;br /&gt;
 * they live inside numbered list items and already get serif styling. */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output ul li a {&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
    padding-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5276</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5276"/>
		<updated>2026-06-02T20:18:16Z</updated>

		<summary type="html">&lt;p&gt;Magent: v3: absorb {{Ensemble|...}} blocks (not ensemble= field); upgrade poster thumb to 800px; render poster_artist credit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists      = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue        = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var showtime     = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var doors        = fieldValue(&#039;Doors&#039;);&lt;br /&gt;
  var show         = fieldValue(&#039;Show&#039;);&lt;br /&gt;
  var posterArtist = fieldValue(&#039;Poster art&#039;);&lt;br /&gt;
  var tickets      = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price        = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages         = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
  if (doors) kickerBits.push(&#039;Doors &#039; + doors);&lt;br /&gt;
  if (show)  kickerBits.push(&#039;Show &#039; + show);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Ensembles: find every Template:Ensemble block on the page. Each renders&lt;br /&gt;
  // as a .ensemble-infobox with a colored header div (the band title) and&lt;br /&gt;
  // a body div with one musician per line (via Template:m). Multiple&lt;br /&gt;
  // ensembles per page are common — headliner + opener(s) + sit-ins.&lt;br /&gt;
  var ensembleBlocks = content.querySelectorAll(&#039;.ensemble-infobox&#039;);&lt;br /&gt;
  var ensembleHtml = &#039;&#039;;&lt;br /&gt;
  ensembleBlocks.forEach(function (eb) {&lt;br /&gt;
    // Header div carries the band name (or default &amp;quot;Ensemble&amp;quot;).&lt;br /&gt;
    var bandName = &#039;&#039;;&lt;br /&gt;
    var headerEl = eb.querySelector(&#039;div:first-child&#039;);&lt;br /&gt;
    if (headerEl) bandName = headerEl.textContent.trim();&lt;br /&gt;
&lt;br /&gt;
    // Member list: the second-child div has musicians separated by &amp;lt;br&amp;gt;.&lt;br /&gt;
    var listEl = eb.querySelector(&#039;div:nth-child(2)&#039;);&lt;br /&gt;
    if (!listEl) return;&lt;br /&gt;
    // Each &amp;quot;row&amp;quot; is text between &amp;lt;br&amp;gt;s; pull text content and split.&lt;br /&gt;
    var raw = listEl.innerHTML&lt;br /&gt;
      .split(/&amp;lt;br\s*\/?&amp;gt;/i)&lt;br /&gt;
      .map(function (chunk) {&lt;br /&gt;
        var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
        tmp.innerHTML = chunk;&lt;br /&gt;
        return tmp.textContent.trim();&lt;br /&gt;
      })&lt;br /&gt;
      .filter(Boolean);&lt;br /&gt;
    if (!raw.length) return;&lt;br /&gt;
&lt;br /&gt;
    var labelHtml = bandName &amp;amp;&amp;amp; bandName.toLowerCase() !== &#039;ensemble&#039;&lt;br /&gt;
      ? &#039;&amp;lt;span class=&amp;quot;pp-ensemble-label&amp;quot;&amp;gt;&#039; + escapeHtml(bandName) + &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
      : &#039;&amp;lt;span class=&amp;quot;pp-ensemble-label&amp;quot;&amp;gt;Featuring&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    ensembleHtml += &#039;&amp;lt;p class=&amp;quot;pp-ensemble&amp;quot;&amp;gt;&#039; + labelHtml + &#039; &#039; +&lt;br /&gt;
      raw.map(escapeHtml).join(&#039; &amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; &#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    eb.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Upgrade the poster thumbnail: Template:Show renders [[File:foo|220px]]&lt;br /&gt;
  // which gives us /images/thumb/.../220px-foo.png. We replace the 220px&lt;br /&gt;
  // segment with 800px to request a larger thumbnail; CSS scales it to&lt;br /&gt;
  // fit the card. If the URL doesn&#039;t match the thumb pattern (e.g. SVG,&lt;br /&gt;
  // or non-thumbnailed file), we just use the original src.&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    var bigSrc = imageImg.src.replace(/\/(\d+)px-/, &#039;/800px-&#039;);&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + bigSrc +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      (posterArtist&lt;br /&gt;
        ? &#039;&amp;lt;p class=&amp;quot;pp-poster-credit&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pp-poster-credit-label&amp;quot;&amp;gt;Poster art by&amp;lt;/span&amp;gt; &#039; +&lt;br /&gt;
            escapeHtml(posterArtist) + &#039;&amp;lt;/p&amp;gt;&#039;&lt;br /&gt;
        : &#039;&#039;) +&lt;br /&gt;
      &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    ensembleHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Full-takeover chrome: corner logo + slim topbar ----------&lt;br /&gt;
  // Only fires when the hero was built (Template:Show present). The CSS&lt;br /&gt;
  // chrome-hiding rules are gated by .has-show-hero so bare Show: pages&lt;br /&gt;
  // keep their wiki sidebar; if you want to make those takeover too,&lt;br /&gt;
  // remove the .has-show-hero gating from the CSS file.&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(cornerLogo, body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  var topbar = document.createElement(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-show-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-left&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Category:Shows&#039;) + &#039;&amp;quot;&amp;gt;← All shows&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-right&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(topbar, cornerLogo.nextSibling);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5275</id>
		<title>Template:Show</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5275"/>
		<updated>2026-06-02T20:18:16Z</updated>

		<summary type="html">&lt;p&gt;Magent: Drop ensemble= field (use Template:Ensemble instead). Add poster_artist field.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker (kept in noinclude so it doesn&#039;t transclude) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Show&#039;&#039;&#039; - Structured data template for performances/concerts.&lt;br /&gt;
&lt;br /&gt;
Uses Ethereum blockheight as the canonical timestamp anchor.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Show&lt;br /&gt;
|artists=Billy Strings&lt;br /&gt;
|venue=The Station Inn&lt;br /&gt;
|blockheight=24140272&lt;br /&gt;
|official_poster=Show-poster.jpg&lt;br /&gt;
|doors_time=7:30 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|ensemble=Billy Strings; Jarrod Walker; Royal Masat; Alex Hargreaves&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Tea&lt;br /&gt;
|source=stationinn.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must manually add &amp;lt;nowiki&amp;gt;[[Category:Shows]]&amp;lt;/nowiki&amp;gt; to pages using this template (SMW bug workaround).&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;artists&#039;&#039;&#039; (required) - Performing artist(s); the headlining name as it appears on the poster&lt;br /&gt;
* &#039;&#039;&#039;venue&#039;&#039;&#039; (required) - Venue name (should match a venue page)&lt;br /&gt;
* &#039;&#039;&#039;blockheight&#039;&#039;&#039; (required) - Ethereum block height when the show started/starts&lt;br /&gt;
* &#039;&#039;&#039;official_poster&#039;&#039;&#039; (optional) - Filename of the official show poster (e.g., &amp;quot;Show-poster.jpg&amp;quot;). Takes priority over &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;image&#039;&#039;&#039; (optional, deprecated) - Older alias for &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt; on new pages.&lt;br /&gt;
* &#039;&#039;&#039;doors_time&#039;&#039;&#039; (optional) - Door time as displayed text (e.g., &amp;quot;7:30 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;show_time&#039;&#039;&#039; (optional) - Show start time as displayed text (e.g., &amp;quot;8:00 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;poster_artist&#039;&#039;&#039; (optional) - Credit for the graphic designer who made the official poster&lt;br /&gt;
&lt;br /&gt;
For listing the musicians, use {{tl|Ensemble}} as a separate block on the page (one per band — headliner, openers, sit-ins).&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (optional) - Custom title for social sharing (defaults to &amp;quot;artists at venue - PickiPedia&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;status&#039;&#039;&#039; (optional) - &amp;quot;proposed&amp;quot; for bot-proposed, &amp;quot;verified&amp;quot; for human-verified, blank for unverified&lt;br /&gt;
* &#039;&#039;&#039;by&#039;&#039;&#039; (optional) - Who proposed/verified this&lt;br /&gt;
* &#039;&#039;&#039;source&#039;&#039;&#039; (optional) - Source for verification&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Ticket price&lt;br /&gt;
* &#039;&#039;&#039;tickets&#039;&#039;&#039; (optional) - Ticket purchase URL&lt;br /&gt;
* &#039;&#039;&#039;ages&#039;&#039;&#039; (optional) - Age restriction (e.g., &amp;quot;21+&amp;quot;, &amp;quot;All ages&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039; (optional) - Short description for social sharing cards&lt;br /&gt;
&lt;br /&gt;
=== SMW Properties Set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Artist&amp;lt;/code&amp;gt; - The artist(s)&lt;br /&gt;
* &amp;lt;code&amp;gt;Venue&amp;lt;/code&amp;gt; - The venue&lt;br /&gt;
* &amp;lt;code&amp;gt;Blockheight&amp;lt;/code&amp;gt; - The block height timestamp&lt;br /&gt;
* &amp;lt;code&amp;gt;Poster artist&amp;lt;/code&amp;gt; - Graphic designer credit, if provided&lt;br /&gt;
* &amp;lt;code&amp;gt;Verification status&amp;lt;/code&amp;gt; - proposed/verified/unverified&lt;br /&gt;
&lt;br /&gt;
For per-musician &amp;lt;code&amp;gt;Performer&amp;lt;/code&amp;gt; SMW properties, use {{tl|Ensemble}} — it sets them on a per-band basis.&lt;br /&gt;
&lt;br /&gt;
== Page naming ==&lt;br /&gt;
Show pages should be named: &amp;lt;code&amp;gt;Show:ArtistName-blockheight&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings-24140272&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings_DelMcCouryBand-24140500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Bot_proposes]]&lt;br /&gt;
* [[Template:Verified]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;show-infobox {{#ifeq:{{{status|}}}|proposed|bot-proposal|{{#ifeq:{{{status|}}}|verified|show-verified|show-unverified}}}}&amp;quot; style=&amp;quot;width: 22em; border: 1px solid #aaa; padding: 0.5em; margin: 0 0 1em 1em; float: right; clear: right; {{#ifeq:{{{status|}}}|proposed|background: #fff3cd; border-left: 3px solid #ffc107;|background: #f9f9f9;}}&amp;quot; data-source=&amp;quot;{{{source|}}}&amp;quot; data-proposed-by=&amp;quot;{{{by|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #98b; font-size: 1.1em; padding: 0.3em; text-align: center; margin: -0.5em -0.5em 0.5em -0.5em;&amp;quot;&amp;gt;{{{artists}}} at {{{venue}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{official_poster|{{{image|}}}}}}|&amp;lt;div style=&amp;quot;text-align: center; margin: 0.5em 0;&amp;quot;&amp;gt;[[File:{{{official_poster|{{{image|}}}}}}|220px]]&amp;lt;/div&amp;gt;|}}&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Artists:&amp;lt;/strong&amp;gt; {{{artists}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Venue:&amp;lt;/strong&amp;gt; [[{{{venue}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Showtime:&amp;lt;/strong&amp;gt; [https://etherscan.io/block/{{{blockheight}}} {{{blockheight}}}]&amp;lt;/div&amp;gt;{{#if:{{{doors_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Doors:&amp;lt;/strong&amp;gt; {{{doors_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{show_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Show:&amp;lt;/strong&amp;gt; {{{show_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{poster_artist|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Poster art:&amp;lt;/strong&amp;gt; {{{poster_artist}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{price|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Price:&amp;lt;/strong&amp;gt; ${{{price}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{tickets|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Tickets:&amp;lt;/strong&amp;gt; [{{{tickets}}} Buy tickets]&amp;lt;/div&amp;gt;|}}{{#if:{{{ages|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Ages:&amp;lt;/strong&amp;gt; {{{ages}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|proposed|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #856404;&amp;quot;&amp;gt;Proposed by {{{by|bot}}} via {{{source|unknown}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|verified|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #228b22;&amp;quot;&amp;gt;✓ Verified{{#if:{{{by|}}}| by {{{by}}}|}}&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Artist={{#replace:{{#replace:{{{artists}}}|]|}}|[|}}}}{{#set:Venue={{{venue}}}}}{{#set:Blockheight={{{blockheight}}}}}{{#if:{{{poster_artist|}}}|{{#set:Poster artist={{{poster_artist}}}}}|}}{{#set:Verification status={{#ifeq:{{{status|}}}|verified|verified|{{#ifeq:{{{status|}}}|proposed|proposed|unverified}}}}}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadgets-definition&amp;diff=5268</id>
		<title>Candidate:Gadgets-definition</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadgets-definition&amp;diff=5268"/>
		<updated>2026-06-02T20:05:54Z</updated>

		<summary type="html">&lt;p&gt;Magent: Add dependencies=mediawiki.util for the gadget (needed for mw.util.getUrl in topbar)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- |status=proposed -- bot-staged; remove this line when promoting. --&amp;gt;&lt;br /&gt;
== verification ==&lt;br /&gt;
* verify[ResourceLoader|default|dependencies=mediawiki.api,mediawiki.util]|verify.js&lt;br /&gt;
&lt;br /&gt;
== show pages ==&lt;br /&gt;
* pickipedia-show[ResourceLoader|default|hidden|namespaces=0|targets=desktop,mobile|dependencies=mediawiki.util]|pickipedia-show.js|pickipedia-show.css&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5267</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5267"/>
		<updated>2026-06-02T20:05:54Z</updated>

		<summary type="html">&lt;p&gt;Magent: Full-takeover layout: hide wiki chrome, paper bg, centered 720px column&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.14em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble .pp-ensemble-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 8px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble .pp-sep { color: var(--pp-rule); margin: 0 4px; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image { margin: 22px 0 0; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Full-takeover layout for Show: pages with hero&lt;br /&gt;
 *&lt;br /&gt;
 * Only fires when .pickipedia-show AND .has-show-hero (i.e.,&lt;br /&gt;
 * Template:Show is present). Bare Show: pages keep their wiki&lt;br /&gt;
 * chrome — the setlist typography from the base section still&lt;br /&gt;
 * applies.&lt;br /&gt;
 *&lt;br /&gt;
 * The DOM additions (corner logo, topbar) are inserted by&lt;br /&gt;
 * Gadget-pickipedia-show.js. The patterns here mirror what&lt;br /&gt;
 * .pickipedia-userpost does, so future deduping into a shared&lt;br /&gt;
 * .pickipedia-publication base class stays straightforward.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #column-one,&lt;br /&gt;
.pickipedia-show.has-show-hero #sidebar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-panel,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-main-menu-container,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-toolbar,&lt;br /&gt;
.pickipedia-show.has-show-hero #mw-navigation .portal,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-sidebar-container,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-views,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-cactions-mobile,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-personal,&lt;br /&gt;
.pickipedia-show.has-show-hero #p-logo,&lt;br /&gt;
.pickipedia-show.has-show-hero .vector-page-tools,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-footer,&lt;br /&gt;
.pickipedia-show.has-show-hero #footer,&lt;br /&gt;
.pickipedia-show.has-show-hero .printfooter,&lt;br /&gt;
.pickipedia-show.has-show-hero .catlinks,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-indicators,&lt;br /&gt;
.pickipedia-show.has-show-hero #siteSub,&lt;br /&gt;
.pickipedia-show.has-show-hero #contentSub,&lt;br /&gt;
.pickipedia-show.has-show-hero .subpages,&lt;br /&gt;
.pickipedia-show.has-show-hero #jump-to-nav,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #globalWrapper,&lt;br /&gt;
.pickipedia-show.has-show-hero #column-content,&lt;br /&gt;
.pickipedia-show.has-show-hero .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show.has-show-hero #content,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-body,&lt;br /&gt;
.pickipedia-show.has-show-hero #bodyContent,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-left,&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar-right {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .pickipedia-show-topbar a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Centered content column ---------- */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output {&lt;br /&gt;
  max-width: 720px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 8px 24px 80px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  line-height: 1.55;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 22px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a:hover { color: var(--pp-accent); }&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Setlist links shouldn&#039;t get the body-paragraph underline treatment —&lt;br /&gt;
 * they live inside numbered list items and already get serif styling. */&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-parser-output ul li a {&lt;br /&gt;
  background-image: none;&lt;br /&gt;
  padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show.has-show-hero .mw-parser-output,&lt;br /&gt;
  .pickipedia-show.has-show-hero .pickipedia-show-topbar {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
    padding-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5266</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5266"/>
		<updated>2026-06-02T20:05:54Z</updated>

		<summary type="html">&lt;p&gt;Magent: Full-takeover mode: insert corner logo + slim topbar (edit/history/talk/← All shows)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists  = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue    = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var showtime = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var doors    = fieldValue(&#039;Doors&#039;);&lt;br /&gt;
  var show     = fieldValue(&#039;Show&#039;);&lt;br /&gt;
  var ensemble = fieldValue(&#039;Ensemble&#039;);&lt;br /&gt;
  var tickets  = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price    = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages     = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
  if (doors) kickerBits.push(&#039;Doors &#039; + doors);&lt;br /&gt;
  if (show)  kickerBits.push(&#039;Show &#039; + show);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Ensemble: comma-separated list from Template:Show. Split on commas to&lt;br /&gt;
  // render each name with an interpunct separator, matching the kicker style.&lt;br /&gt;
  var ensembleHtml = &#039;&#039;;&lt;br /&gt;
  if (ensemble) {&lt;br /&gt;
    var names = ensemble.split(/\s*,\s*/).filter(Boolean);&lt;br /&gt;
    if (names.length) {&lt;br /&gt;
      ensembleHtml = &#039;&amp;lt;p class=&amp;quot;pp-ensemble&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pp-ensemble-label&amp;quot;&amp;gt;Featuring&amp;lt;/span&amp;gt; &#039; +&lt;br /&gt;
        names.join(&#039; &amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; &#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + imageImg.src +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    ensembleHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Full-takeover chrome: corner logo + slim topbar ----------&lt;br /&gt;
  // Only fires when the hero was built (Template:Show present). The CSS&lt;br /&gt;
  // chrome-hiding rules are gated by .has-show-hero so bare Show: pages&lt;br /&gt;
  // keep their wiki sidebar; if you want to make those takeover too,&lt;br /&gt;
  // remove the .has-show-hero gating from the CSS file.&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(cornerLogo, body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  var topbar = document.createElement(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-show-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-left&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Category:Shows&#039;) + &#039;&amp;quot;&amp;gt;← All shows&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-show-topbar-right&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039;;&lt;br /&gt;
  body.insertBefore(topbar, cornerLogo.nextSibling);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5265</id>
		<title>Template:Show</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5265"/>
		<updated>2026-06-02T20:05:54Z</updated>

		<summary type="html">&lt;p&gt;Magent: Drop {{#seo:...}} block (WikiSEO extension not loaded; was leaking raw text)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker (kept in noinclude so it doesn&#039;t transclude) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Show&#039;&#039;&#039; - Structured data template for performances/concerts.&lt;br /&gt;
&lt;br /&gt;
Uses Ethereum blockheight as the canonical timestamp anchor.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Show&lt;br /&gt;
|artists=Billy Strings&lt;br /&gt;
|venue=The Station Inn&lt;br /&gt;
|blockheight=24140272&lt;br /&gt;
|official_poster=Show-poster.jpg&lt;br /&gt;
|doors_time=7:30 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|ensemble=Billy Strings; Jarrod Walker; Royal Masat; Alex Hargreaves&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Tea&lt;br /&gt;
|source=stationinn.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must manually add &amp;lt;nowiki&amp;gt;[[Category:Shows]]&amp;lt;/nowiki&amp;gt; to pages using this template (SMW bug workaround).&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;artists&#039;&#039;&#039; (required) - Performing artist(s); the headlining name as it appears on the poster&lt;br /&gt;
* &#039;&#039;&#039;venue&#039;&#039;&#039; (required) - Venue name (should match a venue page)&lt;br /&gt;
* &#039;&#039;&#039;blockheight&#039;&#039;&#039; (required) - Ethereum block height when the show started/starts&lt;br /&gt;
* &#039;&#039;&#039;official_poster&#039;&#039;&#039; (optional) - Filename of the official show poster (e.g., &amp;quot;Show-poster.jpg&amp;quot;). Takes priority over &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;image&#039;&#039;&#039; (optional, deprecated) - Older alias for &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt; on new pages.&lt;br /&gt;
* &#039;&#039;&#039;doors_time&#039;&#039;&#039; (optional) - Door time as displayed text (e.g., &amp;quot;7:30 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;show_time&#039;&#039;&#039; (optional) - Show start time as displayed text (e.g., &amp;quot;8:00 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;ensemble&#039;&#039;&#039; (optional) - Semicolon-separated list of performer names. Each becomes a Performer SMW property for queries and backlinks.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (optional) - Custom title for social sharing (defaults to &amp;quot;artists at venue - PickiPedia&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;status&#039;&#039;&#039; (optional) - &amp;quot;proposed&amp;quot; for bot-proposed, &amp;quot;verified&amp;quot; for human-verified, blank for unverified&lt;br /&gt;
* &#039;&#039;&#039;by&#039;&#039;&#039; (optional) - Who proposed/verified this&lt;br /&gt;
* &#039;&#039;&#039;source&#039;&#039;&#039; (optional) - Source for verification&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Ticket price&lt;br /&gt;
* &#039;&#039;&#039;tickets&#039;&#039;&#039; (optional) - Ticket purchase URL&lt;br /&gt;
* &#039;&#039;&#039;ages&#039;&#039;&#039; (optional) - Age restriction (e.g., &amp;quot;21+&amp;quot;, &amp;quot;All ages&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039; (optional) - Short description for social sharing cards&lt;br /&gt;
&lt;br /&gt;
=== SMW Properties Set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Artist&amp;lt;/code&amp;gt; - The artist(s)&lt;br /&gt;
* &amp;lt;code&amp;gt;Venue&amp;lt;/code&amp;gt; - The venue&lt;br /&gt;
* &amp;lt;code&amp;gt;Blockheight&amp;lt;/code&amp;gt; - The block height timestamp&lt;br /&gt;
* &amp;lt;code&amp;gt;Performer&amp;lt;/code&amp;gt; - One per ensemble member (multi-valued)&lt;br /&gt;
* &amp;lt;code&amp;gt;Verification status&amp;lt;/code&amp;gt; - proposed/verified/unverified&lt;br /&gt;
&lt;br /&gt;
== Page naming ==&lt;br /&gt;
Show pages should be named: &amp;lt;code&amp;gt;Show:ArtistName-blockheight&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings-24140272&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings_DelMcCouryBand-24140500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Bot_proposes]]&lt;br /&gt;
* [[Template:Verified]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;show-infobox {{#ifeq:{{{status|}}}|proposed|bot-proposal|{{#ifeq:{{{status|}}}|verified|show-verified|show-unverified}}}}&amp;quot; style=&amp;quot;width: 22em; border: 1px solid #aaa; padding: 0.5em; margin: 0 0 1em 1em; float: right; clear: right; {{#ifeq:{{{status|}}}|proposed|background: #fff3cd; border-left: 3px solid #ffc107;|background: #f9f9f9;}}&amp;quot; data-source=&amp;quot;{{{source|}}}&amp;quot; data-proposed-by=&amp;quot;{{{by|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #98b; font-size: 1.1em; padding: 0.3em; text-align: center; margin: -0.5em -0.5em 0.5em -0.5em;&amp;quot;&amp;gt;{{{artists}}} at {{{venue}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{official_poster|{{{image|}}}}}}|&amp;lt;div style=&amp;quot;text-align: center; margin: 0.5em 0;&amp;quot;&amp;gt;[[File:{{{official_poster|{{{image|}}}}}}|220px]]&amp;lt;/div&amp;gt;|}}&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Artists:&amp;lt;/strong&amp;gt; {{{artists}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Venue:&amp;lt;/strong&amp;gt; [[{{{venue}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Showtime:&amp;lt;/strong&amp;gt; [https://etherscan.io/block/{{{blockheight}}} {{{blockheight}}}]&amp;lt;/div&amp;gt;{{#if:{{{doors_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Doors:&amp;lt;/strong&amp;gt; {{{doors_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{show_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Show:&amp;lt;/strong&amp;gt; {{{show_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{ensemble|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Ensemble:&amp;lt;/strong&amp;gt; {{#arraymap:{{{ensemble}}}|;|x|x|,&amp;amp;#32;}}&amp;lt;/div&amp;gt;|}}{{#if:{{{price|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Price:&amp;lt;/strong&amp;gt; ${{{price}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{tickets|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Tickets:&amp;lt;/strong&amp;gt; [{{{tickets}}} Buy tickets]&amp;lt;/div&amp;gt;|}}{{#if:{{{ages|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Ages:&amp;lt;/strong&amp;gt; {{{ages}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|proposed|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #856404;&amp;quot;&amp;gt;Proposed by {{{by|bot}}} via {{{source|unknown}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|verified|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #228b22;&amp;quot;&amp;gt;✓ Verified{{#if:{{{by|}}}| by {{{by}}}|}}&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Artist={{#replace:{{#replace:{{{artists}}}|]|}}|[|}}}}{{#set:Venue={{{venue}}}}}{{#set:Blockheight={{{blockheight}}}}}{{#if:{{{ensemble|}}}|{{#arraymap:{{{ensemble}}}|;|x|{{#set:Performer=x}}|}}|}}{{#set:Verification status={{#ifeq:{{{status|}}}|verified|verified|{{#ifeq:{{{status|}}}|proposed|proposed|unverified}}}}}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5262</id>
		<title>Show:JustinHolmes-25254342</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5262"/>
		<updated>2026-06-02T19:47:34Z</updated>

		<summary type="html">&lt;p&gt;Magent: Populate new fields (official_poster, doors_time, show_time, ensemble) for testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Show&lt;br /&gt;
|artists=Justin Holmes &amp;amp; The Cryptograss Conspiracy&lt;br /&gt;
|venue=The Cider Mill Stage&lt;br /&gt;
|blockheight=25255000&lt;br /&gt;
|official_poster=Show-poster-PLACEHOLDER.jpg&lt;br /&gt;
|doors_time=7:30 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|ensemble=Justin Holmes; Sky Stewart; TBD; TBD&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Magent&lt;br /&gt;
|source=in-conversation with Justin at Old Barn Market, Binghamton, 2026-06-02&lt;br /&gt;
|description=Friday-night bluegrass set in Binghamton — two sets with a PickiPedia Dispatch Live segment between&lt;br /&gt;
|tickets=https://example.com/tickets-PLACEHOLDER&lt;br /&gt;
|price=15&lt;br /&gt;
|ages=All ages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A Friday-night [[bluegrass]] show in Binghamton, NY. Two sets plus a break, with the [[PickiPedia]] Dispatch Live segment between sets. Placeholder details — &#039;&#039;&#039;Justin to correct venue, blockheight, lineup, poster, tickets URL, and price before show.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Set 0==&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
==Break==&lt;br /&gt;
* PickiPedia Dispatch Live&lt;br /&gt;
&lt;br /&gt;
==Set 1==&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5261</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5261"/>
		<updated>2026-06-02T19:47:34Z</updated>

		<summary type="html">&lt;p&gt;Magent: Add .pp-ensemble styling for the Featuring credit line&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.14em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble .pp-ensemble-label {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin-right: 8px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-ensemble .pp-sep { color: var(--pp-rule); margin: 0 4px; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image { margin: 22px 0 0; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5260</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5260"/>
		<updated>2026-06-02T19:47:34Z</updated>

		<summary type="html">&lt;p&gt;Magent: Surface Doors/Show/Ensemble in the poster hero&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists  = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue    = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var showtime = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var doors    = fieldValue(&#039;Doors&#039;);&lt;br /&gt;
  var show     = fieldValue(&#039;Show&#039;);&lt;br /&gt;
  var ensemble = fieldValue(&#039;Ensemble&#039;);&lt;br /&gt;
  var tickets  = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price    = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages     = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
  if (doors) kickerBits.push(&#039;Doors &#039; + doors);&lt;br /&gt;
  if (show)  kickerBits.push(&#039;Show &#039; + show);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  // Ensemble: comma-separated list from Template:Show. Split on commas to&lt;br /&gt;
  // render each name with an interpunct separator, matching the kicker style.&lt;br /&gt;
  var ensembleHtml = &#039;&#039;;&lt;br /&gt;
  if (ensemble) {&lt;br /&gt;
    var names = ensemble.split(/\s*,\s*/).filter(Boolean);&lt;br /&gt;
    if (names.length) {&lt;br /&gt;
      ensembleHtml = &#039;&amp;lt;p class=&amp;quot;pp-ensemble&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;pp-ensemble-label&amp;quot;&amp;gt;Featuring&amp;lt;/span&amp;gt; &#039; +&lt;br /&gt;
        names.join(&#039; &amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt; &#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + imageImg.src +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    ensembleHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5259</id>
		<title>Template:Show</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:Show&amp;diff=5259"/>
		<updated>2026-06-02T19:47:34Z</updated>

		<summary type="html">&lt;p&gt;Magent: Add official_poster, doors_time, show_time, ensemble fields (with backward-compat image alias)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- |status=proposed -- bot verification marker (kept in noinclude so it doesn&#039;t transclude) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Show&#039;&#039;&#039; - Structured data template for performances/concerts.&lt;br /&gt;
&lt;br /&gt;
Uses Ethereum blockheight as the canonical timestamp anchor.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Show&lt;br /&gt;
|artists=Billy Strings&lt;br /&gt;
|venue=The Station Inn&lt;br /&gt;
|blockheight=24140272&lt;br /&gt;
|official_poster=Show-poster.jpg&lt;br /&gt;
|doors_time=7:30 PM&lt;br /&gt;
|show_time=8:00 PM&lt;br /&gt;
|ensemble=Billy Strings; Jarrod Walker; Royal Masat; Alex Hargreaves&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Tea&lt;br /&gt;
|source=stationinn.com&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must manually add &amp;lt;nowiki&amp;gt;[[Category:Shows]]&amp;lt;/nowiki&amp;gt; to pages using this template (SMW bug workaround).&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
* &#039;&#039;&#039;artists&#039;&#039;&#039; (required) - Performing artist(s); the headlining name as it appears on the poster&lt;br /&gt;
* &#039;&#039;&#039;venue&#039;&#039;&#039; (required) - Venue name (should match a venue page)&lt;br /&gt;
* &#039;&#039;&#039;blockheight&#039;&#039;&#039; (required) - Ethereum block height when the show started/starts&lt;br /&gt;
* &#039;&#039;&#039;official_poster&#039;&#039;&#039; (optional) - Filename of the official show poster (e.g., &amp;quot;Show-poster.jpg&amp;quot;). Takes priority over &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;image&#039;&#039;&#039; (optional, deprecated) - Older alias for &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;official_poster&amp;lt;/code&amp;gt; on new pages.&lt;br /&gt;
* &#039;&#039;&#039;doors_time&#039;&#039;&#039; (optional) - Door time as displayed text (e.g., &amp;quot;7:30 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;show_time&#039;&#039;&#039; (optional) - Show start time as displayed text (e.g., &amp;quot;8:00 PM&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;ensemble&#039;&#039;&#039; (optional) - Semicolon-separated list of performer names. Each becomes a Performer SMW property for queries and backlinks.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; (optional) - Custom title for social sharing (defaults to &amp;quot;artists at venue - PickiPedia&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;status&#039;&#039;&#039; (optional) - &amp;quot;proposed&amp;quot; for bot-proposed, &amp;quot;verified&amp;quot; for human-verified, blank for unverified&lt;br /&gt;
* &#039;&#039;&#039;by&#039;&#039;&#039; (optional) - Who proposed/verified this&lt;br /&gt;
* &#039;&#039;&#039;source&#039;&#039;&#039; (optional) - Source for verification&lt;br /&gt;
* &#039;&#039;&#039;price&#039;&#039;&#039; (optional) - Ticket price&lt;br /&gt;
* &#039;&#039;&#039;tickets&#039;&#039;&#039; (optional) - Ticket purchase URL&lt;br /&gt;
* &#039;&#039;&#039;ages&#039;&#039;&#039; (optional) - Age restriction (e.g., &amp;quot;21+&amp;quot;, &amp;quot;All ages&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039; (optional) - Short description for social sharing cards&lt;br /&gt;
&lt;br /&gt;
=== SMW Properties Set ===&lt;br /&gt;
* &amp;lt;code&amp;gt;Artist&amp;lt;/code&amp;gt; - The artist(s)&lt;br /&gt;
* &amp;lt;code&amp;gt;Venue&amp;lt;/code&amp;gt; - The venue&lt;br /&gt;
* &amp;lt;code&amp;gt;Blockheight&amp;lt;/code&amp;gt; - The block height timestamp&lt;br /&gt;
* &amp;lt;code&amp;gt;Performer&amp;lt;/code&amp;gt; - One per ensemble member (multi-valued)&lt;br /&gt;
* &amp;lt;code&amp;gt;Verification status&amp;lt;/code&amp;gt; - proposed/verified/unverified&lt;br /&gt;
&lt;br /&gt;
== Page naming ==&lt;br /&gt;
Show pages should be named: &amp;lt;code&amp;gt;Show:ArtistName-blockheight&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings-24140272&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Show:BillyStrings_DelMcCouryBand-24140500&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Template:Bot_proposes]]&lt;br /&gt;
* [[Template:Verified]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Show templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#seo:&lt;br /&gt;
|title={{#if:{{{title|}}}|{{{title}}}|{{{artists}}} at {{{venue}}} - PickiPedia}}&lt;br /&gt;
|description={{#if:{{{description|}}}|{{{description}}}|{{{artists}}} performing at {{{venue}}} (block {{{blockheight}}})}}&lt;br /&gt;
|site_name=PickiPedia&lt;br /&gt;
|type=article&lt;br /&gt;
|image={{#if:{{{official_poster|{{{image|}}}}}}|{{filepath:{{{official_poster|{{{image|}}}}}}}}|}}}}&amp;lt;div class=&amp;quot;show-infobox {{#ifeq:{{{status|}}}|proposed|bot-proposal|{{#ifeq:{{{status|}}}|verified|show-verified|show-unverified}}}}&amp;quot; style=&amp;quot;width: 22em; border: 1px solid #aaa; padding: 0.5em; margin: 0 0 1em 1em; float: right; clear: right; {{#ifeq:{{{status|}}}|proposed|background: #fff3cd; border-left: 3px solid #ffc107;|background: #f9f9f9;}}&amp;quot; data-source=&amp;quot;{{{source|}}}&amp;quot; data-proposed-by=&amp;quot;{{{by|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #98b; font-size: 1.1em; padding: 0.3em; text-align: center; margin: -0.5em -0.5em 0.5em -0.5em;&amp;quot;&amp;gt;{{{artists}}} at {{{venue}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{official_poster|{{{image|}}}}}}|&amp;lt;div style=&amp;quot;text-align: center; margin: 0.5em 0;&amp;quot;&amp;gt;[[File:{{{official_poster|{{{image|}}}}}}|220px]]&amp;lt;/div&amp;gt;|}}&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Artists:&amp;lt;/strong&amp;gt; {{{artists}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Venue:&amp;lt;/strong&amp;gt; [[{{{venue}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Showtime:&amp;lt;/strong&amp;gt; [https://etherscan.io/block/{{{blockheight}}} {{{blockheight}}}]&amp;lt;/div&amp;gt;{{#if:{{{doors_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Doors:&amp;lt;/strong&amp;gt; {{{doors_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{show_time|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Show:&amp;lt;/strong&amp;gt; {{{show_time}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{ensemble|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Ensemble:&amp;lt;/strong&amp;gt; {{#arraymap:{{{ensemble}}}|;|x|x|,&amp;amp;#32;}}&amp;lt;/div&amp;gt;|}}{{#if:{{{price|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Price:&amp;lt;/strong&amp;gt; ${{{price}}}&amp;lt;/div&amp;gt;|}}{{#if:{{{tickets|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Tickets:&amp;lt;/strong&amp;gt; [{{{tickets}}} Buy tickets]&amp;lt;/div&amp;gt;|}}{{#if:{{{ages|}}}|&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Ages:&amp;lt;/strong&amp;gt; {{{ages}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|proposed|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #856404;&amp;quot;&amp;gt;Proposed by {{{by|bot}}} via {{{source|unknown}}}&amp;lt;/div&amp;gt;|}}{{#ifeq:{{{status|}}}|verified|&amp;lt;div style=&amp;quot;font-size: 0.85em; margin-top: 0.5em; color: #228b22;&amp;quot;&amp;gt;✓ Verified{{#if:{{{by|}}}| by {{{by}}}|}}&amp;lt;/div&amp;gt;|}}&amp;lt;/div&amp;gt;{{#set:Artist={{#replace:{{#replace:{{{artists}}}|]|}}|[|}}}}{{#set:Venue={{{venue}}}}}{{#set:Blockheight={{{blockheight}}}}}{{#if:{{{ensemble|}}}|{{#arraymap:{{{ensemble}}}|;|x|{{#set:Performer=x}}|}}|}}{{#set:Verification status={{#ifeq:{{{status|}}}|verified|verified|{{#ifeq:{{{status|}}}|proposed|proposed|unverified}}}}}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5258</id>
		<title>Show:JustinHolmes-25254342</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5258"/>
		<updated>2026-06-02T19:32:26Z</updated>

		<summary type="html">&lt;p&gt;Magent: Sample Friday show page for Justin to correct (status=proposed satisfies bot verification)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Show&lt;br /&gt;
|artists=Justin Holmes &amp;amp; The Cryptograss Conspiracy&lt;br /&gt;
|venue=The Cider Mill Stage&lt;br /&gt;
|blockheight=25255000&lt;br /&gt;
|status=proposed&lt;br /&gt;
|by=Magent&lt;br /&gt;
|source=in-conversation with Justin while he was at Old Barn Market, Binghamton, 2026-06-02&lt;br /&gt;
|description=Friday-night bluegrass set in Binghamton — two sets with a PickiPedia Dispatch Live segment between&lt;br /&gt;
|tickets=https://example.com/tickets-PLACEHOLDER&lt;br /&gt;
|price=15&lt;br /&gt;
|ages=All ages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A Friday-night [[bluegrass]] show in Binghamton, NY. Two sets plus a break, with the [[PickiPedia]] Dispatch Live segment between sets. Placeholder details — &#039;&#039;&#039;Justin to correct venue, blockheight, lineup, tickets URL, and price before show.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Set 0==&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
==Break==&lt;br /&gt;
* PickiPedia Dispatch Live&lt;br /&gt;
&lt;br /&gt;
==Set 1==&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
[[Category:Shows]]&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadgets-definition&amp;diff=5254</id>
		<title>Candidate:Gadgets-definition</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadgets-definition&amp;diff=5254"/>
		<updated>2026-06-02T19:13:28Z</updated>

		<summary type="html">&lt;p&gt;Magent: Register pickipedia-show gadget (mainspace, default+hidden)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- |status=proposed -- bot-staged; remove this line when promoting. --&amp;gt;&lt;br /&gt;
== verification ==&lt;br /&gt;
* verify[ResourceLoader|default|dependencies=mediawiki.api,mediawiki.util]|verify.js&lt;br /&gt;
&lt;br /&gt;
== show pages ==&lt;br /&gt;
* pickipedia-show[ResourceLoader|default|hidden|namespaces=0|targets=desktop,mobile]|pickipedia-show.js|pickipedia-show.css&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5253</id>
		<title>Candidate:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.js&amp;diff=5253"/>
		<updated>2026-06-02T19:13:28Z</updated>

		<summary type="html">&lt;p&gt;Magent: Show: page hero builder extracted into its own gadget (not Common.js)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists  = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue    = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var showtime = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var tickets  = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price    = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages     = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + imageImg.src +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5252</id>
		<title>Candidate:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Gadget-pickipedia-show.css&amp;diff=5252"/>
		<updated>2026-06-02T19:13:28Z</updated>

		<summary type="html">&lt;p&gt;Magent: Show: page styling extracted into its own gadget (not Common.css)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image { margin: 22px 0 0; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Common.js&amp;diff=5251</id>
		<title>Candidate:Common.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Common.js&amp;diff=5251"/>
		<updated>2026-06-02T18:52:46Z</updated>

		<summary type="html">&lt;p&gt;Magent: Staging full proposed Common.js for sysop review (new Show: detector IIFE at bottom)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// |status=proposed -- bot-staged; remove this line when promoting.&lt;br /&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;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on the Blue Railroad Submission form&lt;br /&gt;
    if (!document.querySelector(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#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(&#039;a[href*=&amp;quot;etherscan.io/block/&amp;quot;]&#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(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#039;);&lt;br /&gt;
        if (!blockInput) return;&lt;br /&gt;
        &lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.marginTop = &#039;8px&#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(&#039;br-datepicker&#039;);&lt;br /&gt;
        const convertBtn = document.getElementById(&#039;br-convert-btn&#039;);&lt;br /&gt;
        const status = document.getElementById(&#039;br-status&#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(&#039;click&#039;, function() {&lt;br /&gt;
            const selectedDate = new Date(datePicker.value);&lt;br /&gt;
            if (isNaN(selectedDate.getTime())) {&lt;br /&gt;
                status.textContent = &#039;Invalid date&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Could not find reference block&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Date is in the future!&#039;;&lt;br /&gt;
                status.style.color = &#039;orange&#039;;&lt;br /&gt;
            } else {&lt;br /&gt;
                status.textContent = &#039;~estimated&#039;;&lt;br /&gt;
                status.style.color = &#039;green&#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 === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#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;
    &#039;use strict&#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(&#039;.timeago[data-lastmod-page]&#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, &#039;,&#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(&#039;data-lastmod-page&#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(&#039;wgScriptPath&#039;) + &#039;/api.php&#039;;&lt;br /&gt;
    var url = api + &#039;?action=query&amp;amp;prop=revisions&amp;amp;rvprop=timestamp&amp;amp;format=json&amp;amp;titles=&#039; +&lt;br /&gt;
        encodeURIComponent(titles.join(&#039;|&#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(&#039;data-lastmod-page&#039;);&lt;br /&gt;
            var ts = timestamps[title];&lt;br /&gt;
            if (!ts) {&lt;br /&gt;
                span.textContent = &#039;&#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 &#039;this block&#039;;&lt;br /&gt;
        } else if (blocksAgo === 1) {&lt;br /&gt;
            return &#039;1 block ago&#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            return formatNumber(blocksAgo) + &#039; blocks ago&#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * HLS Video Player - Initializes HLS.js for IPFS-hosted videos&lt;br /&gt;
 *&lt;br /&gt;
 * Usage in wikitext (via Template:HLSVideo):&lt;br /&gt;
 *   &amp;lt;div class=&amp;quot;hls-video-player&amp;quot; data-cid=&amp;quot;QmXet6...&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * The gadget loads hls.js and initializes players for any element&lt;br /&gt;
 * with the hls-video-player class and a data-cid attribute.&lt;br /&gt;
 *&lt;br /&gt;
 * Supports both HLS streams (CID/master.m3u8) and raw video files.&lt;br /&gt;
 * Tries HLS first; if the manifest 404s, falls back to direct playback.&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var IPFS_GATEWAY = &#039;https://ipfs.delivery-kid.cryptograss.live/ipfs&#039;;&lt;br /&gt;
    var HLS_JS_URL = &#039;https://cdn.jsdelivr.net/npm/hls.js@latest&#039;;&lt;br /&gt;
    var hlsLoadPromise = null;&lt;br /&gt;
&lt;br /&gt;
    // CIDv1 (bafy...) is Base32 lowercase, but MediaWiki capitalizes page titles.&lt;br /&gt;
    // CIDv0 (Qm...) is Base58 case-sensitive — must not be lowercased.&lt;br /&gt;
    function normalizeCid(cid) {&lt;br /&gt;
        if (cid &amp;amp;&amp;amp; cid.substring(0, 4) === &#039;Bafy&#039;) {&lt;br /&gt;
            return cid.toLowerCase();&lt;br /&gt;
        }&lt;br /&gt;
        return cid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadHls() {&lt;br /&gt;
        if (typeof Hls !== &#039;undefined&#039;) {&lt;br /&gt;
            return Promise.resolve();&lt;br /&gt;
        }&lt;br /&gt;
        if (hlsLoadPromise) {&lt;br /&gt;
            return hlsLoadPromise;&lt;br /&gt;
        }&lt;br /&gt;
        hlsLoadPromise = new Promise(function(resolve) {&lt;br /&gt;
            var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
            script.src = HLS_JS_URL;&lt;br /&gt;
            script.onload = resolve;&lt;br /&gt;
            document.head.appendChild(script);&lt;br /&gt;
        });&lt;br /&gt;
        return hlsLoadPromise;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayers() {&lt;br /&gt;
        var containers = document.querySelectorAll(&#039;.hls-video-player[data-cid]:not([data-initialized])&#039;);&lt;br /&gt;
        if (!containers.length) return;&lt;br /&gt;
&lt;br /&gt;
        // Mark ALL containers immediately to prevent race conditions&lt;br /&gt;
        containers.forEach(function(c) {&lt;br /&gt;
            c.setAttribute(&#039;data-initialized&#039;, &#039;true&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Then load hls.js and initialize&lt;br /&gt;
        loadHls().then(function() {&lt;br /&gt;
            containers.forEach(initPlayer);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function createVideoElement(width, maxWidth) {&lt;br /&gt;
        var video = document.createElement(&#039;video&#039;);&lt;br /&gt;
        video.controls = true;&lt;br /&gt;
        video.playsInline = true;&lt;br /&gt;
        video.style.width = width;&lt;br /&gt;
        video.style.maxWidth = maxWidth;&lt;br /&gt;
        video.style.backgroundColor = &#039;#000&#039;;&lt;br /&gt;
        video.style.display = &#039;block&#039;;&lt;br /&gt;
        return video;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fallbackToDirectVideo(container, cid, width, maxWidth) {&lt;br /&gt;
        // CID is a raw video file, not an HLS stream — play directly&lt;br /&gt;
        var directUrl = IPFS_GATEWAY + &#039;/&#039; + normalizeCid(cid);&lt;br /&gt;
        container.innerHTML = &#039;&#039;;&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        video.src = directUrl;&lt;br /&gt;
        video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
            container.innerHTML = &#039;&amp;lt;p style=&amp;quot;color: red; padding: 1em;&amp;quot;&amp;gt;Error loading video. The IPFS content may not be available.&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayer(container) {&lt;br /&gt;
        var cid = container.getAttribute(&#039;data-cid&#039;);&lt;br /&gt;
        var normalCid = normalizeCid(cid);&lt;br /&gt;
        var width = container.getAttribute(&#039;data-width&#039;) || &#039;100%&#039;;&lt;br /&gt;
        var maxWidth = container.getAttribute(&#039;data-max-width&#039;) || &#039;800px&#039;;&lt;br /&gt;
        &lt;br /&gt;
        var hlsSrc = IPFS_GATEWAY + &#039;/&#039; + normalCid + &#039;/master.m3u8&#039;;&lt;br /&gt;
&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
&lt;br /&gt;
        if (video.canPlayType(&#039;application/vnd.apple.mpegurl&#039;)) {&lt;br /&gt;
            // Safari native HLS — try HLS first, fall back on error&lt;br /&gt;
            video.src = hlsSrc;&lt;br /&gt;
            video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
                fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
            });&lt;br /&gt;
        } else if (typeof Hls !== &#039;undefined&#039; &amp;amp;&amp;amp; Hls.isSupported()) {&lt;br /&gt;
            var hls = new Hls();&lt;br /&gt;
            hls.loadSource(hlsSrc);&lt;br /&gt;
            hls.attachMedia(video);&lt;br /&gt;
            hls.on(Hls.Events.ERROR, function(event, data) {&lt;br /&gt;
                if (data.fatal) {&lt;br /&gt;
                    // HLS failed (likely no master.m3u8) — try direct video&lt;br /&gt;
                    hls.destroy();&lt;br /&gt;
                    fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // No HLS support — try direct video&lt;br /&gt;
            fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPlayers);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPlayers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (typeof mw !== &#039;undefined&#039; &amp;amp;&amp;amp; mw.hook) {&lt;br /&gt;
        mw.hook(&#039;wikipage.content&#039;).add(function($content) {&lt;br /&gt;
            initPlayers();&lt;br /&gt;
        });&lt;br /&gt;
    }&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;
    &#039;use strict&#039;;&lt;br /&gt;
    console.log(&#039;PickiPedia Common.js instrument module v24772700 loaded&#039;);&lt;br /&gt;
&lt;br /&gt;
    mw.hook(&#039;pf.formValidation&#039;).add(function(args) {&lt;br /&gt;
        var nickname = document.querySelector(&#039;input[name=&amp;quot;Instrument[nickname]&amp;quot;]&#039;);&lt;br /&gt;
        if (!nickname) return;&lt;br /&gt;
&lt;br /&gt;
        var make = document.querySelector(&#039;input[name=&amp;quot;Instrument[make]&amp;quot;]&#039;);&lt;br /&gt;
        var model = document.querySelector(&#039;input[name=&amp;quot;Instrument[model]&amp;quot;]&#039;);&lt;br /&gt;
        var serial = document.querySelector(&#039;input[name=&amp;quot;Instrument[serial]&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
        var nickVal = nickname.value.trim();&lt;br /&gt;
        var makeVal = make ? make.value.trim() : &#039;&#039;;&lt;br /&gt;
        var modelVal = model ? model.value.trim() : &#039;&#039;;&lt;br /&gt;
        var serialVal = serial ? serial.value.trim() : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        var hasNickname = nickVal !== &#039;&#039;;&lt;br /&gt;
        var hasMakerComplete = makeVal !== &#039;&#039; &amp;amp;&amp;amp; modelVal !== &#039;&#039; &amp;amp;&amp;amp; serialVal !== &#039;&#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 !== &#039;&#039; || modelVal !== &#039;&#039; || serialVal !== &#039;&#039;) {&lt;br /&gt;
                alert(&#039;Maker identification requires all three: make, model, and serial number. Or provide a nickname instead.&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                alert(&#039;Please provide either a nickname or maker identification (make, model, and serial number).&#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 + &#039; &#039; + modelVal + &#039; &#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;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 2) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;/&#039;) === -1) return;&lt;br /&gt;
&lt;br /&gt;
  var slash    = title.indexOf(&#039;/&#039;);&lt;br /&gt;
  var username = title.slice(0, slash).replace(/_/g, &#039; &#039;);&lt;br /&gt;
  var subpage  = title.slice(slash + 1).replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-userpost&#039;);&lt;br /&gt;
&lt;br /&gt;
  var variant = &#039;letter&#039;;&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var html = content.innerHTML || &#039;&#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(&#039;wgCategories&#039;) || [];&lt;br /&gt;
  if (cats.indexOf(&#039;Masthead style&#039;) !== -1) variant = &#039;masthead&#039;;&lt;br /&gt;
  if (cats.indexOf(&#039;Letter style&#039;) !== -1) variant = &#039;letter&#039;;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-variant-&#039; + variant);&lt;br /&gt;
&lt;br /&gt;
  var STORAGE_KEY = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  var saved = null;&lt;br /&gt;
  try { saved = localStorage.getItem(STORAGE_KEY); } catch (e) {}&lt;br /&gt;
  if (saved === &#039;dark&#039;) body.classList.add(&#039;pickipedia-dark&#039;);&lt;br /&gt;
&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Corner logo: stand-alone body child, absolute-positioned. ----------&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#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(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-topbar-nav&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#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 = &#039;&#039;;&lt;br /&gt;
    var dekEl = content.querySelector(&#039;.pp-dek-source&#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 = &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;User:&#039; + username.replace(/ /g, &#039;_&#039;)) +&lt;br /&gt;
                     &#039;&amp;quot;&amp;gt;User:&#039; + escapeHtml(username) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    var kickerEl = content.querySelector(&#039;.pp-kicker-source&#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 = &#039;&#039;;&lt;br /&gt;
    var lastModEl = document.getElementById(&#039;footer-info-lastmod&#039;);&lt;br /&gt;
    if (lastModEl) lastMod = lastModEl.textContent.replace(/^\s*This page was last (edited|modified) on\s*/i, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
    hero.className = &#039;pickipedia-hero&#039;;&lt;br /&gt;
&lt;br /&gt;
    if (variant === &#039;masthead&#039;) {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-topbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-topbar-rule&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-topbar-vol&amp;quot;&amp;gt;&#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-titlewrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
          (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#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;
        &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;Last edited &#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#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(&#039;button&#039;);&lt;br /&gt;
  toggle.className = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  toggle.type = &#039;button&#039;;&lt;br /&gt;
  toggle.textContent = body.classList.contains(&#039;pickipedia-dark&#039;) ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
  toggle.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
    var dark = body.classList.toggle(&#039;pickipedia-dark&#039;);&lt;br /&gt;
    toggle.textContent = dark ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
    try { localStorage.setItem(STORAGE_KEY, dark ? &#039;dark&#039; : &#039;light&#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 ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
}());&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Pickipedia — Show: page hero.&lt;br /&gt;
 *&lt;br /&gt;
 * For mainspace pages whose title starts with &amp;quot;Show:&amp;quot; (the legacy&lt;br /&gt;
 * mainspace convention used pre-namespace), adds .pickipedia-show&lt;br /&gt;
 * to body and absorbs Template:Show&#039;s infobox into a poster-style&lt;br /&gt;
 * hero. If the page does not use Template:Show only the body class&lt;br /&gt;
 * is added — the setlist typography in Common.css still applies.&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 0) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;Show:&#039;) !== 0) return;&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-show&#039;);&lt;br /&gt;
&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (!content) return;&lt;br /&gt;
&lt;br /&gt;
  var infobox = content.querySelector(&#039;.show-infobox&#039;);&lt;br /&gt;
  if (!infobox) return;  // Bare show page — body class only.&lt;br /&gt;
&lt;br /&gt;
  // ---------- Pull fields out of the existing infobox ----------&lt;br /&gt;
  // Template:Show emits rows of &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Label:&amp;lt;/strong&amp;gt; value&amp;lt;/div&amp;gt;&lt;br /&gt;
  // plus a top banner with &amp;quot;Artists at Venue&amp;quot; and optional image.&lt;br /&gt;
  function fieldValue(label) {&lt;br /&gt;
    var rows = infobox.querySelectorAll(&#039;div&#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; rows.length; i++) {&lt;br /&gt;
      var s = rows[i].querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (!s) continue;&lt;br /&gt;
      var labelText = s.textContent.replace(/[:\s]*$/, &#039;&#039;).trim();&lt;br /&gt;
      if (labelText !== label) continue;&lt;br /&gt;
      var clone = rows[i].cloneNode(true);&lt;br /&gt;
      var strong = clone.querySelector(&#039;strong&#039;);&lt;br /&gt;
      if (strong) strong.remove();&lt;br /&gt;
      return clone.innerHTML.trim().replace(/^[\s:]+/, &#039;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var artists  = fieldValue(&#039;Artists&#039;);&lt;br /&gt;
  var venue    = fieldValue(&#039;Venue&#039;);&lt;br /&gt;
  var showtime = fieldValue(&#039;Showtime&#039;);&lt;br /&gt;
  var tickets  = fieldValue(&#039;Tickets&#039;);&lt;br /&gt;
  var price    = fieldValue(&#039;Price&#039;);&lt;br /&gt;
  var ages     = fieldValue(&#039;Ages&#039;);&lt;br /&gt;
&lt;br /&gt;
  var imageImg = infobox.querySelector(&#039;img&#039;);&lt;br /&gt;
&lt;br /&gt;
  var status = &#039;&#039;;&lt;br /&gt;
  if (infobox.classList.contains(&#039;show-verified&#039;)) status = &#039;verified&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;bot-proposal&#039;)) status = &#039;proposed&#039;;&lt;br /&gt;
  else if (infobox.classList.contains(&#039;show-unverified&#039;)) status = &#039;unverified&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Build the poster hero ----------&lt;br /&gt;
  // Showtime is rendered by Template:Show as&lt;br /&gt;
  // [https://etherscan.io/block/N N] — pull the block number out and&lt;br /&gt;
  // format it with commas so the kicker reads &amp;quot;BLOCK 24,144,194&amp;quot;.&lt;br /&gt;
  function formatShowtime(htmlIn) {&lt;br /&gt;
    if (!htmlIn) return &#039;&#039;;&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;);&lt;br /&gt;
    tmp.innerHTML = htmlIn;&lt;br /&gt;
    var anchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    var blockNum = (anchor ? anchor.textContent : tmp.textContent).trim();&lt;br /&gt;
    var asInt = parseInt(blockNum.replace(/[^\d]/g, &#039;&#039;), 10);&lt;br /&gt;
    if (isNaN(asInt)) return blockNum;&lt;br /&gt;
    var formatted = asInt.toString().replace(/\B(?=(\d{3})+(?!\d))/g, &#039;,&#039;);&lt;br /&gt;
    var href = anchor ? anchor.href : &#039;&#039;;&lt;br /&gt;
    if (href) {&lt;br /&gt;
      return &#039;&amp;lt;a href=&amp;quot;&#039; + href + &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Block &#039; + formatted + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;Block &#039; + formatted;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var kickerBits = [];&lt;br /&gt;
  var showtimeHtml = formatShowtime(showtime);&lt;br /&gt;
  if (showtimeHtml) kickerBits.push(showtimeHtml);&lt;br /&gt;
&lt;br /&gt;
  var kickerHtml = kickerBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerBits.join(&#039;&amp;lt;span class=&amp;quot;pp-sep&amp;quot;&amp;gt;·&amp;lt;/span&amp;gt;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var venueHtml = venue ? &#039;&amp;lt;p class=&amp;quot;pp-venue&amp;quot;&amp;gt;at &#039; + venue + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var metaBits = [];&lt;br /&gt;
  if (price)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Price&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;$&#039; +&lt;br /&gt;
      escapeHtml(price.replace(/^\$/, &#039;&#039;)) + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  if (ages)&lt;br /&gt;
    metaBits.push(&#039;&amp;lt;span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-label&amp;quot;&amp;gt;Ages&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;pp-meta-value&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      ages + &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
  var metaHtml = metaBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;&#039; + metaBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var imageHtml = &#039;&#039;;&lt;br /&gt;
  if (imageImg) {&lt;br /&gt;
    imageHtml = &#039;&amp;lt;div class=&amp;quot;pp-image&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + imageImg.src +&lt;br /&gt;
      &#039;&amp;quot; alt=&amp;quot;&#039; + escapeHtml(imageImg.alt || &#039;&#039;) + &#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Tickets field is an anchor; surface its href as a poster action.&lt;br /&gt;
  var actionBits = [];&lt;br /&gt;
  if (tickets) {&lt;br /&gt;
    var tmp = document.createElement(&#039;div&#039;); tmp.innerHTML = tickets;&lt;br /&gt;
    var ticketAnchor = tmp.querySelector(&#039;a&#039;);&lt;br /&gt;
    if (ticketAnchor &amp;amp;&amp;amp; ticketAnchor.href) {&lt;br /&gt;
      actionBits.push(&#039;&amp;lt;a href=&amp;quot;&#039; + ticketAnchor.href +&lt;br /&gt;
        &#039;&amp;quot; target=&amp;quot;_blank&amp;quot; rel=&amp;quot;noopener&amp;quot;&amp;gt;Tickets&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  var actionsHtml = actionBits.length&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-actions&amp;quot;&amp;gt;&#039; + actionBits.join(&#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var statusHtml = status&lt;br /&gt;
    ? &#039;&amp;lt;div class=&amp;quot;pp-status is-&#039; + status + &#039;&amp;quot;&amp;gt;&#039; + status + &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
    : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
  var titleHtml = artists || escapeHtml(title.replace(/^Show:\s*/, &#039;&#039;));&lt;br /&gt;
&lt;br /&gt;
  var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
  hero.className = &#039;show-poster&#039;;&lt;br /&gt;
  hero.innerHTML =&lt;br /&gt;
    statusHtml +&lt;br /&gt;
    kickerHtml +&lt;br /&gt;
    &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + titleHtml + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
    venueHtml +&lt;br /&gt;
    metaHtml +&lt;br /&gt;
    imageHtml +&lt;br /&gt;
    actionsHtml;&lt;br /&gt;
&lt;br /&gt;
  content.insertBefore(hero, content.firstChild);&lt;br /&gt;
  infobox.classList.add(&#039;is-absorbed&#039;);&lt;br /&gt;
  body.classList.add(&#039;has-show-hero&#039;);&lt;br /&gt;
&lt;br /&gt;
  function escapeHtml(s) {&lt;br /&gt;
    return String(s == null ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Common.css&amp;diff=5250</id>
		<title>Candidate:Common.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Candidate:Common.css&amp;diff=5250"/>
		<updated>2026-06-02T18:52:46Z</updated>

		<summary type="html">&lt;p&gt;Magent: Staging full proposed Common.css for sysop review (new Show: styling at bottom)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* |status=proposed -- bot-staged; remove this line when promoting. */&lt;br /&gt;
/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
#siteSub {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
    .show-infobox {&lt;br /&gt;
        float: none !important;&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
        margin: 0 0 1em 0 !important;&lt;br /&gt;
        box-sizing: border-box;&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;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost.pickipedia-dark {&lt;br /&gt;
  --pp-paper:   #1a1410;&lt;br /&gt;
  --pp-ink:     #e8dccb;&lt;br /&gt;
  --pp-muted:   #a89888;&lt;br /&gt;
  --pp-rule:    #3a2e22;&lt;br /&gt;
  --pp-accent:  #d97a4a;&lt;br /&gt;
  --pp-card:    #221a14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #column-one,&lt;br /&gt;
.pickipedia-userpost #sidebar,&lt;br /&gt;
.pickipedia-userpost #mw-panel,&lt;br /&gt;
.pickipedia-userpost .vector-main-menu-container,&lt;br /&gt;
.pickipedia-userpost .vector-page-toolbar,&lt;br /&gt;
.pickipedia-userpost #mw-navigation .portal,&lt;br /&gt;
.pickipedia-userpost .mw-sidebar-container,&lt;br /&gt;
.pickipedia-userpost #p-views,&lt;br /&gt;
.pickipedia-userpost #p-cactions,&lt;br /&gt;
.pickipedia-userpost #p-cactions-mobile,&lt;br /&gt;
.pickipedia-userpost #p-personal,&lt;br /&gt;
.pickipedia-userpost #p-logo,&lt;br /&gt;
.pickipedia-userpost .vector-page-tools,&lt;br /&gt;
.pickipedia-userpost .mw-footer,&lt;br /&gt;
.pickipedia-userpost #footer,&lt;br /&gt;
.pickipedia-userpost .printfooter,&lt;br /&gt;
.pickipedia-userpost .catlinks,&lt;br /&gt;
.pickipedia-userpost .mw-indicators,&lt;br /&gt;
.pickipedia-userpost #siteSub,&lt;br /&gt;
.pickipedia-userpost #contentSub,&lt;br /&gt;
.pickipedia-userpost .subpages,&lt;br /&gt;
.pickipedia-userpost #jump-to-nav,&lt;br /&gt;
.pickipedia-userpost .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #globalWrapper,&lt;br /&gt;
.pickipedia-userpost #column-content,&lt;br /&gt;
.pickipedia-userpost .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #content,&lt;br /&gt;
.pickipedia-userpost .mw-body,&lt;br /&gt;
.pickipedia-userpost #bodyContent,&lt;br /&gt;
.pickipedia-userpost .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-first-heading,&lt;br /&gt;
.pickipedia-userpost #firstHeading,&lt;br /&gt;
.pickipedia-userpost h1.firstHeading {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo: flush to upper-left, fluid sized. ---------- */&lt;br /&gt;
.pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar (nav only) — non-sticky, slim. ---------- */&lt;br /&gt;
.pickipedia-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Hero ---------- */&lt;br /&gt;
.pickipedia-hero {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a:hover { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
/* When the kicker follows the title (letter variant), give it a small&lt;br /&gt;
   gap so it reads as a byline. */&lt;br /&gt;
.pickipedia-hero h1.pp-title + .pp-kicker {&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-dek {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 12px 0 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Body type ---------- */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 44px 0 16px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  letter-spacing: -0.01em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h3 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin: 32px 0 12px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s, background-size .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-repeat: repeat-x;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output blockquote {&lt;br /&gt;
  border-left: 3px solid var(--pp-accent);&lt;br /&gt;
  margin: 32px 0;&lt;br /&gt;
  padding: 4px 0 4px 24px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr {&lt;br /&gt;
  border: none;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 40px 0;&lt;br /&gt;
  height: 1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr::before {&lt;br /&gt;
  content: &amp;quot;❦&amp;quot;;&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output iframe,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output embed,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player {&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure {&lt;br /&gt;
  border: none;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;max-width:800px&amp;quot;],&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;width:400px&amp;quot;] {&lt;br /&gt;
  width: 100% !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumbcaption,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figcaption {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.86;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  float: left;&lt;br /&gt;
  padding: 6px 10px 0 0;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Letter (default) ---------- */&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  max-width: 640px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
  padding-left: 24px;&lt;br /&gt;
  padding-right: 24px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero {&lt;br /&gt;
  padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 52px;&lt;br /&gt;
  line-height: 1.08;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 21px;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h2 { font-size: 28px; line-height: 1.2; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h3 { font-size: 22px; line-height: 1.25; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output blockquote { font-size: 22px; line-height: 1.45; }&lt;br /&gt;
&lt;br /&gt;
/* On medium-narrow viewports the centered column would slide under&lt;br /&gt;
   the corner logo — push it right enough to clear. */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Masthead ---------- */&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 36px 48px 28px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 28px;&lt;br /&gt;
  align-items: end;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-rule {&lt;br /&gt;
  flex: 1; height: 1px; background: var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-vol {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.96;&lt;br /&gt;
  letter-spacing: -0.025em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  max-width: 620px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 12px 48px 80px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 32px;&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; * {&lt;br /&gt;
  grid-column: 4 / span 7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; figure,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .thumb,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; iframe,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; video,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .hls-video-player {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  margin: 24px 0 48px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-size: 26px;&lt;br /&gt;
  margin: 40px 0 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output blockquote {&lt;br /&gt;
  font-size: 28px;&lt;br /&gt;
  line-height: 1.3;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  border-bottom: 1px solid var(--pp-rule);&lt;br /&gt;
  padding: 12px 0;&lt;br /&gt;
  margin: 36px 0;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Light/dark toggle ---------- */&lt;br /&gt;
.pickipedia-mode {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 5px;&lt;br /&gt;
  right: 10px;&lt;br /&gt;
  background: var(--pp-card);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 50;&lt;br /&gt;
  transition: background .15s, color .15s, border-color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-mode:hover {&lt;br /&gt;
  border-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive (small screens) ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-topbar { padding: 10px 16px; }&lt;br /&gt;
  .pickipedia-topbar-nav { gap: 12px; font-size: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero { padding-top: 10px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-title { font-size: 32px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-dek { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter { font-size: 56px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
    padding: 24px 16px 18px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 16px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-title { font-size: 36px; }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
    padding: 12px 16px 64px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    font-size: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output &amp;gt; * { grid-column: 1; }&lt;br /&gt;
}&lt;br /&gt;
/* ============================================================&lt;br /&gt;
 * Pickipedia — Show: page styling&lt;br /&gt;
 *&lt;br /&gt;
 * Triggers when an article&#039;s title starts with &amp;quot;Show:&amp;quot; (legacy&lt;br /&gt;
 * mainspace convention, not a real namespace). Common.js adds&lt;br /&gt;
 * .pickipedia-show to body and absorbs Template:Show&#039;s infobox&lt;br /&gt;
 * into a poster-style hero; once absorbed the infobox is hidden.&lt;br /&gt;
 * Pages without Template:Show still get the setlist typography.&lt;br /&gt;
 *&lt;br /&gt;
 * Reuses the same paper/ink palette as .pickipedia-userpost so&lt;br /&gt;
 * shows and zine posts feel like the same publication.&lt;br /&gt;
 * ============================================================ */&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Poster (hero block) ---------- */&lt;br /&gt;
.pickipedia-show .show-poster {&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  padding: 32px 36px 28px;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
  position: relative;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0 0 12px;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  align-items: baseline;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-kicker .pp-sep { color: var(--pp-muted); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  font-size: 44px;&lt;br /&gt;
  line-height: 1.05;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 10px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-venue a { color: inherit; }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 16px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-label { opacity: 0.7; margin-right: 4px; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-meta .pp-meta-value { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-image { margin: 22px 0 0; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-image img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions {&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  flex-wrap: wrap;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.12em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-paper);&lt;br /&gt;
  background: var(--pp-accent);&lt;br /&gt;
  border: 1px solid var(--pp-accent);&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-actions a:hover {&lt;br /&gt;
  background: var(--pp-ink);&lt;br /&gt;
  border-color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .show-poster .pp-status {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 14px;&lt;br /&gt;
  right: 18px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 10px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-verified { color: #228b22; }&lt;br /&gt;
.pickipedia-show .show-poster .pp-status.is-proposed { color: #b8860b; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the original infobox once the hero has absorbed its data. */&lt;br /&gt;
.pickipedia-show .show-infobox.is-absorbed { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* Hide the slug-style firstHeading only when the hero has been built —&lt;br /&gt;
   bare Show: pages without Template:Show keep the heading so users&lt;br /&gt;
   aren&#039;t left with an untitled page. */&lt;br /&gt;
.pickipedia-show.has-show-hero #firstHeading,&lt;br /&gt;
.pickipedia-show.has-show-hero .mw-first-heading { display: none; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Setlist typography ---------- */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  letter-spacing: 0.22em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  margin: 32px 0 14px;&lt;br /&gt;
  padding-top: 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 .mw-editsection {&lt;br /&gt;
  font-family: var(--pp-sans);&lt;br /&gt;
  text-transform: none;&lt;br /&gt;
  letter-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-show .mw-parser-output ul {&lt;br /&gt;
  list-style: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 0 0 16px;&lt;br /&gt;
  counter-reset: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.5;&lt;br /&gt;
  padding: 6px 0 6px 40px;&lt;br /&gt;
  border-bottom: 1px dotted var(--pp-rule);&lt;br /&gt;
  position: relative;&lt;br /&gt;
  counter-increment: setlist;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li::before {&lt;br /&gt;
  content: counter(setlist, decimal-leading-zero);&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 8px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  letter-spacing: 0.05em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-show .mw-parser-output ul li:last-child { border-bottom: none; }&lt;br /&gt;
&lt;br /&gt;
/* Reset counter at every h2 so each set starts at 01. */&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 + ul,&lt;br /&gt;
.pickipedia-show .mw-parser-output h2 ~ ul:first-of-type { counter-reset: setlist; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-show .show-poster { padding: 22px 18px 18px; }&lt;br /&gt;
  .pickipedia-show .show-poster h1.pp-title { font-size: 30px; }&lt;br /&gt;
  .pickipedia-show .show-poster .pp-venue { font-size: 18px; }&lt;br /&gt;
  .pickipedia-show .mw-parser-output ul li { font-size: 17px; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5030</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5030"/>
		<updated>2026-04-29T04:18:47Z</updated>

		<summary type="html">&lt;p&gt;Magent: Cap video height (max-height:70vh, width:auto) so portrait videos don&amp;#039;t dominate the page (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
#siteSub {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
    .show-infobox {&lt;br /&gt;
        float: none !important;&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
        margin: 0 0 1em 0 !important;&lt;br /&gt;
        box-sizing: border-box;&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;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost.pickipedia-dark {&lt;br /&gt;
  --pp-paper:   #1a1410;&lt;br /&gt;
  --pp-ink:     #e8dccb;&lt;br /&gt;
  --pp-muted:   #a89888;&lt;br /&gt;
  --pp-rule:    #3a2e22;&lt;br /&gt;
  --pp-accent:  #d97a4a;&lt;br /&gt;
  --pp-card:    #221a14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #column-one,&lt;br /&gt;
.pickipedia-userpost #sidebar,&lt;br /&gt;
.pickipedia-userpost #mw-panel,&lt;br /&gt;
.pickipedia-userpost .vector-main-menu-container,&lt;br /&gt;
.pickipedia-userpost .vector-page-toolbar,&lt;br /&gt;
.pickipedia-userpost #mw-navigation .portal,&lt;br /&gt;
.pickipedia-userpost .mw-sidebar-container,&lt;br /&gt;
.pickipedia-userpost #p-views,&lt;br /&gt;
.pickipedia-userpost #p-cactions,&lt;br /&gt;
.pickipedia-userpost #p-cactions-mobile,&lt;br /&gt;
.pickipedia-userpost #p-personal,&lt;br /&gt;
.pickipedia-userpost #p-logo,&lt;br /&gt;
.pickipedia-userpost .vector-page-tools,&lt;br /&gt;
.pickipedia-userpost .mw-footer,&lt;br /&gt;
.pickipedia-userpost #footer,&lt;br /&gt;
.pickipedia-userpost .printfooter,&lt;br /&gt;
.pickipedia-userpost .catlinks,&lt;br /&gt;
.pickipedia-userpost .mw-indicators,&lt;br /&gt;
.pickipedia-userpost #siteSub,&lt;br /&gt;
.pickipedia-userpost #contentSub,&lt;br /&gt;
.pickipedia-userpost .subpages,&lt;br /&gt;
.pickipedia-userpost #jump-to-nav,&lt;br /&gt;
.pickipedia-userpost .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #globalWrapper,&lt;br /&gt;
.pickipedia-userpost #column-content,&lt;br /&gt;
.pickipedia-userpost .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #content,&lt;br /&gt;
.pickipedia-userpost .mw-body,&lt;br /&gt;
.pickipedia-userpost #bodyContent,&lt;br /&gt;
.pickipedia-userpost .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-first-heading,&lt;br /&gt;
.pickipedia-userpost #firstHeading,&lt;br /&gt;
.pickipedia-userpost h1.firstHeading {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo: flush to upper-left, fluid sized. ---------- */&lt;br /&gt;
.pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar (nav only) — non-sticky, slim. ---------- */&lt;br /&gt;
.pickipedia-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Hero ---------- */&lt;br /&gt;
.pickipedia-hero {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a:hover { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
/* When the kicker follows the title (letter variant), give it a small&lt;br /&gt;
   gap so it reads as a byline. */&lt;br /&gt;
.pickipedia-hero h1.pp-title + .pp-kicker {&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-dek {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 12px 0 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Body type ---------- */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 44px 0 16px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  letter-spacing: -0.01em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h3 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin: 32px 0 12px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s, background-size .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-repeat: repeat-x;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output blockquote {&lt;br /&gt;
  border-left: 3px solid var(--pp-accent);&lt;br /&gt;
  margin: 32px 0;&lt;br /&gt;
  padding: 4px 0 4px 24px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr {&lt;br /&gt;
  border: none;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 40px 0;&lt;br /&gt;
  height: 1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr::before {&lt;br /&gt;
  content: &amp;quot;❦&amp;quot;;&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output iframe,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output embed,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player {&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure {&lt;br /&gt;
  border: none;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;max-width:800px&amp;quot;],&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;width:400px&amp;quot;] {&lt;br /&gt;
  width: 100% !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cap video height so portrait sources (1080x1920) don&#039;t dominate the&lt;br /&gt;
   page. The HLS player JS sets video.style.width = &amp;quot;100%&amp;quot; inline; we&lt;br /&gt;
   override with width:auto so the natural aspect ratio is preserved&lt;br /&gt;
   when the height cap kicks in. */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video {&lt;br /&gt;
  max-height: 70vh !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  height: auto !important;&lt;br /&gt;
  margin: 0 auto !important;&lt;br /&gt;
  display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumbcaption,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figcaption {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.86;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  float: left;&lt;br /&gt;
  padding: 6px 10px 0 0;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Letter (default) ---------- */&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  max-width: 640px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
  padding-left: 24px;&lt;br /&gt;
  padding-right: 24px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero {&lt;br /&gt;
  padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 52px;&lt;br /&gt;
  line-height: 1.08;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 21px;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h2 { font-size: 28px; line-height: 1.2; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h3 { font-size: 22px; line-height: 1.25; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output blockquote { font-size: 22px; line-height: 1.45; }&lt;br /&gt;
&lt;br /&gt;
/* On medium-narrow viewports the centered column would slide under&lt;br /&gt;
   the corner logo — push it right enough to clear. */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Masthead ---------- */&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 36px 48px 28px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 28px;&lt;br /&gt;
  align-items: end;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-rule {&lt;br /&gt;
  flex: 1; height: 1px; background: var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-vol {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.96;&lt;br /&gt;
  letter-spacing: -0.025em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  max-width: 620px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 12px 48px 80px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 32px;&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; * {&lt;br /&gt;
  grid-column: 4 / span 7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; figure,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .thumb,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; iframe,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; video,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .hls-video-player {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  margin: 24px 0 48px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-size: 26px;&lt;br /&gt;
  margin: 40px 0 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output blockquote {&lt;br /&gt;
  font-size: 28px;&lt;br /&gt;
  line-height: 1.3;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  border-bottom: 1px solid var(--pp-rule);&lt;br /&gt;
  padding: 12px 0;&lt;br /&gt;
  margin: 36px 0;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Light/dark toggle ---------- */&lt;br /&gt;
.pickipedia-mode {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 5px;&lt;br /&gt;
  right: 10px;&lt;br /&gt;
  background: var(--pp-card);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 50;&lt;br /&gt;
  transition: background .15s, color .15s, border-color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-mode:hover {&lt;br /&gt;
  border-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive (small screens) ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-topbar { padding: 10px 16px; }&lt;br /&gt;
  .pickipedia-topbar-nav { gap: 12px; font-size: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero { padding-top: 10px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-title { font-size: 32px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-dek { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter { font-size: 56px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
    padding: 24px 16px 18px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 16px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-title { font-size: 36px; }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
    padding: 12px 16px 64px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    font-size: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output &amp;gt; * { grid-column: 1; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5024</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5024"/>
		<updated>2026-04-29T04:03:00Z</updated>

		<summary type="html">&lt;p&gt;Magent: Logo flush to top:0 left:0; add space between title and kicker (which now follows title) (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
#siteSub {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
    .show-infobox {&lt;br /&gt;
        float: none !important;&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
        margin: 0 0 1em 0 !important;&lt;br /&gt;
        box-sizing: border-box;&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;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost.pickipedia-dark {&lt;br /&gt;
  --pp-paper:   #1a1410;&lt;br /&gt;
  --pp-ink:     #e8dccb;&lt;br /&gt;
  --pp-muted:   #a89888;&lt;br /&gt;
  --pp-rule:    #3a2e22;&lt;br /&gt;
  --pp-accent:  #d97a4a;&lt;br /&gt;
  --pp-card:    #221a14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #column-one,&lt;br /&gt;
.pickipedia-userpost #sidebar,&lt;br /&gt;
.pickipedia-userpost #mw-panel,&lt;br /&gt;
.pickipedia-userpost .vector-main-menu-container,&lt;br /&gt;
.pickipedia-userpost .vector-page-toolbar,&lt;br /&gt;
.pickipedia-userpost #mw-navigation .portal,&lt;br /&gt;
.pickipedia-userpost .mw-sidebar-container,&lt;br /&gt;
.pickipedia-userpost #p-views,&lt;br /&gt;
.pickipedia-userpost #p-cactions,&lt;br /&gt;
.pickipedia-userpost #p-cactions-mobile,&lt;br /&gt;
.pickipedia-userpost #p-personal,&lt;br /&gt;
.pickipedia-userpost #p-logo,&lt;br /&gt;
.pickipedia-userpost .vector-page-tools,&lt;br /&gt;
.pickipedia-userpost .mw-footer,&lt;br /&gt;
.pickipedia-userpost #footer,&lt;br /&gt;
.pickipedia-userpost .printfooter,&lt;br /&gt;
.pickipedia-userpost .catlinks,&lt;br /&gt;
.pickipedia-userpost .mw-indicators,&lt;br /&gt;
.pickipedia-userpost #siteSub,&lt;br /&gt;
.pickipedia-userpost #contentSub,&lt;br /&gt;
.pickipedia-userpost .subpages,&lt;br /&gt;
.pickipedia-userpost #jump-to-nav,&lt;br /&gt;
.pickipedia-userpost .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #globalWrapper,&lt;br /&gt;
.pickipedia-userpost #column-content,&lt;br /&gt;
.pickipedia-userpost .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #content,&lt;br /&gt;
.pickipedia-userpost .mw-body,&lt;br /&gt;
.pickipedia-userpost #bodyContent,&lt;br /&gt;
.pickipedia-userpost .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-first-heading,&lt;br /&gt;
.pickipedia-userpost #firstHeading,&lt;br /&gt;
.pickipedia-userpost h1.firstHeading {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo: flush to upper-left, fluid sized. ---------- */&lt;br /&gt;
.pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar (nav only) — non-sticky, slim. ---------- */&lt;br /&gt;
.pickipedia-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Hero ---------- */&lt;br /&gt;
.pickipedia-hero {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a:hover { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
/* When the kicker follows the title (letter variant), give it a small&lt;br /&gt;
   gap so it reads as a byline. */&lt;br /&gt;
.pickipedia-hero h1.pp-title + .pp-kicker {&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-dek {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 12px 0 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Body type ---------- */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin-top: 28px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 44px 0 16px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  letter-spacing: -0.01em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h3 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin: 32px 0 12px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s, background-size .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-repeat: repeat-x;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output blockquote {&lt;br /&gt;
  border-left: 3px solid var(--pp-accent);&lt;br /&gt;
  margin: 32px 0;&lt;br /&gt;
  padding: 4px 0 4px 24px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr {&lt;br /&gt;
  border: none;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 40px 0;&lt;br /&gt;
  height: 1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr::before {&lt;br /&gt;
  content: &amp;quot;❦&amp;quot;;&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output iframe,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output embed,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player {&lt;br /&gt;
  margin: 28px 0;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure {&lt;br /&gt;
  border: none;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;max-width:800px&amp;quot;],&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;width:400px&amp;quot;] {&lt;br /&gt;
  width: 100% !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumbcaption,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figcaption {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.86;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  float: left;&lt;br /&gt;
  padding: 6px 10px 0 0;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Letter (default) ---------- */&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  max-width: 640px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
  padding-left: 24px;&lt;br /&gt;
  padding-right: 24px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero {&lt;br /&gt;
  padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 52px;&lt;br /&gt;
  line-height: 1.08;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 21px;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  padding-bottom: 80px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h2 { font-size: 28px; line-height: 1.2; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h3 { font-size: 22px; line-height: 1.25; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output blockquote { font-size: 22px; line-height: 1.45; }&lt;br /&gt;
&lt;br /&gt;
/* On medium-narrow viewports the centered column would slide under&lt;br /&gt;
   the corner logo — push it right enough to clear. */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Masthead ---------- */&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 36px 48px 28px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 28px;&lt;br /&gt;
  align-items: end;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-rule {&lt;br /&gt;
  flex: 1; height: 1px; background: var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-vol {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.96;&lt;br /&gt;
  letter-spacing: -0.025em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  max-width: 620px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 12px 48px 80px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 32px;&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; * {&lt;br /&gt;
  grid-column: 4 / span 7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; figure,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .thumb,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; iframe,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; video,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .hls-video-player {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  margin: 24px 0 48px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-size: 26px;&lt;br /&gt;
  margin: 40px 0 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output blockquote {&lt;br /&gt;
  font-size: 28px;&lt;br /&gt;
  line-height: 1.3;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  border-bottom: 1px solid var(--pp-rule);&lt;br /&gt;
  padding: 12px 0;&lt;br /&gt;
  margin: 36px 0;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Light/dark toggle ---------- */&lt;br /&gt;
.pickipedia-mode {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  bottom: 24px;&lt;br /&gt;
  right: 24px;&lt;br /&gt;
  background: var(--pp-card);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 50;&lt;br /&gt;
  transition: background .15s, color .15s, border-color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-mode:hover {&lt;br /&gt;
  border-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive (small screens) ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-topbar { padding: 10px 16px; }&lt;br /&gt;
  .pickipedia-topbar-nav { gap: 12px; font-size: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero { padding-top: 10px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-title { font-size: 32px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-dek { font-size: 17px; }&lt;br /&gt;
  .pickipedia-userpost .mw-parser-output { margin-top: 18px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter { font-size: 56px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
    padding: 24px 16px 18px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 16px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-title { font-size: 36px; }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
    padding: 12px 16px 64px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    font-size: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output &amp;gt; * { grid-column: 1; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.js&amp;diff=5023</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.js&amp;diff=5023"/>
		<updated>2026-04-29T04:01:52Z</updated>

		<summary type="html">&lt;p&gt;Magent: Letter variant: title above, kicker below (swap) (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&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;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on the Blue Railroad Submission form&lt;br /&gt;
    if (!document.querySelector(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#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(&#039;a[href*=&amp;quot;etherscan.io/block/&amp;quot;]&#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(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#039;);&lt;br /&gt;
        if (!blockInput) return;&lt;br /&gt;
        &lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.marginTop = &#039;8px&#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(&#039;br-datepicker&#039;);&lt;br /&gt;
        const convertBtn = document.getElementById(&#039;br-convert-btn&#039;);&lt;br /&gt;
        const status = document.getElementById(&#039;br-status&#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(&#039;click&#039;, function() {&lt;br /&gt;
            const selectedDate = new Date(datePicker.value);&lt;br /&gt;
            if (isNaN(selectedDate.getTime())) {&lt;br /&gt;
                status.textContent = &#039;Invalid date&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Could not find reference block&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Date is in the future!&#039;;&lt;br /&gt;
                status.style.color = &#039;orange&#039;;&lt;br /&gt;
            } else {&lt;br /&gt;
                status.textContent = &#039;~estimated&#039;;&lt;br /&gt;
                status.style.color = &#039;green&#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 === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#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;
    &#039;use strict&#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(&#039;.timeago[data-lastmod-page]&#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, &#039;,&#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(&#039;data-lastmod-page&#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(&#039;wgScriptPath&#039;) + &#039;/api.php&#039;;&lt;br /&gt;
    var url = api + &#039;?action=query&amp;amp;prop=revisions&amp;amp;rvprop=timestamp&amp;amp;format=json&amp;amp;titles=&#039; +&lt;br /&gt;
        encodeURIComponent(titles.join(&#039;|&#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(&#039;data-lastmod-page&#039;);&lt;br /&gt;
            var ts = timestamps[title];&lt;br /&gt;
            if (!ts) {&lt;br /&gt;
                span.textContent = &#039;&#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 &#039;this block&#039;;&lt;br /&gt;
        } else if (blocksAgo === 1) {&lt;br /&gt;
            return &#039;1 block ago&#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            return formatNumber(blocksAgo) + &#039; blocks ago&#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * HLS Video Player - Initializes HLS.js for IPFS-hosted videos&lt;br /&gt;
 *&lt;br /&gt;
 * Usage in wikitext (via Template:HLSVideo):&lt;br /&gt;
 *   &amp;lt;div class=&amp;quot;hls-video-player&amp;quot; data-cid=&amp;quot;QmXet6...&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * The gadget loads hls.js and initializes players for any element&lt;br /&gt;
 * with the hls-video-player class and a data-cid attribute.&lt;br /&gt;
 *&lt;br /&gt;
 * Supports both HLS streams (CID/master.m3u8) and raw video files.&lt;br /&gt;
 * Tries HLS first; if the manifest 404s, falls back to direct playback.&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var IPFS_GATEWAY = &#039;https://ipfs.delivery-kid.cryptograss.live/ipfs&#039;;&lt;br /&gt;
    var HLS_JS_URL = &#039;https://cdn.jsdelivr.net/npm/hls.js@latest&#039;;&lt;br /&gt;
    var hlsLoadPromise = null;&lt;br /&gt;
&lt;br /&gt;
    // CIDv1 (bafy...) is Base32 lowercase, but MediaWiki capitalizes page titles.&lt;br /&gt;
    // CIDv0 (Qm...) is Base58 case-sensitive — must not be lowercased.&lt;br /&gt;
    function normalizeCid(cid) {&lt;br /&gt;
        if (cid &amp;amp;&amp;amp; cid.substring(0, 4) === &#039;Bafy&#039;) {&lt;br /&gt;
            return cid.toLowerCase();&lt;br /&gt;
        }&lt;br /&gt;
        return cid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadHls() {&lt;br /&gt;
        if (typeof Hls !== &#039;undefined&#039;) {&lt;br /&gt;
            return Promise.resolve();&lt;br /&gt;
        }&lt;br /&gt;
        if (hlsLoadPromise) {&lt;br /&gt;
            return hlsLoadPromise;&lt;br /&gt;
        }&lt;br /&gt;
        hlsLoadPromise = new Promise(function(resolve) {&lt;br /&gt;
            var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
            script.src = HLS_JS_URL;&lt;br /&gt;
            script.onload = resolve;&lt;br /&gt;
            document.head.appendChild(script);&lt;br /&gt;
        });&lt;br /&gt;
        return hlsLoadPromise;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayers() {&lt;br /&gt;
        var containers = document.querySelectorAll(&#039;.hls-video-player[data-cid]:not([data-initialized])&#039;);&lt;br /&gt;
        if (!containers.length) return;&lt;br /&gt;
&lt;br /&gt;
        // Mark ALL containers immediately to prevent race conditions&lt;br /&gt;
        containers.forEach(function(c) {&lt;br /&gt;
            c.setAttribute(&#039;data-initialized&#039;, &#039;true&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Then load hls.js and initialize&lt;br /&gt;
        loadHls().then(function() {&lt;br /&gt;
            containers.forEach(initPlayer);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function createVideoElement(width, maxWidth) {&lt;br /&gt;
        var video = document.createElement(&#039;video&#039;);&lt;br /&gt;
        video.controls = true;&lt;br /&gt;
        video.playsInline = true;&lt;br /&gt;
        video.style.width = width;&lt;br /&gt;
        video.style.maxWidth = maxWidth;&lt;br /&gt;
        video.style.backgroundColor = &#039;#000&#039;;&lt;br /&gt;
        video.style.display = &#039;block&#039;;&lt;br /&gt;
        return video;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fallbackToDirectVideo(container, cid, width, maxWidth) {&lt;br /&gt;
        // CID is a raw video file, not an HLS stream — play directly&lt;br /&gt;
        var directUrl = IPFS_GATEWAY + &#039;/&#039; + normalizeCid(cid);&lt;br /&gt;
        container.innerHTML = &#039;&#039;;&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        video.src = directUrl;&lt;br /&gt;
        video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
            container.innerHTML = &#039;&amp;lt;p style=&amp;quot;color: red; padding: 1em;&amp;quot;&amp;gt;Error loading video. The IPFS content may not be available.&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayer(container) {&lt;br /&gt;
        var cid = container.getAttribute(&#039;data-cid&#039;);&lt;br /&gt;
        var normalCid = normalizeCid(cid);&lt;br /&gt;
        var width = container.getAttribute(&#039;data-width&#039;) || &#039;100%&#039;;&lt;br /&gt;
        var maxWidth = container.getAttribute(&#039;data-max-width&#039;) || &#039;800px&#039;;&lt;br /&gt;
        &lt;br /&gt;
        var hlsSrc = IPFS_GATEWAY + &#039;/&#039; + normalCid + &#039;/master.m3u8&#039;;&lt;br /&gt;
&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
&lt;br /&gt;
        if (video.canPlayType(&#039;application/vnd.apple.mpegurl&#039;)) {&lt;br /&gt;
            // Safari native HLS — try HLS first, fall back on error&lt;br /&gt;
            video.src = hlsSrc;&lt;br /&gt;
            video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
                fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
            });&lt;br /&gt;
        } else if (typeof Hls !== &#039;undefined&#039; &amp;amp;&amp;amp; Hls.isSupported()) {&lt;br /&gt;
            var hls = new Hls();&lt;br /&gt;
            hls.loadSource(hlsSrc);&lt;br /&gt;
            hls.attachMedia(video);&lt;br /&gt;
            hls.on(Hls.Events.ERROR, function(event, data) {&lt;br /&gt;
                if (data.fatal) {&lt;br /&gt;
                    // HLS failed (likely no master.m3u8) — try direct video&lt;br /&gt;
                    hls.destroy();&lt;br /&gt;
                    fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // No HLS support — try direct video&lt;br /&gt;
            fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPlayers);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPlayers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (typeof mw !== &#039;undefined&#039; &amp;amp;&amp;amp; mw.hook) {&lt;br /&gt;
        mw.hook(&#039;wikipage.content&#039;).add(function($content) {&lt;br /&gt;
            initPlayers();&lt;br /&gt;
        });&lt;br /&gt;
    }&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;
    &#039;use strict&#039;;&lt;br /&gt;
    console.log(&#039;PickiPedia Common.js instrument module v24772700 loaded&#039;);&lt;br /&gt;
&lt;br /&gt;
    mw.hook(&#039;pf.formValidation&#039;).add(function(args) {&lt;br /&gt;
        var nickname = document.querySelector(&#039;input[name=&amp;quot;Instrument[nickname]&amp;quot;]&#039;);&lt;br /&gt;
        if (!nickname) return;&lt;br /&gt;
&lt;br /&gt;
        var make = document.querySelector(&#039;input[name=&amp;quot;Instrument[make]&amp;quot;]&#039;);&lt;br /&gt;
        var model = document.querySelector(&#039;input[name=&amp;quot;Instrument[model]&amp;quot;]&#039;);&lt;br /&gt;
        var serial = document.querySelector(&#039;input[name=&amp;quot;Instrument[serial]&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
        var nickVal = nickname.value.trim();&lt;br /&gt;
        var makeVal = make ? make.value.trim() : &#039;&#039;;&lt;br /&gt;
        var modelVal = model ? model.value.trim() : &#039;&#039;;&lt;br /&gt;
        var serialVal = serial ? serial.value.trim() : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        var hasNickname = nickVal !== &#039;&#039;;&lt;br /&gt;
        var hasMakerComplete = makeVal !== &#039;&#039; &amp;amp;&amp;amp; modelVal !== &#039;&#039; &amp;amp;&amp;amp; serialVal !== &#039;&#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 !== &#039;&#039; || modelVal !== &#039;&#039; || serialVal !== &#039;&#039;) {&lt;br /&gt;
                alert(&#039;Maker identification requires all three: make, model, and serial number. Or provide a nickname instead.&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                alert(&#039;Please provide either a nickname or maker identification (make, model, and serial number).&#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 + &#039; &#039; + modelVal + &#039; &#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;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 2) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;/&#039;) === -1) return;&lt;br /&gt;
&lt;br /&gt;
  var slash    = title.indexOf(&#039;/&#039;);&lt;br /&gt;
  var username = title.slice(0, slash).replace(/_/g, &#039; &#039;);&lt;br /&gt;
  var subpage  = title.slice(slash + 1).replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-userpost&#039;);&lt;br /&gt;
&lt;br /&gt;
  var variant = &#039;letter&#039;;&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var html = content.innerHTML || &#039;&#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(&#039;wgCategories&#039;) || [];&lt;br /&gt;
  if (cats.indexOf(&#039;Masthead style&#039;) !== -1) variant = &#039;masthead&#039;;&lt;br /&gt;
  if (cats.indexOf(&#039;Letter style&#039;) !== -1) variant = &#039;letter&#039;;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-variant-&#039; + variant);&lt;br /&gt;
&lt;br /&gt;
  var STORAGE_KEY = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  var saved = null;&lt;br /&gt;
  try { saved = localStorage.getItem(STORAGE_KEY); } catch (e) {}&lt;br /&gt;
  if (saved === &#039;dark&#039;) body.classList.add(&#039;pickipedia-dark&#039;);&lt;br /&gt;
&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Corner logo: stand-alone body child, absolute-positioned. ----------&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#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(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-topbar-nav&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#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 = &#039;&#039;;&lt;br /&gt;
    var dekEl = content.querySelector(&#039;.pp-dek-source&#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 = &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;User:&#039; + username.replace(/ /g, &#039;_&#039;)) +&lt;br /&gt;
                     &#039;&amp;quot;&amp;gt;User:&#039; + escapeHtml(username) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    var kickerEl = content.querySelector(&#039;.pp-kicker-source&#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 = &#039;&#039;;&lt;br /&gt;
    var lastModEl = document.getElementById(&#039;footer-info-lastmod&#039;);&lt;br /&gt;
    if (lastModEl) lastMod = lastModEl.textContent.replace(/^\s*This page was last (edited|modified) on\s*/i, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
    hero.className = &#039;pickipedia-hero&#039;;&lt;br /&gt;
&lt;br /&gt;
    if (variant === &#039;masthead&#039;) {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-topbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-topbar-rule&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-topbar-vol&amp;quot;&amp;gt;&#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-titlewrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
          (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#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;
        &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;Last edited &#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#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(&#039;button&#039;);&lt;br /&gt;
  toggle.className = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  toggle.type = &#039;button&#039;;&lt;br /&gt;
  toggle.textContent = body.classList.contains(&#039;pickipedia-dark&#039;) ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
  toggle.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
    var dark = body.classList.toggle(&#039;pickipedia-dark&#039;);&lt;br /&gt;
    toggle.textContent = dark ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
    try { localStorage.setItem(STORAGE_KEY, dark ? &#039;dark&#039; : &#039;light&#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 ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5022</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5022"/>
		<updated>2026-04-29T03:54:25Z</updated>

		<summary type="html">&lt;p&gt;Magent: Logo: smaller and fluid-sized via clamp; add hero/content left padding so they clear the logo (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
#siteSub {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
    .show-infobox {&lt;br /&gt;
        float: none !important;&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
        margin: 0 0 1em 0 !important;&lt;br /&gt;
        box-sizing: border-box;&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;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost.pickipedia-dark {&lt;br /&gt;
  --pp-paper:   #1a1410;&lt;br /&gt;
  --pp-ink:     #e8dccb;&lt;br /&gt;
  --pp-muted:   #a89888;&lt;br /&gt;
  --pp-rule:    #3a2e22;&lt;br /&gt;
  --pp-accent:  #d97a4a;&lt;br /&gt;
  --pp-card:    #221a14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #column-one,&lt;br /&gt;
.pickipedia-userpost #sidebar,&lt;br /&gt;
.pickipedia-userpost #mw-panel,&lt;br /&gt;
.pickipedia-userpost .vector-main-menu-container,&lt;br /&gt;
.pickipedia-userpost .vector-page-toolbar,&lt;br /&gt;
.pickipedia-userpost #mw-navigation .portal,&lt;br /&gt;
.pickipedia-userpost .mw-sidebar-container,&lt;br /&gt;
.pickipedia-userpost #p-views,&lt;br /&gt;
.pickipedia-userpost #p-cactions,&lt;br /&gt;
.pickipedia-userpost #p-cactions-mobile,&lt;br /&gt;
.pickipedia-userpost #p-personal,&lt;br /&gt;
.pickipedia-userpost #p-logo,&lt;br /&gt;
.pickipedia-userpost .vector-page-tools,&lt;br /&gt;
.pickipedia-userpost .mw-footer,&lt;br /&gt;
.pickipedia-userpost #footer,&lt;br /&gt;
.pickipedia-userpost .printfooter,&lt;br /&gt;
.pickipedia-userpost .catlinks,&lt;br /&gt;
.pickipedia-userpost .mw-indicators,&lt;br /&gt;
.pickipedia-userpost #siteSub,&lt;br /&gt;
.pickipedia-userpost #contentSub,&lt;br /&gt;
.pickipedia-userpost .subpages,&lt;br /&gt;
.pickipedia-userpost #jump-to-nav,&lt;br /&gt;
.pickipedia-userpost .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #globalWrapper,&lt;br /&gt;
.pickipedia-userpost #column-content,&lt;br /&gt;
.pickipedia-userpost .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #content,&lt;br /&gt;
.pickipedia-userpost .mw-body,&lt;br /&gt;
.pickipedia-userpost #bodyContent,&lt;br /&gt;
.pickipedia-userpost .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-first-heading,&lt;br /&gt;
.pickipedia-userpost #firstHeading,&lt;br /&gt;
.pickipedia-userpost h1.firstHeading {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo: absolute-positioned upper-left, fluid-sized&lt;br /&gt;
   so it shrinks proportionally at narrower viewports and never crowds&lt;br /&gt;
   the content. ---------- */&lt;br /&gt;
.pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 16px;&lt;br /&gt;
  left: 16px;&lt;br /&gt;
  width: clamp(60px, 9vw, 130px);&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar (nav only) — non-sticky, slim. ---------- */&lt;br /&gt;
.pickipedia-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Hero ---------- */&lt;br /&gt;
.pickipedia-hero {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a:hover { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-dek {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Body type ---------- */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin-top: 28px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 44px 0 16px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  letter-spacing: -0.01em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h3 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin: 32px 0 12px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s, background-size .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-repeat: repeat-x;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output blockquote {&lt;br /&gt;
  border-left: 3px solid var(--pp-accent);&lt;br /&gt;
  margin: 32px 0;&lt;br /&gt;
  padding: 4px 0 4px 24px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr {&lt;br /&gt;
  border: none;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 40px 0;&lt;br /&gt;
  height: 1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr::before {&lt;br /&gt;
  content: &amp;quot;❦&amp;quot;;&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output iframe,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output embed,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player {&lt;br /&gt;
  margin: 28px 0;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure {&lt;br /&gt;
  border: none;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;max-width:800px&amp;quot;],&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;width:400px&amp;quot;] {&lt;br /&gt;
  width: 100% !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumbcaption,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figcaption {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.86;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  float: left;&lt;br /&gt;
  padding: 6px 10px 0 0;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Letter (default) ---------- */&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  max-width: 640px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
  padding-left: 24px;&lt;br /&gt;
  padding-right: 24px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero {&lt;br /&gt;
  padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 52px;&lt;br /&gt;
  line-height: 1.08;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 21px;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  padding-bottom: 80px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h2 { font-size: 28px; line-height: 1.2; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h3 { font-size: 22px; line-height: 1.25; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output blockquote { font-size: 22px; line-height: 1.45; }&lt;br /&gt;
&lt;br /&gt;
/* On medium-narrow viewports, the logo and the centered reading column&lt;br /&gt;
   start to overlap (logo extends to ~16px+130px=~146px from the left,&lt;br /&gt;
   while the centered column&#039;s left edge moves further left as the&lt;br /&gt;
   viewport narrows). Push the hero/content right enough to clear the&lt;br /&gt;
   logo. */&lt;br /&gt;
@media (min-width: 720px) and (max-width: 1100px) {&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    margin-left: 160px;&lt;br /&gt;
    margin-right: 24px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Masthead ---------- */&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 36px 48px 28px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 28px;&lt;br /&gt;
  align-items: end;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-rule {&lt;br /&gt;
  flex: 1; height: 1px; background: var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-vol {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.96;&lt;br /&gt;
  letter-spacing: -0.025em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  max-width: 620px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 12px 48px 80px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 32px;&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; * {&lt;br /&gt;
  grid-column: 4 / span 7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; figure,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .thumb,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; iframe,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; video,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .hls-video-player {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  margin: 24px 0 48px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-size: 26px;&lt;br /&gt;
  margin: 40px 0 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output blockquote {&lt;br /&gt;
  font-size: 28px;&lt;br /&gt;
  line-height: 1.3;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  border-bottom: 1px solid var(--pp-rule);&lt;br /&gt;
  padding: 12px 0;&lt;br /&gt;
  margin: 36px 0;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Light/dark toggle ---------- */&lt;br /&gt;
.pickipedia-mode {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  bottom: 24px;&lt;br /&gt;
  right: 24px;&lt;br /&gt;
  background: var(--pp-card);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 50;&lt;br /&gt;
  transition: background .15s, color .15s, border-color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-mode:hover {&lt;br /&gt;
  border-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive (small screens) ---------- */&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
  .pickipedia-topbar { padding: 10px 16px; }&lt;br /&gt;
  .pickipedia-topbar-nav { gap: 12px; font-size: 10px; }&lt;br /&gt;
&lt;br /&gt;
  /* Logo top-left, smaller, with hero padded to clear it. */&lt;br /&gt;
  .pp-corner-logo { top: 10px; left: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
    padding-left: max(24px, calc(9vw + 24px));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero { padding-top: 10px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-title { font-size: 32px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-dek { font-size: 17px; }&lt;br /&gt;
  .pickipedia-userpost .mw-parser-output { margin-top: 18px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter { font-size: 56px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
    padding: 24px 16px 18px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 16px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-title { font-size: 36px; }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
    padding: 12px 16px 64px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    font-size: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output &amp;gt; * { grid-column: 1; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5021</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5021"/>
		<updated>2026-04-29T03:48:40Z</updated>

		<summary type="html">&lt;p&gt;Magent: Corner logo as absolute element (won&amp;#039;t push content); topbar slim with just nav (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
#siteSub {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
    .show-infobox {&lt;br /&gt;
        float: none !important;&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
        margin: 0 0 1em 0 !important;&lt;br /&gt;
        box-sizing: border-box;&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;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost.pickipedia-dark {&lt;br /&gt;
  --pp-paper:   #1a1410;&lt;br /&gt;
  --pp-ink:     #e8dccb;&lt;br /&gt;
  --pp-muted:   #a89888;&lt;br /&gt;
  --pp-rule:    #3a2e22;&lt;br /&gt;
  --pp-accent:  #d97a4a;&lt;br /&gt;
  --pp-card:    #221a14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  position: relative; /* anchor for the absolute corner logo */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #column-one,&lt;br /&gt;
.pickipedia-userpost #sidebar,&lt;br /&gt;
.pickipedia-userpost #mw-panel,&lt;br /&gt;
.pickipedia-userpost .vector-main-menu-container,&lt;br /&gt;
.pickipedia-userpost .vector-page-toolbar,&lt;br /&gt;
.pickipedia-userpost #mw-navigation .portal,&lt;br /&gt;
.pickipedia-userpost .mw-sidebar-container,&lt;br /&gt;
.pickipedia-userpost #p-views,&lt;br /&gt;
.pickipedia-userpost #p-cactions,&lt;br /&gt;
.pickipedia-userpost #p-cactions-mobile,&lt;br /&gt;
.pickipedia-userpost #p-personal,&lt;br /&gt;
.pickipedia-userpost #p-logo,&lt;br /&gt;
.pickipedia-userpost .vector-page-tools,&lt;br /&gt;
.pickipedia-userpost .mw-footer,&lt;br /&gt;
.pickipedia-userpost #footer,&lt;br /&gt;
.pickipedia-userpost .printfooter,&lt;br /&gt;
.pickipedia-userpost .catlinks,&lt;br /&gt;
.pickipedia-userpost .mw-indicators,&lt;br /&gt;
.pickipedia-userpost #siteSub,&lt;br /&gt;
.pickipedia-userpost #contentSub,&lt;br /&gt;
.pickipedia-userpost .subpages,&lt;br /&gt;
.pickipedia-userpost #jump-to-nav,&lt;br /&gt;
.pickipedia-userpost .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #globalWrapper,&lt;br /&gt;
.pickipedia-userpost #column-content,&lt;br /&gt;
.pickipedia-userpost .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #content,&lt;br /&gt;
.pickipedia-userpost .mw-body,&lt;br /&gt;
.pickipedia-userpost #bodyContent,&lt;br /&gt;
.pickipedia-userpost .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-first-heading,&lt;br /&gt;
.pickipedia-userpost #firstHeading,&lt;br /&gt;
.pickipedia-userpost h1.firstHeading {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Corner logo: absolute-positioned upper-left of the body&lt;br /&gt;
   so it doesn&#039;t take any space in the document flow — content flows&lt;br /&gt;
   underneath it. The topbar / hero get padding to keep their content&lt;br /&gt;
   from sliding under it. ---------- */&lt;br /&gt;
.pp-corner-logo {&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 16px;&lt;br /&gt;
  left: 16px;&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  z-index: 5;&lt;br /&gt;
  display: block;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
.pp-corner-logo img {&lt;br /&gt;
  display: block;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  height: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar (nav only) — non-sticky, slim. ---------- */&lt;br /&gt;
.pickipedia-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: flex-end;&lt;br /&gt;
  padding: 14px 24px;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Hero ---------- */&lt;br /&gt;
.pickipedia-hero {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a:hover { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-dek {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Body type ---------- */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin-top: 28px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 44px 0 16px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  letter-spacing: -0.01em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h3 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin: 32px 0 12px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s, background-size .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-repeat: repeat-x;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output blockquote {&lt;br /&gt;
  border-left: 3px solid var(--pp-accent);&lt;br /&gt;
  margin: 32px 0;&lt;br /&gt;
  padding: 4px 0 4px 24px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr {&lt;br /&gt;
  border: none;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 40px 0;&lt;br /&gt;
  height: 1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr::before {&lt;br /&gt;
  content: &amp;quot;❦&amp;quot;;&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output iframe,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output embed,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player {&lt;br /&gt;
  margin: 28px 0;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure {&lt;br /&gt;
  border: none;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;max-width:800px&amp;quot;],&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;width:400px&amp;quot;] {&lt;br /&gt;
  width: 100% !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumbcaption,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figcaption {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.86;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  float: left;&lt;br /&gt;
  padding: 6px 10px 0 0;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Letter (default) ---------- */&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  max-width: 640px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
  padding-left: 24px;&lt;br /&gt;
  padding-right: 24px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero {&lt;br /&gt;
  padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 52px;&lt;br /&gt;
  line-height: 1.08;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 21px;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  padding-bottom: 80px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h2 { font-size: 28px; line-height: 1.2; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h3 { font-size: 22px; line-height: 1.25; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output blockquote { font-size: 22px; line-height: 1.45; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Masthead ---------- */&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 36px 48px 28px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 28px;&lt;br /&gt;
  align-items: end;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-rule {&lt;br /&gt;
  flex: 1; height: 1px; background: var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-vol {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.96;&lt;br /&gt;
  letter-spacing: -0.025em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  max-width: 620px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 12px 48px 80px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 32px;&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; * {&lt;br /&gt;
  grid-column: 4 / span 7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; figure,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .thumb,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; iframe,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; video,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .hls-video-player {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  margin: 24px 0 48px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-size: 26px;&lt;br /&gt;
  margin: 40px 0 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output blockquote {&lt;br /&gt;
  font-size: 28px;&lt;br /&gt;
  line-height: 1.3;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  border-bottom: 1px solid var(--pp-rule);&lt;br /&gt;
  padding: 12px 0;&lt;br /&gt;
  margin: 36px 0;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Light/dark toggle ---------- */&lt;br /&gt;
.pickipedia-mode {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  bottom: 24px;&lt;br /&gt;
  right: 24px;&lt;br /&gt;
  background: var(--pp-card);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 50;&lt;br /&gt;
  transition: background .15s, color .15s, border-color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-mode:hover {&lt;br /&gt;
  border-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 880px) {&lt;br /&gt;
  .pickipedia-topbar { padding: 10px 16px; }&lt;br /&gt;
  .pickipedia-topbar-nav { gap: 12px; font-size: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pp-corner-logo { width: 90px; top: 10px; left: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero { padding-top: 10px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-title { font-size: 32px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-dek { font-size: 17px; }&lt;br /&gt;
  .pickipedia-userpost .mw-parser-output { margin-top: 18px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter { font-size: 56px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
    padding: 24px 16px 18px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 16px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-title { font-size: 36px; }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
    padding: 12px 16px 64px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    font-size: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output &amp;gt; * { grid-column: 1; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.js&amp;diff=5020</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.js&amp;diff=5020"/>
		<updated>2026-04-29T03:47:34Z</updated>

		<summary type="html">&lt;p&gt;Magent: Logo as separate body-level element, absolute-positioned upper-left; topbar keeps only nav (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&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;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on the Blue Railroad Submission form&lt;br /&gt;
    if (!document.querySelector(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#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(&#039;a[href*=&amp;quot;etherscan.io/block/&amp;quot;]&#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(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#039;);&lt;br /&gt;
        if (!blockInput) return;&lt;br /&gt;
        &lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.marginTop = &#039;8px&#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(&#039;br-datepicker&#039;);&lt;br /&gt;
        const convertBtn = document.getElementById(&#039;br-convert-btn&#039;);&lt;br /&gt;
        const status = document.getElementById(&#039;br-status&#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(&#039;click&#039;, function() {&lt;br /&gt;
            const selectedDate = new Date(datePicker.value);&lt;br /&gt;
            if (isNaN(selectedDate.getTime())) {&lt;br /&gt;
                status.textContent = &#039;Invalid date&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Could not find reference block&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Date is in the future!&#039;;&lt;br /&gt;
                status.style.color = &#039;orange&#039;;&lt;br /&gt;
            } else {&lt;br /&gt;
                status.textContent = &#039;~estimated&#039;;&lt;br /&gt;
                status.style.color = &#039;green&#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 === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#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;
    &#039;use strict&#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(&#039;.timeago[data-lastmod-page]&#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, &#039;,&#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(&#039;data-lastmod-page&#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(&#039;wgScriptPath&#039;) + &#039;/api.php&#039;;&lt;br /&gt;
    var url = api + &#039;?action=query&amp;amp;prop=revisions&amp;amp;rvprop=timestamp&amp;amp;format=json&amp;amp;titles=&#039; +&lt;br /&gt;
        encodeURIComponent(titles.join(&#039;|&#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(&#039;data-lastmod-page&#039;);&lt;br /&gt;
            var ts = timestamps[title];&lt;br /&gt;
            if (!ts) {&lt;br /&gt;
                span.textContent = &#039;&#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 &#039;this block&#039;;&lt;br /&gt;
        } else if (blocksAgo === 1) {&lt;br /&gt;
            return &#039;1 block ago&#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            return formatNumber(blocksAgo) + &#039; blocks ago&#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * HLS Video Player - Initializes HLS.js for IPFS-hosted videos&lt;br /&gt;
 *&lt;br /&gt;
 * Usage in wikitext (via Template:HLSVideo):&lt;br /&gt;
 *   &amp;lt;div class=&amp;quot;hls-video-player&amp;quot; data-cid=&amp;quot;QmXet6...&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * The gadget loads hls.js and initializes players for any element&lt;br /&gt;
 * with the hls-video-player class and a data-cid attribute.&lt;br /&gt;
 *&lt;br /&gt;
 * Supports both HLS streams (CID/master.m3u8) and raw video files.&lt;br /&gt;
 * Tries HLS first; if the manifest 404s, falls back to direct playback.&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var IPFS_GATEWAY = &#039;https://ipfs.delivery-kid.cryptograss.live/ipfs&#039;;&lt;br /&gt;
    var HLS_JS_URL = &#039;https://cdn.jsdelivr.net/npm/hls.js@latest&#039;;&lt;br /&gt;
    var hlsLoadPromise = null;&lt;br /&gt;
&lt;br /&gt;
    // CIDv1 (bafy...) is Base32 lowercase, but MediaWiki capitalizes page titles.&lt;br /&gt;
    // CIDv0 (Qm...) is Base58 case-sensitive — must not be lowercased.&lt;br /&gt;
    function normalizeCid(cid) {&lt;br /&gt;
        if (cid &amp;amp;&amp;amp; cid.substring(0, 4) === &#039;Bafy&#039;) {&lt;br /&gt;
            return cid.toLowerCase();&lt;br /&gt;
        }&lt;br /&gt;
        return cid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadHls() {&lt;br /&gt;
        if (typeof Hls !== &#039;undefined&#039;) {&lt;br /&gt;
            return Promise.resolve();&lt;br /&gt;
        }&lt;br /&gt;
        if (hlsLoadPromise) {&lt;br /&gt;
            return hlsLoadPromise;&lt;br /&gt;
        }&lt;br /&gt;
        hlsLoadPromise = new Promise(function(resolve) {&lt;br /&gt;
            var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
            script.src = HLS_JS_URL;&lt;br /&gt;
            script.onload = resolve;&lt;br /&gt;
            document.head.appendChild(script);&lt;br /&gt;
        });&lt;br /&gt;
        return hlsLoadPromise;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayers() {&lt;br /&gt;
        var containers = document.querySelectorAll(&#039;.hls-video-player[data-cid]:not([data-initialized])&#039;);&lt;br /&gt;
        if (!containers.length) return;&lt;br /&gt;
&lt;br /&gt;
        // Mark ALL containers immediately to prevent race conditions&lt;br /&gt;
        containers.forEach(function(c) {&lt;br /&gt;
            c.setAttribute(&#039;data-initialized&#039;, &#039;true&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Then load hls.js and initialize&lt;br /&gt;
        loadHls().then(function() {&lt;br /&gt;
            containers.forEach(initPlayer);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function createVideoElement(width, maxWidth) {&lt;br /&gt;
        var video = document.createElement(&#039;video&#039;);&lt;br /&gt;
        video.controls = true;&lt;br /&gt;
        video.playsInline = true;&lt;br /&gt;
        video.style.width = width;&lt;br /&gt;
        video.style.maxWidth = maxWidth;&lt;br /&gt;
        video.style.backgroundColor = &#039;#000&#039;;&lt;br /&gt;
        video.style.display = &#039;block&#039;;&lt;br /&gt;
        return video;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fallbackToDirectVideo(container, cid, width, maxWidth) {&lt;br /&gt;
        // CID is a raw video file, not an HLS stream — play directly&lt;br /&gt;
        var directUrl = IPFS_GATEWAY + &#039;/&#039; + normalizeCid(cid);&lt;br /&gt;
        container.innerHTML = &#039;&#039;;&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        video.src = directUrl;&lt;br /&gt;
        video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
            container.innerHTML = &#039;&amp;lt;p style=&amp;quot;color: red; padding: 1em;&amp;quot;&amp;gt;Error loading video. The IPFS content may not be available.&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayer(container) {&lt;br /&gt;
        var cid = container.getAttribute(&#039;data-cid&#039;);&lt;br /&gt;
        var normalCid = normalizeCid(cid);&lt;br /&gt;
        var width = container.getAttribute(&#039;data-width&#039;) || &#039;100%&#039;;&lt;br /&gt;
        var maxWidth = container.getAttribute(&#039;data-max-width&#039;) || &#039;800px&#039;;&lt;br /&gt;
        &lt;br /&gt;
        var hlsSrc = IPFS_GATEWAY + &#039;/&#039; + normalCid + &#039;/master.m3u8&#039;;&lt;br /&gt;
&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
&lt;br /&gt;
        if (video.canPlayType(&#039;application/vnd.apple.mpegurl&#039;)) {&lt;br /&gt;
            // Safari native HLS — try HLS first, fall back on error&lt;br /&gt;
            video.src = hlsSrc;&lt;br /&gt;
            video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
                fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
            });&lt;br /&gt;
        } else if (typeof Hls !== &#039;undefined&#039; &amp;amp;&amp;amp; Hls.isSupported()) {&lt;br /&gt;
            var hls = new Hls();&lt;br /&gt;
            hls.loadSource(hlsSrc);&lt;br /&gt;
            hls.attachMedia(video);&lt;br /&gt;
            hls.on(Hls.Events.ERROR, function(event, data) {&lt;br /&gt;
                if (data.fatal) {&lt;br /&gt;
                    // HLS failed (likely no master.m3u8) — try direct video&lt;br /&gt;
                    hls.destroy();&lt;br /&gt;
                    fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // No HLS support — try direct video&lt;br /&gt;
            fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPlayers);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPlayers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (typeof mw !== &#039;undefined&#039; &amp;amp;&amp;amp; mw.hook) {&lt;br /&gt;
        mw.hook(&#039;wikipage.content&#039;).add(function($content) {&lt;br /&gt;
            initPlayers();&lt;br /&gt;
        });&lt;br /&gt;
    }&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;
    &#039;use strict&#039;;&lt;br /&gt;
    console.log(&#039;PickiPedia Common.js instrument module v24772700 loaded&#039;);&lt;br /&gt;
&lt;br /&gt;
    mw.hook(&#039;pf.formValidation&#039;).add(function(args) {&lt;br /&gt;
        var nickname = document.querySelector(&#039;input[name=&amp;quot;Instrument[nickname]&amp;quot;]&#039;);&lt;br /&gt;
        if (!nickname) return;&lt;br /&gt;
&lt;br /&gt;
        var make = document.querySelector(&#039;input[name=&amp;quot;Instrument[make]&amp;quot;]&#039;);&lt;br /&gt;
        var model = document.querySelector(&#039;input[name=&amp;quot;Instrument[model]&amp;quot;]&#039;);&lt;br /&gt;
        var serial = document.querySelector(&#039;input[name=&amp;quot;Instrument[serial]&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
        var nickVal = nickname.value.trim();&lt;br /&gt;
        var makeVal = make ? make.value.trim() : &#039;&#039;;&lt;br /&gt;
        var modelVal = model ? model.value.trim() : &#039;&#039;;&lt;br /&gt;
        var serialVal = serial ? serial.value.trim() : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        var hasNickname = nickVal !== &#039;&#039;;&lt;br /&gt;
        var hasMakerComplete = makeVal !== &#039;&#039; &amp;amp;&amp;amp; modelVal !== &#039;&#039; &amp;amp;&amp;amp; serialVal !== &#039;&#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 !== &#039;&#039; || modelVal !== &#039;&#039; || serialVal !== &#039;&#039;) {&lt;br /&gt;
                alert(&#039;Maker identification requires all three: make, model, and serial number. Or provide a nickname instead.&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                alert(&#039;Please provide either a nickname or maker identification (make, model, and serial number).&#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 + &#039; &#039; + modelVal + &#039; &#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 kicker, title, 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;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 2) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;/&#039;) === -1) return;&lt;br /&gt;
&lt;br /&gt;
  var slash    = title.indexOf(&#039;/&#039;);&lt;br /&gt;
  var username = title.slice(0, slash).replace(/_/g, &#039; &#039;);&lt;br /&gt;
  var subpage  = title.slice(slash + 1).replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-userpost&#039;);&lt;br /&gt;
&lt;br /&gt;
  var variant = &#039;letter&#039;;&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var html = content.innerHTML || &#039;&#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(&#039;wgCategories&#039;) || [];&lt;br /&gt;
  if (cats.indexOf(&#039;Masthead style&#039;) !== -1) variant = &#039;masthead&#039;;&lt;br /&gt;
  if (cats.indexOf(&#039;Letter style&#039;) !== -1) variant = &#039;letter&#039;;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-variant-&#039; + variant);&lt;br /&gt;
&lt;br /&gt;
  var STORAGE_KEY = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  var saved = null;&lt;br /&gt;
  try { saved = localStorage.getItem(STORAGE_KEY); } catch (e) {}&lt;br /&gt;
  if (saved === &#039;dark&#039;) body.classList.add(&#039;pickipedia-dark&#039;);&lt;br /&gt;
&lt;br /&gt;
  var LOGO_URL = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Corner logo: stand-alone body child, absolute-positioned. ----------&lt;br /&gt;
  var cornerLogo = document.createElement(&#039;a&#039;);&lt;br /&gt;
  cornerLogo.className = &#039;pp-corner-logo&#039;;&lt;br /&gt;
  cornerLogo.href = &#039;/wiki/Main_Page&#039;;&lt;br /&gt;
  cornerLogo.title = &#039;PickiPedia home&#039;;&lt;br /&gt;
  cornerLogo.innerHTML = &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_URL + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#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(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-topbar-nav&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#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 = &#039;&#039;;&lt;br /&gt;
    var dekEl = content.querySelector(&#039;.pp-dek-source&#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 = &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;User:&#039; + username.replace(/ /g, &#039;_&#039;)) +&lt;br /&gt;
                     &#039;&amp;quot;&amp;gt;User:&#039; + escapeHtml(username) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    var kickerEl = content.querySelector(&#039;.pp-kicker-source&#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 = &#039;&#039;;&lt;br /&gt;
    var lastModEl = document.getElementById(&#039;footer-info-lastmod&#039;);&lt;br /&gt;
    if (lastModEl) lastMod = lastModEl.textContent.replace(/^\s*This page was last (edited|modified) on\s*/i, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
    hero.className = &#039;pickipedia-hero&#039;;&lt;br /&gt;
&lt;br /&gt;
    if (variant === &#039;masthead&#039;) {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-topbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-topbar-rule&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-topbar-vol&amp;quot;&amp;gt;&#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-titlewrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
          (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
        (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;Last edited &#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#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(&#039;button&#039;);&lt;br /&gt;
  toggle.className = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  toggle.type = &#039;button&#039;;&lt;br /&gt;
  toggle.textContent = body.classList.contains(&#039;pickipedia-dark&#039;) ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
  toggle.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
    var dark = body.classList.toggle(&#039;pickipedia-dark&#039;);&lt;br /&gt;
    toggle.textContent = dark ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
    try { localStorage.setItem(STORAGE_KEY, dark ? &#039;dark&#039; : &#039;light&#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 ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5019</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.css&amp;diff=5019"/>
		<updated>2026-04-29T03:43:07Z</updated>

		<summary type="html">&lt;p&gt;Magent: Bigger topbar logo (always shown); drop masthead-in-hero rules (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
#siteSub {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
    .show-infobox {&lt;br /&gt;
        float: none !important;&lt;br /&gt;
        width: 100% !important;&lt;br /&gt;
        margin: 0 0 1em 0 !important;&lt;br /&gt;
        box-sizing: border-box;&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;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  --pp-paper:   #f5efe4;&lt;br /&gt;
  --pp-ink:     #2b1d12;&lt;br /&gt;
  --pp-muted:   #7a6450;&lt;br /&gt;
  --pp-rule:    #d9cdb8;&lt;br /&gt;
  --pp-accent:  #9a3b1b;&lt;br /&gt;
  --pp-card:    #ede4d2;&lt;br /&gt;
  --pp-serif:   Georgia, &amp;quot;Iowan Old Style&amp;quot;, &amp;quot;Charter&amp;quot;, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
  --pp-mono:    ui-monospace, &amp;quot;SF Mono&amp;quot;, &amp;quot;Menlo&amp;quot;, &amp;quot;Consolas&amp;quot;, monospace;&lt;br /&gt;
  --pp-sans:    -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost.pickipedia-dark {&lt;br /&gt;
  --pp-paper:   #1a1410;&lt;br /&gt;
  --pp-ink:     #e8dccb;&lt;br /&gt;
  --pp-muted:   #a89888;&lt;br /&gt;
  --pp-rule:    #3a2e22;&lt;br /&gt;
  --pp-accent:  #d97a4a;&lt;br /&gt;
  --pp-card:    #221a14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #column-one,&lt;br /&gt;
.pickipedia-userpost #sidebar,&lt;br /&gt;
.pickipedia-userpost #mw-panel,&lt;br /&gt;
.pickipedia-userpost .vector-main-menu-container,&lt;br /&gt;
.pickipedia-userpost .vector-page-toolbar,&lt;br /&gt;
.pickipedia-userpost #mw-navigation .portal,&lt;br /&gt;
.pickipedia-userpost .mw-sidebar-container,&lt;br /&gt;
.pickipedia-userpost #p-views,&lt;br /&gt;
.pickipedia-userpost #p-cactions,&lt;br /&gt;
.pickipedia-userpost #p-cactions-mobile,&lt;br /&gt;
.pickipedia-userpost #p-personal,&lt;br /&gt;
.pickipedia-userpost #p-logo,&lt;br /&gt;
.pickipedia-userpost .vector-page-tools,&lt;br /&gt;
.pickipedia-userpost .mw-footer,&lt;br /&gt;
.pickipedia-userpost #footer,&lt;br /&gt;
.pickipedia-userpost .printfooter,&lt;br /&gt;
.pickipedia-userpost .catlinks,&lt;br /&gt;
.pickipedia-userpost .mw-indicators,&lt;br /&gt;
.pickipedia-userpost #siteSub,&lt;br /&gt;
.pickipedia-userpost #contentSub,&lt;br /&gt;
.pickipedia-userpost .subpages,&lt;br /&gt;
.pickipedia-userpost #jump-to-nav,&lt;br /&gt;
.pickipedia-userpost .mw-jump-link {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #globalWrapper,&lt;br /&gt;
.pickipedia-userpost #column-content,&lt;br /&gt;
.pickipedia-userpost .monobook-body {&lt;br /&gt;
  float: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  width: auto !important;&lt;br /&gt;
  background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost #content,&lt;br /&gt;
.pickipedia-userpost .mw-body,&lt;br /&gt;
.pickipedia-userpost #bodyContent,&lt;br /&gt;
.pickipedia-userpost .mw-content-container {&lt;br /&gt;
  background: var(--pp-paper) !important;&lt;br /&gt;
  border: none !important;&lt;br /&gt;
  box-shadow: none !important;&lt;br /&gt;
  margin: 0 !important;&lt;br /&gt;
  padding: 0 !important;&lt;br /&gt;
  max-width: none !important;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-first-heading,&lt;br /&gt;
.pickipedia-userpost #firstHeading,&lt;br /&gt;
.pickipedia-userpost h1.firstHeading {&lt;br /&gt;
  display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Topbar (logo + nav) — non-sticky, sits at top of body&lt;br /&gt;
   above mw-content-text. Logo upper-left, nav upper-right. ---------- */&lt;br /&gt;
.pickipedia-topbar {&lt;br /&gt;
  position: static;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  justify-content: space-between;&lt;br /&gt;
  padding: 12px 24px;&lt;br /&gt;
  background: var(--pp-paper);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-logo {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-logo img {&lt;br /&gt;
  height: 120px;&lt;br /&gt;
  width: auto;&lt;br /&gt;
  display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 16px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-topbar-nav a:hover { color: var(--pp-accent); }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Hero ---------- */&lt;br /&gt;
.pickipedia-hero {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero .pp-kicker {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.18em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  font-weight: 600;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a {&lt;br /&gt;
  color: inherit;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  border-bottom: 1px dotted currentColor;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-kicker a:hover { color: var(--pp-ink); }&lt;br /&gt;
&lt;br /&gt;
.pickipedia-hero h1.pp-title {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  letter-spacing: -0.018em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-dek {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 14px 0 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-hero .pp-meta {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.08em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  margin: 0;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Body type ---------- */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  margin-top: 28px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; p {&lt;br /&gt;
  text-wrap: pretty;&lt;br /&gt;
  margin: 0 0 24px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  border: none;&lt;br /&gt;
  padding: 0;&lt;br /&gt;
  margin: 44px 0 16px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  letter-spacing: -0.01em;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; h3 {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  margin: 32px 0 12px;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a {&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  background-image: linear-gradient(var(--pp-accent), var(--pp-accent));&lt;br /&gt;
  background-repeat: no-repeat;&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  padding-bottom: 1px;&lt;br /&gt;
  transition: color .15s, background-size .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a:hover {&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output a.new {&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  background-image: linear-gradient(var(--pp-muted), var(--pp-muted));&lt;br /&gt;
  background-size: 100% 1px;&lt;br /&gt;
  background-repeat: repeat-x;&lt;br /&gt;
  background-position: 0 100%;&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output blockquote {&lt;br /&gt;
  border-left: 3px solid var(--pp-accent);&lt;br /&gt;
  margin: 32px 0;&lt;br /&gt;
  padding: 4px 0 4px 24px;&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr {&lt;br /&gt;
  border: none;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 40px 0;&lt;br /&gt;
  height: 1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output hr::before {&lt;br /&gt;
  content: &amp;quot;❦&amp;quot;;&lt;br /&gt;
  font-size: 18px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output iframe,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output video,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output embed,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .hls-video-player {&lt;br /&gt;
  margin: 28px 0;&lt;br /&gt;
  max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumb,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figure {&lt;br /&gt;
  border: none;&lt;br /&gt;
  background: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The {{HLSVideo|...|width=400px}} template wraps the player in a div&lt;br /&gt;
   with inline `width:400px;max-width:800px`. On a post the video should&lt;br /&gt;
   fill the reading column instead. */&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;max-width:800px&amp;quot;],&lt;br /&gt;
.pickipedia-userpost .mw-parser-output &amp;gt; div[style*=&amp;quot;width:400px&amp;quot;] {&lt;br /&gt;
  width: 100% !important;&lt;br /&gt;
  max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-userpost .mw-parser-output .thumbcaption,&lt;br /&gt;
.pickipedia-userpost .mw-parser-output figcaption {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-style: italic;&lt;br /&gt;
  font-size: 14px;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin-top: 12px;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter {&lt;br /&gt;
  font-family: var(--pp-serif);&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.86;&lt;br /&gt;
  font-weight: 700;&lt;br /&gt;
  float: left;&lt;br /&gt;
  padding: 6px 10px 0 0;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Letter (default) ---------- */&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero,&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  max-width: 640px;&lt;br /&gt;
  margin-left: auto;&lt;br /&gt;
  margin-right: auto;&lt;br /&gt;
  padding-left: 24px;&lt;br /&gt;
  padding-right: 24px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero {&lt;br /&gt;
  padding-top: 10px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 52px;&lt;br /&gt;
  line-height: 1.08;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 21px;&lt;br /&gt;
  line-height: 1.45;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output {&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.65;&lt;br /&gt;
  padding-bottom: 80px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h2 { font-size: 28px; line-height: 1.2; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output &amp;gt; h3 { font-size: 22px; line-height: 1.25; }&lt;br /&gt;
.pickipedia-variant-letter .mw-parser-output blockquote { font-size: 22px; line-height: 1.45; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Variant: Masthead ---------- */&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 36px 48px 28px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 28px;&lt;br /&gt;
  align-items: end;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 14px;&lt;br /&gt;
  margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-rule {&lt;br /&gt;
  flex: 1; height: 1px; background: var(--pp-rule);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-topbar-vol {&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  color: var(--pp-muted);&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-title {&lt;br /&gt;
  font-size: 76px;&lt;br /&gt;
  line-height: 0.96;&lt;br /&gt;
  letter-spacing: -0.025em;&lt;br /&gt;
  margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .pickipedia-hero .pp-dek {&lt;br /&gt;
  font-size: 22px;&lt;br /&gt;
  line-height: 1.4;&lt;br /&gt;
  margin: 22px 0 0;&lt;br /&gt;
  max-width: 620px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
  max-width: 1080px;&lt;br /&gt;
  margin: 0 auto;&lt;br /&gt;
  padding: 12px 48px 80px;&lt;br /&gt;
  display: grid;&lt;br /&gt;
  grid-template-columns: repeat(12, 1fr);&lt;br /&gt;
  gap: 32px;&lt;br /&gt;
  font-size: 19px;&lt;br /&gt;
  line-height: 1.7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; * {&lt;br /&gt;
  grid-column: 4 / span 7;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; figure,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .thumb,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; iframe,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; video,&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; .hls-video-player {&lt;br /&gt;
  grid-column: 1 / -1;&lt;br /&gt;
  margin: 24px 0 48px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output &amp;gt; h2 {&lt;br /&gt;
  font-size: 26px;&lt;br /&gt;
  margin: 40px 0 14px;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-variant-masthead .mw-parser-output blockquote {&lt;br /&gt;
  font-size: 28px;&lt;br /&gt;
  line-height: 1.3;&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
  border: none;&lt;br /&gt;
  border-top: 1px solid var(--pp-rule);&lt;br /&gt;
  border-bottom: 1px solid var(--pp-rule);&lt;br /&gt;
  padding: 12px 0;&lt;br /&gt;
  margin: 36px 0;&lt;br /&gt;
  text-wrap: balance;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Light/dark toggle ---------- */&lt;br /&gt;
.pickipedia-mode {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  bottom: 24px;&lt;br /&gt;
  right: 24px;&lt;br /&gt;
  background: var(--pp-card);&lt;br /&gt;
  color: var(--pp-ink);&lt;br /&gt;
  border: 1px solid var(--pp-rule);&lt;br /&gt;
  border-radius: 999px;&lt;br /&gt;
  padding: 8px 14px;&lt;br /&gt;
  font-family: var(--pp-mono);&lt;br /&gt;
  font-size: 11px;&lt;br /&gt;
  letter-spacing: 0.1em;&lt;br /&gt;
  text-transform: uppercase;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  z-index: 50;&lt;br /&gt;
  transition: background .15s, color .15s, border-color .15s;&lt;br /&gt;
}&lt;br /&gt;
.pickipedia-mode:hover {&lt;br /&gt;
  border-color: var(--pp-accent);&lt;br /&gt;
  color: var(--pp-accent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Responsive ---------- */&lt;br /&gt;
@media (max-width: 880px) {&lt;br /&gt;
  .pickipedia-topbar { padding: 10px 16px; }&lt;br /&gt;
  .pickipedia-topbar-logo img { height: 72px; }&lt;br /&gt;
  .pickipedia-topbar-nav { gap: 12px; font-size: 10px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero { padding-top: 10px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-title { font-size: 32px; }&lt;br /&gt;
  .pickipedia-variant-letter .pickipedia-hero .pp-dek { font-size: 17px; }&lt;br /&gt;
  .pickipedia-userpost .mw-parser-output { margin-top: 18px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output { font-size: 17px; }&lt;br /&gt;
  .pickipedia-variant-letter .mw-parser-output &amp;gt; p:first-of-type::first-letter { font-size: 56px; }&lt;br /&gt;
&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero {&lt;br /&gt;
    padding: 24px 16px 18px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    gap: 16px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-titlewrap {&lt;br /&gt;
    grid-column: 1 / -1;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .pickipedia-hero .pp-title { font-size: 36px; }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output {&lt;br /&gt;
    padding: 12px 16px 64px;&lt;br /&gt;
    grid-template-columns: 1fr;&lt;br /&gt;
    font-size: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  .pickipedia-variant-masthead .mw-parser-output &amp;gt; * { grid-column: 1; }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.js&amp;diff=5018</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Common.js&amp;diff=5018"/>
		<updated>2026-04-29T03:41:53Z</updated>

		<summary type="html">&lt;p&gt;Magent: Drop in-hero masthead logo; topbar logo is the only logo now (sits above mw-content-text) (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;hr /&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;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    // Only run on the Blue Railroad Submission form&lt;br /&gt;
    if (!document.querySelector(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#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(&#039;a[href*=&amp;quot;etherscan.io/block/&amp;quot;]&#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(&#039;input[name=&amp;quot;Blue Railroad Submission[block_height]&amp;quot;]&#039;);&lt;br /&gt;
        if (!blockInput) return;&lt;br /&gt;
        &lt;br /&gt;
        const container = document.createElement(&#039;div&#039;);&lt;br /&gt;
        container.style.marginTop = &#039;8px&#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(&#039;br-datepicker&#039;);&lt;br /&gt;
        const convertBtn = document.getElementById(&#039;br-convert-btn&#039;);&lt;br /&gt;
        const status = document.getElementById(&#039;br-status&#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(&#039;click&#039;, function() {&lt;br /&gt;
            const selectedDate = new Date(datePicker.value);&lt;br /&gt;
            if (isNaN(selectedDate.getTime())) {&lt;br /&gt;
                status.textContent = &#039;Invalid date&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Could not find reference block&#039;;&lt;br /&gt;
                status.style.color = &#039;red&#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 = &#039;Date is in the future!&#039;;&lt;br /&gt;
                status.style.color = &#039;orange&#039;;&lt;br /&gt;
            } else {&lt;br /&gt;
                status.textContent = &#039;~estimated&#039;;&lt;br /&gt;
                status.style.color = &#039;green&#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 === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#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;
    &#039;use strict&#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(&#039;.timeago[data-lastmod-page]&#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, &#039;,&#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(&#039;data-lastmod-page&#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(&#039;wgScriptPath&#039;) + &#039;/api.php&#039;;&lt;br /&gt;
    var url = api + &#039;?action=query&amp;amp;prop=revisions&amp;amp;rvprop=timestamp&amp;amp;format=json&amp;amp;titles=&#039; +&lt;br /&gt;
        encodeURIComponent(titles.join(&#039;|&#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(&#039;data-lastmod-page&#039;);&lt;br /&gt;
            var ts = timestamps[title];&lt;br /&gt;
            if (!ts) {&lt;br /&gt;
                span.textContent = &#039;&#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 &#039;this block&#039;;&lt;br /&gt;
        } else if (blocksAgo === 1) {&lt;br /&gt;
            return &#039;1 block ago&#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            return formatNumber(blocksAgo) + &#039; blocks ago&#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * HLS Video Player - Initializes HLS.js for IPFS-hosted videos&lt;br /&gt;
 *&lt;br /&gt;
 * Usage in wikitext (via Template:HLSVideo):&lt;br /&gt;
 *   &amp;lt;div class=&amp;quot;hls-video-player&amp;quot; data-cid=&amp;quot;QmXet6...&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * The gadget loads hls.js and initializes players for any element&lt;br /&gt;
 * with the hls-video-player class and a data-cid attribute.&lt;br /&gt;
 *&lt;br /&gt;
 * Supports both HLS streams (CID/master.m3u8) and raw video files.&lt;br /&gt;
 * Tries HLS first; if the manifest 404s, falls back to direct playback.&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    var IPFS_GATEWAY = &#039;https://ipfs.delivery-kid.cryptograss.live/ipfs&#039;;&lt;br /&gt;
    var HLS_JS_URL = &#039;https://cdn.jsdelivr.net/npm/hls.js@latest&#039;;&lt;br /&gt;
    var hlsLoadPromise = null;&lt;br /&gt;
&lt;br /&gt;
    // CIDv1 (bafy...) is Base32 lowercase, but MediaWiki capitalizes page titles.&lt;br /&gt;
    // CIDv0 (Qm...) is Base58 case-sensitive — must not be lowercased.&lt;br /&gt;
    function normalizeCid(cid) {&lt;br /&gt;
        if (cid &amp;amp;&amp;amp; cid.substring(0, 4) === &#039;Bafy&#039;) {&lt;br /&gt;
            return cid.toLowerCase();&lt;br /&gt;
        }&lt;br /&gt;
        return cid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadHls() {&lt;br /&gt;
        if (typeof Hls !== &#039;undefined&#039;) {&lt;br /&gt;
            return Promise.resolve();&lt;br /&gt;
        }&lt;br /&gt;
        if (hlsLoadPromise) {&lt;br /&gt;
            return hlsLoadPromise;&lt;br /&gt;
        }&lt;br /&gt;
        hlsLoadPromise = new Promise(function(resolve) {&lt;br /&gt;
            var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
            script.src = HLS_JS_URL;&lt;br /&gt;
            script.onload = resolve;&lt;br /&gt;
            document.head.appendChild(script);&lt;br /&gt;
        });&lt;br /&gt;
        return hlsLoadPromise;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayers() {&lt;br /&gt;
        var containers = document.querySelectorAll(&#039;.hls-video-player[data-cid]:not([data-initialized])&#039;);&lt;br /&gt;
        if (!containers.length) return;&lt;br /&gt;
&lt;br /&gt;
        // Mark ALL containers immediately to prevent race conditions&lt;br /&gt;
        containers.forEach(function(c) {&lt;br /&gt;
            c.setAttribute(&#039;data-initialized&#039;, &#039;true&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Then load hls.js and initialize&lt;br /&gt;
        loadHls().then(function() {&lt;br /&gt;
            containers.forEach(initPlayer);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function createVideoElement(width, maxWidth) {&lt;br /&gt;
        var video = document.createElement(&#039;video&#039;);&lt;br /&gt;
        video.controls = true;&lt;br /&gt;
        video.playsInline = true;&lt;br /&gt;
        video.style.width = width;&lt;br /&gt;
        video.style.maxWidth = maxWidth;&lt;br /&gt;
        video.style.backgroundColor = &#039;#000&#039;;&lt;br /&gt;
        video.style.display = &#039;block&#039;;&lt;br /&gt;
        return video;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function fallbackToDirectVideo(container, cid, width, maxWidth) {&lt;br /&gt;
        // CID is a raw video file, not an HLS stream — play directly&lt;br /&gt;
        var directUrl = IPFS_GATEWAY + &#039;/&#039; + normalizeCid(cid);&lt;br /&gt;
        container.innerHTML = &#039;&#039;;&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        video.src = directUrl;&lt;br /&gt;
        video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
            container.innerHTML = &#039;&amp;lt;p style=&amp;quot;color: red; padding: 1em;&amp;quot;&amp;gt;Error loading video. The IPFS content may not be available.&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initPlayer(container) {&lt;br /&gt;
        var cid = container.getAttribute(&#039;data-cid&#039;);&lt;br /&gt;
        var normalCid = normalizeCid(cid);&lt;br /&gt;
        var width = container.getAttribute(&#039;data-width&#039;) || &#039;100%&#039;;&lt;br /&gt;
        var maxWidth = container.getAttribute(&#039;data-max-width&#039;) || &#039;800px&#039;;&lt;br /&gt;
        &lt;br /&gt;
        var hlsSrc = IPFS_GATEWAY + &#039;/&#039; + normalCid + &#039;/master.m3u8&#039;;&lt;br /&gt;
&lt;br /&gt;
        var video = createVideoElement(width, maxWidth);&lt;br /&gt;
        container.appendChild(video);&lt;br /&gt;
&lt;br /&gt;
        if (video.canPlayType(&#039;application/vnd.apple.mpegurl&#039;)) {&lt;br /&gt;
            // Safari native HLS — try HLS first, fall back on error&lt;br /&gt;
            video.src = hlsSrc;&lt;br /&gt;
            video.addEventListener(&#039;error&#039;, function() {&lt;br /&gt;
                fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
            });&lt;br /&gt;
        } else if (typeof Hls !== &#039;undefined&#039; &amp;amp;&amp;amp; Hls.isSupported()) {&lt;br /&gt;
            var hls = new Hls();&lt;br /&gt;
            hls.loadSource(hlsSrc);&lt;br /&gt;
            hls.attachMedia(video);&lt;br /&gt;
            hls.on(Hls.Events.ERROR, function(event, data) {&lt;br /&gt;
                if (data.fatal) {&lt;br /&gt;
                    // HLS failed (likely no master.m3u8) — try direct video&lt;br /&gt;
                    hls.destroy();&lt;br /&gt;
                    fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        } else {&lt;br /&gt;
            // No HLS support — try direct video&lt;br /&gt;
            fallbackToDirectVideo(container, cid, width, maxWidth);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initPlayers);&lt;br /&gt;
    } else {&lt;br /&gt;
        initPlayers();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (typeof mw !== &#039;undefined&#039; &amp;amp;&amp;amp; mw.hook) {&lt;br /&gt;
        mw.hook(&#039;wikipage.content&#039;).add(function($content) {&lt;br /&gt;
            initPlayers();&lt;br /&gt;
        });&lt;br /&gt;
    }&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;
    &#039;use strict&#039;;&lt;br /&gt;
    console.log(&#039;PickiPedia Common.js instrument module v24772700 loaded&#039;);&lt;br /&gt;
&lt;br /&gt;
    mw.hook(&#039;pf.formValidation&#039;).add(function(args) {&lt;br /&gt;
        var nickname = document.querySelector(&#039;input[name=&amp;quot;Instrument[nickname]&amp;quot;]&#039;);&lt;br /&gt;
        if (!nickname) return;&lt;br /&gt;
&lt;br /&gt;
        var make = document.querySelector(&#039;input[name=&amp;quot;Instrument[make]&amp;quot;]&#039;);&lt;br /&gt;
        var model = document.querySelector(&#039;input[name=&amp;quot;Instrument[model]&amp;quot;]&#039;);&lt;br /&gt;
        var serial = document.querySelector(&#039;input[name=&amp;quot;Instrument[serial]&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
        var nickVal = nickname.value.trim();&lt;br /&gt;
        var makeVal = make ? make.value.trim() : &#039;&#039;;&lt;br /&gt;
        var modelVal = model ? model.value.trim() : &#039;&#039;;&lt;br /&gt;
        var serialVal = serial ? serial.value.trim() : &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
        var hasNickname = nickVal !== &#039;&#039;;&lt;br /&gt;
        var hasMakerComplete = makeVal !== &#039;&#039; &amp;amp;&amp;amp; modelVal !== &#039;&#039; &amp;amp;&amp;amp; serialVal !== &#039;&#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 !== &#039;&#039; || modelVal !== &#039;&#039; || serialVal !== &#039;&#039;) {&lt;br /&gt;
                alert(&#039;Maker identification requires all three: make, model, and serial number. Or provide a nickname instead.&#039;);&lt;br /&gt;
            } else {&lt;br /&gt;
                alert(&#039;Please provide either a nickname or maker identification (make, model, and serial number).&#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 + &#039; &#039; + modelVal + &#039; &#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 (Justin&#039;s design)&lt;br /&gt;
 *&lt;br /&gt;
 * Layout:&lt;br /&gt;
 *   - non-sticky topbar at top of body (logo upper-left, nav upper-right)&lt;br /&gt;
 *   - hero block with kicker, title, dek, optional last-edited line&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;
  &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (typeof mw === &#039;undefined&#039; || !mw.config) return;&lt;br /&gt;
&lt;br /&gt;
  var nsNumber = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
  var pageName = mw.config.get(&#039;wgPageName&#039;) || &#039;&#039;;&lt;br /&gt;
  var title    = mw.config.get(&#039;wgTitle&#039;) || &#039;&#039;;&lt;br /&gt;
  var action   = mw.config.get(&#039;wgAction&#039;) || &#039;view&#039;;&lt;br /&gt;
&lt;br /&gt;
  if (nsNumber !== 2) return;&lt;br /&gt;
  if (action !== &#039;view&#039;) return;&lt;br /&gt;
  if (title.indexOf(&#039;/&#039;) === -1) return;&lt;br /&gt;
&lt;br /&gt;
  var slash    = title.indexOf(&#039;/&#039;);&lt;br /&gt;
  var username = title.slice(0, slash).replace(/_/g, &#039; &#039;);&lt;br /&gt;
  var subpage  = title.slice(slash + 1).replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  var body = document.body;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-userpost&#039;);&lt;br /&gt;
&lt;br /&gt;
  var variant = &#039;letter&#039;;&lt;br /&gt;
  var content = document.querySelector(&#039;.mw-parser-output&#039;);&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var html = content.innerHTML || &#039;&#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(&#039;wgCategories&#039;) || [];&lt;br /&gt;
  if (cats.indexOf(&#039;Masthead style&#039;) !== -1) variant = &#039;masthead&#039;;&lt;br /&gt;
  if (cats.indexOf(&#039;Letter style&#039;) !== -1) variant = &#039;letter&#039;;&lt;br /&gt;
  body.classList.add(&#039;pickipedia-variant-&#039; + variant);&lt;br /&gt;
&lt;br /&gt;
  var STORAGE_KEY = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  var saved = null;&lt;br /&gt;
  try { saved = localStorage.getItem(STORAGE_KEY); } catch (e) {}&lt;br /&gt;
  if (saved === &#039;dark&#039;) body.classList.add(&#039;pickipedia-dark&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Pre-generated thumb of the transparent logo. 400px exists; 300 was a 404.&lt;br /&gt;
  var LOGO_TOPBAR = &#039;/images/thumb/8/80/Pickipedia-quarter-transparent.png/400px-Pickipedia-quarter-transparent.png&#039;;&lt;br /&gt;
&lt;br /&gt;
  // ---------- Topbar (logo + nav) — sits at the top of the body, outside&lt;br /&gt;
  //            mw-content-text. Non-sticky, so it scrolls away with the page.&lt;br /&gt;
  var topbar = document.createElement(&#039;header&#039;);&lt;br /&gt;
  topbar.className = &#039;pickipedia-topbar&#039;;&lt;br /&gt;
  topbar.innerHTML =&lt;br /&gt;
    &#039;&amp;lt;a class=&amp;quot;pickipedia-topbar-logo&amp;quot; href=&amp;quot;/wiki/Main_Page&amp;quot; title=&amp;quot;PickiPedia home&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;img src=&amp;quot;&#039; + LOGO_TOPBAR + &#039;&amp;quot; alt=&amp;quot;PickiPedia&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;nav class=&amp;quot;pickipedia-topbar-nav&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;edit&#039; }) + &#039;&amp;quot;&amp;gt;edit&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(pageName, { action: &#039;history&#039; }) + &#039;&amp;quot;&amp;gt;history&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;Talk:&#039; + pageName) + &#039;&amp;quot;&amp;gt;talk&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
    &#039;&amp;lt;/nav&amp;gt;&#039;;&lt;br /&gt;
  document.body.insertBefore(topbar, document.body.firstChild);&lt;br /&gt;
&lt;br /&gt;
  // ---------- Hero ----------&lt;br /&gt;
  if (content) {&lt;br /&gt;
    var dek = &#039;&#039;;&lt;br /&gt;
    var dekEl = content.querySelector(&#039;.pp-dek-source&#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 = &#039;&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&#039;User:&#039; + username.replace(/ /g, &#039;_&#039;)) +&lt;br /&gt;
                     &#039;&amp;quot;&amp;gt;User:&#039; + escapeHtml(username) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    var kickerEl = content.querySelector(&#039;.pp-kicker-source&#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 = &#039;&#039;;&lt;br /&gt;
    var lastModEl = document.getElementById(&#039;footer-info-lastmod&#039;);&lt;br /&gt;
    if (lastModEl) lastMod = lastModEl.textContent.replace(/^\s*This page was last (edited|modified) on\s*/i, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    var hero = document.createElement(&#039;header&#039;);&lt;br /&gt;
    hero.className = &#039;pickipedia-hero&#039;;&lt;br /&gt;
&lt;br /&gt;
    if (variant === &#039;masthead&#039;) {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-topbar&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;div class=&amp;quot;pp-topbar-rule&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
          (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-topbar-vol&amp;quot;&amp;gt;&#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-titlewrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
          &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
          (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
      hero.innerHTML =&lt;br /&gt;
        &#039;&amp;lt;div class=&amp;quot;pp-kicker&amp;quot;&amp;gt;&#039; + kickerHtml + &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
        &#039;&amp;lt;h1 class=&amp;quot;pp-title&amp;quot;&amp;gt;&#039; + escapeHtml(subpage) + &#039;&amp;lt;/h1&amp;gt;&#039; +&lt;br /&gt;
        (dek ? &#039;&amp;lt;p class=&amp;quot;pp-dek&amp;quot;&amp;gt;&#039; + dek + &#039;&amp;lt;/p&amp;gt;&#039; : &#039;&#039;) +&lt;br /&gt;
        (lastMod ? &#039;&amp;lt;div class=&amp;quot;pp-meta&amp;quot;&amp;gt;Last edited &#039; + escapeHtml(lastMod) + &#039;&amp;lt;/div&amp;gt;&#039; : &#039;&#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(&#039;button&#039;);&lt;br /&gt;
  toggle.className = &#039;pickipedia-mode&#039;;&lt;br /&gt;
  toggle.type = &#039;button&#039;;&lt;br /&gt;
  toggle.textContent = body.classList.contains(&#039;pickipedia-dark&#039;) ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
  toggle.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
    var dark = body.classList.toggle(&#039;pickipedia-dark&#039;);&lt;br /&gt;
    toggle.textContent = dark ? &#039;☼ Light&#039; : &#039;☾ Dark&#039;;&lt;br /&gt;
    try { localStorage.setItem(STORAGE_KEY, dark ? &#039;dark&#039; : &#039;light&#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 ? &#039;&#039; : s)&lt;br /&gt;
      .replace(/&amp;amp;/g, &#039;&amp;amp;amp;&#039;)&lt;br /&gt;
      .replace(/&amp;lt;/g, &#039;&amp;amp;lt;&#039;)&lt;br /&gt;
      .replace(/&amp;gt;/g, &#039;&amp;amp;gt;&#039;)&lt;br /&gt;
      .replace(/&amp;quot;/g, &#039;&amp;amp;quot;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>Magent</name></author>
	</entry>
</feed>