The z-order gate added last round asked `el.contains(elementFromPoint(x, y))`
— "is the thing painted here mine?" — and was handed `TerminalView`'s inner
xterm host while every overlay in that pane is a *sibling* of it. So any point
under the pane's own chrome answered "not mine" and the drop was refused, with
no message and no log line. The "▼ Following / ▽ Paused" toggle is rendered
unconditionally at `absolute top-2 right-4`, and `ToastHost` is `fixed
bottom-4 right-4` 24rem wide with error cards that never time out: two corners
of the terminal, and one of the Files pane, that could not accept a file for
as long as the app was running.
It shipped green because jsdom has no `elementFromPoint`, so not one of the 81
drop tests entered that branch. The tests here install one.
The question the gate asks is now "is a *blocking overlay* painted here?".
Chrome the pane paints over itself is not one; a dialog backdrop is, and
`ui/Modal` marks its own backdrop so the element `elementFromPoint` actually
returns is the one carrying the marker. `classifyDrop` also separates "aimed at
me and swallowed" from "not my drop", so the first gets a toast and a log line
and the second stays silent.
Three defects around it:
- **A dialog now refuses only the points it covers.** `dropIsBlocked` is
document-wide and `ui/Modal` portals to `document.body`, so any open dialog
refused every drop in the window. The deeper half of that is that a dialog
opened in project A really was still on screen after a tab switch — the pane
hides itself with a `hidden` class, which a portal does not inherit — so
`PaneVisibility` lets `App` tell a `Modal` its pane stepped aside, and a
hidden one paints nothing, traps no focus, answers no Escape and blocks no
drop while staying mounted with its state intact.
- **`devicePixelRatio` is applied on Windows only.** Only wry's WebView2
backend hands over physical pixels; the macOS and GTK ones deliver logical
points and `tauri-runtime-wry` does not rescale them. Halving those was
survivable while the test was a bare rect and is a refused drop once z-order
joins in. Read from the wry/tauri sources, not verified on a HiDPI Mac or
GTK box.
- **`isFileExistsError` can no longer be forged by a filename.** It matched
`fileexists` anywhere in a normalised error, so uploading a host file called
`file-exists.txt` turned *any* failure into a collision — and Replace
re-invoked the upload with `overwrite: true`. The marker now has to stand
alone in the backend's canonical form, or be a whole discriminant value.
- **A refused compaction or cache-clear keeps its dialog.** `reclaim` reports
refusals inside `Ok`, so "did it throw" read one as success: the dialog
closed, the tick list was dropped, and the explanation appeared in the
outcome panel several screens above the row that was clicked. The dialog now
stays put and renders the backend's own sentence verbatim.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GBq2rGum6GX7xXgsas1fDc