| @@ -0,0 +1,35 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
| <head> | |||
| <meta charset="UTF-8"> | |||
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||
| <title>After words</title> | |||
| <link rel="stylesheet" type="text/css" href="style.css"> | |||
| </head> | |||
| <body> | |||
| <div class="audio-player"> | |||
| <div class="icon-container"> | |||
| <div class="controls"> | |||
| <button class="player-button"> | |||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="rgb(255 255 255/var(--tw-bg-opacity))"> | |||
| <path fill-rule="evenodd" | |||
| d="M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z" | |||
| clip-rule="evenodd" /> | |||
| </svg> | |||
| </button> | |||
| <input type="range" class="timeline" max="100" value="0"> | |||
| </div> | |||
| <audio preload="auto" loop | |||
| src="https://blakeney.s3.ap-southeast-2.amazonaws.com/Machine+Listening+-+After+Words+-+Stereo+Master.wav"></audio> | |||
| </div> | |||
| </div> | |||
| <iframe class="website" src="https://data-relations.netlify.app/"> | |||
| </iframe> | |||
| </body> | |||
| <script src="script.js"></script> | |||
| </html> | |||
| @@ -0,0 +1,48 @@ | |||
| const playerButton = document.querySelector('.player-button'), | |||
| audio = document.querySelector('audio'), | |||
| playIcon = ` | |||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="rgb(255 255 255/var(--tw-bg-opacity))"> | |||
| <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z" clip-rule="evenodd" /> | |||
| </svg> | |||
| `, | |||
| pauseIcon = ` | |||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="rgb(255 255 255/var(--tw-bg-opacity))"> | |||
| <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z" clip-rule="evenodd" /> | |||
| </svg> | |||
| `; | |||
| function toggleAudio() { | |||
| if (audio.paused) { | |||
| audio.play(); | |||
| playerButton.innerHTML = pauseIcon; | |||
| } else { | |||
| audio.pause(); | |||
| playerButton.innerHTML = playIcon; | |||
| } | |||
| } | |||
| playerButton.addEventListener('click', toggleAudio); | |||
| function audioEnded() { | |||
| playerButton.innerHTML = playIcon; | |||
| } | |||
| audio.onended = audioEnded; | |||
| const timeline = document.querySelector('.timeline'); | |||
| function changeTimelinePosition() { | |||
| const percentagePosition = (100 * audio.currentTime) / audio.duration; | |||
| timeline.style.backgroundSize = `${percentagePosition}% 100%`; | |||
| timeline.value = percentagePosition; | |||
| } | |||
| audio.ontimeupdate = changeTimelinePosition; | |||
| function changeSeek() { | |||
| const time = (timeline.value * audio.duration) / 100; | |||
| audio.currentTime = time; | |||
| } | |||
| timeline.addEventListener('change', changeSeek); | |||
| @@ -0,0 +1,129 @@ | |||
| body { | |||
| /* display: grid | |||
| grid-template-columns: 100% | |||
| grid-template-rows: 1fr 1fr 1fr 1fr */ | |||
| height: 100vh; | |||
| width: 100vw; | |||
| margin: 0px; | |||
| } | |||
| .audio-player { | |||
| width: 100vw; | |||
| height: 30 rem; | |||
| --player-button-width: 3em; | |||
| --sound-button-width: 2em; | |||
| --space: .5em; | |||
| --tw-bg-opacity: 1; | |||
| --acc-background: rgb(239 239 239/var(--tw-bg-opacity)); | |||
| --acc-background: #d9d9d9; | |||
| --acc-button: rgb(255 255 255/var(--tw-bg-opacity)); | |||
| --acc-black: rgb(0 0 0/var(--tw-bg-opacity)); | |||
| } | |||
| .icon-container { | |||
| width: 100%; | |||
| height: 100%; | |||
| background-color: #000000; | |||
| background-color: var(--acc-black); | |||
| color: #fff; | |||
| display: flex; | |||
| justify-content: center; | |||
| align-items: center; | |||
| } | |||
| .audio-icon { | |||
| width: 90%; | |||
| height: 90%; | |||
| } | |||
| .controls { | |||
| display: flex; | |||
| flex-direction: row; | |||
| align-items: center; | |||
| width: 100%; | |||
| /* margin-top: 10px; */ | |||
| } | |||
| .player-button { | |||
| background-color: transparent; | |||
| border: 0; | |||
| width: var(--player-button-width); | |||
| height: var(--player-button-width); | |||
| cursor: pointer; | |||
| padding: 0; | |||
| box-shadow: 0 0 20px 2px #00000040; | |||
| } | |||
| .timeline { | |||
| -webkit-appearance: none; | |||
| width: calc(100% - (var(--player-button-width) + var(--sound-button-width) + var(--space))); | |||
| height: .5em; | |||
| background-color: var(--acc-background); | |||
| border-radius: 5px; | |||
| background-size: 0% 100%; | |||
| background-image: linear-gradient(#00000080, var(--acc-background)); | |||
| background-repeat: no-repeat; | |||
| margin-right: var(--space); | |||
| width: 100vw; | |||
| } | |||
| .timeline::-webkit-slider-thumb { | |||
| -webkit-appearance: none; | |||
| width: 1em; | |||
| height: 1em; | |||
| border-radius: 50%; | |||
| cursor: pointer; | |||
| opacity: 0; | |||
| transition: all .1s; | |||
| background-color: var(--acc-background); | |||
| } | |||
| .timeline::-moz-range-thumb { | |||
| -webkit-appearance: none; | |||
| width: 1em; | |||
| height: 1em; | |||
| border-radius: 50%; | |||
| cursor: pointer; | |||
| opacity: 0; | |||
| transition: all .1s; | |||
| background-color: var(--acc-background); | |||
| } | |||
| .timeline::-ms-thumb { | |||
| -webkit-appearance: none; | |||
| width: 1em; | |||
| height: 1em; | |||
| border-radius: 50%; | |||
| cursor: pointer; | |||
| opacity: 0; | |||
| transition: all .1s; | |||
| background-color: var(--acc-background); | |||
| } | |||
| .timeline::-webkit-slider-runnable-track { | |||
| -webkit-appearance: none; | |||
| box-shadow: none; | |||
| border: none; | |||
| background: transparent; | |||
| } | |||
| .timeline::-moz-range-track { | |||
| -webkit-appearance: none; | |||
| box-shadow: none; | |||
| border: none; | |||
| background: transparent; | |||
| } | |||
| .timeline::-ms-track { | |||
| -webkit-appearance: none; | |||
| box-shadow: none; | |||
| border: none; | |||
| background: transparent; | |||
| } | |||
| iframe { | |||
| width: 100vw; | |||
| height: 100vh; | |||
| border: none; | |||
| } | |||