diff --git a/src/public/index.html b/src/public/index.html
index 70a2152..2717712 100644
--- a/src/public/index.html
+++ b/src/public/index.html
@@ -182,11 +182,11 @@
-
BUZZER CONTROLS
+
ROUND CONTROL
-
-
-
+
+
+
diff --git a/src/public/script.js b/src/public/script.js
index a8c81f8..de750b0 100644
--- a/src/public/script.js
+++ b/src/public/script.js
@@ -73,17 +73,26 @@ function handle(msg){
break;
case 'room_update':
room=msg.room;
- if(role==='mod')renderMod();else renderPlayer();
+ if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayer();
break;
case 'settings_updated':
room=msg.room;
- if(role==='mod'){renderMod();renderModSettings();}else renderPlayer();
+ if(role==='mod'){renderMod();renderRoundButtons();renderModSettings();}else renderPlayer();
break;
- case 'round_open':
+ case 'round_open':
room=msg.room;
- if(role==='mod')renderMod();
+ if(role==='mod'){renderMod();renderRoundButtons();}
else{renderPlayerBuzzer();startPlayerTimer();toast('ROUND OPEN','ok');}
break;
+ case 'round_closed':
+ room=msg.room;
+ if(role==='mod'){renderMod();renderRoundButtons();}
+ else{renderPlayerBuzzer();stopPlayerTimer();toast('ROUND CLOSED','warn');}
+ break;
+ case 'buzzer_reset':
+ room=msg.room;
+ if(role==='mod'){renderMod();renderRoundButtons();}else renderPlayerBuzzer();
+ break;
case 'round_closed':
room=msg.room;
if(role==='mod')renderMod();
@@ -93,9 +102,9 @@ function handle(msg){
room=msg.room;
if(role==='mod')renderMod();else renderPlayerBuzzer();
break;
- case 'buzz_event':
+ case 'buzz_event':
room=msg.room;
- if(role==='mod')renderModBuzz(msg);else{renderPlayerBuzzer();addFeed(msg);}
+ if(role==='mod'){renderMod();renderRoundButtons();}else{renderPlayerBuzzer();addFeed(msg);}
break;
case 'buzz_rejected':
toast(msg.reason,'warn');break;
@@ -272,7 +281,6 @@ function createRoom(){
// MOD TIMER
// ══════════════════════════════════════════════════════
function fmtTime(s){return Math.floor(s/60)+':'+(s%60<10?'0':'')+(s%60);}
-
function modTimerLoad(){
modTimerRemaining=Math.max(5,parseInt(document.getElementById('mod-timer-set').value)||30);
modTimerRunning=false;
@@ -330,6 +338,42 @@ function broadcastTimerToPlayers(sec,running){
}catch{}
}
+// ══════════════════════════════════════════════════════
+// MOD ROUND CONTROL
+// ══════════════════════════════════════════════════════
+function toggleRound(){
+ if(room.buzzerState.roundOpen){
+ ws_send({type:'close_round'});
+ } else {
+ ws_send({type:'open_round'});
+ }
+}
+
+function resumeRound(){
+ ws_send({type:'open_round'});
+}
+
+function renderRoundButtons(){
+ const openBtn=document.getElementById('mod-round-btn');
+ const resumeBtn=document.getElementById('mod-resume-btn');
+
+ if(room.buzzerState.roundOpen){
+ openBtn.innerHTML='■ CLOSE ROUND';
+ openBtn.className='btn btn-red btn-full';
+ resumeBtn.style.display='block';
+ if(typeof gsap!=='undefined'){
+ gsap.fromTo(resumeBtn,{opacity:0,y:4},{opacity:1,y:0,duration:0.3,ease:'power2.out'});
+ }
+ } else {
+ openBtn.innerHTML='▶ OPEN ROUND';
+ openBtn.className='btn btn-g btn-full';
+ resumeBtn.style.display='none';
+ if(typeof gsap!=='undefined'){
+ gsap.to(resumeBtn,{opacity:0,y:-4,duration:0.3,ease:'power2.in',onComplete:()=>{resumeBtn.style.display='none';}});
+ }
+ }
+}
+
// ══════════════════════════════════════════════════════
// MOD RENDER
// ══════════════════════════════════════════════════════
@@ -351,6 +395,7 @@ function renderMod(){
renderModBuzz(null);
renderModPlayerList();
renderModTeams();
+ renderRoundButtons();
}
function renderModBuzz(evt){