diff --git a/lib/folk-rapp.ts b/lib/folk-rapp.ts index 401247a..27cc74a 100644 --- a/lib/folk-rapp.ts +++ b/lib/folk-rapp.ts @@ -42,6 +42,7 @@ const MODULE_META: Record = { rschedule: { badge: "r⏱", color: "#a5b4fc" }, crowdsurf: { badge: "r🏄", color: "#fde68a" }, rids: { badge: "r🪪", color: "#6ee7b7" }, + rdesign: { badge: "r🎨", color: "#7c3aed" }, rstack: { badge: "r✨", color: "#c4b5fd" }, }; diff --git a/shared/components/rstack-collab-overlay.ts b/shared/components/rstack-collab-overlay.ts index cd03909..e289b7a 100644 --- a/shared/components/rstack-collab-overlay.ts +++ b/shared/components/rstack-collab-overlay.ts @@ -210,6 +210,21 @@ export class RStackCollabOverlay extends HTMLElement { this.#renderBadge(); if (this.#panelOpen) this.#renderPanel(); }); + + // Listen for explicit leave signals (immediate cleanup, no GC wait) + this.#unsubLeave = runtime.onCustomMessage('presence-leave', (msg: any) => { + const pid = msg.peerId; + if (!pid || pid === this.#localPeerId) return; + if (this.#peers.has(pid)) { + this.#peers.delete(pid); + this.#renderBadge(); + if (!this.#badgeOnly) { + this.#renderCursors(); + this.#renderFocusRings(); + } + if (this.#panelOpen) this.#renderPanel(); + } + }); } #connectToDoc() {