User:Toad64/Sandbox

From The Deadlock Wiki
Jump to navigation Jump to search

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-subtle);
            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: