diff --git a/web/zebra-spaces.html b/web/zebra-spaces.html
index df01c8f..dee4665 100644
--- a/web/zebra-spaces.html
+++ b/web/zebra-spaces.html
@@ -4003,6 +4003,20 @@ async function handleSignal(raw){
sfuUnpublishGame().catch(()=>{});
sfuUnsubscribe().catch(()=>{});
dropMic();
+ /* UI: kicked-self should NOT look like a connected listener
+ * still in the room. Flip dot from green/connected to a
+ * hollow/warn state, drop the leave button (already left),
+ * disable the mute button, and reset the status line. Fox
+ * 2026-06-04: 'kicked listener gets green left state and
+ * still has a leave button even though they are out of the
+ * room — should be gone'. */
+ $('dot-call').className = 'dot warn';
+ setStatus(m.action === 'ban' ? 'banned from this space' : 'kicked from this space', 'warn');
+ $('btn-leave').classList.add('hidden');
+ $('btn-leave').disabled = true;
+ $('btn-mute').classList.add('hidden');
+ $('btn-mute').disabled = true;
+ $('btn-enter').disabled = false;
}
/* Authoritative tile teardown by pubkey — booted users can't be
* publishing anything anymore by definition. The SFU side eviction
@@ -5461,8 +5475,8 @@ logLine('', 'ready — pick a handle, type a rendezvous code, enter the space');