<?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=JMyles</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=JMyles"/>
	<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/wiki/Special:Contributions/JMyles"/>
	<updated>2026-10-15T03:26:22Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Delivery-kid&amp;diff=5397</id>
		<title>Cryptograss:Delivery-kid</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Delivery-kid&amp;diff=5397"/>
		<updated>2026-08-14T23:57:48Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox resource&lt;br /&gt;
| image = &amp;lt;pre style=&amp;quot;font-size:5px; line-height:1.1; font-family:monospace;&amp;quot;&amp;gt;&lt;br /&gt;
         .                          .       .  :=@%%@*.           .           &lt;br /&gt;
         .                .  .   .  .  @=                =#%+  =@%            &lt;br /&gt;
                             .     .%%          @..  .+.          -@.    .    &lt;br /&gt;
                   .         .  -@* .  @.  @@   @%=%.@      ..      +@   .    &lt;br /&gt;
         .                      @.. %= @    @@. ::#@+*     :@@%:..%.  @     . &lt;br /&gt;
         .      .         .  .  @=@  *@: # %  %:  @@%#   :##@@*%*#:.  .@ .    &lt;br /&gt;
         .      .         .     -@@.   @=-            @%* @@@+#.@*....  @   . &lt;br /&gt;
                                  @@ @:                    =+:@@@@@@@@.. @:.. &lt;br /&gt;
         .                         @#                          :%@=::*+::.@=. &lt;br /&gt;
                          .  .     *.                              =@@*@@* #@ &lt;br /&gt;
                             .     %       .  .                -  --...@@@  *@&lt;br /&gt;
                          .  .   .@....:::::::::::.:.:. .     % -.+@@@@@%..-% &lt;br /&gt;
                          .    . =*.+@@#-%%:-:::::::#@@+::..    ..@:%@%:::@: .&lt;br /&gt;
                             .. .@*:--::@@@@%:::::::::::@@@:.  = %@@@@@@@*  . &lt;br /&gt;
         .         .      .  .  @--::::*@#-@@@@@#:::::::@@-@@:.::@.      .    &lt;br /&gt;
         .                .    @=-:::::@:@%-:::::::::::::@@@@@@@::@#..   .  . &lt;br /&gt;
         .             .  .  . @-::::::::::::::::::::::::=@@+@#@::+@* .       &lt;br /&gt;
                          .    @::::::::::::::::::::::::::*%*+%@::%%@.      . &lt;br /&gt;
         .                .  .@@@@@%::::::=%--*:::@=::::::::*+*:#:@:@*   .. . &lt;br /&gt;
                .       . .  .%@-:::%:::@::%%::-::@@-:::::::=@-@=@-@@.   .    &lt;br /&gt;
       =#@   . =%+:@         . @-@::@@:::%:::::::::::::::::::%%:*@#@.         &lt;br /&gt;
      *%:@ ..*=:::%%      .  .. @:%@@+::::::::::::::::::::::::%-:#@-  .  .    &lt;br /&gt;
   .  @::@.-*:::@* .      .  .  *+::@::--::=:::::::-:::::::::::@:@@      .    &lt;br /&gt;
 @-@ :@::@=#:::@:  ..  .  .  .  @::@-::::-*+:@@@@*+@--:::::::::@:%%      .    &lt;br /&gt;
 @-%+:@-:@=*:::*.%::=*:.  .  ..%=::-@@-@@#@@@:@=::.@--::::::::*@-#@.  .       &lt;br /&gt;
 #=:%:@:::@#:::@@::@=-::=@   . %=::@:=@::-@%-:::::::::::::@::%=#@@*@@+   .    &lt;br /&gt;
  %:=@#@:::@*::*:::** .+*--  . *%-@@%%*#:::::::::::::::::#=#*:@@#:::@@.  .  . &lt;br /&gt;
   @:::@@**:::.@-::=@   **:@.. .@:-+%*:::::::::::::::::-@-@:%@@@::::*@@==+-   &lt;br /&gt;
    @-%:::::::::-:::@   **::@.   @=:::#:::::::::::::::::%*:@#=@@@#:::*@-::    &lt;br /&gt;
  .. -@:::@*::@%*::::@+  @%:%*.   +*-:@::::::::.@=:::::@:@-:@%::#%+:::#@@@. . &lt;br /&gt;
      .@::::@*::::::::::@*::@.     .@:@=::::::@#:::::+@=:+%=@=::: .  .   ==   &lt;br /&gt;
        @-::::=%:::::::::@+%:.      .@::@%+%%-:::::=@=:@-.+@%..   .           &lt;br /&gt;
        %+::::::@:::::::::-@ .   .   .:@+::::::::@@@:@-#+:.*@=           .    &lt;br /&gt;
      .  @:::::::::-:::::-@. . ..   .  *@*:-=%@@=+@@:=@@@@=              .    &lt;br /&gt;
      .  @-:::::::::@:::%@@#%#.  .  . .=@@@@@@%:@.:@%.                        &lt;br /&gt;
         :@:::::::::::#@%=*#@%.@@%*.:.=@@#@=:#@@@+@* .            .      .    &lt;br /&gt;
      . *@@-::::::::*: .  .  .%+::::-@@*=@: -:%:.:      .  .             .    &lt;br /&gt;
      .@@@::::::::::.           @%==%%@-                   .                  &lt;br /&gt;
      %.#@:::::+@=%@         .      .                                       . &lt;br /&gt;
     @=  =.     .#@:                                    .                .    &lt;br /&gt;
     @=            .      .  .                          .                     &lt;br /&gt;
      .  .   .  .         .         .  .                .   .               . &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| role = the distributor&lt;br /&gt;
| type = Server&lt;br /&gt;
| hostname = delivery-kid.cryptograss.live&lt;br /&gt;
| services = IPFS, bit torrent, various open-source encoders and shit&lt;br /&gt;
| namesake = [[wikipedia:The_Pizza_Tapes|The kid who leaked the pizza tapes]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font-size:8px; line-height:1.2;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    .___     .__  .__                                     __   .__    .___&lt;br /&gt;
  __| _/____ |  | |__|__  __ ___________ ___.__.         |  | _|__| __| _/&lt;br /&gt;
 / __ |/ __ \|  | |  \  \/ // __ \_  __ &amp;lt;   |  |  ______ |  |/ /  |/ __ | &lt;br /&gt;
/ /_/ \  ___/|  |_|  |\   /\  ___/|  | \/\___  | /_____/ |    &amp;lt;|  / /_/ | &lt;br /&gt;
\____ |\___  &amp;gt;____/__| \_/  \___  &amp;gt;__|   / ____|         |__|_ \__\____ | &lt;br /&gt;
     \/    \/                   \/       \/                   \/       \/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;delivery-kid&#039;&#039;&#039; is the official seedbox configuration of cryptograss, designed to relentlessly and freely distribute the music of cryptograss artists, with high-bandwidth, fault tolerance, and censorship-resistance.&lt;br /&gt;
&lt;br /&gt;
It is named after the mysterious pizza delivery kid who apparently absconded with [[wikipedia:The_Pizza_Tapes|The Pizza Tapes]] and leaked them - an act that has turned out to be a great public service.&lt;br /&gt;
&lt;br /&gt;
===Releases on delivery-kid===&lt;br /&gt;
* [[Special:Releases]]&lt;br /&gt;
* [[Special:ReleaseDrafts]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PickiPedia Frontends for delivery-kid tools===&lt;br /&gt;
* [[Special:DeliverVideo]]&lt;br /&gt;
* [[Special:DeliverOtherContent]]&lt;br /&gt;
* [[Special:DeliverBlueRailroad]]&lt;br /&gt;
* [[Special:DeliverRecord]]&lt;br /&gt;
&lt;br /&gt;
===Audits and maintenance===&lt;br /&gt;
&lt;br /&gt;
A storage audit runs on maybelle every 30 minutes and cross-references IPFS pins, BitTorrent seeding directories, and staging draft directories on delivery-kid against the Release and ReleaseDraft pages tracked in this wiki. It flags orphans in both directions so nothing falls through the cracks.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Special:DeliveryKidAudit]]&#039;&#039;&#039; — live view of the most recent audit run. The page reads a JSON blob from &amp;lt;code&amp;gt;delivery-kid.cryptograss.live/audit-latest.json&amp;lt;/code&amp;gt; (written by maybelle&#039;s host cron); it makes no wiki edits and never appears in recent changes.&lt;br /&gt;
&lt;br /&gt;
When the audit detects a problem (orphan pin/seed/draft, missing pin/seed, stalled draft, cleanup pending) AND the problem set has changed since the last posting, it creates a one-shot page at &amp;lt;code&amp;gt;Cryptograss:Delivery-kid-audits/&amp;amp;lt;blockheight&amp;amp;gt;&amp;lt;/code&amp;gt;. Those pages DO show in recent changes — they&#039;re the &amp;quot;something needs human attention&amp;quot; signal. A persistent problem creates one page, not one every 30 minutes.&lt;br /&gt;
&lt;br /&gt;
====Manual cleanup of an orphan staging dir====&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;Special:DeliveryKidAudit&amp;lt;/code&amp;gt; shows an &amp;quot;ORPHAN DRAFT&amp;quot; entry — a staging directory on delivery-kid with no corresponding ReleaseDraft wiki page — and you want it cleaned up, just &#039;&#039;&#039;create the wiki page&#039;&#039;&#039; at &amp;lt;code&amp;gt;ReleaseDraft:&amp;amp;lt;uuid&amp;amp;gt;&amp;lt;/code&amp;gt; with this content:&lt;br /&gt;
&lt;br /&gt;
abandoned: true&lt;br /&gt;
&lt;br /&gt;
The next run of &amp;lt;code&amp;gt;purge-deleted-releases.py&amp;lt;/code&amp;gt; (cron on maybelle) will see the abandoned flag and remove the staging directory on its own. Set &amp;lt;code&amp;gt;abandoned_keep_files: true&amp;lt;/code&amp;gt; if you want to keep the uploaded files (e.g. for later re-draft) — the audit will then list it as &amp;quot;files kept&amp;quot; instead of &amp;quot;CLEANUP PENDING&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The same flow handles draft pages that already exist: edit the YAML to add &amp;lt;code&amp;gt;abandoned: true&amp;lt;/code&amp;gt; (with optional &amp;lt;code&amp;gt;abandoned_reason&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;abandoned_keep_files&amp;lt;/code&amp;gt;), and the cron will sweep them. The &amp;quot;Abandon and delete&amp;quot; / &amp;quot;Abandon and keep files&amp;quot; buttons on a draft page do exactly that edit for you.&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=The_Station_Inn&amp;diff=5396</id>
		<title>The Station Inn</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=The_Station_Inn&amp;diff=5396"/>
		<updated>2026-08-14T23:51:03Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Station Inn&#039;&#039;&#039; is a legendary bluegrass venue in Nashville, Tennessee.&lt;br /&gt;
&lt;br /&gt;
== Upcoming Shows ==&lt;br /&gt;
{{#ask: [[Venue::The Station Inn]]&lt;br /&gt;
|?Artist&lt;br /&gt;
|?Blockheight&lt;br /&gt;
|?Verification status&lt;br /&gt;
|format=table&lt;br /&gt;
|limit=10&lt;br /&gt;
|sort=Blockheight&lt;br /&gt;
|order=desc&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== About ==&lt;br /&gt;
Located in The Gulch neighborhood, The Station Inn has been a home for bluegrass and acoustic music since 1974.&lt;br /&gt;
&lt;br /&gt;
[[Category:Venues]]&lt;br /&gt;
[[Category:Nashville]]&lt;br /&gt;
[[Has scene::Nashville]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-verify.js&amp;diff=5394</id>
		<title>MediaWiki:Gadget-verify.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-verify.js&amp;diff=5394"/>
		<updated>2026-08-11T18:42:13Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * Gadget-verify.js - Verification gadget for Pickipedia claims&lt;br /&gt;
 * &lt;br /&gt;
 * Adds &amp;quot;Verify&amp;quot; buttons to {{claim}}, {{bot_proposes}}, and {{Show}} templates,&lt;br /&gt;
 * allowing logged-in users to verify content and record attestations.&lt;br /&gt;
 */&lt;br /&gt;
(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
    // Only run for logged-in users&lt;br /&gt;
    if (mw.config.get(&#039;wgUserName&#039;) === null) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Wait for page to be ready&lt;br /&gt;
    mw.hook(&#039;wikipage.content&#039;).add(function($content) {&lt;br /&gt;
        // Find all claim and bot_proposes elements (inline)&lt;br /&gt;
        // .pv-proposed is the &amp;lt;proposed&amp;gt; tag from the PickiPediaVerification&lt;br /&gt;
        // extension. Both its forms are handled here: the inline one is a&lt;br /&gt;
        // &amp;lt;span&amp;gt;, the block one a &amp;lt;div&amp;gt; wrapping a whole template call.&lt;br /&gt;
        var $claims = $content.find(&#039;.claim-unverified, span.bot-proposal, .pv-proposed&#039;);&lt;br /&gt;
        &lt;br /&gt;
        $claims.each(function() {&lt;br /&gt;
            var $claim = $(this);&lt;br /&gt;
            &lt;br /&gt;
            // Don&#039;t add button twice&lt;br /&gt;
            if ($claim.find(&#039;.verify-btn&#039;).length &amp;gt; 0) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var $btn = $(&#039;&amp;lt;button&amp;gt;&#039;)&lt;br /&gt;
                .addClass(&#039;verify-btn&#039;)&lt;br /&gt;
                .text(&#039;✓ Verify&#039;)&lt;br /&gt;
                .css({&lt;br /&gt;
                    &#039;margin-left&#039;: &#039;0.5em&#039;,&lt;br /&gt;
                    &#039;font-size&#039;: &#039;0.8em&#039;,&lt;br /&gt;
                    &#039;padding&#039;: &#039;1px 6px&#039;,&lt;br /&gt;
                    &#039;cursor&#039;: &#039;pointer&#039;,&lt;br /&gt;
                    &#039;background&#039;: &#039;#f8f9fa&#039;,&lt;br /&gt;
                    &#039;border&#039;: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
                    &#039;border-radius&#039;: &#039;3px&#039;,&lt;br /&gt;
                    &#039;vertical-align&#039;: &#039;middle&#039;&lt;br /&gt;
                })&lt;br /&gt;
                .on(&#039;click&#039;, function(e) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    e.stopPropagation();&lt;br /&gt;
                    openVerifyDialog($claim, false);&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            $claim.append(&#039; &#039;).append($btn);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Find Show infoboxes that need verification&lt;br /&gt;
        var $shows = $content.find(&#039;.show-infobox.bot-proposal&#039;);&lt;br /&gt;
        &lt;br /&gt;
        $shows.each(function() {&lt;br /&gt;
            var $show = $(this);&lt;br /&gt;
            &lt;br /&gt;
            // Don&#039;t add button twice&lt;br /&gt;
            if ($show.find(&#039;.verify-show-btn&#039;).length &amp;gt; 0) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var $btn = $(&#039;&amp;lt;button&amp;gt;&#039;)&lt;br /&gt;
                .addClass(&#039;verify-show-btn&#039;)&lt;br /&gt;
                .text(&#039;✓ Verify This Show&#039;)&lt;br /&gt;
                .css({&lt;br /&gt;
                    &#039;display&#039;: &#039;block&#039;,&lt;br /&gt;
                    &#039;width&#039;: &#039;100%&#039;,&lt;br /&gt;
                    &#039;margin-top&#039;: &#039;0.5em&#039;,&lt;br /&gt;
                    &#039;padding&#039;: &#039;6px 12px&#039;,&lt;br /&gt;
                    &#039;cursor&#039;: &#039;pointer&#039;,&lt;br /&gt;
                    &#039;background&#039;: &#039;#f8f9fa&#039;,&lt;br /&gt;
                    &#039;border&#039;: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
                    &#039;border-radius&#039;: &#039;3px&#039;,&lt;br /&gt;
                    &#039;font-size&#039;: &#039;0.9em&#039;&lt;br /&gt;
                })&lt;br /&gt;
                .on(&#039;click&#039;, function(e) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    e.stopPropagation();&lt;br /&gt;
                    openVerifyDialog($show, true);&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            $show.append($btn);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function openVerifyDialog($element, isShow) {&lt;br /&gt;
        var claimText;&lt;br /&gt;
        if (isShow) {&lt;br /&gt;
            // For shows, build a summary from the infobox content&lt;br /&gt;
            var artists = $element.find(&#039;div:contains(&amp;quot;Artists:&amp;quot;)&#039;).text().replace(&#039;Artists:&#039;, &#039;&#039;).trim();&lt;br /&gt;
            var venue = $element.find(&#039;div:contains(&amp;quot;Venue:&amp;quot;)&#039;).text().replace(&#039;Venue:&#039;, &#039;&#039;).trim();&lt;br /&gt;
            var block = $element.find(&#039;div:contains(&amp;quot;Block:&amp;quot;)&#039;).text().replace(&#039;Block:&#039;, &#039;&#039;).trim();&lt;br /&gt;
            claimText = artists + &#039; @ &#039; + venue + &#039; (block &#039; + block + &#039;)&#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            // The badge and byline are the marker&#039;s own chrome, not part of&lt;br /&gt;
            // the claim. Leaving them in makes claimText read&lt;br /&gt;
            // &amp;quot;...[unverified]Proposed by Magent&amp;quot;, which then fails to match&lt;br /&gt;
            // anything in the wikitext.&lt;br /&gt;
            claimText = $element.clone()&lt;br /&gt;
                .children(&#039;.verify-btn, .pv-proposed__badge, .pv-proposed__byline&#039;)&lt;br /&gt;
                .remove().end().text().trim();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        var existingSource = $element.data(&#039;source&#039;) || &#039;&#039;;&lt;br /&gt;
        var isBotProposal = $element.hasClass(&#039;bot-proposal&#039;) ||&lt;br /&gt;
            $element.hasClass(&#039;pv-proposed&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Create dialog content&lt;br /&gt;
        var $dialog = $(&#039;&amp;lt;div&amp;gt;&#039;).addClass(&#039;verify-dialog&#039;);&lt;br /&gt;
        &lt;br /&gt;
        var $form = $(&#039;&amp;lt;form&amp;gt;&#039;).on(&#039;submit&#039;, function(e) {&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            if (isShow) {&lt;br /&gt;
                submitShowVerification($element, $form, claimText, $overlay, $dialog);&lt;br /&gt;
            } else {&lt;br /&gt;
                submitVerification($element, $form, claimText, $overlay, $dialog);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $form.append(&lt;br /&gt;
            $(&#039;&amp;lt;p&amp;gt;&#039;).css(&#039;margin-top&#039;, &#039;0&#039;).html(&#039;&amp;lt;strong&amp;gt;Verifying:&amp;lt;/strong&amp;gt; &#039; + mw.html.escape(claimText))&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        $form.append(&lt;br /&gt;
            $(&#039;&amp;lt;label&amp;gt;&#039;).attr(&#039;for&#039;, &#039;verify-source&#039;).text(&#039;Source (optional):&#039;),&lt;br /&gt;
            $(&#039;&amp;lt;br&amp;gt;&#039;),&lt;br /&gt;
            $(&#039;&amp;lt;input&amp;gt;&#039;)&lt;br /&gt;
                .attr({&lt;br /&gt;
                    type: &#039;text&#039;,&lt;br /&gt;
                    id: &#039;verify-source&#039;,&lt;br /&gt;
                    name: &#039;source&#039;,&lt;br /&gt;
                    placeholder: &#039;https://... or &amp;quot;I was there&amp;quot; or leave blank&#039;&lt;br /&gt;
                })&lt;br /&gt;
                .val(existingSource || &#039;&#039;)&lt;br /&gt;
                .css({ width: &#039;100%&#039;, marginBottom: &#039;1em&#039;, padding: &#039;6px&#039;, boxSizing: &#039;border-box&#039; })&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        if (isBotProposal &amp;amp;&amp;amp; existingSource) {&lt;br /&gt;
            $form.find(&#039;label[for=&amp;quot;verify-source&amp;quot;]&#039;).after(&lt;br /&gt;
                $(&#039;&amp;lt;div&amp;gt;&#039;).css({ fontSize: &#039;0.9em&#039;, color: &#039;#666&#039;, marginBottom: &#039;0.5em&#039; })&lt;br /&gt;
                    .text(&#039;Bot suggested source: &#039; + existingSource)&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $form.append(&lt;br /&gt;
            $(&#039;&amp;lt;label&amp;gt;&#039;).attr(&#039;for&#039;, &#039;verify-note&#039;).text(&#039;Note (optional):&#039;),&lt;br /&gt;
            $(&#039;&amp;lt;br&amp;gt;&#039;),&lt;br /&gt;
            $(&#039;&amp;lt;textarea&amp;gt;&#039;)&lt;br /&gt;
                .attr({&lt;br /&gt;
                    id: &#039;verify-note&#039;,&lt;br /&gt;
                    name: &#039;note&#039;,&lt;br /&gt;
                    rows: 3,&lt;br /&gt;
                    placeholder: &#039;Additional context about your verification...&#039;&lt;br /&gt;
                })&lt;br /&gt;
                .css({ width: &#039;100%&#039;, marginBottom: &#039;1em&#039;, padding: &#039;6px&#039;, boxSizing: &#039;border-box&#039; })&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        $form.append(&lt;br /&gt;
            $(&#039;&amp;lt;button&amp;gt;&#039;)&lt;br /&gt;
                .attr(&#039;type&#039;, &#039;submit&#039;)&lt;br /&gt;
                .text(&#039;Confirm Verification&#039;)&lt;br /&gt;
                .css({&lt;br /&gt;
                    padding: &#039;8px 16px&#039;,&lt;br /&gt;
                    background: &#039;#36c&#039;,&lt;br /&gt;
                    color: &#039;white&#039;,&lt;br /&gt;
                    border: &#039;none&#039;,&lt;br /&gt;
                    borderRadius: &#039;3px&#039;,&lt;br /&gt;
                    cursor: &#039;pointer&#039;,&lt;br /&gt;
                    marginRight: &#039;8px&#039;&lt;br /&gt;
                }),&lt;br /&gt;
            $(&#039;&amp;lt;button&amp;gt;&#039;)&lt;br /&gt;
                .attr(&#039;type&#039;, &#039;button&#039;)&lt;br /&gt;
                .text(&#039;Cancel&#039;)&lt;br /&gt;
                .css({&lt;br /&gt;
                    padding: &#039;8px 16px&#039;,&lt;br /&gt;
                    background: &#039;#f8f9fa&#039;,&lt;br /&gt;
                    border: &#039;1px solid #a2a9b1&#039;,&lt;br /&gt;
                    borderRadius: &#039;3px&#039;,&lt;br /&gt;
                    cursor: &#039;pointer&#039;&lt;br /&gt;
                })&lt;br /&gt;
                .on(&#039;click&#039;, function() {&lt;br /&gt;
                    $overlay.remove();&lt;br /&gt;
                    $dialog.remove();&lt;br /&gt;
                })&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        $dialog.append($form);&lt;br /&gt;
        &lt;br /&gt;
        // Style the dialog&lt;br /&gt;
        $dialog.css({&lt;br /&gt;
            position: &#039;fixed&#039;,&lt;br /&gt;
            top: &#039;50%&#039;,&lt;br /&gt;
            left: &#039;50%&#039;,&lt;br /&gt;
            transform: &#039;translate(-50%, -50%)&#039;,&lt;br /&gt;
            background: &#039;white&#039;,&lt;br /&gt;
            padding: &#039;20px&#039;,&lt;br /&gt;
            borderRadius: &#039;8px&#039;,&lt;br /&gt;
            boxShadow: &#039;0 4px 20px rgba(0,0,0,0.3)&#039;,&lt;br /&gt;
            zIndex: 10000,&lt;br /&gt;
            minWidth: &#039;400px&#039;,&lt;br /&gt;
            maxWidth: &#039;90vw&#039;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Add overlay&lt;br /&gt;
        var $overlay = $(&#039;&amp;lt;div&amp;gt;&#039;).css({&lt;br /&gt;
            position: &#039;fixed&#039;,&lt;br /&gt;
            top: 0,&lt;br /&gt;
            left: 0,&lt;br /&gt;
            right: 0,&lt;br /&gt;
            bottom: 0,&lt;br /&gt;
            background: &#039;rgba(0,0,0,0.5)&#039;,&lt;br /&gt;
            zIndex: 9999&lt;br /&gt;
        }).on(&#039;click&#039;, function() {&lt;br /&gt;
            $overlay.remove();&lt;br /&gt;
            $dialog.remove();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;body&#039;).append($overlay).append($dialog);&lt;br /&gt;
        $dialog.find(&#039;#verify-source&#039;).focus();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function submitShowVerification($show, $form, claimText, $overlay, $dialog) {&lt;br /&gt;
        var source = $form.find(&#039;#verify-source&#039;).val().trim();&lt;br /&gt;
        var note = $form.find(&#039;#verify-note&#039;).val().trim();&lt;br /&gt;
        var pageName = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        var userName = mw.config.get(&#039;wgUserName&#039;);&lt;br /&gt;
        var timestamp = new Date().toISOString().split(&#039;T&#039;)[0];&lt;br /&gt;
&lt;br /&gt;
        // Disable form while processing&lt;br /&gt;
        $form.find(&#039;button&#039;).prop(&#039;disabled&#039;, true);&lt;br /&gt;
        $form.find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).text(&#039;Verifying...&#039;);&lt;br /&gt;
&lt;br /&gt;
        var api = new mw.Api();&lt;br /&gt;
        &lt;br /&gt;
        api.get({&lt;br /&gt;
            action: &#039;query&#039;,&lt;br /&gt;
            titles: pageName,&lt;br /&gt;
            prop: &#039;revisions&#039;,&lt;br /&gt;
            rvprop: &#039;content&#039;,&lt;br /&gt;
            rvslots: &#039;main&#039;,&lt;br /&gt;
            formatversion: 2&lt;br /&gt;
        }).then(function(data) {&lt;br /&gt;
            var page = data.query.pages[0];&lt;br /&gt;
            var content = page.revisions[0].slots.main.content;&lt;br /&gt;
&lt;br /&gt;
            // For Show template, change status=proposed to status=verified&lt;br /&gt;
            var newContent = content&lt;br /&gt;
                .replace(/\|status=proposed/g, &#039;|status=verified&#039;)&lt;br /&gt;
                .replace(/\|by=[^\n|}]*/g, &#039;|by=&#039; + userName)&lt;br /&gt;
                .replace(/\|source=[^\n|}]*/g, &#039;|source=&#039; + (source || &#039;verified by &#039; + userName));&lt;br /&gt;
&lt;br /&gt;
            if (newContent === content) {&lt;br /&gt;
                mw.notify(&#039;Could not update show status. It may have already been verified.&#039;, { type: &#039;error&#039; });&lt;br /&gt;
                $form.find(&#039;button&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
                $form.find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).text(&#039;Confirm Verification&#039;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var editSummary = &#039;Verified show: &#039; + claimText.substring(0, 50);&lt;br /&gt;
            &lt;br /&gt;
            return api.postWithToken(&#039;csrf&#039;, {&lt;br /&gt;
                action: &#039;edit&#039;,&lt;br /&gt;
                title: pageName,&lt;br /&gt;
                text: newContent,&lt;br /&gt;
                summary: editSummary&lt;br /&gt;
            }).then(function() {&lt;br /&gt;
                // Add to talk page&lt;br /&gt;
                return addTalkPageEntry(api, pageName, claimText, source, note, userName, timestamp);&lt;br /&gt;
            }).then(function() {&lt;br /&gt;
                mw.notify(&#039;Show verified!&#039;, { type: &#039;success&#039; });&lt;br /&gt;
                $overlay.remove();&lt;br /&gt;
                $dialog.remove();&lt;br /&gt;
                // Reload to show changes&lt;br /&gt;
                location.reload();&lt;br /&gt;
            });&lt;br /&gt;
        }).catch(function(err) {&lt;br /&gt;
            mw.notify(&#039;Error: &#039; + err, { type: &#039;error&#039; });&lt;br /&gt;
            $form.find(&#039;button&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
            $form.find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).text(&#039;Confirm Verification&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Strip wikitext formatting for comparison purposes.&lt;br /&gt;
     * Removes bold (&#039;&#039;&#039;), italic (&#039;&#039;), and common markup.&lt;br /&gt;
     */&lt;br /&gt;
    function stripWikitext(text) {&lt;br /&gt;
        return text&lt;br /&gt;
            .replace(/&#039;{2,}/g, &#039;&#039;)  // Remove &#039;&#039; and &#039;&#039;&#039;&lt;br /&gt;
            .replace(/\[\[([^\]|]+\|)?([^\]]+)\]\]/g, &#039;$2&#039;)  // [[link|text]] -&amp;gt; text&lt;br /&gt;
            .replace(/\{\{!\}\}/g, &#039;|&#039;)  // {{!}} -&amp;gt; |&lt;br /&gt;
            .replace(/\s+/g, &#039; &#039;)&lt;br /&gt;
            .trim()&lt;br /&gt;
            .toLowerCase();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Find a Bot_proposes or claim template in wikitext that contains the given text.&lt;br /&gt;
     * Returns {start, end, content} or null if not found.&lt;br /&gt;
     * Properly handles nested templates like {{!}}.&lt;br /&gt;
     */&lt;br /&gt;
    function findTemplateContaining(wikitext, searchText) {&lt;br /&gt;
        // Normalize searchText for comparison - collapse whitespace&lt;br /&gt;
        var normalizedSearch = stripWikitext(searchText).substring(0, 40);&lt;br /&gt;
        &lt;br /&gt;
        // Find all {{Bot_proposes or {{claim occurrences&lt;br /&gt;
        var templateRegex = /\{\{(Bot_proposes|claim)\s*\|/gi;&lt;br /&gt;
        var match;&lt;br /&gt;
        &lt;br /&gt;
        while ((match = templateRegex.exec(wikitext)) !== null) {&lt;br /&gt;
            var startIndex = match.index;&lt;br /&gt;
            var depth = 0;&lt;br /&gt;
            var i = startIndex;&lt;br /&gt;
            &lt;br /&gt;
            // Find the matching closing }}&lt;br /&gt;
            while (i &amp;lt; wikitext.length - 1) {&lt;br /&gt;
                if (wikitext[i] === &#039;{&#039; &amp;amp;&amp;amp; wikitext[i + 1] === &#039;{&#039;) {&lt;br /&gt;
                    depth++;&lt;br /&gt;
                    i += 2;&lt;br /&gt;
                } else if (wikitext[i] === &#039;}&#039; &amp;amp;&amp;amp; wikitext[i + 1] === &#039;}&#039;) {&lt;br /&gt;
                    depth--;&lt;br /&gt;
                    if (depth === 0) {&lt;br /&gt;
                        var endIndex = i + 2;&lt;br /&gt;
                        var templateContent = wikitext.substring(startIndex, endIndex);&lt;br /&gt;
                        &lt;br /&gt;
                        // Extract the actual content (first parameter, before |by= or |source=)&lt;br /&gt;
                        var inner = templateContent.replace(/^\{\{(Bot_proposes|claim)\s*\|\s*/i, &#039;&#039;).replace(/\}\}$/, &#039;&#039;);&lt;br /&gt;
                        // Remove |by=... and |source=... parameters&lt;br /&gt;
                        inner = inner.replace(/\|by=[^|}]*/gi, &#039;&#039;).replace(/\|source=[^|}]*/gi, &#039;&#039;);&lt;br /&gt;
                        &lt;br /&gt;
                        // Strip wikitext formatting for comparison&lt;br /&gt;
                        var normalizedInner = stripWikitext(inner);&lt;br /&gt;
                        &lt;br /&gt;
                        // Check if this template contains our search text&lt;br /&gt;
                        if (normalizedInner.indexOf(normalizedSearch) !== -1) {&lt;br /&gt;
                            return {&lt;br /&gt;
                                start: startIndex,&lt;br /&gt;
                                end: endIndex,&lt;br /&gt;
                                fullMatch: templateContent,&lt;br /&gt;
                                content: inner.trim()&lt;br /&gt;
                            };&lt;br /&gt;
                        }&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                    i += 2;&lt;br /&gt;
                } else {&lt;br /&gt;
                    i++;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Find a &amp;lt;proposed&amp;gt;...&amp;lt;/proposed&amp;gt; block whose contents match the claim.&lt;br /&gt;
     *&lt;br /&gt;
     * Simpler than findTemplateContaining() below, and that is the point of&lt;br /&gt;
     * the tag: there are no balanced braces to walk and no escaped pipes to&lt;br /&gt;
     * undo, because tag content is never parsed as template parameters.&lt;br /&gt;
     *&lt;br /&gt;
     * Returns {start, end, fullMatch, content, wasTag} or null.&lt;br /&gt;
     */&lt;br /&gt;
    function findProposedTagContaining(wikitext, searchText) {&lt;br /&gt;
        var normalizedSearch = stripWikitext(searchText).substring(0, 40);&lt;br /&gt;
        var tagRegex = /&amp;lt;proposed(?:\s[^&amp;gt;]*)?&amp;gt;([\s\S]*?)&amp;lt;\/proposed\s*&amp;gt;/gi;&lt;br /&gt;
        var match;&lt;br /&gt;
&lt;br /&gt;
        while ((match = tagRegex.exec(wikitext)) !== null) {&lt;br /&gt;
            // Block form puts the tags on their own lines; drop one newline&lt;br /&gt;
            // each side so verifying doesn&#039;t leave a blank line behind.&lt;br /&gt;
            var inner = match[1].replace(/^\n/, &#039;&#039;).replace(/\n$/, &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
            if (stripWikitext(inner).indexOf(normalizedSearch) !== -1) {&lt;br /&gt;
                return {&lt;br /&gt;
                    start: match.index,&lt;br /&gt;
                    end: match.index + match[0].length,&lt;br /&gt;
                    fullMatch: match[0],&lt;br /&gt;
                    content: inner,&lt;br /&gt;
                    wasTag: true&lt;br /&gt;
                };&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function submitVerification($claim, $form, claimText, $overlay, $dialog) {&lt;br /&gt;
        var source = $form.find(&#039;#verify-source&#039;).val().trim();&lt;br /&gt;
        var note = $form.find(&#039;#verify-note&#039;).val().trim();&lt;br /&gt;
        var pageName = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
        var userName = mw.config.get(&#039;wgUserName&#039;);&lt;br /&gt;
        var timestamp = new Date().toISOString().split(&#039;T&#039;)[0];&lt;br /&gt;
&lt;br /&gt;
        // Disable form while processing&lt;br /&gt;
        $form.find(&#039;button&#039;).prop(&#039;disabled&#039;, true);&lt;br /&gt;
        $form.find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).text(&#039;Verifying...&#039;);&lt;br /&gt;
&lt;br /&gt;
        var api = new mw.Api();&lt;br /&gt;
        &lt;br /&gt;
        api.get({&lt;br /&gt;
            action: &#039;query&#039;,&lt;br /&gt;
            titles: pageName,&lt;br /&gt;
            prop: &#039;revisions&#039;,&lt;br /&gt;
            rvprop: &#039;content&#039;,&lt;br /&gt;
            rvslots: &#039;main&#039;,&lt;br /&gt;
            formatversion: 2&lt;br /&gt;
        }).then(function(data) {&lt;br /&gt;
            var page = data.query.pages[0];&lt;br /&gt;
            var content = page.revisions[0].slots.main.content;&lt;br /&gt;
&lt;br /&gt;
            // Try tag syntax first, then the older template wrappers.&lt;br /&gt;
            var found = findProposedTagContaining(content, claimText) ||&lt;br /&gt;
                findTemplateContaining(content, claimText);&lt;br /&gt;
            &lt;br /&gt;
            if (!found) {&lt;br /&gt;
                mw.notify(&#039;Could not find the claim in page source. It may have been modified.&#039;, { type: &#039;error&#039; });&lt;br /&gt;
                $form.find(&#039;button&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
                $form.find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).text(&#039;Confirm Verification&#039;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // Build replacement - use {{source|...}} for URLs, {{verified|...}} for text&lt;br /&gt;
            var replacement;&lt;br /&gt;
            // {{Bot_proposes}} is a template call, so any pipe in the content&lt;br /&gt;
            // had to be escaped to {{!}} going in. Unescaping is part of&lt;br /&gt;
            // removing the wrapper, not an extra step -- skipping it is what&lt;br /&gt;
            // left {{!}} baked into ~25 pages. A &amp;lt;proposed&amp;gt; tag never escaped&lt;br /&gt;
            // anything, so there is nothing to undo.&lt;br /&gt;
            var cleanContent = found.wasTag ?&lt;br /&gt;
                found.content :&lt;br /&gt;
                found.content.replace(/\{\{!\}\}/g, &#039;|&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (source &amp;amp;&amp;amp; source.match(/^https?:\/\//)) {&lt;br /&gt;
                replacement = cleanContent + &#039;{{source|&#039; + source + &#039;}}&#039;;&lt;br /&gt;
            } else if (source) {&lt;br /&gt;
                replacement = cleanContent + &#039;{{verified|&#039; + source + &#039;}}&#039;;&lt;br /&gt;
            } else {&lt;br /&gt;
                replacement = cleanContent + &#039;{{verified|by &#039; + userName + &#039;}}&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            var newContent = content.substring(0, found.start) + replacement + content.substring(found.end);&lt;br /&gt;
&lt;br /&gt;
            var editSummary = &#039;Verified: &amp;quot;&#039; + claimText.substring(0, 50) + (claimText.length &amp;gt; 50 ? &#039;...&#039; : &#039;&#039;) + &#039;&amp;quot;&#039;;&lt;br /&gt;
            &lt;br /&gt;
            return api.postWithToken(&#039;csrf&#039;, {&lt;br /&gt;
                action: &#039;edit&#039;,&lt;br /&gt;
                title: pageName,&lt;br /&gt;
                text: newContent,&lt;br /&gt;
                summary: editSummary&lt;br /&gt;
            }).then(function() {&lt;br /&gt;
                // Add to talk page&lt;br /&gt;
                return addTalkPageEntry(api, pageName, claimText, source, note, userName, timestamp);&lt;br /&gt;
            }).then(function() {&lt;br /&gt;
                mw.notify(&#039;Verification recorded!&#039;, { type: &#039;success&#039; });&lt;br /&gt;
                $overlay.remove();&lt;br /&gt;
                $dialog.remove();&lt;br /&gt;
                // Reload to show changes&lt;br /&gt;
                location.reload();&lt;br /&gt;
            });&lt;br /&gt;
        }).catch(function(err) {&lt;br /&gt;
            mw.notify(&#039;Error: &#039; + err, { type: &#039;error&#039; });&lt;br /&gt;
            $form.find(&#039;button&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
            $form.find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).text(&#039;Confirm Verification&#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function addTalkPageEntry(api, pageName, claimText, source, note, userName, timestamp) {&lt;br /&gt;
        var talkPage = &#039;Talk:&#039; + pageName.replace(/^Talk:/, &#039;&#039;).replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
        var entry = &#039;\n== Verification by &#039; + userName + &#039; (&#039; + timestamp + &#039;) ==\n&#039;;&lt;br /&gt;
        entry += &amp;quot;&#039;&#039;&#039;Claim:&#039;&#039;&#039; &amp;quot; + claimText + &#039;\n\n&#039;;&lt;br /&gt;
        if (source) {&lt;br /&gt;
            entry += &amp;quot;&#039;&#039;&#039;Source:&#039;&#039;&#039; &amp;quot; + source + &#039;\n&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (note) {&lt;br /&gt;
            entry += &amp;quot;\n&#039;&#039;&#039;Note:&#039;&#039;&#039; &amp;quot; + note + &#039;\n&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return api.postWithToken(&#039;csrf&#039;, {&lt;br /&gt;
            action: &#039;edit&#039;,&lt;br /&gt;
            title: talkPage,&lt;br /&gt;
            appendtext: entry,&lt;br /&gt;
            summary: &#039;Recorded verification of claim&#039;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Sandbox_Thumbnail_Test&amp;diff=5393</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=5393"/>
		<updated>2026-08-10T20:01:57Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Verified bot edits (removed proposal markers)&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;
&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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Brendan_Daniel&amp;diff=5389</id>
		<title>Brendan Daniel</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Brendan_Daniel&amp;diff=5389"/>
		<updated>2026-08-10T13:50:19Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;{{MusicianInfo |name=Brendan Daniel |image=Brendan Daniel Freedompalooza 2026.jpg |show_instrument=guitar |image_caption=Brendan Daniel at FreedomPalooza 2026 |does1=plays guitar backwards, claims it is because he is &amp;#039;left-handed&amp;#039; or &amp;#039;left-wing&amp;#039; or something |does2=didn&amp;#039;t see {{m|Justin Myles Holmes}}&amp;#039; FreedomPalooza set in 2026; he just drove by it. }}  ==External Links== * [https://www.brendandanielmusic.com/ Official Website] * [https://brendandaniel.bandcamp.com/ Ban...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Brendan Daniel&lt;br /&gt;
|image=Brendan Daniel Freedompalooza 2026.jpg&lt;br /&gt;
|show_instrument=guitar&lt;br /&gt;
|image_caption=Brendan Daniel at FreedomPalooza 2026&lt;br /&gt;
|does1=plays guitar backwards, claims it is because he is &#039;left-handed&#039; or &#039;left-wing&#039; or something&lt;br /&gt;
|does2=didn&#039;t see {{m|Justin Myles Holmes}}&#039; FreedomPalooza set in 2026; he just drove by it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
* [https://www.brendandanielmusic.com/ Official Website]&lt;br /&gt;
* [https://brendandaniel.bandcamp.com/ Bandcamp]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=File:Brendan_Daniel_Freedompalooza_2026.jpg&amp;diff=5388</id>
		<title>File:Brendan Daniel Freedompalooza 2026.jpg</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=File:Brendan_Daniel_Freedompalooza_2026.jpg&amp;diff=5388"/>
		<updated>2026-08-10T13:46:01Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Uploaded a work by null from null with Media Uploader&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
&lt;br /&gt;
== Media information ==&lt;br /&gt;
* &#039;&#039;&#039;Date:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Source:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Location:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Hunter&amp;diff=5381</id>
		<title>Cryptograss:Hunter</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cryptograss:Hunter&amp;diff=5381"/>
		<updated>2026-08-05T14:51:16Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox resource&lt;br /&gt;
| image = &amp;lt;pre style=&amp;quot;font-size:5px; line-height:1.1; font-family:monospace;&amp;quot;&amp;gt;&lt;br /&gt;
           ░            ░░░                       &lt;br /&gt;
                   ▓▒▒▒▒▒▒▒▒▒▒▒▒▒                 &lt;br /&gt;
                ▒▒▓▒▒▒▒     ░▒▒▒▒▓░               &lt;br /&gt;
             ▒▒▒▒▒                ▒▒▒░            &lt;br /&gt;
           ▒▒▒▒                     ░▒▒▒          &lt;br /&gt;
         ▓▒▒▒░                        ▒▒▒░        &lt;br /&gt;
       ▓▓▒▒▒░                          ▓▒▒▒       &lt;br /&gt;
      ▒▒▒▒▒▒                            ▓▒▒▒      &lt;br /&gt;
     ▒▒▒▒▒▒                             ░▓▒▒▒     &lt;br /&gt;
    ▓▒▓▓▒▒▒                              ▓▒▒▒▒    &lt;br /&gt;
   ▒▓▒▒▒▒▒▒░        ░░                   ▓▓▒▒▒    &lt;br /&gt;
  ░▓▒▓▒▒▓▒▒▒░    ▒▒▒▒▒▒░▒▒ ░ ░▒▒▒▓▒▒░    ▓▓▓▒▓▒   &lt;br /&gt;
  ▒▒▓▒▒▓▓▓▓▓   ▒▓     ░░░    ▒▒      ░▒  ▓▒▓▒▒▓░  &lt;br /&gt;
  ▓▓▓▓▓▓▓▓▓░  ▒  ░▓▒▓▒▒░       ▒ ▓▒░▒  ▒ ░▓▓▒▓▓▒▒ &lt;br /&gt;
 ▓▒▒▓▓▓▓▓▓▒                              ░▓▒▓▓▓░▒ &lt;br /&gt;
 ░▓▓▒▓▓▓▓▓▓                              ░▒▒▒▒▒   &lt;br /&gt;
▒▒▓▓▓▓▓▓▓▓▓▒                             ▒▓▒▒▓    &lt;br /&gt;
  ▓▓▓▓▓▒▒▒▒░             ░ ░░ ▒          ▒▓▓▒▒░   &lt;br /&gt;
  ▓▓▒▓▓▓░▒▒░            ░░▒▒▒▒░         ░▒▒▒▒▓▓   &lt;br /&gt;
  ░▒▒▒▓▓▓ ░▓           ▓▓▓▒▒▒░▓▒▓   ░   ▒▒▒▓▓▒▓   &lt;br /&gt;
   ▓▓▓▓▓▓ ░░        ▓▒▓▒▒░░▒▒▒░▒▓▓▒  ▒   ▒▓▓▓▓    &lt;br /&gt;
  ▓▓▓▓▓▓▓▓▓▒      ▒▒▓▒     ░░░░░░▒▒▒▓    ▓▓▓▒▓    &lt;br /&gt;
 ▒▒▒▓▓▓▓▓▓▒▒  ░   ░     ░▒▒░░░░    ░▒   ▒▓▓▓▓▓░   &lt;br /&gt;
 ░▓▓▓▓▒▓▒▓          ░    ░   ░░░        ▓▓▓▓▓▒▒   &lt;br /&gt;
    ▓ ▓▓▓          ░                   ▓▓▓▓▓▓▓░░░ &lt;br /&gt;
    ▓▓▓▒░               ▒           ░ ▓▓▓▓▓▓▓▓   ░&lt;br /&gt;
░░░  ▓▓                  ▒░           ▒ ▒▒▒▓▒▒▒▒░ &lt;br /&gt;
░░░   ▒                    ▒▒▒▒▒▒░    ▒░░▓▒▒▒▒░ ░░&lt;br /&gt;
░░ ▒▒▒                ░░▒ ░ ▒▒▒▒░     ▒░     ░ ░▓▒&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| role = the storyteller&lt;br /&gt;
| type = Server&lt;br /&gt;
| hostname = hunter.cryptograss.live&lt;br /&gt;
| services = User containers, SSH router, Memory Lane watcher&lt;br /&gt;
| namesake = [[wikipedia:Robert_Hunter_(lyricist)|Robert Hunter]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font-size:14px; line-height:1.2;&amp;quot;&amp;gt;&lt;br /&gt;
  ┌───────────────────────────────────────┐&lt;br /&gt;
  │                                       │&lt;br /&gt;
  │  |                    |               │&lt;br /&gt;
  │  __ \   |   |  __ \   __|   _ \   __| │&lt;br /&gt;
  │  | | |  |   |  |   |  |     __/  |    │&lt;br /&gt;
  │ _| |_| \__,_| _|  _| \__| \___| _|    │&lt;br /&gt;
  │                                       │&lt;br /&gt;
  └───────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hunter&#039;&#039;&#039; is the multi-user development server in the [[Cryptograss]] ecosystem, named after [https://en.wikipedia.org/wiki/Robert_Hunter_(lyricist) Robert Hunter], the Grateful Dead lyricist and storyteller.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
Hunter runs isolated Docker containers for each developer, providing:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User containers&#039;&#039;&#039; - each user gets their own [[Cryptograss:Arthel|arthel]]-based development environment&lt;br /&gt;
* &#039;&#039;&#039;SSH router&#039;&#039;&#039; - routes SSH connections to the appropriate user container&lt;br /&gt;
* &#039;&#039;&#039;Memory Lane watcher&#039;&#039;&#039; - monitors Claude Code conversations and posts to the Memory Lane ingest endpoint on [[Cryptograss:Maybelle|Maybelle]]&lt;br /&gt;
&lt;br /&gt;
== Access ==&lt;br /&gt;
&lt;br /&gt;
Developers connect via SSH:&lt;br /&gt;
&amp;lt;code&amp;gt;ssh username@hunter.cryptograss.live&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each user&#039;s container includes:&lt;br /&gt;
* Claude Code with MCP tools&lt;br /&gt;
* Access to the shared [[PickiPedia]] MCP server&lt;br /&gt;
* Git and development tooling&lt;br /&gt;
&lt;br /&gt;
== Relationship to Maybelle ==&lt;br /&gt;
&lt;br /&gt;
Hunter is deployed and maintained by [[Cryptograss:Maybelle|Maybelle]]. While Hunter handles the storytelling (development work, conversations, code changes), Maybelle handles the integration (builds, deployments, backups).&lt;br /&gt;
&lt;br /&gt;
[[Category:Cryptograss infrastructure]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Justin_Holmes_and_The_Immutable_String_Band&amp;diff=5380</id>
		<title>Justin Holmes and The Immutable String Band</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Justin_Holmes_and_The_Immutable_String_Band&amp;diff=5380"/>
		<updated>2026-08-02T15:49:09Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Immutable String Band&#039;&#039;&#039; is a rotating band led by [[Justin Myles Holmes]].  The project is focused on cypherpunk events and building methods of hosting and ticketing live events that funnel funds toward musicians instead of rent-seekers.&lt;br /&gt;
&lt;br /&gt;
The band has five US and two Europe tours, as well as a two-night run in Colombia adjacent to devcon IV.  It has features many local musicians from those places, including {{m|Jake Stargel}}, {{m|Skyler Golden}}, {{m|Harry Clark}}, {{m|Pepa Lopera}}, {{m|Cory Walker}}, {{m|Christian Ward}}, as well as touring musicians from the crypto scene such as {{m|Shaka Lei Kaumaka}}, {{m|Lauren Luz}}, and {{m|Jonathan Mann}}.&lt;br /&gt;
&lt;br /&gt;
* [https://justinholmes.com/ Official website]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Justin_Holmes_and_The_Immutable_String_Band&amp;diff=5379</id>
		<title>Justin Holmes and The Immutable String Band</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Justin_Holmes_and_The_Immutable_String_Band&amp;diff=5379"/>
		<updated>2026-08-02T15:45:47Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;The Immutable String Band&amp;#039;&amp;#039;&amp;#039; is a rotating band led by Justin Myles Holmes.  The project is focused on cypherpunk events and building methods of hosting and ticketing live events that funnel funds toward musicians instead of rent-seekers.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Immutable String Band&#039;&#039;&#039; is a rotating band led by [[Justin Myles Holmes]].  The project is focused on cypherpunk events and building methods of hosting and ticketing live events that funnel funds toward musicians instead of rent-seekers.&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Talk:David_Grier&amp;diff=5378</id>
		<title>Talk:David Grier</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Talk:David_Grier&amp;diff=5378"/>
		<updated>2026-08-02T05:14:33Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;Somehow this page doesn&amp;#039;t exist?  I just started a reddit thread for best Grier vids.  I&amp;#039;ll paste some amazing ones here as they come up.  * https://www.youtube.com/watch?v=BwJ5xSdiQq4&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Somehow this page doesn&#039;t exist?&lt;br /&gt;
&lt;br /&gt;
I just started a reddit thread for best Grier vids.  I&#039;ll paste some amazing ones here as they come up.&lt;br /&gt;
&lt;br /&gt;
* https://www.youtube.com/watch?v=BwJ5xSdiQq4&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=4masks&amp;diff=5374</id>
		<title>4masks</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=4masks&amp;diff=5374"/>
		<updated>2026-07-20T01:51:51Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:four-masks-temp.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Tracks are here (latest version, RC1): [[Release:QmUWtV7fG1K9pM5TQSf5c38vmh9MtU6p3VNQuzaxvYr6ep]]&lt;br /&gt;
&lt;br /&gt;
==Ensembles==&lt;br /&gt;
&#039;&#039;(Justin is listed first in each ensemble; the others are listed in an ordered by dev.urandom)&#039;&#039;&lt;br /&gt;
===Ensemble 21===&lt;br /&gt;
* Justin Myles Holmes&lt;br /&gt;
* Kyle Tuttle&lt;br /&gt;
* Maddie Denton&lt;br /&gt;
* Harry Clark&lt;br /&gt;
* Skyler Golden&lt;br /&gt;
&lt;br /&gt;
===Ensemble 34===&lt;br /&gt;
* Justin Myles Holmes&lt;br /&gt;
* Maddie Denton&lt;br /&gt;
* Harry Clark&lt;br /&gt;
* Skyler Golden&lt;br /&gt;
* Gaven Largent&lt;br /&gt;
&lt;br /&gt;
===Ensemble 55===&lt;br /&gt;
* Justin Myles Holmes&lt;br /&gt;
* John Mailander&lt;br /&gt;
* Samson Grisman&lt;br /&gt;
* Kaitlyn Raitz&lt;br /&gt;
* Harry Clark&lt;br /&gt;
* Cory Walker&lt;br /&gt;
&lt;br /&gt;
===Ensemble 89===&lt;br /&gt;
* Justin Myles Holmes&lt;br /&gt;
* David Grier&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cory_Walker&amp;diff=5373</id>
		<title>Cory Walker</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Cory_Walker&amp;diff=5373"/>
		<updated>2026-07-19T21:42:40Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Cory Walker&lt;br /&gt;
|image=Cory_Walker_Ryman.png&lt;br /&gt;
|image_caption=Walker attempting to play his banjo at a [[wikipedia:Ryman Auditorium|renovated church]] in Tennessee&lt;br /&gt;
|does1=plays banjo in a band... [[East Nash Something]]&lt;br /&gt;
|does2=Is currently embarking on a hair-growth experiment to see if human hair can work as a makeshift 5th (G) string&lt;br /&gt;
|does3=Is working on a geography textbook entitled, &amp;quot;Anywhere banjo can come from, more banjo from that place.&amp;quot;&lt;br /&gt;
|location=Nashville, TN&lt;br /&gt;
|instruments=banjo&lt;br /&gt;
|show_instrument=banjo&lt;br /&gt;
|genres=bluegrass&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Major Life Events==&lt;br /&gt;
In 2024, Walker was nominated and confirmed to the prestigious post of &amp;quot;Customer of the Year&amp;quot; at Tacos y Mariscos Lindo Mexico in Madison, TN. For clarity: this was Tacos y Mariscos &#039;&#039;Lindo Mexico&#039;&#039;, not one of the inferior Tacos y Mariscos.{{verified|by JMyles}}&lt;br /&gt;
&lt;br /&gt;
[[File:Cory Loyd Walker Customer of the Year Award.jpg{{!}}thumb{{!}}left{{!}}Walker&#039;s Customer of the Year Award, displayed prominently at Tacos y Mariscos &#039;&#039;&#039;Lindo Mexico&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
==Links==&lt;br /&gt;
* [https://www.eastnashgrass.com/ East Nash Grass Website]{{verified|by JMyles}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Rhiannon_Giddens&amp;diff=5372</id>
		<title>Rhiannon Giddens</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Rhiannon_Giddens&amp;diff=5372"/>
		<updated>2026-07-19T17:04:02Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;{{See wikipedia page}} {{MusicianInfo |show_instrument=banjo |scene=Galway }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{See wikipedia page}}&lt;br /&gt;
{{MusicianInfo&lt;br /&gt;
|show_instrument=banjo&lt;br /&gt;
|scene=Galway&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsShorts&amp;diff=5371</id>
		<title>Template:NewsShorts</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsShorts&amp;diff=5371"/>
		<updated>2026-07-19T17:02:23Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Wildfire smoke and lightning storms hound [[Grey Fox 2026]], prompting cancellation of headliner {{m|Rhiannon Giddens}} and closure of the main stage.  Giddens showed up at other stages and jams throughout the evening.&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Michael_Cleveland&amp;diff=5370</id>
		<title>Michael Cleveland</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Michael_Cleveland&amp;diff=5370"/>
		<updated>2026-07-19T16:14:56Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;{{See wikipedia page}} {{MusicianInfo |show_instrument=fiddle |scene=Nashville }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{See wikipedia page}}&lt;br /&gt;
{{MusicianInfo&lt;br /&gt;
|show_instrument=fiddle&lt;br /&gt;
|scene=Nashville&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:See_wikipedia_page&amp;diff=5369</id>
		<title>Template:See wikipedia page</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:See_wikipedia_page&amp;diff=5369"/>
		<updated>2026-07-19T16:14:48Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border:1px solid black; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Wikipedia-logo-v2.svg|60px|left]]&lt;br /&gt;
There is a &amp;lt;strong&amp;gt; [[wikipedia:{{PAGENAME}}|WikiPedia article on {{PAGENAME}}]]&amp;lt;/strong&amp;gt;.  This page is not meant to replace information found there, but instead to act as a vector for structured data and other unique information about {{PAGENAME}}.  Remember, [[PickiPedia:Is Not WikiPedia]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5368</id>
		<title>Template:NewsPhoto</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5368"/>
		<updated>2026-07-19T16:12:38Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Jason Carter and Michael Cleveland at Grey Fox 2026.jpg|300px|{{m|Jason Carter}} and {{m|Michael Cleveland}} light up the [[Grey Fox 2026]] dance stage, with {{m|Cody Looper}}, {{m|Josh Gooding}}, and {{m|Jake Stargel}}|left|thumb]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=File:Fibonacci_at_Grey_Fox_2026.MP.jpg&amp;diff=5367</id>
		<title>File:Fibonacci at Grey Fox 2026.MP.jpg</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=File:Fibonacci_at_Grey_Fox_2026.MP.jpg&amp;diff=5367"/>
		<updated>2026-07-19T15:58:21Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Uploaded a work by null from null with Media Uploader&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
&lt;br /&gt;
== Media information ==&lt;br /&gt;
* &#039;&#039;&#039;Date:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Source:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Location:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5366</id>
		<title>Jake Stargel</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5366"/>
		<updated>2026-07-17T18:01:53Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Jake Stargel&lt;br /&gt;
|image=Jake Stargel and Christian Ward in Colorado.png&lt;br /&gt;
|image_caption=Jake Stargel playing bass, with [[Christian Ward]] on fiddle.&lt;br /&gt;
|does1=is the current touring guitarist of [[wikipedia:Béla Fleck|Béla Fleck]]&#039;s [[wikipedia:My Bluegrass Heart|My Bluegrass Heart]]&lt;br /&gt;
|does2=has played on some ridiculously sick bluegrass video game music tracks, including the self-titled album from [[The Hitpoints]], and two Final Fantasy arrangements with [[Justin Myles Holmes]].  &lt;br /&gt;
|does3=has an extensive history of live shows, including playing with {{m|Jason Carter}} and {{m|Michael Cleveland}}, {{ShowInstrument|Sierra Hull}}, {{Band|Mountain Heart}}, and {{Band|Justin Holmes and The Immutable String Band}}.&lt;br /&gt;
|does4=engineers a lot of amazing records.  Works with [[David Grier]] and [[East Nash Grass]] a lot in this capacity.  &lt;br /&gt;
|show_instrument=guitar&lt;br /&gt;
|instruments=guitar, bass, mandolin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:Tony-rice-jake-stargel.png|right|thumb|200px|[[Jake Stargel]] with [[wikipedia:Tony Rice|Tony Rice]], during a performance with [[Mountain Heart]] at the 2010 [[Gettysburg Bluegrass Festival]].]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jake Stargel 58957.png|right|thumb|200px|Jake Stargel playing [[Martin D-28 58957]].]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5365</id>
		<title>Jake Stargel</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5365"/>
		<updated>2026-07-17T17:56:48Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Jake Stargel&lt;br /&gt;
|image=Jake Stargel and Christian Ward in Colorado.png&lt;br /&gt;
|image_caption=Jake Stargel playing bass, with [[Christian Ward]] on fiddle.&lt;br /&gt;
|does1=is the current touring guitarist of [[wikipedia:Béla Fleck|Béla Fleck]]&#039;s [[wikipedia:My Bluegrass Heart|My Bluegrass Heart]]&lt;br /&gt;
|does2=has played on some ridiculously sick bluegrass video game music tracks, including the self-titled album from [[The Hitpoints]], and two Final Fantasy arrangements with [[Justin Myles Holmes]].  &lt;br /&gt;
|does3=has an extensive history of live shows, including playing with {{m|Jason Carter}} and {{m|Michael Cleveland}}, {{ShowInstrument|Sierra Hull}}, {{Band|Mountain Heart}}, and {{Band|Justin Holmes and The Immutable String Band}}.&lt;br /&gt;
|does4=engineers a lot of amazing records.  Works with [[David Grier]] and [[East Nash Grass]] a lot in this capacity.  &lt;br /&gt;
|show_instrument=guitar&lt;br /&gt;
|instruments=guitar, bass, mandolin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Jake Stargel 58957.png|right|thumb|200px|Jake Stargel playing [[Martin D-28 58957]].]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=File:Jake_Stargel_and_Christian_Ward_in_Colorado.png&amp;diff=5364</id>
		<title>File:Jake Stargel and Christian Ward in Colorado.png</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=File:Jake_Stargel_and_Christian_Ward_in_Colorado.png&amp;diff=5364"/>
		<updated>2026-07-17T17:54:19Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Uploaded a work by null from null with Media Uploader&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Working on Bubak and Hungaricus in prepartion for a show with Justin Holmes and The Immutable String Band&lt;br /&gt;
&lt;br /&gt;
== Media information ==&lt;br /&gt;
* &#039;&#039;&#039;Date:&#039;&#039;&#039; 2023-03-03&lt;br /&gt;
* &#039;&#039;&#039;Source:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Location:&#039;&#039;&#039; &#039;&#039;unknown&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5363</id>
		<title>Jake Stargel</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5363"/>
		<updated>2026-07-17T17:46:54Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Jake Stargel&lt;br /&gt;
|does1=is the current touring guitarist of [[wikipedia:Béla Fleck|Béla Fleck]]&#039;s [[wikipedia:My Bluegrass Heart|My Bluegrass Heart]]&lt;br /&gt;
|does2=has played on some ridiculously sick bluegrass video game music tracks, including the self-titled album from [[The Hitpoints]], and two Final Fantasy arrangements with [[Justin Myles Holmes]].  &lt;br /&gt;
|does3=has an extensive history of live shows, including playing with {{m|Jason Carter}} and {{m|Michael Cleveland}}, {{ShowInstrument|Sierra Hull}}, {{Band|Mountain Heart}}, and {{Band|Justin Holmes and The Immutable String Band}}.&lt;br /&gt;
|does4=engineers a lot of amazing records.  Works with [[David Grier]] and [[East Nash Grass]] a lot in this capacity.  &lt;br /&gt;
|show_instrument=guitar&lt;br /&gt;
|instruments=guitar, bass, mandolin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:Jake Stargel 58957.png|right|thumb|200px|Jake Stargel playing [[Martin D-28 58957]].]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5362</id>
		<title>Jake Stargel</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Jake_Stargel&amp;diff=5362"/>
		<updated>2026-07-17T17:45:23Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Jake Stargel&lt;br /&gt;
|does1=is the current touring guitarist of [[wikipedia:Béla Fleck|Béla Fleck]]&#039;s [[wikipedia:My Bluegrass Heart|My Bluegrass Heart]]&lt;br /&gt;
|does2=has played on some ridiculously sick bluegrass video game music tracks, including the self-titled album from [[The Hitpoints]], and two Final Fantasy arrangements with [[Justin Myles Holmes]].  &lt;br /&gt;
|does3=has an extensive history of live shows, including playing with {{m|Jason Carter}} and {{m|Michael Cleveland}}, {{ShowInstrument|Sierra Hull}}, {{Band|Mountain Heart}}, and {{Band|Justin Holmes and The Immutable String Band}}.&lt;br /&gt;
|does4=engineers a lot of amazing records.  Works with [[David Grier]] and [[East Nash Grass]] a lot in this capacity.  &lt;br /&gt;
|show_instrument=guitar&lt;br /&gt;
|instruments=guitar, bass, mandolin&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Grey_Fox_2026&amp;diff=5361</id>
		<title>Grey Fox 2026</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Grey_Fox_2026&amp;diff=5361"/>
		<updated>2026-07-17T14:12:50Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Grey fox 2026 smoke.jpg|right|thumb|400px|Smoke and haze were visible on Thursday evening.]]&lt;br /&gt;
&lt;br /&gt;
Grey Fox 2026 in an ongoing [[wikipedia:Grey Fox Bluegrass Festival]] held July 15-19, 2026.&lt;br /&gt;
&lt;br /&gt;
Grey Fox 2026 took place during the [[wikipedia:2026 Canadian wildfires|2026 Canadian wildfires]], which caused significant smoke and haz on the festival grounds, particularly during the opening days.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery perrow=4&amp;gt;&lt;br /&gt;
File:East Nash Grass at Grey Fox Bluegrass Festival 2026.jpg|East Nash Grass on Thursday afternoon at the Catskill stage.  From left to right: {{m|Cory Walker}}, {{m|Harry Clark}}, {{m|Maddie Denton}}, {{m|Carter Eddy}}, {{m|Frank Carter Rische}}&lt;br /&gt;
File:Grey fox 2026, smoke visible.jpg|Smoke and haze&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5360</id>
		<title>Template:NewsPhoto</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5360"/>
		<updated>2026-07-17T14:00:13Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Grey fox 2026 smoke.jpg|400px|[[Grey Fox 2026]] opens amidst wildfire smoke|left|thumb]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Carter_Eddy&amp;diff=5359</id>
		<title>Carter Eddy</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Carter_Eddy&amp;diff=5359"/>
		<updated>2026-07-17T13:04:30Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;{{MusicianInfo |name=Carter Eddy |show_instrument=bass |scene=Nashville }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Carter Eddy&lt;br /&gt;
|show_instrument=bass&lt;br /&gt;
|scene=Nashville&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Grey_Fox_2026&amp;diff=5358</id>
		<title>Grey Fox 2026</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Grey_Fox_2026&amp;diff=5358"/>
		<updated>2026-07-17T12:31:45Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grey Fox 2026 in an ongoing [[wikipedia:Grey Fox Bluegrass Festival]] held July 15-19, 2026.&lt;br /&gt;
&lt;br /&gt;
[[File:East Nash Grass at Grey Fox Bluegrass Festival 2026.jpg|thumb|200px|East Nash Grass on Thursday afternoon at the Catskill stage.  From left to right: {{m|Cory Walker}}, {{m|Harry Clark}}, {{m|Maddie Denton}}, {{m|Carter Eddy}}, {{m|Frank Carter Rische}} ]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Frank_Carter_Rische&amp;diff=5357</id>
		<title>Frank Carter Rische</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Frank_Carter_Rische&amp;diff=5357"/>
		<updated>2026-07-16T23:54:02Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Frank Carter Rische&lt;br /&gt;
|show_instrument=guitar&lt;br /&gt;
|scene=Nashville&lt;br /&gt;
|does1=is the current touring guitarist in East Nash Grass.&lt;br /&gt;
|does2=has played with virtually every bluegrass band ever to play at [[Dee&#039;s Country Cocktail Lounge]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Envy expressed in the bluegrass community after ENG annointment===&lt;br /&gt;
When Carter Rische was named ENG&#039;s new touring guitarist, some (well, one) in the community expressed disdain that, while he&#039;s a perfect fit as a guitarist, he doesn&#039;t have a track record of making green fruit and vegetable puree on stage which fans might expect.&lt;br /&gt;
&lt;br /&gt;
{{HLSVideo|QmdrF7qb9zExAwHZtfVn8fUJFLFQxXs2PmHsWEUQj9FDN4|width=75px|align=right}}&lt;br /&gt;
&lt;br /&gt;
===Social Media===&lt;br /&gt;
* [https://www.instagram.com/brothertothewind/ Frank Carter Riche&#039;s Instagram]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Another_Jeff_/_Geoff&amp;diff=5356</id>
		<title>Another Jeff / Geoff</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Another_Jeff_/_Geoff&amp;diff=5356"/>
		<updated>2026-07-16T23:49:42Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Another Jeff / Geoff&amp;#039;&amp;#039;&amp;#039; is the name of the rotating bass player in East Nash Grass.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Another Jeff / Geoff&#039;&#039;&#039; is the name of the rotating bass player in [[East Nash Grass]].&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Grey_Fox_2026&amp;diff=5355</id>
		<title>Grey Fox 2026</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Grey_Fox_2026&amp;diff=5355"/>
		<updated>2026-07-16T23:49:05Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;Grey Fox 2026 in an ongoing wikipedia:Grey Fox Bluegrass Festival held July 15-19, 2026.  Frank Carter Rische}} &amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grey Fox 2026 in an ongoing [[wikipedia:Grey Fox Bluegrass Festival]] held July 15-19, 2026.&lt;br /&gt;
&lt;br /&gt;
[[File:East Nash Grass at Grey Fox Bluegrass Festival 2026.jpg|thumb|200px|East Nash Grass on Thursday afternoon at the Catskill stage.  From left to right: {{m|Cory Walker}}, {{m|Harry Clark}}, {{m|Maddie Denton}}, {{m|Another Jeff / Geoff}}, {{m|Frank Carter Rische}} ]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsShorts&amp;diff=5354</id>
		<title>Template:NewsShorts</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsShorts&amp;diff=5354"/>
		<updated>2026-07-16T23:14:04Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Grey Fox 2026]] opens amidst wildfire smoke&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5353</id>
		<title>Template:NewsPhoto</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5353"/>
		<updated>2026-07-16T23:13:10Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:East Nash Grass at Grey Fox Bluegrass Festival 2026 (view from back of crowd).jpg|400px|[[Grey Fox 2026]] opens amidst wildfire smoke (pictured; East Nash Grass on Catskill stage|left|thumb]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5352</id>
		<title>Template:NewsPhoto</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Template:NewsPhoto&amp;diff=5352"/>
		<updated>2026-07-16T23:12:41Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:East Nash Grass at Grey Fox Bluegrass Festival 2026 (view from back of crowd).jpg|400px|[[Grey Fox 2026]] opens amidst wildfire smoke (pictured; East Nash Grass on Catskill stage|thumb]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5306</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=5306"/>
		<updated>2026-06-06T16:04:52Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Note: this show was previously projected at blockheight 25247741, but actually occurred at 25254342.&#039;&#039;&lt;br /&gt;
&lt;br /&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;
|status=verified&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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25247741&amp;diff=5305</id>
		<title>Show:JustinHolmes-25247741</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25247741&amp;diff=5305"/>
		<updated>2026-06-06T16:02:25Z</updated>

		<summary type="html">&lt;p&gt;JMyles: JMyles moved page Show:JustinHolmes-25247741 to Show:JustinHolmes-25254342&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Show:JustinHolmes-25254342]]&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5304</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=5304"/>
		<updated>2026-06-06T16:02:25Z</updated>

		<summary type="html">&lt;p&gt;JMyles: JMyles moved page Show:JustinHolmes-25247741 to Show:JustinHolmes-25254342&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;
|status=verified&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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5298</id>
		<title>MediaWiki:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5298"/>
		<updated>2026-06-02T21:02:19Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5297</id>
		<title>MediaWiki:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5297"/>
		<updated>2026-06-02T21:02:02Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5294</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=5294"/>
		<updated>2026-06-02T20:59:35Z</updated>

		<summary type="html">&lt;p&gt;JMyles: JMyles moved page Show:JustinHolmes-25255000 to Show:JustinHolmes-25247741 without leaving a redirect: corrected blockheight&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;
|status=verified&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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5293</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=5293"/>
		<updated>2026-06-02T20:59:10Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &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;
|status=verified&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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5292</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=5292"/>
		<updated>2026-06-02T20:56:02Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5291</id>
		<title>MediaWiki:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5291"/>
		<updated>2026-06-02T20:54:14Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5290</id>
		<title>MediaWiki:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5290"/>
		<updated>2026-06-02T20:53:56Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5287</id>
		<title>MediaWiki:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5287"/>
		<updated>2026-06-02T20:45:00Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5286</id>
		<title>MediaWiki:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5286"/>
		<updated>2026-06-02T20:44:42Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Show:JustinHolmes-25254342&amp;diff=5281</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=5281"/>
		<updated>2026-06-02T20:38:26Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &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;
|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;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5280</id>
		<title>MediaWiki:Gadget-pickipedia-show.css</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.css&amp;diff=5280"/>
		<updated>2026-06-02T20:21:55Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5279</id>
		<title>MediaWiki:Gadget-pickipedia-show.js</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=MediaWiki:Gadget-pickipedia-show.js&amp;diff=5279"/>
		<updated>2026-06-02T20:21:39Z</updated>

		<summary type="html">&lt;p&gt;JMyles: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Paul_Sanna&amp;diff=5274</id>
		<title>Paul Sanna</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Paul_Sanna&amp;diff=5274"/>
		<updated>2026-06-02T20:15:51Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;{{MusicianInfo |name=Paul Sanna |show_instrument=banjo |scene=Upstate NY }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Paul Sanna&lt;br /&gt;
|show_instrument=banjo&lt;br /&gt;
|scene=Upstate NY&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
	<entry>
		<id>https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Christina_Docenko&amp;diff=5273</id>
		<title>Christina Docenko</title>
		<link rel="alternate" type="text/html" href="https://pickipedia.skyler.hunter.cryptograss.live/index.php?title=Christina_Docenko&amp;diff=5273"/>
		<updated>2026-06-02T20:15:31Z</updated>

		<summary type="html">&lt;p&gt;JMyles: Created page with &amp;quot;{{MusicianInfo |name=Christina Docenko |show_instrument=fiddle |scene=Upstate NY }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{MusicianInfo&lt;br /&gt;
|name=Christina Docenko&lt;br /&gt;
|show_instrument=fiddle&lt;br /&gt;
|scene=Upstate NY&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>JMyles</name></author>
	</entry>
</feed>