User:Toad64/Sandbox: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
Toad64 (talk | contribs)
updated code in syntaxhighlight
Toad64 (talk | contribs)
updated info about code
Line 1: Line 1:
Using Javascript (and a set of ::root colors i had), It is possible to modify the default audio element used to play audio.
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)


<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
Line 119: Line 119:
</syntaxhighlight>
</syntaxhighlight>


This code creates a styleized media player (in this example the Old Deadlock Title Screen):
In this example, the Old Deadlock Title Screen:
 
[[File:Music menu lp.mp3]]
[[File:Music menu lp.mp3]]

Revision as of 03:34, 4 July 2026

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)

// In your Common.js
$(document).ready(function() {
    // Find every native audio player generated by the wiki
    $('audio').each(function() {
        // Create your custom component
        const myPlayer = document.createElement('audio-player');
        
        // Transfer the source
        myPlayer.setAttribute('track', $(this).attr('src'));
        
        // Replace the native player with your custom one
        $(this).replaceWith(myPlayer);
    });
});

// audioplayer.js (pulled and modified from website)
if (!customElements.get('audio-player')) {
  class AudioPlayer extends HTMLElement {
    connectedCallback() {
      const src = this.getAttribute("track") || "";
      const ext = src.split(".").pop().toLowerCase();
      const mime = ext === "wav" ? "audio/wav" : "audio/mpeg";

      this.innerHTML = `
    	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    	
        <style>
          .player-controls {
            display: flex;
            align-items: center;
            gap: 12px;
            width: 100%;
            max-width: 400px;
            background: var(--background-color-base-border);
            padding: 10px 15px;
            border-radius: 50px;
            color: var(--color-base);
            font-family: sans-serif;
          }
          .playBtn {
            width: 30px;
            height: 30px;
            background: var(--background-color-interactive);
            border: none;
            color: var(--color-base);
            border-radius: 50%;
            cursor: pointer;
            flex-shrink: 0;
          }
          .seek {
            -webkit-appearance: none;
            flex: 1;
            height: 6px;
            background: var(--color-base);
            border-radius: 5px;
            cursor: pointer;
          }
          
          .seek::-webkit-slider-thumb {
        	-webkit-appearance: none; /* Override default look */
        	appearance: none;
        	border-radius: 50px;
        	width: 15px;
        	height: 15px;
        	background: var(--link-color);
        	cursor: pointer;
    	  }
    	  
    	  .seek::-moz-range-thumb {
        	border-radius: 50px;
        	width: 15px;
        	height: 15px;
        	background: var(--link-color);
        	cursor: pointer;
          }
          .time { font-size: 12px; opacity: 0.8; white-space: nowrap; }
        </style>
        
        <div class="player-controls">
          <audio class="audio"><source src="${src}" type="${mime}"></audio>
          <button class="playBtn"><i class="fa-solid fa-play"></i></button>
          <input class="seek" type="range" value="0" min="0" max="100">
          <span class="time">0:00 / 0:00</span>
        </div>
      `;

      const audio = this.querySelector(".audio");
      const playBtn = this.querySelector(".playBtn");
      const seek = this.querySelector(".seek");
      const time = this.querySelector(".time");

      playBtn.addEventListener("click", () => {
        if (audio.paused) { audio.play(); playBtn.innerHTML = '<i class="fa-solid fa-pause"></i>'; }
        else { audio.pause(); playBtn.innerHTML = '<i class="fa-solid fa-play"></i>'; }
      });

      audio.addEventListener("timeupdate", () => {
        seek.value = (audio.currentTime / audio.duration) * 100 || 0;
        time.textContent = formatTime(audio.currentTime) + " / " + formatTime(audio.duration);
      });

      seek.addEventListener("input", () => {
        audio.currentTime = (seek.value / 100) * audio.duration;
      });

      function formatTime(sec) {
        if (isNaN(sec)) return "0:00";
        const m = Math.floor(sec / 60);
        const s = Math.floor(sec % 60).toString().padStart(2, "0");
        return `${m}:${s}`;
      }
    }
  }
  customElements.define("audio-player", AudioPlayer);
}

In this example, the Old Deadlock Title Screen: