|
<script lang="ts"> |
|
import { onMount } from "svelte"; |
|
import WaveSurfer from "wavesurfer.js"; |
|
|
|
export let currentVolume = 1; |
|
export let show_volume_slider = false; |
|
export let waveform: WaveSurfer | undefined; |
|
|
|
let volumeElement: HTMLInputElement; |
|
|
|
onMount(() => { |
|
adjustSlider(); |
|
}); |
|
|
|
const adjustSlider = (): void => { |
|
let slider = volumeElement; |
|
if (!slider) return; |
|
|
|
slider.style.background = `linear-gradient(to right, var(--color-accent) ${ |
|
currentVolume * 100 |
|
}%, var(--neutral-400) ${currentVolume * 100}%)`; |
|
}; |
|
|
|
$: currentVolume, adjustSlider(); |
|
</script> |
|
|
|
<input |
|
bind:this={volumeElement} |
|
id="volume" |
|
class="volume-slider" |
|
type="range" |
|
min="0" |
|
max="1" |
|
step="0.01" |
|
value={currentVolume} |
|
on:focusout={() => (show_volume_slider = false)} |
|
on:input={(e) => { |
|
if (e.target instanceof HTMLInputElement) { |
|
currentVolume = parseFloat(e.target.value); |
|
waveform?.setVolume(currentVolume); |
|
} |
|
}} |
|
/> |
|
|
|
<style> |
|
.volume-slider { |
|
-webkit-appearance: none; |
|
appearance: none; |
|
width: var(--size-20); |
|
accent-color: var(--color-accent); |
|
height: 4px; |
|
cursor: pointer; |
|
outline: none; |
|
border-radius: 15px; |
|
background-color: var(--neutral-400); |
|
} |
|
|
|
input[type="range"]::-webkit-slider-thumb { |
|
-webkit-appearance: none; |
|
appearance: none; |
|
height: 15px; |
|
width: 15px; |
|
background-color: var(--color-accent); |
|
border-radius: 50%; |
|
border: none; |
|
transition: 0.2s ease-in-out; |
|
} |
|
|
|
input[type="range"]::-moz-range-thumb { |
|
height: 15px; |
|
width: 15px; |
|
background-color: var(--color-accent); |
|
border-radius: 50%; |
|
border: none; |
|
transition: 0.2s ease-in-out; |
|
} |
|
</style> |
|
|