fix(call): one-row phone call bar with self-view; screenshare-audio mute only when useful (#265, #277) #437

Merged
jared merged 2 commits from fix/phone-call-controls into lotus 2026-10-19 18:11:32 -04:00
Owner

Fixes #265 and #277. Pins @lotusguild/element-call-embedded 0.25.0-lotus.27 (element-call #57, #58).

#265, phone call layout

  • In the compact layout (phones, narrow windows) the bar stacked into four rows (~330 px, 40% of a portrait phone). It's now one row: mic, deafen, camera, chat, soundboard, More, and an icon-only End (aria-label="End Call").
  • Screenshare, the screenshare-audio mute and fullscreen move into More. "Share Screen" is only offered where getDisplayMedia exists.
  • Self-view: upstream EC hides your own tile on mobile while your camera is off, which in voice rooms is nearly always. lotus.27 keeps it, falling back to your avatar (element-call #58).
  • The desktop layout is unchanged apart from #277.

#277, "Mute Screenshare Audio"

  • It showed whenever screensharing was allowed, as a speaker icon that did nothing.
  • The fork now reports remote screenshare audio (io.lotus.screenshare_audio_state { present }, element-call #57). CallControl tracks it, and the button (desktop) or More item (phone) shows while remote screenshare audio is playing, or while it's muted. A hidden mute therefore can't silently swallow the next share.

Verified (two-person call on the local stack, with the published lotus.27):

result
phone 390×844 bar 1 row, 68 px, fully on screen. Buttons: mic, deafen, camera, chat, soundboard, More, End Call. More lists Share Screen, Mute Screenshare Audio (when present), Fullscreen, Spotlight, Reactions, Settings
phone 360×740 1 row, 68 px, fits
self-view your tile bottom-right with avatar, name and mic state
desktop bar, no share no screenshare-audio button
fork reports present: true / false button appears / disappears

Headless Chrome can't produce a real screenshare with audio, so the call frame posted the fork's exact action for the last row.

Unit test: parseScreenshareAudioState handles valid values and garbage. tsc and lint are clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5

Fixes #265 and #277. Pins `@lotusguild/element-call-embedded` **0.25.0-lotus.27** (element-call #57, #58). **#265, phone call layout** - In the compact layout (phones, narrow windows) the bar stacked into **four rows** (~330 px, 40% of a portrait phone). It's now **one row**: mic, deafen, camera, chat, soundboard, More, and an icon-only End (`aria-label="End Call"`). - Screenshare, the screenshare-audio mute and fullscreen move into **More**. "Share Screen" is only offered where `getDisplayMedia` exists. - **Self-view:** upstream EC hides your own tile on mobile while your camera is off, which in voice rooms is nearly always. lotus.27 keeps it, falling back to your avatar (element-call #58). - The desktop layout is unchanged apart from #277. **#277, "Mute Screenshare Audio"** - It showed whenever screensharing was *allowed*, as a speaker icon that did nothing. - The fork now reports remote screenshare audio (`io.lotus.screenshare_audio_state { present }`, element-call #57). `CallControl` tracks it, and the button (desktop) or More item (phone) shows **while remote screenshare audio is playing, or while it's muted**. A hidden mute therefore can't silently swallow the next share. **Verified** (two-person call on the local stack, with the published lotus.27): | | result | |---|---| | phone 390×844 | bar **1 row, 68 px**, fully on screen. Buttons: mic, deafen, camera, chat, soundboard, More, End Call. More lists Share Screen, Mute Screenshare Audio (when present), Fullscreen, Spotlight, Reactions, Settings | | phone 360×740 | 1 row, 68 px, fits | | self-view | your tile bottom-right with avatar, name and mic state | | desktop bar, no share | no screenshare-audio button | | fork reports `present: true` / `false` | button appears / disappears | Headless Chrome can't produce a real screenshare with audio, so the call frame posted the fork's exact action for the last row. Unit test: `parseScreenshareAudioState` handles valid values and garbage. tsc and lint are clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared added 2 commits 2026-10-19 17:28:17 -04:00
#265: in the compact layout (phones, narrow windows) the control bar
stacked into four rows (~330px, 40% of a portrait phone). It is now one
row: mic, deafen, camera, chat, soundboard, More and an icon-only End.
Screenshare, its audio mute and fullscreen move into More; Share Screen
is only offered where getDisplayMedia exists. (The self-view comes from
the fork, lotus.27.)

#277: "Mute Screenshare Audio" showed whenever screensharing was allowed,
as a speaker icon that did nothing. It now shows while the fork reports
remote screenshare audio (io.lotus.screenshare_audio_state), or while it
is muted, so a hidden mute cannot silence the next share.

Fixes #265
Fixes #277

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
chore(deps): pin @lotusguild/element-call-embedded 0.25.0-lotus.27 (#265, #277)
CI / Build & Quality Checks (pull_request) Successful in 2m2s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 7s
CI / Playwright smoke (e2e) (pull_request) Successful in 16m19s
78dcf9ee9d
lotus.27 reports remote screenshare audio (element-call#57) and keeps
your own tile on phones with the camera off (element-call#58).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared merged commit 1873285371 into lotus 2026-10-19 18:11:32 -04:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#437