Originally created by: kristofferR
Carrier treats any visible labelled role=dialog as a media viewer. Messenger also uses labelled dialogs for compact emoji, sticker, GIF, reaction, people, and other popovers inside its main surface.
When one of those compact dialogs matches, Carrier can restore Facebook's hidden global banner, change the header-height variable, and run media-control offset logic against the wrong surface. This is the same class of failure as a displaced emoji picker or a chat layout that shifts when a popover opens.
Classify actual full media viewers structurally and leave compact Messenger popovers untouched.
Tickets: #117
Tickets: #248
Tickets: #264
Tickets: #273
Tickets: #28
Originally posted by: kristofferR
Implemented and merged in PR [#273].
Carrier now identifies full media viewers using their geometry, media, and controls instead of treating every labelled dialog as a viewer. CSS and control positioning share the same marker. Compact and nested pickers, the main Messenger surface, and Carrier overlays are excluded; stale markers and offsets clear when viewers hide, change, or disappear. Tall screenshots and wide panoramas remain supported.
Validation passed: 465 Bun tests, 246 Rust tests, formatting, Clippy, typechecking, rebuilt inject bundles, and Linux/macOS/Windows CI. Browser fixtures cover three window widths, light/dark themes, both zoom paths from 30–200%, extreme image aspect ratios, and viewer lifecycle changes. The CI browser-launch hang was fixed by preferring the runner's configured stable Chrome and bounding subprocess execution.
Live Messenger and cross-platform WebView checks remain tracked in [#28]. Closing the implementation issue; this is merged to main, not yet included in a new release.
Related
Tickets:
#273Tickets:
#28Ticket changed by: kristofferR