From 2f8ce08e3ca1f5e5346ff5e733a30d8dd74d1908 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Wed, 25 Mar 2026 16:35:10 -0700 Subject: [PATCH] feat: add rDesign module metadata, collab presence-leave cleanup - Register rDesign in folk-rapp MODULE_META and shell FAVICON_BADGE_MAP - Handle explicit presence-leave messages for immediate peer cleanup Co-Authored-By: Claude Opus 4.6 --- lib/folk-rapp.ts | 1 + server/shell.ts | 1 + shared/components/rstack-collab-overlay.ts | 15 +++++++++++++++ 3 files changed, 17 insertions(+) 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() {