From 34edfc662e1df560dcee0fd41b1e94edfb5b74f8 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Mon, 28 Sep 2026 09:23:06 +0200 Subject: [PATCH] Il precedente fix dello swipe non bastava: guarda anche offset.y MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dragDirectionLock non ha effetto quando drag è già vincolato a un solo asse ("x"): il gesto veniva comunque interpretato come swipe orizzontale sulla sola velocity.x, rumorosa nei flick verticali veloci (bug visto sia verso Obiettivi che verso Rosa, segno che il rumore cambiava segno). Ora onDragEnd ignora il gesto se lo spostamento verticale (offset.y) è maggiore di quello orizzontale (offset.x): uno scroll resta sempre dominante in verticale, uno swipe intenzionale in orizzontale. Co-Authored-By: Claude Sonnet 5 --- src/components/crapp/BarraSottosezioni.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/crapp/BarraSottosezioni.tsx b/src/components/crapp/BarraSottosezioni.tsx index b9a19b7..e083034 100644 --- a/src/components/crapp/BarraSottosezioni.tsx +++ b/src/components/crapp/BarraSottosezioni.tsx @@ -149,13 +149,14 @@ export function BarraSottosezioni({ // Sui device deboli lo swipe orizzontale (pointer listener + hit-testing // ad ogni frame) resta disattivato: si cambia tab solo toccando la barra. drag={ridotto ? false : "x"} - // Blocca il gesto sull'asse dominante iniziale: uno scroll verticale veloce - // (con la solita deriva orizzontale del dito) non deve far scattare il cambio tab. - dragDirectionLock dragConstraints={{ left: 0, right: 0 }} dragElastic={0.12} dragMomentum={false} onDragEnd={(_, info) => { + // Uno scroll verticale (anche veloce) ha sempre offset.y ben maggiore di + // offset.x: la velocity.x, invece, può essere rumorosa su gesti rapidi e da + // sola non basta a distinguere uno swipe reale da un semplice scroll in giù. + if (Math.abs(info.offset.x) <= Math.abs(info.offset.y)) return; const arrivo = info.offset.x + proietta(info.velocity.x); if (arrivo < -60) vaiA(indice + 1); else if (arrivo > 60) vaiA(indice - 1);