In-call avatar decoration is sized 1:1 with the avatar (no inset like the host) and has no onError fallback #4
Closed
opened 2026-09-12 02:12:58 -04:00 by jared
·
0 comments
No Branch/Tag Specified
lotus
chore/dev-tool-security
feat/expected-devices
lotus-upstream-v0.28.0
feat/call-summary-details
feat/soundboard-mic-mix
feat/mobile-self-tile
feat/screenshare-audio-state
feat/decorations-origin
docs/lotus-call-error
lotus-stall-retry
docs/lotus-protocol
lotus-soundboard-not-permitted
lotus-mic-sampler-churn
lotus-call-error
fix/audio-output-list
lotus-notify-none
lotus-screenshare-prompt
lotus-call-origin
v0.28.0-lotus.4
v0.28.0-lotus.3
v0.28.0-lotus.2
v0.28.0-lotus.1
v0.25.0-lotus.29
v0.25.0-lotus.28
v0.25.0-lotus.27
v0.25.0-lotus.26
v0.25.0-lotus.25
v0.25.0-lotus.24
v0.25.0-lotus.23
v0.25.0-lotus.22
v0.25.0-lotus.21
v0.25.0-lotus.20
v0.25.0-lotus.19
v0.25.0-lotus.18
v0.25.0-lotus.17
v0.25.0-lotus.16
v0.25.0-lotus.15
v0.25.0-lotus.14
v0.25.0-lotus.13
v0.25.0-lotus.12
v0.25.0-lotus.11
v0.25.0-lotus.10
v0.25.0-lotus.9
v0.25.0-lotus.8
v0.25.0-lotus.7
v0.25.0-lotus.6
v0.25.0-lotus.5
v0.25.0-lotus.4
v0.25.0-lotus.3
v0.25.0-lotus.2
v0.25.0-lotus.1
v0.20.1
Labels
Clear labels
a11y
area: audio-pipeline
area: build-publish
area: deafen
area: decorations
area: denoise
area: livekit
area: mobile-ui
area: soundboard-inject
area: upstream-sync
area: widget-actions
bug
dependencies
docs
enhancement
performance
priority: critical
priority: high
priority: low
priority: medium
research
security
tech-debt
ux
Accessibility
Fork area: audio-pipeline
Fork area: build-publish
Fork area: deafen
Fork area: decorations
Fork area: denoise
Fork area: livekit
Fork area: mobile-ui
Fork area: soundboard-inject
Fork area: upstream-sync
Fork area: widget-actions
Something is not working
Package versions and advisories
Docs wrong or missing
New feature
Audio pipeline cost, re-render storms, leaks
Data loss, security hole, or crash on a main path
Broken feature or serious usability problem
Minor issue or polish
Wrong behaviour in an edge case or notable degradation
Origin checks, capability leaks, media/key handling
Code health, fragile patterns
Usability or visual inconsistency
Milestone
No items
No Milestone
EC fork audit 2026-09 · High
Projects
Clear projects
No projects
Notifications
Due Date
Dependencies
No dependencies set.
Reference: LotusGuild/element-call#4
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: high · Type: bug · Confidence: high
Location:
src/tile/MediaView.module.css:64-80(.lotusDecoration),src/tile/MediaView.module.css:82-90(.avatar),src/Avatar.module.css:39-44(avatar fills 100% of its box,aspect-ratio:1/1,border-radiuscircular)src/tile/MediaView.module.css:64-79,src/tile/MediaView.tsx:145-151Problem
.lotusDecorationand.avatarare both centered, absolutely positioned, and sized to the exact same50cqmin × 50cqminbox. The underlyingAvatarcomponent fills 100% of that box with a circle that touches all four edges (no inset). A "frame"-style decoration image therefore has no room to extend past the avatar's edge — the ring artwork is forced into the same square the avatar circle already fully occupies, so it will visually overlap/clip against the avatar instead of surrounding it with a gap. Compare this to the host side: cinny's ownAvatarDecoration.tsx(/root/code/cinny/src/app/components/avatar-decoration/AvatarDecoration.tsx) renders the same decoration images with an explicitDEFAULT_INSET = 8px outward inset on all four sides (top:-inset, left:-inset, width:calc(100% + inset*2)…), i.e. the decoration is deliberately larger than the avatar everywhere else the roster is used. The EC in-call tile is the only place in the stack that renders it 1:1 with no outward bleed.Related finding:
.lotusDecorationuses exactly50cqmin— the same box as.avatar. cinny renders the same asset at100% + 2*inset(default 8px) so frame-style decorations sit around the avatar; at 1:1 they overlap and crop it, so in-call decorations look different from the ones everywhere else in the app. The EC<img>also lacks theonErrorhide that cinny added, so a 404 from the CDN (easy to reach given the unvalidated slug above) leaves a broken-image element over the avatar in browsers that render one foralt="".How to trigger
Any call where the host pushes an
io.lotus.decorationsroster entry for a participant whose avatar is visible (video off). Reproducible statically by comparing box dimensions in the two components; visually confirms on any tile size/spotlight since the sizing iscqmin-relative and thus proportionally wrong everywhere.Also: any participant with a frame-style decoration, camera off; compare an in-call tile with the same user's avatar in the member list.
Suggested fix
Give
.lotusDecorationan outward inset matching cinny's convention, e.g. size it to~116-125%of the avatar box (or add a fixed px/cqmininset like cinny's 8px) instead of matching.avatar's box exactly, so the frame artwork bleeds outside the avatar circle as intended.Also: size the overlay proportionally larger than the avatar (e.g.
62cqmin, matching cinny's inset ratio) and hide the image onerror.Filed from the September 2026 audit (branch
lotus).