/* widget: Namenkiezer */ /* ========================================================= Name picker widget ==========================================================*/ function mountNames(root, initState){ let used = new Set(initState?.used||[]), spinning = false; root.innerHTML = `
🎯
`; const ta = root.querySelector(".np-list"), result = root.querySelector(".np-result"), pickBtn = root.querySelector(".np-pick"), nr = root.querySelector(".np-nr"); if(initState){ ta.value = initState.names || ""; nr.checked = !!initState.nr; } ta.addEventListener("input", ()=>{used.clear();updateProgress();}); ta.addEventListener("keydown", e=>e.stopPropagation()); function names(){ return ta.value.split("\n").map(s=>s.trim()).filter(Boolean); } function updateProgress(){const all=names();used=new Set([...used].filter(name=>all.includes(name)));root.querySelector('.np-progress').textContent=T('namesProgress').replace('{used}',used.size).replace('{total}',all.length)} pickBtn.addEventListener("click", ()=>{ if(spinning) return; const all = names(); if(!all.length){ ta.focus(); return; } let pool = nr.checked ? all.filter(n=>!used.has(n)) : all; if(!pool.length){ result.textContent = T("namesDone"); updateProgress(); return; } spinning = true; result.classList.remove("winner"); result.classList.add("spin"); const FUN = ["🌟","🎉","🦄","🚀","🐸","🎈","🍀","⚡"]; let n = 0; const iv = setInterval(()=>{ result.textContent = all[Math.floor(Math.random()*all.length)]; tone(400+Math.random()*300, 0.03, 0, "square", 0.04); if(++n >= 16){ clearInterval(iv); const winner = pool[Math.floor(Math.random()*pool.length)]; const em = FUN[Math.floor(Math.random()*8)]; result.textContent = `${em} ${winner} ${em}`; result.classList.remove("spin"); result.classList.add("winner"); confetti(result.parentElement); if(nr.checked) used.add(winner); updateProgress(); sndWin(); spinning = false; } }, 80); }); root.querySelector('.np-reset').addEventListener('click',()=>{used.clear();result.textContent='🎯';result.classList.remove('winner','spin');updateProgress()}); function labels(){ ta.placeholder = T("namesPh"); pickBtn.textContent = T("namesPick"); root.querySelector('.np-reset').textContent=T('namesReset'); root.querySelector(".np-nrl").textContent = T("namesNoRep"); updateProgress(); } document.addEventListener("langchange", labels); labels(); return { getState: ()=>({names:ta.value, nr:nr.checked, used:[...used]}) }; }