- Sidebar (channel list + nickname) becomes an off-canvas drawer below
860px, opened via a new fixed top bar (hamburger + live status) and
closed by tapping the backdrop or picking a channel.
- Mic/deafen/share get an always-visible bottom control bar so they're
reachable mid-call without opening the drawer; updateMicButton/
updateDeafenButton and their click wiring now target both the
sidebar and mirror buttons via shared NodeLists instead of single
elements.
- Per-user volume popup (previously hover-only) now also toggles on
tap, and repositions below the row instead of to the side, which
would overflow a narrow drawer.
- Screen-share tiles stack full-width, touch targets are enlarged,
and the spatial map panel shrinks to leave room for the stage.
Also includes the working tree's prior swap of the spatial view from
Konva to Cytoscape.js (drag, scroll-to-zoom, fit-to-view, distance
edges) — not authored in this change, carried along since it was
already uncommitted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
New visitors (no nickname in localStorage) get a blocking welcome
modal instead of a silently-generated guest-N name, so everyone in a
room has a name they actually chose. It doubles as quick-start help
(join a channel, mic/deafen/share shortcuts, drag-to-reposition on the
spatial map) reachable any time via the new ? button. The sidebar nick
field no longer falls back to a random name when cleared — it now
just rejects the blank edit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The custom pointer-capture + frozen-camera drag math was fragile and
felt worse than before. Konva handles the drag gesture itself; the
"me" node's screen position stays pinned to the stage center via
dragBoundFunc + a worldLayer offset that recenters on every dragmove,
so the world pans under the avatar instead of the avatar drifting off
center. Grid, peers, and the audible-range circle all live in the same
world-space layer so they pan together.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>