fix: use timestamp guard instead of rAF for mobile backdrop click

On first page load on mobile, the synthetic mousedown from a tap can
arrive ~300ms after the touch event — well after a single
requestAnimationFrame (~16ms). Replace the rAF-based overlayReady
guard with a 400ms timestamp check from mount time to reliably
ignore stale synthetic events on slow first loads.

https://claude.ai/code/session_018DYwSysqysMmaRi5XkqTpo
This commit is contained in:
Claude
2026-03-12 09:30:47 +01:00
committed by Fred Cabassut
parent e08a4883f1
commit c411975bb9
+5 -13
View File
@@ -179,21 +179,13 @@
// On mobile, the tap that opens the editor produces synthetic mouse events
// (mousedown → mouseup → click) at the original touch coordinates. If those
// coordinates land on the overlay backdrop, the editor would close instantly.
// Guard against this by ignoring mousedowns that arrive within the first
// animation frame after mount.
let overlayReady = false;
$effect(() => {
const id = requestAnimationFrame(() => {
overlayReady = true;
});
return () => {
overlayReady = false;
cancelAnimationFrame(id);
};
});
// On first page load, synthetic mousedown can arrive ~300ms after the tap
// (well after a single rAF). Use a timestamp guard to ignore early events.
const mountTime = Date.now();
const OVERLAY_READY_DELAY = 400;
function handleOverlayMousedown(e: MouseEvent) {
if (!overlayReady) return;
if (Date.now() - mountTime < OVERLAY_READY_DELAY) return;
mousedownOnOverlay = e.target === e.currentTarget;
}