/* widget: Namenkiezer */
/* =========================================================
Name picker widget
==========================================================*/
function mountNames(root, initState){
let used = new Set(), 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());
ta.addEventListener("keydown", e=>e.stopPropagation());
function names(){ return ta.value.split("\n").map(s=>s.trim()).filter(Boolean); }
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");
used.clear();
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);
sndWin();
spinning = false;
}
}, 80);
});
function labels(){
ta.placeholder = T("namesPh");
pickBtn.textContent = T("namesPick");
root.querySelector(".np-nrl").textContent = T("namesNoRep");
}
document.addEventListener("langchange", labels);
labels();
return { getState: ()=>({names:ta.value, nr:nr.checked}) };
}