Eccoci, zio. Hai fatto benissimo a forzarmi la mano: io sono qui per scavare nel codice e risolvere i problemi veri. Ora che mi hai passato il codice sorgente in chiaro[cite: 4], ho potuto fare una vera e propria autopsia ai tuoi file principali.
Ho analizzato il tuo index.css, la configurazione di Vite e soprattutto le varie versioni di EdilSkyLanding.tsx[cite: 4]. I problemi che stai riscontrando su mobile sono tutti lì, scritti nero su bianco.
Ecco la diagnosi esatta e la cura definitiva per i tuoi tre problemi principali.
Ho trovato il colpevole. Nel tuo EdilSkyLanding.tsx, hai questa struttura principale[cite: 4]:
<div ref={scrollRef} className="h-screen overflow-y-scroll snap-y snap-mandatory bg-black text-white overflow-x-hidden">
<section className="relative h-[100vh] h-screen snap-start">
<motion.div style={{ scale: zoom, rotateX: tilt }} className="sticky top-0 h-screen overflow-hidden perspective-[1200px]">Il problema: Usi h-screen e h-[100vh] ovunque[cite: 4]. Su mobile, ogni volta che fai scroll, la barra degli indirizzi del browser (Safari/Chrome) si ritira o riappare. Questo cambia fisicamente l'altezza del viewport (vh), forzando React e Framer Motion a ricalcolare tutto il layout in tempo reale. Il risultato è che lo scroll "scatta" e l'esperienza fa schifo.
La Soluzione:
Devi sostituire TUTTI gli h-screen e h-[100vh] con le unit dinamiche (dvh). Modifica il tuo wrapper principale e le tue section così:
{/* 1. Sostituisci nel contenitore principale */}
<div ref={scrollRef} className="h-[100dvh] overflow-y-scroll snap-y snap-mandatory bg-black text-white overflow-x-hidden">
{/* 2. Sostituisci nelle section */}
<section className="relative h-[100dvh] snap-start">
{/* 3. Sostituisci negli elementi sticky */}
<motion.div style={{ scale: zoom, rotateX: tilt }} className="sticky top-0 h-[100dvh] overflow-hidden perspective-[1200px]">Sempre nel tuo EdilSkyLanding.tsx, ho notato che usi snap-y snap-mandatory sul container principale che governa lo scroll[cite: 4].
Framer Motion (specialmente con l'hook useScroll) e il CSS Scroll Snapping nativo sono spesso in guerra sui dispositivi touch. Il dito vuole andare fluido, ma il CSS lo "strappa" per forzarlo alla sezione successiva, creando dei lag visivi spaventosi.
La Soluzione: Se vuoi mantenere la fluidità cinematografica legata allo scroll, ti consiglio di disabilitare lo snap su mobile e lasciarlo solo su desktop, oppure ammorbidirlo:
- Cambia la classe in:
snap-y sm:snap-mandatory snap-proximity
Ho analizzato il tuo src/index.css e src/App.css[cite: 4]. Hai fatto un ottimo lavoro inserendo -webkit-tap-highlight-color: transparent;[cite: 4], ma ti manca la regola d'oro per spegnere gli hover sui dispositivi touch. Su mobile, quando tocchi un bottone (come il tuo "Richiedi sopralluogo"[cite: 4]), lo stato :hover si attiva e rimane incastrato.
La Soluzione:
Aggiungi in fondo al tuo src/index.css questo blocco preciso per la v4 di Tailwind:
/* Spegne gli hover nativi sui dispositivi touch */
@media (hover: none) {
*:hover {
transform: none !important;
background-color: inherit;
border-color: inherit;
color: inherit;
}
}
/* Fix per i drag orizzontali di Framer Motion */
.touch-pan-y {
touch-action: pan-y !important;
}Anche se non mi hai postato tutto il codice completo di FX_DraggableSlider, ho visto il tuo FX_VelocityGallery.tsx[cite: 4]. Quando su mobile cerchi di trascinare qualcosa in orizzontale, e il movimento non è perfettamente dritto, il telefono cerca di fare scroll in giù, bloccando l'animazione di Framer.
La Soluzione:
Assicurati che qualsiasi contenitore che usi per fare drag in Framer Motion abbia la classe touch-pan-y. Questo dice al telefono: "Consenti lo scroll in giù, ma lascia che Framer gestisca il movimento orizzontale".
Zio, il tuo codice è scritto da paura: stai usando Tailwind v4 (@tailwindcss/vite e tailwindcss 4.2.2[cite: 4]), React 19[cite: 4], e componenti super complessi. Questi non sono bug "tuoi", sono accorgimenti di fino per l'ingegneria mobile.
Fai un "Trova e Sostituisci" di h-screen con h-[100dvh] su tutti i tuoi file FX_*.tsx e inserisci quel CSS. Vedrai che il cantiere smette di tremare.
Vuoi che ti riscriva interamente uno di questi EdilSkyLanding.tsx con i fix applicati per usarlo come "Master Template" da copiare?
Daje zio! Questo è lo spirito giusto. Il vero dev si vede quando decide di mettere le mani in pasta e sporcarsi di calce.
Ti lascio il piano di volo rapido per la tua sessione di "Trova e Sostituisci" tattico:
- Il cecchino del viewport: Fai fuori tutti gli
h-screeneh-[100vh], e rimpiazzali conh-[100dvh]. - Il CSS killer: Piazza quel blocco in
index.cssper spegnere gli hover fantasma e i flash blu su touch. - Il fluido: Trasforma
snap-mandatoryinsnap-proximity(o spegnilo su mobile) e sparatouch-pan-ysui container dove devi strisciare col dito in orizzontale.
Io rimango qua in postazione con l'imbracatura allacciata. Smucina tutto, fai il collaudo pesante da smartphone e quando hai finito torna a dirmi se il cantiere finalmente è stabile e fluido come l'olio.
Buon lavoro e spacca tutto! 🚀🛠️🏗️
Bene zio, andiamo a sistemare i file CSS generati nella cartella dist. Questo ci permette di applicare i fix per il mobile senza toccare l'ambiente di sviluppo se non vuoi.
Il file che ci interessa è dist/main-k2WQW_1E.css. Al suo interno sono contenuti tutti gli stili Tailwind compilati, inclusi quelli di reset e le classi custom.
Cerca questa sezione nel file (dovrebbe trovarsi verso l'inizio, subito dopo il lungo blocco di variabili --tw-... e i selettori base di HTML):
html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}Aggiungi subito dopo questo blocco il fix per disabilitare gli hover sui dispositivi touch. È la modifica più sicura e globale.
/* Fix per Hover Fantasma su Mobile */
@media (hover: none) {
*:hover {
transform: none !important;
background-color: inherit !important;
border-color: inherit !important;
color: inherit !important;
}
}Ora passiamo al problema del resize. Questo è più insidioso. Invece di cercare e sostituire h-screen e min-h-screen in tutto il CSS (cosa che potrebbe spaccare altre cose), aggiungiamo una regola globale che forza l'altezza del body e dell'html a usare i dvh, e un'utility class che sovrascrive h-screen se usata.
Aggiungi queste regole in fondo al tuo file CSS (o dove preferisci, purché non dentro una media query):
/* Fix per il Resize su Mobile (Dynamic Viewport Height) */
html, body {
height: 100%;
height: 100dvh;
}
/* Questa utility forza il 100dvh su tutti gli elementi che usano h-screen */
.h-screen {
height: 100vh !important; /* Fallback per vecchi browser */
height: 100dvh !important;
}
.min-h-screen {
min-height: 100vh !important;
min-height: 100dvh !important;
}- Aggiungi il blocco
@media (hover: none) { ... }per disabilitare gli hover sui touchscreen. - Aggiungi il blocco
html, body { ... }e le classi.h-screen,.min-h-screenper forzare l'utilizzo di100dvhe prevenire i salti di layout.
Nota bene: Queste modifiche al file compilato (dist/main-k2WQW_1E.css) andranno perse la prossima volta che farai una build (npm run build). Se vuoi che i fix siano permanenti, dovrai applicare le stesse modifiche al tuo file sorgente src/index.css (o dove definisci i tuoi stili custom) e ricostruire il progetto.