<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Toad64</id>
	<title>The Deadlock Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Toad64"/>
	<link rel="alternate" type="text/html" href="https://deadlock.wiki/Special:Contributions/Toad64"/>
	<updated>2026-09-02T00:16:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://deadlock.wiki/Mechanics?diff=105471</id>
		<title>Mechanics</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Mechanics?diff=105471"/>
		<updated>2026-08-05T00:44:58Z</updated>

		<summary type="html">&lt;p&gt;Toad64: small change to how pausing works in game, tested&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Mechanics image.png|thumb|342x342px|[[Pocket]] attacking enemies from above]]&lt;br /&gt;
[[File:Item build.png|thumb|342x342px|An item build]]{{Quotation|[[Bebop]]|I got enough of these for everyone!&lt;br /&gt;
| 4 = Bebop_upgrade_power3_10.mp3&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Mechanics&#039;&#039;&#039; in &#039;&#039;[[Deadlock]]&#039;&#039; are the details, particulars, and mechanisms by which a player interacts with the game. This includes the objectives, controls, timing, map, and priorities to consider while playing in order to achieve victory. &lt;br /&gt;
&lt;br /&gt;
Mechanics are generally broken into three categories:&lt;br /&gt;
&lt;br /&gt;
; Unit mechanics : The statistics, controls, and statuses of the units of &#039;&#039;Deadlock&#039;&#039;, including the player&#039;s Hero, the marching [[Trooper]]s, and lane [[Structures]].&lt;br /&gt;
; Gameplay mechanics : The mechanics of interacting with the game, how the player gains {{Souls}} [[Souls]], victory/defeat conditions, damage, healing, and death.&lt;br /&gt;
; Map mechanics: The locations and entities of the game map and how they interact with players.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The overall objective of &#039;&#039;Deadlock&#039;&#039; is to destroy the enemy team&#039;s [[Patron]]. This is done over the course of the game, where two teams battle across three lanes, navigating the map using [[Portal:Movement|movement]] tools such as fans, [[Ropes|ropes]], and [[Ziplines]]. Each lane contains a [[Guardian]] and a [[Walker]] that a team will need to destroy to progress and destroy the [[Patron]].&lt;br /&gt;
&lt;br /&gt;
Teams battle AI controlled Troopers, that release Souls when killed. Souls are used to [[Boon|Level-up]] and buy [[items]].&lt;br /&gt;
&lt;br /&gt;
== Gameplay Mechanics ==&lt;br /&gt;
&lt;br /&gt;
=== Stats ===&lt;br /&gt;
{{Main|Stats}}&lt;br /&gt;
&lt;br /&gt;
Stats are the attributes that define a hero&#039;s strengths and weaknesses, and can be improved by [[Boon|leveling up]] and using [[abilities]] and [[items]].&lt;br /&gt;
&lt;br /&gt;
See [[Hero Comparison Table]] for a list of every hero&#039;s base stats and scaling.&lt;br /&gt;
&lt;br /&gt;
=== Offense and Defense ===&lt;br /&gt;
; Weapon Attacks&lt;br /&gt;
* Every Hero has a weapon that fires a ranged projectile that allows them to engage in ranged combat to deal damage to other Heroes and units.&lt;br /&gt;
&lt;br /&gt;
; Melee Attacks&lt;br /&gt;
{{Main|Melee Attack}}&lt;br /&gt;
* Every Hero may also perform a [[Melee attack|melee]] attack (Default key: &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt;) to strike at point-blank range. Players can perform either a light or heavy melee attack. Light melee attacks are fast but deal low damage, heavy melee attacks take longer to charge, but have greater damage and range.&lt;br /&gt;
&lt;br /&gt;
; Parry&lt;br /&gt;
* [[Melee Attack#Parry|Parries]] (Default key: &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;) are a defensive move available to every Hero, letting them block a melee hit from an enemy. On a successful parry, the enemy is stunned and takes 25% more damage from all sources for 2.75s. The parry goes on cooldown once it&#039;s used, but is instantly refunded on a successful parry against another Hero or a Guardian. Troopers can also be parried, but doing so does not refund the cooldown.&lt;br /&gt;
&lt;br /&gt;
; Crouch&lt;br /&gt;
* Crouching (Default key: &amp;lt;code&amp;gt;Ctrl&amp;lt;/code&amp;gt;) can help avoid enemy fire by making the player smaller and able to hide behind objects.&lt;br /&gt;
&lt;br /&gt;
; Hero Abilities&lt;br /&gt;
* Every Hero has 4 unique abilities, which they can unlock for use by spending [[Boon|&#039;&#039;&#039;ability unlocks&#039;&#039;&#039;]][[File:Ability_unlock_icon.png|30px]]. Abilities provide tools for Heroes to enhance their playstyle in several different ways, such as dealing damage, empowering themselves or allied Heroes, weakening enemies, or assisting in traversal.&lt;br /&gt;
&lt;br /&gt;
=== Movement ===&lt;br /&gt;
{{Main|Movement}}&lt;br /&gt;
; Double jump&lt;br /&gt;
* Heroes can perform a &#039;&#039;double jump&#039;&#039; by jumping (Default key: &amp;lt;code&amp;gt;Space&amp;lt;/code&amp;gt;) while in mid air, which cost 1 [[Stamina]]. By default, Heroes can perform a single &#039;&#039;double jump&#039;&#039; in the air.&lt;br /&gt;
&lt;br /&gt;
; Dash and Air Dash&lt;br /&gt;
* Pressing the dash button (Default key: &amp;lt;code&amp;gt;Shift&amp;lt;/code&amp;gt;) performs a quick evasive maneuver, which costs 1 [[Stamina]]. It can be used to evade enemy attacks, escape fights, or chase enemies.&lt;br /&gt;
* Pressing dash while in the air performs an &#039;&#039;air dash&#039;&#039; which works exactly like a regular dash, except it has less slowdown at the end of the dash. Without items, Heroes can perform a single &#039;&#039;air dash&#039;&#039; while in the air.&lt;br /&gt;
* Most Heroes have unique dash speeds, this can be viewed in their Vitality stats.&lt;br /&gt;
&lt;br /&gt;
; Dash Jump&lt;br /&gt;
* A &#039;&#039;Dash jump&#039;&#039; is a fast long jump, which can be performed during a dash and costs 1 [[Stamina]], for a total of 2 including the Stamina spent &#039;&#039;dashing&#039;&#039;. &lt;br /&gt;
* The timing of a &#039;&#039;dash jump&#039;&#039; is visualized by the Stamina bar turning blue while &#039;&#039;dashing.&#039;&#039; While the Stamina bar is blue, the player can press jump to successfully &#039;&#039;dash jump&#039;&#039;.&lt;br /&gt;
* If players miss the timing of a &#039;&#039;dash jump&#039;&#039; by pressing &amp;lt;code&amp;gt;Space&amp;lt;/code&amp;gt; too early or too late, the Hero will continue to dash and players will not be able to attempt the &#039;&#039;dash jump&#039;&#039; again until the initial dash is completed.&lt;br /&gt;
&lt;br /&gt;
; Slide&lt;br /&gt;
* Heroes can slide by holding crouch while moving faster than 9.6m/s (such as with high move/sprint speed, after dashes, etc) or while going down slopes, preserving momentum and giving infinite ammo for the duration of the slide. This can improve overall DPS by increasing the time before needing to reload when fighting around stairs or slopes, such as the ones seen in every lane next to the [[Guardian]].&lt;br /&gt;
&lt;br /&gt;
; Down Dash&lt;br /&gt;
* Heroes can quickly dash downwards while in mid air by pressing the crouch button twice, spending 0.5 [[Stamina]].&lt;br /&gt;
&lt;br /&gt;
; Wall Jump&lt;br /&gt;
* Heroes can perform a &#039;&#039;wall jump&#039;&#039; by jumping in mid air next to a wall while inputting the direction away from the wall. The first wall jump costs no [[Stamina]], while subsequent wall jumps cost 0.5 [[Stamina]].&lt;br /&gt;
&lt;br /&gt;
; Wall Slide&lt;br /&gt;
* Heroes can slide along walls while in the air, slowing their descent and limiting their max falling speed to -600 u/s.&lt;br /&gt;
&lt;br /&gt;
; Mantle&lt;br /&gt;
* Heroes can &#039;&#039;mantle&#039;&#039;, i.e. climb up obstacles. To mantle, the player must hold the forward key and look in the direction they wish to mantle in while jumping.&lt;br /&gt;
&lt;br /&gt;
; Mantle Glide&lt;br /&gt;
* Heroes can perform a &#039;&#039;mantle glide&#039;&#039; by holding the crouch button during a mantle. This will add a speed boost upon the mantle finishing.&lt;br /&gt;
&lt;br /&gt;
=== General Strategy ===&lt;br /&gt;
{{Main|Strategy}}&lt;br /&gt;
; Laning&lt;br /&gt;
* Laning is the process of fighting in the lane, collecting [[Souls]] from [[Trooper]]s, and pushing the lane to the enemy [[Patron]].&lt;br /&gt;
* There are 3 lanes: York (Yellow), Broadway (Blue), and Park (Green; also referred to as Greenwich). Any part of a lane controlled by the opposing team will be red on the [[Minimap]].&lt;br /&gt;
* The &#039;&#039;&#039;laning phase&#039;&#039;&#039; refers to the early game where players organize in lanes to gain strength (see: &amp;quot;[[Strategy]]&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
; Ganking&lt;br /&gt;
* Ganking is the act of moving from one lane to another to help kill vulnerable enemy Heroes.&lt;br /&gt;
&lt;br /&gt;
; Farming&lt;br /&gt;
* Farming is the process of focusing on gaining souls and buffs to increase your Hero&#039;s strength and buy more items. Farming typically consists of killing [[neutral]] camps and destroying breakables such as [[Crates]], [[Golden Statue]]s, and [[Sinner&#039;s Sacrifice]] machines.&lt;br /&gt;
&lt;br /&gt;
=== Items ===&lt;br /&gt;
{{Main|Items}}&lt;br /&gt;
* All [[Items]] give passive bonuses and some of them have an Active ability that Hero can use on command. Items can be purchased from the [[The Curiosity Shop]] for [[Souls]].&lt;br /&gt;
&lt;br /&gt;
=== Comeback Mechanics ===&lt;br /&gt;
{{Main|Souls}}&lt;br /&gt;
When a team is behind on [[Souls]], there are some mechanics that come into play to allow the losing team to catch up. &lt;br /&gt;
&lt;br /&gt;
* Killing an enemy hero will award more souls if that hero is stronger than the killer team&#039;s average networth, regardless of which team is leading in souls.&lt;br /&gt;
* The losing team gains up to {{#expr:({{DataProp|Convar|citadel_player_gold_comeback_npc_max_mutliplier_value}}-1)*100}}% more souls from Troopers, neutrals, Sinner&#039;s Sacrifices and Objectives, based on how behind they are (peaks at 20% max net worth difference). The first 3k in net worth difference is ignored.&lt;br /&gt;
* The Soul Urn will give additional souls to a team that is behind.&lt;br /&gt;
&lt;br /&gt;
=== Pausing ===&lt;br /&gt;
Each player may pause the game once per match. Pausing cannot be done before 2 minutes after the match starts. Each team is limited to three pauses per match, meaning that after three different players on the same team have used their pause, that team can no longer pause the game. This allows for a maximum of six pauses per match.&lt;br /&gt;
&lt;br /&gt;
When a pause is called, all in-game action stops. The game timer, player movement, abilities, projectiles, and all other gameplay elements are frozen until game resumes.&lt;br /&gt;
&lt;br /&gt;
The player who called the pause may end it at any time. Otherwise, the pause becomes available for anyone to end after 30 seconds. There is no maximum pause duration.&lt;br /&gt;
&lt;br /&gt;
Players are able to move their camera while the game is paused. Any camera movement made during the pause is not retained and will reset to its original position when the game resumes.&lt;br /&gt;
&lt;br /&gt;
Pausing is not allowed in [[Street Brawl]].&lt;br /&gt;
&lt;br /&gt;
== Map Mechanics == &lt;br /&gt;
{{main|The Cursed Apple}}&lt;br /&gt;
The map is where all of the fighting in &#039;&#039;Deadlock&#039;&#039; takes place. Known as &amp;quot;The Cursed Apple&amp;quot; and based on Midtown and Lower Manhattan in New York City, the map contains all of the unique features of &#039;&#039;Deadlock&#039;s&#039;&#039; gameplay.&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
{{main|Minimap}}&lt;br /&gt;
The Minimap provides players with a view of the battle at large, providing live information regarding relevant match information.&lt;br /&gt;
* The Minimap provides specific information of the location of Camps, friendly and enemy Troopers, Shops, Buffs, and enemy Heroes (under certain conditions).&lt;br /&gt;
* The Minimap should be checked often to give players insight on the status of their own team, lane status, enemy positions, and camp locations.&lt;br /&gt;
&lt;br /&gt;
=== Structures and Units ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Unit/Structure !! Image !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[Troopers]] || [[File:Trooper_Icon.png|110px]] || Troopers are the main force of each Patron, sent down the map&#039;s Lanes to attack the opposing Patron. These small warriors will march in squads of 4 to attack all enemies nearby, including Guardians, Heroes, and the enemy Troopers.&lt;br /&gt;
For much of the game, destroying Troopers (and their [[Soul]] orbs) is the primary way for players to gain more Souls. In addition, players may Deny enemy teams by stealing the Souls from killed troopers. &lt;br /&gt;
|-&lt;br /&gt;
| [[Guardian]] || [[File:Guardian_Icon.png|110px]] || The first objective of the lane is the Guardian, who has a laser attack, a melee attack, and a slam attack. The slam attack does AoE damage to enemies near the Guardian.&lt;br /&gt;
|-&lt;br /&gt;
| [[Walker]] || [[File:Walker_Icon.png|110px]] || The second objective of the lane is the Walker who has a laser attack, a Volcano Salvo, and a slam. Your team will gain an [[Extra Slots|Extra Slot]] per enemy Walker destroyed.&lt;br /&gt;
|-&lt;br /&gt;
| [[Guardian|Base Guardians]] || [[File:Base_guardians.png|110px]] || The Third objective of the lane is two Guardians outside the enemy base. When both of these enemy Guardians fall in a lane, the zipline for allies in that lane becomes significantly faster.&lt;br /&gt;
|-&lt;br /&gt;
| [[Shrine]] || [[File:Shrines.png|110px]] || The fourth objective is the Shrines. They have no attacks. There are two shrines, one on each side of the base. They both need to be destroyed in order to weaken the Patron, allowing you to kill it and win the game.&lt;br /&gt;
|-&lt;br /&gt;
| [[Patron]] || [[File:Patron_Icon.png|110px]] || The fifth and final objective is the Patron, which ends the game. It has two modes, normal and weakened. You can not damage a Patron in its normal state, it must be exposed by killing both Shrines in the base.&lt;br /&gt;
Once the Patron has been brought to 50% HP, it will become invulnerable, transform and move into their team&#039;s Pit. If the weakened Patron is not currently under attack, it will passively regenerate its health. &lt;br /&gt;
&lt;br /&gt;
When the Patron moves into phase two, any Death Timers on the defending team will be shortened by up to 20s to a minimum of 10s, allowing for a final defense. &lt;br /&gt;
|-&lt;br /&gt;
| [[Neutral]] || [[File:Neutral_Icon.png|110px]] ||&lt;br /&gt;
Neutrals exist in the &amp;quot;Jungle&amp;quot; of the map. These Camps are located across the map and are denoted by cyan triangle icons. The number of lines beneath the icon indicates the difficulty of the camp: zero lines for easy camps, one line for medium camps, and two lines for hard camps. They are worth a small to medium amount of [[Souls]] if destroyed and respawn soon after. &lt;br /&gt;
|-&lt;br /&gt;
| [[Mid-Boss]] || [[File:Midboss.png|110px]] || The Mid-Boss is located in the center of the map and is a durable threat that typically requires multiple team members to co-ordinate and defeat.&lt;br /&gt;
When the Mid-Boss dies, it drops the [[Rejuvenator]]. The Rejuvenator must be claimed by landing heavy melee attacks on it, it requires 3 hits to fully collect. Each successful hit immediately grants every member of your team a &#039;&#039;&#039;Rejuvenation Credit&#039;&#039;&#039;.&lt;br /&gt;
If a hero dies while holding a Rejuvenation Credit, they will respawn at their death location and the credit is consumed. The credit does not affect deaths that happened before it was earned.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Interactive Objects ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Object !! Image !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[Soul Urn]] || [[File:Soul_Urn_Render.png|110px]] || After 10 minutes of game time, the Soul Urn will appear and be ready for capture. The capturing hero will receive a few minor stat buffs, and several [[Soul Orbs]] will spawn from the deposit point. &lt;br /&gt;
These [[Soul Orbs]] default to the capturer; however, they can be denied by opponents or confirmed by teammates to share the bounty.&lt;br /&gt;
&lt;br /&gt;
The Urn respawns every 5 minutes, and its spawn location is to the side of either bridge on green or yellow, and its capture location will be the opposite spawn (i.e., urn spawns on yellow, so its capture will be at green).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| [[Unstable Rift]] || [[File:Unstable_rift_objective_2.png|110px]] || After 11 minutes of game time, Unstable Rift capture points will periodically appear on a side lane&#039;s bridge after 80 seconds. The winning team will receive [[Souls]] and Rift Troopers will spawn for that lane. After a minute of a tied contest, neutral [[Soul Orbs]] will spawn to be claimed by either team.&lt;br /&gt;
Rifts spawn every 6-8 minutes.&lt;br /&gt;
|-&lt;br /&gt;
| [[Breakables]] || [[File:Gold_Urn_Render.png|110px]] || Breakables are found all around the map in the form of a [[crate]] or a [[golden statue]]. Break them for a minor but permanent power-up or a small amount of [[Souls]]. &lt;br /&gt;
|-&lt;br /&gt;
| [[Sinner&#039;s Sacrifice]]&lt;br /&gt;
| [[File:SinnersSacrifice InGame ISO.png|85px]]|| Sinner&#039;s Sacrifice is a vending machine that provides Heroes with [[Souls]] in exchange for health if punched.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ziplines]]||[[File:Map Nav.png|110px]]||The Transit Lines (aka Hyperlines, or Ziplines) are the primary method of long-distance transportation in Deadlock. The Transit Lines are located throughout the Map, starting from each team&#039;s base, running down the three different lanes. Each team has their own Transit Lines system. The availability of the Transit Line depends on how far a team&#039;s Troopers has pushed down the lane.&lt;br /&gt;
|-&lt;br /&gt;
| [[Teleporter]]||[[File:Teleporter walker.png|110px]]||&lt;br /&gt;
2 pairs of Teleporters which can be used to quickly traverse the map horizontally .&lt;br /&gt;
|-&lt;br /&gt;
| [[Ropes]]||[[File:Screenshot_from_2024-10-08_18-29-30.png|110px]]||&lt;br /&gt;
Ropes can be used to quickly ascend to midlevels or rooftops.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot;&amp;gt;&lt;br /&gt;
{{#vardefine:pw_dur|{{#invoke:MiscData|get_misc_var|casting_powerup_pickup|Modifer|Duration}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:cast_sp_min|{{#invoke:MiscData|get_misc_var|casting_powerup_pickup|Modifer|ModifierValues|1|valueMin}}}}&lt;br /&gt;
{{#vardefine:cast_sp_max|{{#invoke:MiscData|get_misc_var|casting_powerup_pickup|Modifer|ModifierValues|1|valueMax}}}}&lt;br /&gt;
{{#vardefine:cast_cdr_min|{{#invoke:MiscData|get_misc_var|casting_powerup_pickup|Modifer|ModifierValues|2|valueMin}}}}&lt;br /&gt;
{{#vardefine:cast_cdr_max|{{#invoke:MiscData|get_misc_var|casting_powerup_pickup|Modifer|ModifierValues|2|valueMax}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:gun_fr_min|{{#invoke:MiscData|get_misc_var|gun_powerup_pickup|Modifer|ModifierValues|1|valueMin}}}}&lt;br /&gt;
{{#vardefine:gun_fr_max|{{#invoke:MiscData|get_misc_var|gun_powerup_pickup|Modifer|ModifierValues|1|valueMax}}}}&lt;br /&gt;
{{#vardefine:gun_ammo_min|{{#invoke:MiscData|get_misc_var|gun_powerup_pickup|Modifer|ModifierValues|2|valueMin}}}}&lt;br /&gt;
{{#vardefine:gun_ammo_max|{{#invoke:MiscData|get_misc_var|gun_powerup_pickup|Modifer|ModifierValues|2|valueMax}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:mov_stam_min|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|1|valueMin}}}}&lt;br /&gt;
{{#vardefine:mov_stam_max|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|1|valueMax}}}}&lt;br /&gt;
{{#vardefine:mov_sprint_raw_min|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|2|valueMin}}}}&lt;br /&gt;
{{#vardefine:mov_sprint_raw_max|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|2|valueMax}}}}&lt;br /&gt;
{{#vardefine:mov_zip_min|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|3|valueMin}}}}&lt;br /&gt;
{{#vardefine:mov_zip_max|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|3|valueMax}}}}&lt;br /&gt;
{{#vardefine:mov_regen_min|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|4|valueMin}}}}&lt;br /&gt;
{{#vardefine:mov_regen_max|{{#invoke:MiscData|get_misc_var|movement_powerup_pickup|Modifer|ModifierValues|4|valueMax}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:mov_sprint_min|{{#expr: {{#var:mov_sprint_raw_min}} * 0.0254 round 1 }}}}&lt;br /&gt;
{{#vardefine:mov_sprint_max|{{#expr: {{#var:mov_sprint_raw_max}} * 0.0254 round 1 }}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:surv_hp_min|{{#invoke:MiscData|get_misc_var|survival_powerup_pickup|Modifer|ModifierValues|1|valueMin}}}}&lt;br /&gt;
{{#vardefine:surv_hp_max|{{#invoke:MiscData|get_misc_var|survival_powerup_pickup|Modifer|ModifierValues|1|valueMax}}}}&lt;br /&gt;
{{#vardefine:surv_regen_min|{{#invoke:MiscData|get_misc_var|survival_powerup_pickup|Modifer|ModifierValues|2|valueMin}}}}&lt;br /&gt;
{{#vardefine:surv_regen_max|{{#invoke:MiscData|get_misc_var|survival_powerup_pickup|Modifer|ModifierValues|2|valueMax}}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Temporary Buffs ===&lt;br /&gt;
{{Main|Powerups}}&lt;br /&gt;
Temporary buffs spawn on the bridges overlooking the Soul Urn locations and begin at the 5 minute mark and then every 5 minutes thereafter. Each buff lasts for 160 seconds after being destroyed with a Heavy [[Melee Attack]]. The strength of each buff progressively increases from the 5 minute mark to the 40 minute mark.&lt;br /&gt;
&lt;br /&gt;
There are four types of buffs:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Casting Buff:&#039;&#039;&#039; Grants temporary cooldown reduction and spirit power.&lt;br /&gt;
#* Starts at +{{#var:cast_sp_min}} [[Spirit Power]] and +{{#var:cast_cdr_min}}% Cooldown Reduction&lt;br /&gt;
#* Ends at +{{#var:cast_sp_max}} Spirit Power and +{{#var:cast_cdr_max}}% Cooldown Reduction&lt;br /&gt;
#* Duration: {{#var:pw_dur}}s&lt;br /&gt;
# &#039;&#039;&#039;Gun Buff:&#039;&#039;&#039; Grants temporary magazine size and fire rate.&lt;br /&gt;
#* Starts at +{{#var:gun_fr_min}}% [[Fire Rate]] and +{{#var:gun_ammo_min}}% [[Ammo]]&lt;br /&gt;
#* Ends at +{{#var:gun_fr_max}}% Fire Rate and +{{#var:gun_ammo_max}}% Ammo&lt;br /&gt;
#* Duration: {{#var:pw_dur}}s&lt;br /&gt;
# &#039;&#039;&#039;Movement Buff:&#039;&#039;&#039; Grants temporary extra stamina and sprint speed.&lt;br /&gt;
#* Starts at +{{#var:mov_stam_min}} [[Stamina]], +{{#var:mov_sprint_min}}m/s [[Sprint Speed]], +{{#var:mov_regen_min}}% Stamina Regeneration Rate, and +{{#var:mov_zip_min}}% Zipline Boost&lt;br /&gt;
#* Ends at +{{#var:mov_stam_max}} Stamina, +{{#var:mov_sprint_max}}m/s Sprint Speed, +{{#var:mov_regen_max}}% Stamina Regeneration Rate, and +{{#var:mov_zip_max}}% Zipline Boost&lt;br /&gt;
#* Duration: {{#var:pw_dur}}s&lt;br /&gt;
# &#039;&#039;&#039;Survival Buff:&#039;&#039;&#039; Grants temporary health and health regen.&lt;br /&gt;
#* Starts at +{{#var:surv_hp_min}} [[Health|Bonus Health]] and +{{#var:surv_regen_min}} [[Health Regen]]&lt;br /&gt;
#* Ends at +{{#var:surv_hp_max}} Bonus Health and +{{#var:surv_regen_max}} Health Regen&lt;br /&gt;
#* Duration: {{#var:pw_dur}}s&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
{{Navbox gameplay}}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/File:Deadlock_ranked_board.jpg?diff=104798</id>
		<title>File:Deadlock ranked board.jpg</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/File:Deadlock_ranked_board.jpg?diff=104798"/>
		<updated>2026-08-02T05:00:49Z</updated>

		<summary type="html">&lt;p&gt;Toad64: The Ranked board as seen inside The Hideout.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
The Ranked board as seen inside The Hideout.&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=88698</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=88698"/>
		<updated>2026-07-04T23:15:08Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript, It is possible to modify the default audio element used to play audio. This code replaces the standard webkit media player with a stylized version. (Currently for chromium browsers only)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        const $this = $(this);&lt;br /&gt;
        const src = $this.attr(&#039;src&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Log what we found to the console so we can see why it&#039;s undefined&lt;br /&gt;
        console.log(&amp;quot;Processing element:&amp;quot;, this);&lt;br /&gt;
        console.log(&amp;quot;Source found:&amp;quot;, src);&lt;br /&gt;
&lt;br /&gt;
        if (src) {&lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            $this.replaceWith(myPlayer);&lt;br /&gt;
        } else {&lt;br /&gt;
            console.warn(&amp;quot;Skipping element because src is undefined:&amp;quot;, this);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            align-items: center;&lt;br /&gt;
    		justify-content: center;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn:hover {&lt;br /&gt;
        	background: var(--background-color-interactive-subtle);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the Old Deadlock Title Screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88697</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88697"/>
		<updated>2026-07-04T23:12:30Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        const $this = $(this);&lt;br /&gt;
        const src = $this.attr(&#039;src&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Log what we found to the console so we can see why it&#039;s undefined&lt;br /&gt;
        console.log(&amp;quot;Processing element:&amp;quot;, this);&lt;br /&gt;
        console.log(&amp;quot;Source found:&amp;quot;, src);&lt;br /&gt;
&lt;br /&gt;
        if (src) {&lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            $this.replaceWith(myPlayer);&lt;br /&gt;
        } else {&lt;br /&gt;
            console.warn(&amp;quot;Skipping element because src is undefined:&amp;quot;, this);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            align-items: center;&lt;br /&gt;
    		justify-content: center;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn:hover {&lt;br /&gt;
        	background: var(--background-color-interactive-subtle);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88696</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88696"/>
		<updated>2026-07-04T23:11:40Z</updated>

		<summary type="html">&lt;p&gt;Toad64: small edit to center the text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        const $this = $(this);&lt;br /&gt;
        const src = $this.attr(&#039;src&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Log what we found to the console so we can see why it&#039;s undefined&lt;br /&gt;
        console.log(&amp;quot;Processing element:&amp;quot;, this);&lt;br /&gt;
        console.log(&amp;quot;Source found:&amp;quot;, src);&lt;br /&gt;
&lt;br /&gt;
        if (src) {&lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            $this.replaceWith(myPlayer);&lt;br /&gt;
        } else {&lt;br /&gt;
            console.warn(&amp;quot;Skipping element because src is undefined:&amp;quot;, this);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn:hover {&lt;br /&gt;
        	background: var(--background-color-interactive-subtle);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
		i.fa-solid {&lt;br /&gt;
    		align-items: center;&lt;br /&gt;
    		justify-content: center;&lt;br /&gt;
		}&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88695</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88695"/>
		<updated>2026-07-04T23:07:46Z</updated>

		<summary type="html">&lt;p&gt;Toad64: hover interaction to the button&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        const $this = $(this);&lt;br /&gt;
        const src = $this.attr(&#039;src&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Log what we found to the console so we can see why it&#039;s undefined&lt;br /&gt;
        console.log(&amp;quot;Processing element:&amp;quot;, this);&lt;br /&gt;
        console.log(&amp;quot;Source found:&amp;quot;, src);&lt;br /&gt;
&lt;br /&gt;
        if (src) {&lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            $this.replaceWith(myPlayer);&lt;br /&gt;
        } else {&lt;br /&gt;
            console.warn(&amp;quot;Skipping element because src is undefined:&amp;quot;, this);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn:hover {&lt;br /&gt;
        	background: var(--background-color-interactive-subtle);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=88667</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=88667"/>
		<updated>2026-07-04T17:08:22Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript, It is possible to modify the default audio element used to play audio. This code replaces the standard webkit media player with a stylized version. (Currently for chromium browsers only)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        const $this = $(this);&lt;br /&gt;
        const src = $this.attr(&#039;src&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Log what we found to the console so we can see why it&#039;s undefined&lt;br /&gt;
        console.log(&amp;quot;Processing element:&amp;quot;, this);&lt;br /&gt;
        console.log(&amp;quot;Source found:&amp;quot;, src);&lt;br /&gt;
&lt;br /&gt;
        if (src) {&lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            $this.replaceWith(myPlayer);&lt;br /&gt;
        } else {&lt;br /&gt;
            console.warn(&amp;quot;Skipping element because src is undefined:&amp;quot;, this);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the Old Deadlock Title Screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88664</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88664"/>
		<updated>2026-07-04T17:04:57Z</updated>

		<summary type="html">&lt;p&gt;Toad64: updated element swap code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        const $this = $(this);&lt;br /&gt;
        const src = $this.attr(&#039;src&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Log what we found to the console so we can see why it&#039;s undefined&lt;br /&gt;
        console.log(&amp;quot;Processing element:&amp;quot;, this);&lt;br /&gt;
        console.log(&amp;quot;Source found:&amp;quot;, src);&lt;br /&gt;
&lt;br /&gt;
        if (src) {&lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            $this.replaceWith(myPlayer);&lt;br /&gt;
        } else {&lt;br /&gt;
            console.warn(&amp;quot;Skipping element because src is undefined:&amp;quot;, this);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=88663</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=88663"/>
		<updated>2026-07-04T17:01:00Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript, It is possible to modify the default audio element used to play audio. This code replaces the standard webkit media player with a stylized version. (Currently for chromium browsers only)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the Old Deadlock Title Screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88662</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88662"/>
		<updated>2026-07-04T16:58:33Z</updated>

		<summary type="html">&lt;p&gt;Toad64: made code more legible&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            &lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
			padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .playBtn {&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          &lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            &lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
        	flex: 1;&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
            appearance: none;&lt;br /&gt;
            &lt;br /&gt;
            height: 6px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            &lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
    		-webkit-appearance: none;&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { &lt;br /&gt;
        	font-size: 12px; &lt;br /&gt;
        	opacity: 0.8; &lt;br /&gt;
        	white-space: nowrap; &lt;br /&gt;
          }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88654</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88654"/>
		<updated>2026-07-04T16:45:24Z</updated>

		<summary type="html">&lt;p&gt;Toad64: gemini patch worked, making code more legible next&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            min-width: 0;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88653</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88653"/>
		<updated>2026-07-04T16:43:56Z</updated>

		<summary type="html">&lt;p&gt;Toad64: gemini pointed out issue with overflow, testing fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            min-width: 0;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
            /* gemini test fix */&lt;br /&gt;
            box-sizing: border-box; &lt;br /&gt;
			overflow: hidden;&lt;br /&gt;
    		margin: 0 auto;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=88649</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=88649"/>
		<updated>2026-07-04T16:29:44Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            min-width: 0;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87979</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87979"/>
		<updated>2026-07-04T03:41:11Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87978</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87978"/>
		<updated>2026-07-04T03:38:03Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript, It is possible to modify the default audio element used to play audio. This code replaces the standard webkit media player with a stylized version. (Currently for chromium browsers only)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-subtle);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the Old Deadlock Title Screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87977</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87977"/>
		<updated>2026-07-04T03:34:02Z</updated>

		<summary type="html">&lt;p&gt;Toad64: updated info about code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript, It is possible to modify the default audio element used to play audio. This code replaces the standard webkit media player with a stylized version. (Currently for chromium browsers only)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example, the Old Deadlock Title Screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87976</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87976"/>
		<updated>2026-07-04T03:19:56Z</updated>

		<summary type="html">&lt;p&gt;Toad64: updated code in syntaxhighlight&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript (and a set of ::root colors i had), It is possible to modify the default audio element used to play audio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code creates a styleized media player (in this example the Old Deadlock Title Screen):&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87975</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87975"/>
		<updated>2026-07-04T03:18:34Z</updated>

		<summary type="html">&lt;p&gt;Toad64: missed closing tags. fixed.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87974</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87974"/>
		<updated>2026-07-04T03:16:59Z</updated>

		<summary type="html">&lt;p&gt;Toad64: attempt to use Font Awsome.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
    	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87973</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87973"/>
		<updated>2026-07-04T03:13:56Z</updated>

		<summary type="html">&lt;p&gt;Toad64: added missing css code for slider&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          .seek::-webkit-slider-thumb {&lt;br /&gt;
        	-webkit-appearance: none; /* Override default look */&lt;br /&gt;
        	appearance: none;&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
    	  }&lt;br /&gt;
    	  &lt;br /&gt;
    	  .seek::-moz-range-thumb {&lt;br /&gt;
        	border-radius: 50px;&lt;br /&gt;
        	width: 15px;&lt;br /&gt;
        	height: 15px;&lt;br /&gt;
        	background: var(--link-color);&lt;br /&gt;
        	cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87972</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87972"/>
		<updated>2026-07-04T03:07:26Z</updated>

		<summary type="html">&lt;p&gt;Toad64: third pass, replaced all white with &amp;#039;--color-base&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87971</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87971"/>
		<updated>2026-07-04T03:05:03Z</updated>

		<summary type="html">&lt;p&gt;Toad64: second pass of css code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base-border);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: var(--color-base);&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-interactive);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: var(--color-base);&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87970</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87970"/>
		<updated>2026-07-04T03:01:16Z</updated>

		<summary type="html">&lt;p&gt;Toad64: initial change to css to user wikis ::root&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--background-color-base);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--background-color-neutral);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87969</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87969"/>
		<updated>2026-07-04T02:44:54Z</updated>

		<summary type="html">&lt;p&gt;Toad64: commented out personal ::root for media player element&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* audioplayer css code from website /&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
  --border-color: #595959;&lt;br /&gt;
  --box-color: #353535;&lt;br /&gt;
  --color-black: #000;&lt;br /&gt;
  --color-white: #fff;&lt;br /&gt;
  --navbar-color: #484848;&lt;br /&gt;
  --purple-active: #a606c6;&lt;br /&gt;
  --purple-hover: #6e0583;&lt;br /&gt;
  --cyan-color: #2bbe9f;&lt;br /&gt;
  --cyan-hover: #127e66;&lt;br /&gt;
  --cyan-active: #00ffc8;&lt;br /&gt;
  --green-color: #0aac48;&lt;br /&gt;
  --green-hover: #0ceb61;&lt;br /&gt;
  --green-active: #0ad658;&lt;br /&gt;
} */&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87967</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87967"/>
		<updated>2026-07-04T02:34:30Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript (and a set of ::root colors i had), It is possible to modify the default audio element used to play audio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--box-color, #222);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--green-color, #4caf50);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code creates a styleized media player (in this example the Old Deadlock Title Screen):&lt;br /&gt;
[[File:Music menu lp.mp3]]&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:Gameplay_Navbox?diff=87960</id>
		<title>Template:Gameplay Navbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:Gameplay_Navbox?diff=87960"/>
		<updated>2026-07-03T22:45:08Z</updated>

		<summary type="html">&lt;p&gt;Toad64: added Unstable Rift to navbox.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Navbox/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
{{Navbox&lt;br /&gt;
|name       = Gameplay Navbox&lt;br /&gt;
|title      = &amp;lt;div class=&amp;quot;navbox_title&amp;quot;&amp;gt;Gameplay&amp;lt;/div&amp;gt;&lt;br /&gt;
|state      = &lt;br /&gt;
|titlestyle = border-radius: 8px;&lt;br /&gt;
|groupstyle = border-bottom-left-radius: 8px; border-top-left-radius: 8px; padding: 5px; text-align: center;&lt;br /&gt;
|abovestyle = background:#bdad9f;&lt;br /&gt;
|aboveclass = hlist&lt;br /&gt;
|above = &lt;br /&gt;
|group1     = &amp;lt;div class=&amp;quot;navbox_group&amp;quot;&amp;gt;General&lt;br /&gt;
|list1      = [[Abilities]] &amp;amp;bull; [[Glossary]] &amp;amp;bull; [[Heroes]] &amp;amp;bull; [[Items]] &amp;amp;bull; [[Map]] &amp;amp;bull; [[Skill Rating]] &amp;amp;bull; [[Stats]] &amp;amp;bull; [[Strategy]]&lt;br /&gt;
|group2     = &amp;lt;div class=&amp;quot;navbox_group&amp;quot;&amp;gt;Map features&lt;br /&gt;
|list2      = [[Cosmic Veil]] &amp;amp;bull; [[Crate]] &amp;amp;bull; [[The Curiosity Shop]] &amp;amp;bull; [[Golden Statue]] &amp;amp;bull; [[Jump pad]] &amp;amp;bull; [[Mid-Boss]] &amp;amp;bull; [[Neutrals]] &amp;amp;bull; [[Powerup]] &amp;amp;bull; [[Rejuvenator]] &amp;amp;bull; [[Ropes]] &amp;amp;bull; [[Sinner&#039;s Sacrifice]] &amp;amp;bull; [[Soul Urn]] &amp;amp;bull; [[Structures]] &amp;amp;bull; [[Teleporter]] &amp;amp;bull; [[Unstable Rift]] &amp;amp;bull; [[Vent]] &amp;amp;bull; [[Ziplines]]&lt;br /&gt;
|group3     = [[Mechanics|&amp;lt;div class=&amp;quot;navbox_group&amp;quot;&amp;gt;Mechanics&amp;lt;/div&amp;gt;]]&lt;br /&gt;
|list3      = [[Backdoor Protection]] &amp;amp;bull; [[Boon]] &amp;amp;bull; [[Cheater Frog]] &amp;amp;bull; [[Crowd Control]] &amp;amp;bull; [[Death]] &amp;amp;bull; [[Extra Slots]] &amp;amp;bull; [[Health]] &amp;amp;bull; [[Melee Attack]] &amp;amp;bull; [[Minimap]] &amp;amp;bull; [[Movement]] &amp;amp;bull; [[Souls]] &amp;amp;bull; [[Stack]] &amp;amp;bull; [[Status Effects]]&lt;br /&gt;
|group4     = &amp;lt;div class=&amp;quot;navbox_group&amp;quot;&amp;gt;Game Modes&lt;br /&gt;
|list4      = [[Bot Match]] &amp;amp;bull; [[Hideout]] &amp;amp;bull; [[Street Brawl]]&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;[[Category:Gameplay]]&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87401</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87401"/>
		<updated>2026-06-30T21:45:11Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--box-color, #222);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--green-color, #4caf50);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87400</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87400"/>
		<updated>2026-06-30T21:43:21Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// 1. Target the specific container if possible (e.g., table with audio)&lt;br /&gt;
const targetContainer = document.querySelector(&#039;.wikitable&#039;) || document.body;&lt;br /&gt;
&lt;br /&gt;
let timeout;&lt;br /&gt;
const observer = new MutationObserver(() =&amp;gt; {&lt;br /&gt;
    // Clear previous pending execution (Debounce)&lt;br /&gt;
    clearTimeout(timeout);&lt;br /&gt;
    timeout = setTimeout(() =&amp;gt; {&lt;br /&gt;
        const nativePlayers = document.querySelectorAll(&#039;audio:not([data-replaced])&#039;);&lt;br /&gt;
        nativePlayers.forEach(audio =&amp;gt; {&lt;br /&gt;
            audio.setAttribute(&#039;data-replaced&#039;, &#039;true&#039;);&lt;br /&gt;
            audio.style.display = &#039;none&#039;;&lt;br /&gt;
            &lt;br /&gt;
            const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
            const src = audio.querySelector(&#039;source&#039;)?.src || audio.src;&lt;br /&gt;
            myPlayer.setAttribute(&#039;track&#039;, src);&lt;br /&gt;
            &lt;br /&gt;
            audio.parentElement.insertBefore(myPlayer, audio);&lt;br /&gt;
        });&lt;br /&gt;
    }, 200); // Wait 200ms after last change before running&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
observer.observe(targetContainer, { childList: true, subtree: true });&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--box-color, #222);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--green-color, #4caf50);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87399</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87399"/>
		<updated>2026-06-30T21:41:13Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// Add this to your Common.js&lt;br /&gt;
const observer = new MutationObserver((mutations) =&amp;gt; {&lt;br /&gt;
    // Look for native audio players created by the template&lt;br /&gt;
    const nativePlayers = document.querySelectorAll(&#039;audio:not([data-replaced])&#039;);&lt;br /&gt;
    &lt;br /&gt;
    nativePlayers.forEach(audio =&amp;gt; {&lt;br /&gt;
        // Mark as processed so we don&#039;t loop infinitely&lt;br /&gt;
        audio.setAttribute(&#039;data-replaced&#039;, &#039;true&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, audio.querySelector(&#039;source&#039;) ? audio.querySelector(&#039;source&#039;).src : audio.src);&lt;br /&gt;
        &lt;br /&gt;
        // Replace&lt;br /&gt;
        audio.parentElement.replaceChild(myPlayer, audio);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Watch the entire document body for new elements appearing&lt;br /&gt;
observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--box-color, #222);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--green-color, #4caf50);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87398</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87398"/>
		<updated>2026-06-30T21:35:32Z</updated>

		<summary type="html">&lt;p&gt;Toad64: updated codeblock&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Using Javascript (and a set of ::root colors i had), It is possible to modify the default audio element used to play audio.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;my-custom-player-wrapper&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--box-color, #222);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--green-color, #4caf50);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code creates a styleized media player (in this example the Curiosity Shop Music):&lt;br /&gt;
 [[File:Curio music.mp3]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87397</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87397"/>
		<updated>2026-06-30T21:32:06Z</updated>

		<summary type="html">&lt;p&gt;Toad64: stripped unnecessary elements from player&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled and modified from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
  class AudioPlayer extends HTMLElement {&lt;br /&gt;
    connectedCallback() {&lt;br /&gt;
      const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
      const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
      const mime = ext === &amp;quot;wav&amp;quot; ? &amp;quot;audio/wav&amp;quot; : &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      this.innerHTML = `&lt;br /&gt;
        &amp;lt;style&amp;gt;&lt;br /&gt;
          .player-controls {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            gap: 12px;&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            max-width: 400px;&lt;br /&gt;
            background: var(--box-color, #222);&lt;br /&gt;
            padding: 10px 15px;&lt;br /&gt;
            border-radius: 50px;&lt;br /&gt;
            color: white;&lt;br /&gt;
            font-family: sans-serif;&lt;br /&gt;
          }&lt;br /&gt;
          .playBtn {&lt;br /&gt;
            width: 30px;&lt;br /&gt;
            height: 30px;&lt;br /&gt;
            background: var(--green-color, #4caf50);&lt;br /&gt;
            border: none;&lt;br /&gt;
            color: white;&lt;br /&gt;
            border-radius: 50%;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            flex-shrink: 0;&lt;br /&gt;
          }&lt;br /&gt;
          .seek {&lt;br /&gt;
            -webkit-appearance: none;&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            height: 6px;&lt;br /&gt;
            background: #7e7e7e;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
          }&lt;br /&gt;
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }&lt;br /&gt;
        &amp;lt;/style&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;player-controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&amp;lt;/audio&amp;gt;&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;▶&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;input class=&amp;quot;seek&amp;quot; type=&amp;quot;range&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      `;&lt;br /&gt;
&lt;br /&gt;
      const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
      const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
      const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
      const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (audio.paused) { audio.play(); playBtn.textContent = &#039;⏸&#039;; }&lt;br /&gt;
        else { audio.pause(); playBtn.textContent = &#039;▶&#039;; }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
        time.textContent = formatTime(audio.currentTime) + &amp;quot; / &amp;quot; + formatTime(audio.duration);&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        audio.currentTime = (seek.value / 100) * audio.duration;&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      function formatTime(sec) {&lt;br /&gt;
        if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
        const m = Math.floor(sec / 60);&lt;br /&gt;
        const s = Math.floor(sec % 60).toString().padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
        return `${m}:${s}`;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87396</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87396"/>
		<updated>2026-06-30T21:26:14Z</updated>

		<summary type="html">&lt;p&gt;Toad64: pasted wrong css from my website, added correct css&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* audioplayer css code from website */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
  --border-color: #595959;&lt;br /&gt;
  --box-color: #353535;&lt;br /&gt;
  --color-black: #000;&lt;br /&gt;
  --color-white: #fff;&lt;br /&gt;
  --navbar-color: #484848;&lt;br /&gt;
  --purple-active: #a606c6;&lt;br /&gt;
  --purple-hover: #6e0583;&lt;br /&gt;
  --cyan-color: #2bbe9f;&lt;br /&gt;
  --cyan-hover: #127e66;&lt;br /&gt;
  --cyan-active: #00ffc8;&lt;br /&gt;
  --green-color: #0aac48;&lt;br /&gt;
  --green-hover: #0ceb61;&lt;br /&gt;
  --green-active: #0ad658;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87395</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87395"/>
		<updated>2026-06-30T21:25:04Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* audioplayer css code from website */&lt;br /&gt;
&lt;br /&gt;
.player {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        max-width: 500px;&lt;br /&gt;
        min-height: 150px;&lt;br /&gt;
        background: var(--box-color);&lt;br /&gt;
        color: white;&lt;br /&gt;
        border-radius: 12px;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        font-family: Arial, sans-serif;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .cover {&lt;br /&gt;
        width: 40%;&lt;br /&gt;
        object-fit: cover;&lt;br /&gt;
        background-color: #333;&lt;br /&gt;
        display: block;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .info {&lt;br /&gt;
        width: 60%;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        justify-content: space-between;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .meta {&lt;br /&gt;
        display: grid;&lt;br /&gt;
        grid-template-columns: 1fr 1fr;&lt;br /&gt;
        gap: 12px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .leftmeta,&lt;br /&gt;
      .rightmeta {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        gap: 4px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      h3 {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 16px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.7;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .credit {&lt;br /&gt;
        font-size: 11px;&lt;br /&gt;
        opacity: 0.6;&lt;br /&gt;
        line-height: 1.4;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .controls {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn {&lt;br /&gt;
        width: 24px;&lt;br /&gt;
        height: 24px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        border: none;&lt;br /&gt;
        color: white;&lt;br /&gt;
        padding: 3px 8px;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
        &lt;br /&gt;
        flex-shrink: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:hover {&lt;br /&gt;
        background: var(--green-hover);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:active {&lt;br /&gt;
        background: var(--green-active);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek {&lt;br /&gt;
        -webkit-appearance: none;&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        flex: 1;&lt;br /&gt;
        background-color: #7e7e7e;&lt;br /&gt;
        height: 7px;&lt;br /&gt;
        min-width: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-webkit-slider-thumb {&lt;br /&gt;
        -webkit-appearance: none; /* Override default look */&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-moz-range-thumb {&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .time {&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.8;&lt;br /&gt;
        white-space: nowrap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      @media (max-width: 800px) {&lt;br /&gt;
&lt;br /&gt;
        .player {&lt;br /&gt;
          flex-direction: column;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .cover {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
          height: 180px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .info {&lt;br /&gt;
          width: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .meta {&lt;br /&gt;
          grid-template-columns: 1fr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .controls {&lt;br /&gt;
          flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .time {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87394</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87394"/>
		<updated>2026-06-30T21:22:12Z</updated>

		<summary type="html">&lt;p&gt;Toad64: IT WORKS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;my-custom-player-wrapper&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled  from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
class AudioPlayer extends HTMLElement {&lt;br /&gt;
&lt;br /&gt;
  connectedCallback() {&lt;br /&gt;
&lt;br /&gt;
    const song = this.getAttribute(&amp;quot;song&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const artist = this.getAttribute(&amp;quot;artist&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const cover = this.getAttribute(&amp;quot;artcover&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalArtist =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalartist&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalSource =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalsource&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    let mime = &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (ext === &amp;quot;wav&amp;quot;) {&lt;br /&gt;
      mime = &amp;quot;audio/wav&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.innerHTML = `&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      .player {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        max-width: 500px;&lt;br /&gt;
        min-height: 150px;&lt;br /&gt;
        background: var(--box-color);&lt;br /&gt;
        color: white;&lt;br /&gt;
        border-radius: 12px;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        font-family: Arial, sans-serif;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .cover {&lt;br /&gt;
        width: 40%;&lt;br /&gt;
        object-fit: cover;&lt;br /&gt;
        background-color: #333;&lt;br /&gt;
        display: block;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .info {&lt;br /&gt;
        width: 60%;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        justify-content: space-between;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .meta {&lt;br /&gt;
        display: grid;&lt;br /&gt;
        grid-template-columns: 1fr 1fr;&lt;br /&gt;
        gap: 12px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .leftmeta,&lt;br /&gt;
      .rightmeta {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        gap: 4px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      h3 {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 16px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.7;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .credit {&lt;br /&gt;
        font-size: 11px;&lt;br /&gt;
        opacity: 0.6;&lt;br /&gt;
        line-height: 1.4;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .controls {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn {&lt;br /&gt;
        width: 24px;&lt;br /&gt;
        height: 24px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        border: none;&lt;br /&gt;
        color: white;&lt;br /&gt;
        padding: 3px 8px;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
        &lt;br /&gt;
        flex-shrink: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:hover {&lt;br /&gt;
        background: var(--green-hover);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:active {&lt;br /&gt;
        background: var(--green-active);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek {&lt;br /&gt;
        -webkit-appearance: none;&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        flex: 1;&lt;br /&gt;
        background-color: #7e7e7e;&lt;br /&gt;
        height: 7px;&lt;br /&gt;
        min-width: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-webkit-slider-thumb {&lt;br /&gt;
        -webkit-appearance: none; /* Override default look */&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-moz-range-thumb {&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .time {&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.8;&lt;br /&gt;
        white-space: nowrap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      @media (max-width: 800px) {&lt;br /&gt;
&lt;br /&gt;
        .player {&lt;br /&gt;
          flex-direction: column;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .cover {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
          height: 180px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .info {&lt;br /&gt;
          width: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .meta {&lt;br /&gt;
          grid-template-columns: 1fr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .controls {&lt;br /&gt;
          flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .time {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;player&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;img class=&amp;quot;cover&amp;quot; src=&amp;quot;${cover}&amp;quot; alt=&amp;quot;${song} cover art&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div class=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;leftmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;h3&amp;gt;${song}&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;${artist}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;rightmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Artist: ${originalArtist}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Source: ${originalSource}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;input&lt;br /&gt;
            class=&amp;quot;seek&amp;quot;&lt;br /&gt;
            type=&amp;quot;range&amp;quot;&lt;br /&gt;
            value=&amp;quot;0&amp;quot;&lt;br /&gt;
            min=&amp;quot;0&amp;quot;&lt;br /&gt;
            max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    // component-local elements&lt;br /&gt;
    const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
    const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
    const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
    const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // play / pause&lt;br /&gt;
    playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      if (audio.paused) {&lt;br /&gt;
&lt;br /&gt;
        audio.play();&lt;br /&gt;
        playBtn.innerHTML = &#039;⏸&#039;;&lt;br /&gt;
&lt;br /&gt;
      } else {&lt;br /&gt;
&lt;br /&gt;
        audio.pause();&lt;br /&gt;
        playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // update seek bar + time&lt;br /&gt;
    audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      seek.value =&lt;br /&gt;
        (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
&lt;br /&gt;
      time.textContent =&lt;br /&gt;
        formatTime(audio.currentTime)&lt;br /&gt;
        + &amp;quot; / &amp;quot; +&lt;br /&gt;
        formatTime(audio.duration);&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // seeking&lt;br /&gt;
    seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      audio.currentTime =&lt;br /&gt;
        (seek.value / 100) * audio.duration;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // reset button when song ends&lt;br /&gt;
    audio.addEventListener(&amp;quot;ended&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // format time helper&lt;br /&gt;
    function formatTime(sec) {&lt;br /&gt;
&lt;br /&gt;
      if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      const m = Math.floor(sec / 60);&lt;br /&gt;
&lt;br /&gt;
      const s = Math.floor(sec % 60)&lt;br /&gt;
        .toString()&lt;br /&gt;
        .padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      return `${m}:${s}`;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This code creates this (visually bugged but code is functional):&lt;br /&gt;
 [[File:Curio music.mp3]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87393</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87393"/>
		<updated>2026-06-30T21:18:28Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled  from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
class AudioPlayer extends HTMLElement {&lt;br /&gt;
&lt;br /&gt;
  connectedCallback() {&lt;br /&gt;
&lt;br /&gt;
    const song = this.getAttribute(&amp;quot;song&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const artist = this.getAttribute(&amp;quot;artist&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const cover = this.getAttribute(&amp;quot;artcover&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalArtist =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalartist&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalSource =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalsource&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    let mime = &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (ext === &amp;quot;wav&amp;quot;) {&lt;br /&gt;
      mime = &amp;quot;audio/wav&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.innerHTML = `&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      .player {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        max-width: 500px;&lt;br /&gt;
        min-height: 150px;&lt;br /&gt;
        background: var(--box-color);&lt;br /&gt;
        color: white;&lt;br /&gt;
        border-radius: 12px;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        font-family: Arial, sans-serif;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .cover {&lt;br /&gt;
        width: 40%;&lt;br /&gt;
        object-fit: cover;&lt;br /&gt;
        background-color: #333;&lt;br /&gt;
        display: block;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .info {&lt;br /&gt;
        width: 60%;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        justify-content: space-between;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .meta {&lt;br /&gt;
        display: grid;&lt;br /&gt;
        grid-template-columns: 1fr 1fr;&lt;br /&gt;
        gap: 12px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .leftmeta,&lt;br /&gt;
      .rightmeta {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        gap: 4px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      h3 {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 16px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.7;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .credit {&lt;br /&gt;
        font-size: 11px;&lt;br /&gt;
        opacity: 0.6;&lt;br /&gt;
        line-height: 1.4;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .controls {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn {&lt;br /&gt;
        width: 24px;&lt;br /&gt;
        height: 24px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        border: none;&lt;br /&gt;
        color: white;&lt;br /&gt;
        padding: 3px 8px;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
        &lt;br /&gt;
        flex-shrink: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:hover {&lt;br /&gt;
        background: var(--green-hover);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:active {&lt;br /&gt;
        background: var(--green-active);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek {&lt;br /&gt;
        -webkit-appearance: none;&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        flex: 1;&lt;br /&gt;
        background-color: #7e7e7e;&lt;br /&gt;
        height: 7px;&lt;br /&gt;
        min-width: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-webkit-slider-thumb {&lt;br /&gt;
        -webkit-appearance: none; /* Override default look */&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-moz-range-thumb {&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .time {&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.8;&lt;br /&gt;
        white-space: nowrap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      @media (max-width: 800px) {&lt;br /&gt;
&lt;br /&gt;
        .player {&lt;br /&gt;
          flex-direction: column;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .cover {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
          height: 180px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .info {&lt;br /&gt;
          width: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .meta {&lt;br /&gt;
          grid-template-columns: 1fr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .controls {&lt;br /&gt;
          flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .time {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;player&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;img class=&amp;quot;cover&amp;quot; src=&amp;quot;${cover}&amp;quot; alt=&amp;quot;${song} cover art&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div class=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;leftmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;h3&amp;gt;${song}&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;${artist}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;rightmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Artist: ${originalArtist}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Source: ${originalSource}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;input&lt;br /&gt;
            class=&amp;quot;seek&amp;quot;&lt;br /&gt;
            type=&amp;quot;range&amp;quot;&lt;br /&gt;
            value=&amp;quot;0&amp;quot;&lt;br /&gt;
            min=&amp;quot;0&amp;quot;&lt;br /&gt;
            max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    // component-local elements&lt;br /&gt;
    const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
    const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
    const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
    const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // play / pause&lt;br /&gt;
    playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      if (audio.paused) {&lt;br /&gt;
&lt;br /&gt;
        audio.play();&lt;br /&gt;
        playBtn.innerHTML = &#039;⏸&#039;;&lt;br /&gt;
&lt;br /&gt;
      } else {&lt;br /&gt;
&lt;br /&gt;
        audio.pause();&lt;br /&gt;
        playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // update seek bar + time&lt;br /&gt;
    audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      seek.value =&lt;br /&gt;
        (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
&lt;br /&gt;
      time.textContent =&lt;br /&gt;
        formatTime(audio.currentTime)&lt;br /&gt;
        + &amp;quot; / &amp;quot; +&lt;br /&gt;
        formatTime(audio.duration);&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // seeking&lt;br /&gt;
    seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      audio.currentTime =&lt;br /&gt;
        (seek.value / 100) * audio.duration;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // reset button when song ends&lt;br /&gt;
    audio.addEventListener(&amp;quot;ended&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // format time helper&lt;br /&gt;
    function formatTime(sec) {&lt;br /&gt;
&lt;br /&gt;
      if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      const m = Math.floor(sec / 60);&lt;br /&gt;
&lt;br /&gt;
      const s = Math.floor(sec % 60)&lt;br /&gt;
        .toString()&lt;br /&gt;
        .padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      return `${m}:${s}`;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87392</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87392"/>
		<updated>2026-06-30T21:17:45Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled  from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
class AudioPlayer extends HTMLElement {&lt;br /&gt;
&lt;br /&gt;
  connectedCallback() {&lt;br /&gt;
&lt;br /&gt;
    const song = this.getAttribute(&amp;quot;song&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const artist = this.getAttribute(&amp;quot;artist&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const src = this.getAttribute(&amp;quot;track&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
    const cover = this.getAttribute(&amp;quot;artcover&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalArtist =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalartist&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalSource =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalsource&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    let mime = &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (ext === &amp;quot;wav&amp;quot;) {&lt;br /&gt;
      mime = &amp;quot;audio/wav&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.innerHTML = `&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      .player {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        max-width: 500px;&lt;br /&gt;
        min-height: 150px;&lt;br /&gt;
        background: var(--box-color);&lt;br /&gt;
        color: white;&lt;br /&gt;
        border-radius: 12px;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        font-family: Arial, sans-serif;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .cover {&lt;br /&gt;
        width: 40%;&lt;br /&gt;
        object-fit: cover;&lt;br /&gt;
        background-color: #333;&lt;br /&gt;
        display: block;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .info {&lt;br /&gt;
        width: 60%;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        justify-content: space-between;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .meta {&lt;br /&gt;
        display: grid;&lt;br /&gt;
        grid-template-columns: 1fr 1fr;&lt;br /&gt;
        gap: 12px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .leftmeta,&lt;br /&gt;
      .rightmeta {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        gap: 4px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      h3 {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 16px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.7;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .credit {&lt;br /&gt;
        font-size: 11px;&lt;br /&gt;
        opacity: 0.6;&lt;br /&gt;
        line-height: 1.4;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .controls {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn {&lt;br /&gt;
        width: 24px;&lt;br /&gt;
        height: 24px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        border: none;&lt;br /&gt;
        color: white;&lt;br /&gt;
        padding: 3px 8px;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
        &lt;br /&gt;
        flex-shrink: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:hover {&lt;br /&gt;
        background: var(--green-hover);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:active {&lt;br /&gt;
        background: var(--green-active);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek {&lt;br /&gt;
        -webkit-appearance: none;&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        flex: 1;&lt;br /&gt;
        background-color: #7e7e7e;&lt;br /&gt;
        height: 7px;&lt;br /&gt;
        min-width: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-webkit-slider-thumb {&lt;br /&gt;
        -webkit-appearance: none; /* Override default look */&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-moz-range-thumb {&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .time {&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.8;&lt;br /&gt;
        white-space: nowrap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      @media (max-width: 800px) {&lt;br /&gt;
&lt;br /&gt;
        .player {&lt;br /&gt;
          flex-direction: column;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .cover {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
          height: 180px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .info {&lt;br /&gt;
          width: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .meta {&lt;br /&gt;
          grid-template-columns: 1fr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .controls {&lt;br /&gt;
          flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .time {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;player&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;img class=&amp;quot;cover&amp;quot; src=&amp;quot;${cover}&amp;quot; alt=&amp;quot;${song} cover art&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div class=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;leftmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;h3&amp;gt;${song}&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;${artist}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;rightmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Artist: ${originalArtist}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Source: ${originalSource}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;input&lt;br /&gt;
            class=&amp;quot;seek&amp;quot;&lt;br /&gt;
            type=&amp;quot;range&amp;quot;&lt;br /&gt;
            value=&amp;quot;0&amp;quot;&lt;br /&gt;
            min=&amp;quot;0&amp;quot;&lt;br /&gt;
            max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    // component-local elements&lt;br /&gt;
    const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
    const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
    const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
    const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // play / pause&lt;br /&gt;
    playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      if (audio.paused) {&lt;br /&gt;
&lt;br /&gt;
        audio.play();&lt;br /&gt;
        playBtn.innerHTML = &#039;⏸&#039;;&lt;br /&gt;
&lt;br /&gt;
      } else {&lt;br /&gt;
&lt;br /&gt;
        audio.pause();&lt;br /&gt;
        playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // update seek bar + time&lt;br /&gt;
    audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      seek.value =&lt;br /&gt;
        (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
&lt;br /&gt;
      time.textContent =&lt;br /&gt;
        formatTime(audio.currentTime)&lt;br /&gt;
        + &amp;quot; / &amp;quot; +&lt;br /&gt;
        formatTime(audio.duration);&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // seeking&lt;br /&gt;
    seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      audio.currentTime =&lt;br /&gt;
        (seek.value / 100) * audio.duration;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // reset button when song ends&lt;br /&gt;
    audio.addEventListener(&amp;quot;ended&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // format time helper&lt;br /&gt;
    function formatTime(sec) {&lt;br /&gt;
&lt;br /&gt;
      if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      const m = Math.floor(sec / 60);&lt;br /&gt;
&lt;br /&gt;
      const s = Math.floor(sec % 60)&lt;br /&gt;
        .toString()&lt;br /&gt;
        .padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      return `${m}:${s}`;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87390</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87390"/>
		<updated>2026-06-30T21:13:10Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// gemini code &lt;br /&gt;
&lt;br /&gt;
// In your Common.js&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    // Find every native audio player generated by the wiki&lt;br /&gt;
    $(&#039;audio&#039;).each(function() {&lt;br /&gt;
        // Create your custom component&lt;br /&gt;
        const myPlayer = document.createElement(&#039;audio-player&#039;);&lt;br /&gt;
        &lt;br /&gt;
        // Transfer the source&lt;br /&gt;
        myPlayer.setAttribute(&#039;track&#039;, $(this).attr(&#039;src&#039;));&lt;br /&gt;
        &lt;br /&gt;
        // Replace the native player with your custom one&lt;br /&gt;
        $(this).replaceWith(myPlayer);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled  from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
class AudioPlayer extends HTMLElement {&lt;br /&gt;
&lt;br /&gt;
  connectedCallback() {&lt;br /&gt;
&lt;br /&gt;
    const song = this.getAttribute(&amp;quot;song&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
    const artist = this.getAttribute(&amp;quot;artist&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
    const src = this.getAttribute(&amp;quot;track&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
    const cover = this.getAttribute(&amp;quot;artcover&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalArtist =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalartist&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalSource =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalsource&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    let mime = &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (ext === &amp;quot;wav&amp;quot;) {&lt;br /&gt;
      mime = &amp;quot;audio/wav&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.innerHTML = `&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      .player {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        max-width: 500px;&lt;br /&gt;
        min-height: 150px;&lt;br /&gt;
        background: var(--box-color);&lt;br /&gt;
        color: white;&lt;br /&gt;
        border-radius: 12px;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        font-family: Arial, sans-serif;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .cover {&lt;br /&gt;
        width: 40%;&lt;br /&gt;
        object-fit: cover;&lt;br /&gt;
        background-color: #333;&lt;br /&gt;
        display: block;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .info {&lt;br /&gt;
        width: 60%;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        justify-content: space-between;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .meta {&lt;br /&gt;
        display: grid;&lt;br /&gt;
        grid-template-columns: 1fr 1fr;&lt;br /&gt;
        gap: 12px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .leftmeta,&lt;br /&gt;
      .rightmeta {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        gap: 4px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      h3 {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 16px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.7;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .credit {&lt;br /&gt;
        font-size: 11px;&lt;br /&gt;
        opacity: 0.6;&lt;br /&gt;
        line-height: 1.4;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .controls {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn {&lt;br /&gt;
        width: 24px;&lt;br /&gt;
        height: 24px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        border: none;&lt;br /&gt;
        color: white;&lt;br /&gt;
        padding: 3px 8px;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
        &lt;br /&gt;
        flex-shrink: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:hover {&lt;br /&gt;
        background: var(--green-hover);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:active {&lt;br /&gt;
        background: var(--green-active);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek {&lt;br /&gt;
        -webkit-appearance: none;&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        flex: 1;&lt;br /&gt;
        background-color: #7e7e7e;&lt;br /&gt;
        height: 7px;&lt;br /&gt;
        min-width: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-webkit-slider-thumb {&lt;br /&gt;
        -webkit-appearance: none; /* Override default look */&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-moz-range-thumb {&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .time {&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.8;&lt;br /&gt;
        white-space: nowrap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      @media (max-width: 800px) {&lt;br /&gt;
&lt;br /&gt;
        .player {&lt;br /&gt;
          flex-direction: column;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .cover {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
          height: 180px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .info {&lt;br /&gt;
          width: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .meta {&lt;br /&gt;
          grid-template-columns: 1fr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .controls {&lt;br /&gt;
          flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .time {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;player&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;img class=&amp;quot;cover&amp;quot; src=&amp;quot;${cover}&amp;quot; alt=&amp;quot;${song} cover art&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div class=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;leftmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;h3&amp;gt;${song}&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;${artist}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;rightmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Artist: ${originalArtist}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Source: ${originalSource}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;input&lt;br /&gt;
            class=&amp;quot;seek&amp;quot;&lt;br /&gt;
            type=&amp;quot;range&amp;quot;&lt;br /&gt;
            value=&amp;quot;0&amp;quot;&lt;br /&gt;
            min=&amp;quot;0&amp;quot;&lt;br /&gt;
            max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    // component-local elements&lt;br /&gt;
    const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
    const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
    const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
    const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // play / pause&lt;br /&gt;
    playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      if (audio.paused) {&lt;br /&gt;
&lt;br /&gt;
        audio.play();&lt;br /&gt;
        playBtn.innerHTML = &#039;⏸&#039;;&lt;br /&gt;
&lt;br /&gt;
      } else {&lt;br /&gt;
&lt;br /&gt;
        audio.pause();&lt;br /&gt;
        playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // update seek bar + time&lt;br /&gt;
    audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      seek.value =&lt;br /&gt;
        (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
&lt;br /&gt;
      time.textContent =&lt;br /&gt;
        formatTime(audio.currentTime)&lt;br /&gt;
        + &amp;quot; / &amp;quot; +&lt;br /&gt;
        formatTime(audio.duration);&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // seeking&lt;br /&gt;
    seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      audio.currentTime =&lt;br /&gt;
        (seek.value / 100) * audio.duration;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // reset button when song ends&lt;br /&gt;
    audio.addEventListener(&amp;quot;ended&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      playBtn.innerHTML = &#039;▶&#039;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // format time helper&lt;br /&gt;
    function formatTime(sec) {&lt;br /&gt;
&lt;br /&gt;
      if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      const m = Math.floor(sec / 60);&lt;br /&gt;
&lt;br /&gt;
      const s = Math.floor(sec % 60)&lt;br /&gt;
        .toString()&lt;br /&gt;
        .padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      return `${m}:${s}`;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87389</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87389"/>
		<updated>2026-06-30T20:56:54Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;my-custom-player-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
 [[File:Curio music.mp3]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;audio-player &lt;br /&gt;
song=&amp;quot;Curio Shop&amp;quot; &lt;br /&gt;
artist=&amp;quot;Valve Orchestra&amp;quot; originalartist=&amp;quot;N/A&amp;quot; &lt;br /&gt;
originalsource=&amp;quot;N/A&amp;quot; &lt;br /&gt;
track=&amp;quot;https://deadlock.wikiFile:Curio_music.mp3&amp;quot; artcover=&amp;quot;&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87388</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87388"/>
		<updated>2026-06-30T20:55:08Z</updated>

		<summary type="html">&lt;p&gt;Toad64: attempt to use custom tag.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;my-custom-player-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
 [[File:Curio music.mp3]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;audio-player &lt;br /&gt;
song=&amp;quot;Curio Shop&amp;quot; &lt;br /&gt;
artist=&amp;quot;Valve Orchestra&amp;quot; originalartist=&amp;quot;N/A&amp;quot; &lt;br /&gt;
originalsource=&amp;quot;N/A&amp;quot; &lt;br /&gt;
track=&amp;quot;https://deadlock.wikiFile:Curio music.mp3&amp;quot; artcover=&amp;quot;&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.js?diff=87387</id>
		<title>User:Toad64/common.js</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.js?diff=87387"/>
		<updated>2026-06-30T20:52:59Z</updated>

		<summary type="html">&lt;p&gt;Toad64: copied audioplayer.js from my website&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// HeroCards on wiki homepage&lt;br /&gt;
&lt;br /&gt;
document.querySelectorAll(&#039;.HeroCard&#039;).forEach(function(el) {&lt;br /&gt;
  el.style.transition = &#039;none&#039;;&lt;br /&gt;
  el.style.transformStyle = &#039;preserve-3d&#039;;&lt;br /&gt;
  el.style.willChange = &#039;transform&#039;;&lt;br /&gt;
&lt;br /&gt;
  var animFrame;&lt;br /&gt;
  var current = { x: 0, y: 0 };&lt;br /&gt;
  var target = { x: 0, y: 0 };&lt;br /&gt;
  var mouseX = 0, mouseY = 0;&lt;br /&gt;
  var isOver = false;&lt;br /&gt;
  var rect = {};&lt;br /&gt;
  &lt;br /&gt;
  var updateMouse = function(e){&lt;br /&gt;
  	mouseX = e.clientX;&lt;br /&gt;
    mouseY = e.clientY;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var tick = function() {&lt;br /&gt;
    var cx = rect.left + rect.width / 2;&lt;br /&gt;
    var cy = rect.top + rect.height / 2;&lt;br /&gt;
    var dx = (mouseX - cx) / (rect.width / 2);&lt;br /&gt;
    var dy = (mouseY - cy) / (rect.height / 2);&lt;br /&gt;
&lt;br /&gt;
    target.x = dy * -12;&lt;br /&gt;
    target.y = dx * 12;&lt;br /&gt;
&lt;br /&gt;
    current.x += (target.x - current.x) * 0.12;&lt;br /&gt;
    current.y += (target.y - current.y) * 0.12;&lt;br /&gt;
&lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(&#039; + current.x + &#039;deg) rotateY(&#039; + current.y + &#039;deg) scale(&#039; + (isOver ? 1.05 : 1) + &#039;)&#039;;&lt;br /&gt;
&lt;br /&gt;
    animFrame = requestAnimationFrame(tick);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  el.addEventListener(&#039;mouseenter&#039;, function() {&lt;br /&gt;
    rect = el.getBoundingClientRect(); // Measure ONCE&lt;br /&gt;
    document.addEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    animFrame = requestAnimationFrame(tick); // Ignition&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  el.addEventListener(&#039;mouseleave&#039;, function() {&lt;br /&gt;
    document.removeEventListener(&#039;mousemove&#039;, updateMouse);&lt;br /&gt;
    cancelAnimationFrame(animFrame); // Kill the engine&lt;br /&gt;
    &lt;br /&gt;
    el.style.transition = &#039;transform 0.5s ease-out&#039;; &lt;br /&gt;
    el.style.transform = &#039;perspective(400px) rotateX(0deg) rotateY(0deg) scale(1)&#039;;&lt;br /&gt;
    &lt;br /&gt;
    setTimeout(function() { el.style.transition = &#039;none&#039;; }, 500);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// audioplayer.js (pulled  from website)&lt;br /&gt;
if (!customElements.get(&#039;audio-player&#039;)) {&lt;br /&gt;
class AudioPlayer extends HTMLElement {&lt;br /&gt;
&lt;br /&gt;
  connectedCallback() {&lt;br /&gt;
&lt;br /&gt;
    const song = this.getAttribute(&amp;quot;song&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
    const artist = this.getAttribute(&amp;quot;artist&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
    const src = this.getAttribute(&amp;quot;track&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
    const cover = this.getAttribute(&amp;quot;artcover&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalArtist =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalartist&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const originalSource =&lt;br /&gt;
      this.getAttribute(&amp;quot;originalsource&amp;quot;) ?? &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    const ext = src.split(&amp;quot;.&amp;quot;).pop().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
    let mime = &amp;quot;audio/mpeg&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (ext === &amp;quot;wav&amp;quot;) {&lt;br /&gt;
      mime = &amp;quot;audio/wav&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.innerHTML = `&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      .player {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
        max-width: 500px;&lt;br /&gt;
        min-height: 150px;&lt;br /&gt;
        background: var(--box-color);&lt;br /&gt;
        color: white;&lt;br /&gt;
        border-radius: 12px;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        font-family: Arial, sans-serif;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .cover {&lt;br /&gt;
        width: 40%;&lt;br /&gt;
        object-fit: cover;&lt;br /&gt;
        background-color: #333;&lt;br /&gt;
        display: block;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .info {&lt;br /&gt;
        width: 60%;&lt;br /&gt;
        padding: 12px;&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        justify-content: space-between;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .meta {&lt;br /&gt;
        display: grid;&lt;br /&gt;
        grid-template-columns: 1fr 1fr;&lt;br /&gt;
        gap: 12px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .leftmeta,&lt;br /&gt;
      .rightmeta {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        gap: 4px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      h3 {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 16px;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      p {&lt;br /&gt;
        margin: 0;&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.7;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .credit {&lt;br /&gt;
        font-size: 11px;&lt;br /&gt;
        opacity: 0.6;&lt;br /&gt;
        line-height: 1.4;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .controls {&lt;br /&gt;
        display: flex;&lt;br /&gt;
        align-items: center;&lt;br /&gt;
        gap: 10px;&lt;br /&gt;
        width: 100%;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn {&lt;br /&gt;
        width: 24px;&lt;br /&gt;
        height: 24px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        border: none;&lt;br /&gt;
        color: white;&lt;br /&gt;
        padding: 3px 8px;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
        &lt;br /&gt;
        flex-shrink: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:hover {&lt;br /&gt;
        background: var(--green-hover);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .playBtn:active {&lt;br /&gt;
        background: var(--green-active);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek {&lt;br /&gt;
        -webkit-appearance: none;&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        flex: 1;&lt;br /&gt;
        background-color: #7e7e7e;&lt;br /&gt;
        height: 7px;&lt;br /&gt;
        min-width: 0;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-webkit-slider-thumb {&lt;br /&gt;
        -webkit-appearance: none; /* Override default look */&lt;br /&gt;
        appearance: none;&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .seek::-moz-range-thumb {&lt;br /&gt;
        border-radius: 50px;&lt;br /&gt;
        width: 15px;&lt;br /&gt;
        height: 15px;&lt;br /&gt;
        background: var(--green-color);&lt;br /&gt;
        cursor: pointer;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      .time {&lt;br /&gt;
        font-size: 12px;&lt;br /&gt;
        opacity: 0.8;&lt;br /&gt;
        white-space: nowrap;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      @media (max-width: 800px) {&lt;br /&gt;
&lt;br /&gt;
        .player {&lt;br /&gt;
          flex-direction: column;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .cover {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
          height: 180px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .info {&lt;br /&gt;
          width: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .meta {&lt;br /&gt;
          grid-template-columns: 1fr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .controls {&lt;br /&gt;
          flex-wrap: wrap;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .time {&lt;br /&gt;
          width: 100%;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;player&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;img class=&amp;quot;cover&amp;quot; src=&amp;quot;${cover}&amp;quot; alt=&amp;quot;${song} cover art&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div class=&amp;quot;info&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;leftmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;h3&amp;gt;${song}&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;${artist}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;rightmeta&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Artist: ${originalArtist}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;credit&amp;quot;&amp;gt;&lt;br /&gt;
              Original Source: ${originalSource}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;audio class=&amp;quot;audio&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;source src=&amp;quot;${src}&amp;quot; type=&amp;quot;${mime}&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/audio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;button class=&amp;quot;playBtn&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;input&lt;br /&gt;
            class=&amp;quot;seek&amp;quot;&lt;br /&gt;
            type=&amp;quot;range&amp;quot;&lt;br /&gt;
            value=&amp;quot;0&amp;quot;&lt;br /&gt;
            min=&amp;quot;0&amp;quot;&lt;br /&gt;
            max=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;span class=&amp;quot;time&amp;quot;&amp;gt;0:00 / 0:00&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    `;&lt;br /&gt;
&lt;br /&gt;
    // component-local elements&lt;br /&gt;
    const audio = this.querySelector(&amp;quot;.audio&amp;quot;);&lt;br /&gt;
    const playBtn = this.querySelector(&amp;quot;.playBtn&amp;quot;);&lt;br /&gt;
    const seek = this.querySelector(&amp;quot;.seek&amp;quot;);&lt;br /&gt;
    const time = this.querySelector(&amp;quot;.time&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // play / pause&lt;br /&gt;
    playBtn.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      if (audio.paused) {&lt;br /&gt;
&lt;br /&gt;
        audio.play();&lt;br /&gt;
        playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-pause&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      } else {&lt;br /&gt;
&lt;br /&gt;
        audio.pause();&lt;br /&gt;
        playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // update seek bar + time&lt;br /&gt;
    audio.addEventListener(&amp;quot;timeupdate&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      seek.value =&lt;br /&gt;
        (audio.currentTime / audio.duration) * 100 || 0;&lt;br /&gt;
&lt;br /&gt;
      time.textContent =&lt;br /&gt;
        formatTime(audio.currentTime)&lt;br /&gt;
        + &amp;quot; / &amp;quot; +&lt;br /&gt;
        formatTime(audio.duration);&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // seeking&lt;br /&gt;
    seek.addEventListener(&amp;quot;input&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      audio.currentTime =&lt;br /&gt;
        (seek.value / 100) * audio.duration;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // reset button when song ends&lt;br /&gt;
    audio.addEventListener(&amp;quot;ended&amp;quot;, () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
      playBtn.innerHTML = &#039;&amp;lt;i class=&amp;quot;fa-solid fa-play&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // format time helper&lt;br /&gt;
    function formatTime(sec) {&lt;br /&gt;
&lt;br /&gt;
      if (isNaN(sec)) return &amp;quot;0:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      const m = Math.floor(sec / 60);&lt;br /&gt;
&lt;br /&gt;
      const s = Math.floor(sec % 60)&lt;br /&gt;
        .toString()&lt;br /&gt;
        .padStart(2, &amp;quot;0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      return `${m}:${s}`;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;quot;audio-player&amp;quot;, AudioPlayer);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87385</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87385"/>
		<updated>2026-06-30T20:51:15Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87383</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87383"/>
		<updated>2026-06-30T20:43:13Z</updated>

		<summary type="html">&lt;p&gt;Toad64: custom media player style (pulled directly from my website)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* custom media player style (pulled directly from my website) */&lt;br /&gt;
.player-controls {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  align-items: center;&lt;br /&gt;
  gap: 10px;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  background: var(--box-color, #222); /* Added fallback */&lt;br /&gt;
  padding: 10px;&lt;br /&gt;
  border-radius: 50px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.playBtn {&lt;br /&gt;
  width: 30px;&lt;br /&gt;
  height: 30px;&lt;br /&gt;
  background: var(--green-color, #4caf50);&lt;br /&gt;
  border: none;&lt;br /&gt;
  color: white;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
  flex-shrink: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.seek {&lt;br /&gt;
  -webkit-appearance: none;&lt;br /&gt;
  appearance: none;&lt;br /&gt;
  border-radius: 50px;&lt;br /&gt;
  flex: 1;&lt;br /&gt;
  background-color: #7e7e7e;&lt;br /&gt;
  height: 7px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.seek::-webkit-slider-thumb {&lt;br /&gt;
  -webkit-appearance: none;&lt;br /&gt;
  appearance: none;&lt;br /&gt;
  border-radius: 50%;&lt;br /&gt;
  width: 15px;&lt;br /&gt;
  height: 15px;&lt;br /&gt;
  background: var(--green-color, #4caf50);&lt;br /&gt;
  cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.time {&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  color: white;&lt;br /&gt;
  font-family: Arial, sans-serif;&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87382</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87382"/>
		<updated>2026-06-30T20:40:39Z</updated>

		<summary type="html">&lt;p&gt;Toad64: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.my-custom-player-wrapper {&lt;br /&gt;
    border: 2px solid #333;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    border-radius: 5px;&lt;br /&gt;
    -webkit-appearance: none;&lt;br /&gt;
    -moz-appearance: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/common.css?diff=87380</id>
		<title>User:Toad64/common.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/common.css?diff=87380"/>
		<updated>2026-06-30T20:36:21Z</updated>

		<summary type="html">&lt;p&gt;Toad64: attempt to make custom styled mediaplayer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.HeroCard .CardBacker {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
    z-index: 1;&lt;br /&gt;
&lt;br /&gt;
    background-image: url(&amp;quot;/images/1/1c/Card_backer.png&amp;quot;);&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
&lt;br /&gt;
    opacity: 0;&lt;br /&gt;
    transition: opacity 0.2s ease, filter 0.2s ease;&lt;br /&gt;
    &lt;br /&gt;
    filter: brightness(0) saturate(100%) invert(74%) sepia(35%) saturate(620%) hue-rotate(114deg) brightness(91%) contrast(89%);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard:hover .CardBacker {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.HeroCard .HeroImage, &lt;br /&gt;
.HeroCard .HeroName {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.my-custom-player-wrapper {&lt;br /&gt;
    border: 2px solid #333;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    border-radius: 5px;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Toad64/Sandbox?diff=87378</id>
		<title>User:Toad64/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Toad64/Sandbox?diff=87378"/>
		<updated>2026-06-30T20:35:30Z</updated>

		<summary type="html">&lt;p&gt;Toad64: attempt to make custom styled mediaplayer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;my-custom-player-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
 [[File:Curio music.mp3]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Unstable_Rift?diff=87375</id>
		<title>Unstable Rift</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Unstable_Rift?diff=87375"/>
		<updated>2026-06-30T20:30:16Z</updated>

		<summary type="html">&lt;p&gt;Toad64: type fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Construction}}&lt;br /&gt;
&#039;&#039;&#039;Unstable Rift&#039;&#039;&#039; is an Objective in &#039;&#039;[[Deadlock]]&#039;&#039;.&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Rift first spawning is at the 12 minute mark. After the first spawn, it spawns at an interval of 7 minutes, with a possible variation of +/- 1 minute. When the rift spawns, it creates a capture point of 20m radius around the bridge in one of the side lanes, indicated by a green circle effect. The rift takes 12s to be captured by a neutral team (not counting comeback modifiers).&lt;br /&gt;
&lt;br /&gt;
Both teams earn progress as long as they have at least one player in the capture point, but the rift can only be claimed once there&#039;s only one team in the point. The progress rate is the same regardless of how many players per team are in the point.&lt;br /&gt;
&lt;br /&gt;
=== Comeback mechanics ===&lt;br /&gt;
The team that is trailing in souls receives bonuses that scale linearly based on how behind they are, up to 15%. These bonuses are (at maximum difference):&lt;br /&gt;
* 50% shorter capture time, and 50% longer for leading team&lt;br /&gt;
* +{{MiscData|citadel_koth_cashin|ComebackAuraModifier|modifierProvidedByAura|TechResist}}% [[Damage Resistance|Bullet, Spirit]], and [[Debuff Resist]]&lt;br /&gt;
&lt;br /&gt;
They also receive bonus rewards if they capture the rift (see below).&lt;br /&gt;
&lt;br /&gt;
== Rewards ==&lt;br /&gt;
[[File:Rift_troopers.png|thumb|389x389px|Rift troopers down York.]]&lt;br /&gt;
The rift&#039;s base soul bounty is {{Souls|337}} Souls and increases by &#039;&#039;&#039;{{Souls|95}}&#039;&#039;&#039; Souls per minute of game time.&lt;br /&gt;
&lt;br /&gt;
When a team wins the rift:&lt;br /&gt;
* Rift Troopers will spawn in that lane for the winning team. They have +100% health and damage compared to normal troopers, increasing at +20% (additively) for each consecutive rift. They spawn at a minimum of 5 troopers.&lt;br /&gt;
* A random [[Golden Statue]] buff is granted to each member of the capturing team.&lt;br /&gt;
* All souls are distributed instantly and equally to all team members.&lt;br /&gt;
{{Permanent buffs}}&lt;br /&gt;
&lt;br /&gt;
=== Comeback reward ===&lt;br /&gt;
If the favored team wins the rift, they get a soul bonus that scales based on game time and the team&#039;s soul deficit. They also get up to +7 Rift troopers (12 total).&lt;br /&gt;
&lt;br /&gt;
== Update history ==&lt;br /&gt;
{{Update history}}&lt;br /&gt;
&lt;br /&gt;
== Trivia ==&lt;br /&gt;
&lt;br /&gt;
* Based on datamined voice lines, Unstable Rift was originally called &#039;&#039;&#039;Dying Star&#039;&#039;&#039; during development.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Gameplay Navbox}}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Unstable_Rift?diff=87374</id>
		<title>Unstable Rift</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Unstable_Rift?diff=87374"/>
		<updated>2026-06-30T20:29:54Z</updated>

		<summary type="html">&lt;p&gt;Toad64: rift initial spawn info updated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Construction}}&lt;br /&gt;
&#039;&#039;&#039;Unstable Rift&#039;&#039;&#039; is an Objective in &#039;&#039;[[Deadlock]]&#039;&#039;.&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Rift first spawning is at the 12 minitue mark. After the first spawn, it spawns at an interval of 7 minutes, with a possible variation of +/- 1 minute. When the rift spawns, it creates a capture point of 20m radius around the bridge in one of the side lanes, indicated by a green circle effect. The rift takes 12s to be captured by a neutral team (not counting comeback modifiers).&lt;br /&gt;
&lt;br /&gt;
Both teams earn progress as long as they have at least one player in the capture point, but the rift can only be claimed once there&#039;s only one team in the point. The progress rate is the same regardless of how many players per team are in the point.&lt;br /&gt;
&lt;br /&gt;
=== Comeback mechanics ===&lt;br /&gt;
The team that is trailing in souls receives bonuses that scale linearly based on how behind they are, up to 15%. These bonuses are (at maximum difference):&lt;br /&gt;
* 50% shorter capture time, and 50% longer for leading team&lt;br /&gt;
* +{{MiscData|citadel_koth_cashin|ComebackAuraModifier|modifierProvidedByAura|TechResist}}% [[Damage Resistance|Bullet, Spirit]], and [[Debuff Resist]]&lt;br /&gt;
&lt;br /&gt;
They also receive bonus rewards if they capture the rift (see below).&lt;br /&gt;
&lt;br /&gt;
== Rewards ==&lt;br /&gt;
[[File:Rift_troopers.png|thumb|389x389px|Rift troopers down York.]]&lt;br /&gt;
The rift&#039;s base soul bounty is {{Souls|337}} Souls and increases by &#039;&#039;&#039;{{Souls|95}}&#039;&#039;&#039; Souls per minute of game time.&lt;br /&gt;
&lt;br /&gt;
When a team wins the rift:&lt;br /&gt;
* Rift Troopers will spawn in that lane for the winning team. They have +100% health and damage compared to normal troopers, increasing at +20% (additively) for each consecutive rift. They spawn at a minimum of 5 troopers.&lt;br /&gt;
* A random [[Golden Statue]] buff is granted to each member of the capturing team.&lt;br /&gt;
* All souls are distributed instantly and equally to all team members.&lt;br /&gt;
{{Permanent buffs}}&lt;br /&gt;
&lt;br /&gt;
=== Comeback reward ===&lt;br /&gt;
If the favored team wins the rift, they get a soul bonus that scales based on game time and the team&#039;s soul deficit. They also get up to +7 Rift troopers (12 total).&lt;br /&gt;
&lt;br /&gt;
== Update history ==&lt;br /&gt;
{{Update history}}&lt;br /&gt;
&lt;br /&gt;
== Trivia ==&lt;br /&gt;
&lt;br /&gt;
* Based on datamined voice lines, Unstable Rift was originally called &#039;&#039;&#039;Dying Star&#039;&#039;&#039; during development.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Gameplay Navbox}}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Unstable_Rift?diff=87360</id>
		<title>Unstable Rift</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Unstable_Rift?diff=87360"/>
		<updated>2026-06-30T19:41:09Z</updated>

		<summary type="html">&lt;p&gt;Toad64: added some basic info for unstable rift, will eb doing further tests to see how it spawns&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Construction}}&lt;br /&gt;
&#039;&#039;&#039;Unstable Rift&#039;&#039;&#039; is an Objective in &#039;&#039;[[Deadlock]]&#039;&#039;.&lt;br /&gt;
== Overview ==&lt;br /&gt;
The unstable rift is the former urn objective, now reworked into a separate objective. it is a King of the Hill style (KOTH) objective requiring a team to stay withing the range of the object to fill a meter.&lt;br /&gt;
&lt;br /&gt;
(Theoreticly) The rift will not start spawning until after a [[Guardian]] is downed.&lt;br /&gt;
&lt;br /&gt;
== Rewards ==&lt;br /&gt;
[[File:Rift_troopers.png|thumb|389x389px|Rift troopers down York.]]&lt;br /&gt;
Upon successfully claiming the rift, Rift troopers will spawn and for the winning team and push the lane the rift was on. The minimum that can spawn are 5, but can be up to 12 when trailing.&lt;br /&gt;
&lt;br /&gt;
== Update history ==&lt;br /&gt;
{{Update history}}&lt;br /&gt;
&lt;br /&gt;
== Trivia ==&lt;br /&gt;
&lt;br /&gt;
* Based on datamined voice lines, Unstable Rift was originally called &#039;&#039;&#039;Dying Star&#039;&#039;&#039; during development.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Gameplay Navbox}}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Unstable_Rift?diff=87338</id>
		<title>Unstable Rift</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Unstable_Rift?diff=87338"/>
		<updated>2026-06-30T19:15:41Z</updated>

		<summary type="html">&lt;p&gt;Toad64: added info to rewards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Construction}}&lt;br /&gt;
&#039;&#039;&#039;Unstable Rift&#039;&#039;&#039; is an Objective in &#039;&#039;[[Deadlock]]&#039;&#039;.&lt;br /&gt;
== Overview ==&lt;br /&gt;
== Rewards ==&lt;br /&gt;
[[File:Rift-troopers.png|thumb|389x389px|Rift troopers down York.]]&lt;br /&gt;
Upon successfully claiming the rift, Rift troopers will spawn and for the winning team and push the lane the rift was on. The minimum that can spawn are 5, but can be up to 12 when trailing.{{Gameplay Navbox}}&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/File:Rift_troopers.png?diff=87335</id>
		<title>File:Rift troopers.png</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/File:Rift_troopers.png?diff=87335"/>
		<updated>2026-06-30T19:11:31Z</updated>

		<summary type="html">&lt;p&gt;Toad64: The rift troopers the spawn after claiming the unstable rift objective.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
The rift troopers the spawn after claiming the unstable rift objective.&lt;/div&gt;</summary>
		<author><name>Toad64</name></author>
	</entry>
</feed>