// Body for the room media viewer — mounted inside both the mobile // `MobileMediaViewerHorseshoe` panel-body and the desktop floating // `RoomViewMediaWindow`. Owns: // • Resolving + decrypting the media URL for the current entry, // including revoke-on-unmount for blob URLs we create. // • Zoom for images (button row + `+`/`-`/`0` keys). // • Mouse-drag pan when zoomed, with bounds clamping so the // image can't be dragged off the stage. // • Multi-media navigation: prev / next via on-screen chevrons, // keyboard arrows, and horizontal swipe (image only — video // keeps its native seekbar drag). // • Programmatic `