(function(){
var heights=[6,10,16,12,20,14,8,18,11,22,9,15,7,19,13,10,17,8,21,12,6,16,11,18,9,14];
document.querySelectorAll('.vn-bars').forEach(function(box){
heights.forEach(function(h){ var s=document.createElement('span'); s.style.height=h+'px'; box.appendChild(s); });
});
function fmt(t){ if(!t||isNaN(t))return '0:00'; var m=Math.floor(t/60),s=Math.floor(t%60); return m+':'+(s<10?'0':'')+s; }
var current=null;
document.querySelectorAll('.vn-bubble').forEach(function(b){
var btn=b.querySelector('.vn-play');
var track=b.querySelector('.vn-track');
var prog=b.querySelector('.vn-progress');
var timeEl=b.querySelector('.vn-time');
var audio=new Audio(track.dataset.src);
audio.addEventListener('loadedmetadata',function(){ timeEl.textContent=fmt(audio.duration); });
audio.addEventListener('timeupdate',function(){
prog.style.width=(audio.currentTime/audio.duration*100||0)+'%';
timeEl.textContent=fmt(audio.duration-audio.currentTime);
});
audio.addEventListener('ended',function(){
b.classList.remove('playing'); prog.style.width='0%';
timeEl.textContent=fmt(audio.duration); audio.currentTime=0;
});
btn.addEventListener('click',function(){
if(current && current!==audio){ current.pause(); current._b.classList.remove('playing'); }
if(audio.paused){ audio.play(); b.classList.add('playing'); current=audio; audio._b=b; }
else{ audio.pause(); b.classList.remove('playing'); }
});
track.addEventListener('click',function(e){
if(!audio.duration)return;
var r=track.getBoundingClientRect();
var ratio=(r.right-e.clientX)/r.width;
audio.currentTime=Math.min(Math.max(ratio,0),1)*audio.duration;
});
});
})();