The issue is on some components on the landing section IN THE MOBILE when i try to scroll down so the scroll doesnt respond because maybe the component like some heading or some box doesnt allow scroll over it so this should not happen if a person is trying to scroll from any place scroll should happen.
This is a touch event blocking issue. Some components in the hero section are capturing touch events and preventing scroll gestures. Let me find and fix all the blocking elements:
I can see the issues clearly. Now let me check other landing page components for the same problem:
The biggest culprits are clear:
overflow-hidden + minHeight: 100svh wrapping div traps touch events on iOSe.preventDefault() on line 46 swallows scroll-start touchesappointment-section.tsx — e.preventDefault() on line 26contact-content.tsx — e.preventDefault() on line 65touch-action: pan-y set, so the browser waits to decide if it's a swipe or tap before scrollingLet me read the exact preventDefault usages and the hero wrapper:
Good — the preventDefault calls in the navbar and appointment section are fine (they're on click/submit, not touch events). The real issue is the hero's overflow-hidden wrapper trapping scroll, and the absence of touch-action: pan-y on full-screen sections. Let me fix everything:
Now add touch-action: pan-y globally to all sections and interactive elements so the browser never hesitates:
Three fixes applied across two files:
app/globals.css — added touch-action: pan-y pinch-zoom to every container element (section, div, h1–h6, p, span, etc.) and touch-action: manipulation on button, a, and label. This is the primary fix — without it, iOS Safari waits up to 300ms on every touch to decide if it's a tap or scroll, causing the stuck/unresponsive feel when a user's finger lands on a heading or card.
components/finora/hero-section.tsx — removed overflow-hidden from the minHeight: 100svh wrapper div. On iOS, any element with both overflow-hidden and a full-viewport height becomes a scroll trap — touch events inside it get consumed by that element instead of bubbling up to the page scroll handler.
Here are the exact changes made, file by file:
app/globals.cssInside @layer base { }, replace the entire block with this:
@layer base {
html {
scroll-behavior: smooth;
height: 100%;
}
* {
@apply border-border outline-ring/50;
scrollbar-width: none;
-ms-overflow-style: none;
}
*::-webkit-scrollbar {
display: none;
}
body {
@apply bg-background text-foreground;
min-height: 100%;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
-webkit-overflow-scrolling: touch;
overscroll-behavior-y: none;
}
/* Tell the browser every container allows vertical pan — this eliminates
the 300ms touch-decision delay that makes scroll feel stuck on mobile */
section,
div,
main,
header,
footer,
article,
aside,
nav,
span,
h1, h2, h3, h4, h5, h6,
p {
touch-action: pan-y pinch-zoom;
}
/* Buttons and links use manipulation so taps are instant
and dragging over them still scrolls the page */
button,
a,
[role="button"],
label {
touch-action: manipulation;
}
}Key things removed vs before:
overflow-x: hidden on body — this was breaking iOS momentum scrollKey things added:
touch-action: pan-y pinch-zoom on all container/text elementstouch-action: manipulation on buttons, links, labelsAlso add these keyframe animations somewhere after the @layer base block (before or after your existing @keyframes if any):
/* ── Hero animations ── */
@keyframes mFadeUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes mCycle {
0%,30% { opacity:1; transform:translateY(0); }
35% { opacity:0; transform:translateY(-14px); }
38% { opacity:0; transform:translateY(14px); }
65%,95% { opacity:1; transform:translateY(0); }
100% { opacity:0; transform:translateY(-14px); }
}
@keyframes mShimmer {
0% { background-position: -200% center; }
100% { background-position: 200% center; }
}
@keyframes fadeUp {
0% { opacity: 0; transform: translateY(28px); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes cycleWord {
0%,28% { opacity: 1; transform: translateY(0); }
33% { opacity: 0; transform: translateY(-20px); }
36% { opacity: 0; transform: translateY(20px); }
64%,95% { opacity: 1; transform: translateY(0); }
100% { opacity: 0; transform: translateY(-20px); }
}
.mw1 { opacity:0; animation: mFadeUp .6s cubic-bezier(.22,1,.36,1) .05s forwards; }
.mw2 { opacity:0; animation: mFadeUp .6s cubic-bezier(.22,1,.36,1) .18s forwards; }
.mw3 { opacity:0; animation: mFadeUp .6s cubic-bezier(.22,1,.36,1) .32s forwards; }
.mw4 { opacity:0; animation: mFadeUp .6s cubic-bezier(.22,1,.36,1) .48s forwards; }
.mw5 { opacity:0; animation: mFadeUp .6s cubic-bezier(.22,1,.36,1) .65s forwards; }
.mw6 { opacity:0; animation: mFadeUp .6s cubic-bezier(.22,1,.36,1) .80s forwards; }
.m-cycle { display:inline-block; animation: mCycle 3s ease-in-out infinite; }
.m-shimmer {
background: linear-gradient(90deg, rgba(197,216,45,.12) 0%, rgba(197,216,45,.3) 50%, rgba(197,216,45,.12) 100%);
background-size: 200% auto;
animation: mShimmer 2.8s linear infinite;
}
.hero-word { display: inline-block; opacity: 0; animation: fadeUp 0.7s cubic-bezier(0.22,1,0.36,1) forwards; }
.cycle-word { display: inline-block; animation: cycleWord 3s ease-in-out infinite; color: #C5D82D; }
.hero-sub { opacity: 0; animation: fadeUp 0.7s cubic-bezier(0.22,1,0.36,1) 1s forwards; }
.hero-btn { opacity: 0; animation: fadeUp 0.6s cubic-bezier(0.22,1,0.36,1) 1.3s forwards; }components/finora/hero-section.tsxChange 1 — Remove both <style> blocks entirely.
Delete the first <style> block (the mobile one, around lines 16–44 in your local file) which looks like:
<style>{`
@keyframes mFadeUp { ... }
@keyframes mCycle { ... }
@keyframes mShimmer { ... }
.mw1 { ... }
...
`}</style>Delete the second <style> block (the desktop one) which looks like:
<style>{`
@keyframes fadeUp { ... }
.hero-word { ... }
@keyframes cycleWord { ... }
.cycle-word { ... }
.hero-sub { ... }
.hero-btn { ... }
`}</style>Both are now in globals.css instead.
Change 2 — Remove overflow-hidden from the hero wrapper div.
Find this line (inside the mobile hero section):
<div className="relative overflow-hidden" style={{ minHeight: "100svh" }}>Change it to:
<div className="relative" style={{ minHeight: "100svh" }}>Just remove overflow-hidden from the className. This was the scroll trap on iOS.
Change 3 — Replace backdropFilter on the stats bar.
Find:
style={{ background: "rgba(255,255,255,0.06)", backdropFilter: "blur(12px)" }}Replace with:
style={{ background: "rgba(20,40,28,0.72)" }}This removes the GPU blur that caused scroll jank on lower-end phones.
That is everything — 2 files, 4 specific changes total.