fix: kill horizontal overflow on mobile

Add `overflow-x: clip` to main/section/header/footer/nav so decorative
absolutely-positioned glow elements (dcta-glow, brand-card-glow,
cap-tile-glow) can't bubble their bounds up to body.scrollWidth.
Without this, body extended ~168px past viewport at 360px width,
producing right-side empty gap and horizontal scroll on Android Chrome.

Also stack 2-col grids on narrow viewports in ExclusiveAccessSection,
FounderSection, and IndustryUseCases stats row to prevent cramped
or overflowing content under 640px.

Verified via Playwright at 320/360/375/390/411/414/480 — body.scrollWidth
now equals viewport at all widths.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Najjar\NajjarV02 2026-05-22 10:10:09 +04:00
parent e8f3bf8686
commit c667736ee6
4 changed files with 37 additions and 14 deletions

View File

@ -74,15 +74,17 @@ html,
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 100%;
max-width: 100%;
min-height: 100vh; min-height: 100vh;
background-color: var(--color-bg); background-color: var(--color-bg);
color: var(--color-text-primary); color: var(--color-text-primary);
font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
overflow-x: hidden; overflow-x: hidden;
overflow-x: clip;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
direction: ltr !important; direction: ltr !important;
unicode-bidi: isolate;
text-align: left; text-align: left;
} }
@ -713,7 +715,10 @@ html {
.light-sweep { animation: none !important; opacity: 0 !important; } .light-sweep { animation: none !important; opacity: 0 !important; }
} }
html, body { overflow-x: hidden; max-width: 100vw; } html, body { overflow-x: hidden; overflow-x: clip; max-width: 100%; }
/* Catch-all guard against horizontal overflow */
main, footer, nav, section, header { max-width: 100%; overflow-x: clip; }
/* === GLOBAL RESPONSIVE GUARDS === */ /* === GLOBAL RESPONSIVE GUARDS === */

View File

@ -93,9 +93,9 @@ export function ExclusiveAccessSection() {
{/* Right premium showroom grid */} {/* Right premium showroom grid */}
<div <div
className="exa-tiles"
style={{ style={{
display: 'grid', display: 'grid',
gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',
gap: '0.875rem', gap: '0.875rem',
minWidth: 0, minWidth: 0,
}} }}
@ -125,6 +125,14 @@ export function ExclusiveAccessSection() {
.exa-grid { .exa-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.exa-tiles {
grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 640px) {
.exa-tiles {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (min-width: 1024px) { @media (min-width: 1024px) {
.exa-grid { .exa-grid {
grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr); grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);

View File

@ -48,9 +48,9 @@ export function FounderSection() {
</div> </div>
<div <div
className="fs-pillars"
style={{ style={{
display: 'grid', display: 'grid',
gridTemplateColumns: 'repeat(2, 1fr)',
gap: '1rem', gap: '1rem',
}} }}
> >
@ -60,6 +60,17 @@ export function FounderSection() {
<Pillar value="Future" label="Smart, autonomous, intelligent" /> <Pillar value="Future" label="Smart, autonomous, intelligent" />
</div> </div>
</div> </div>
<style jsx>{`
.fs-pillars {
grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 640px) {
.fs-pillars {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
`}</style>
</div> </div>
); );
} }

View File

@ -61,14 +61,14 @@ export function IndustryUseCases({ limit }: { limit?: number }) {
<motion.ul <motion.ul
className="iu-stats" className="iu-stats"
role="list" role="list"
style={{ display: 'flex', flexDirection: 'row', flexWrap: 'nowrap', gap: '0.45rem', listStyle: 'none', margin: 0, padding: 0 }} style={{ listStyle: 'none', margin: 0, padding: 0 }}
initial={{ opacity: 0, y: 12 }} initial={{ opacity: 0, y: 12 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-10%' }} viewport={{ once: true, margin: '-10%' }}
transition={{ duration: 0.6, ease }} transition={{ duration: 0.6, ease }}
> >
{STATS.map((s) => ( {STATS.map((s) => (
<li key={s.label} className="iu-stat" style={{ flex: '1 1 0', minWidth: 0 }}> <li key={s.label} className="iu-stat">
<span className="iu-stat-value">{s.value}</span> <span className="iu-stat-value">{s.value}</span>
<span className="iu-stat-label">{s.label}</span> <span className="iu-stat-label">{s.label}</span>
</li> </li>
@ -90,15 +90,14 @@ export function IndustryUseCases({ limit }: { limit?: number }) {
gap: clamp(1.5rem, 3vw, 2.25rem); gap: clamp(1.5rem, 3vw, 2.25rem);
} }
/* STATS — always single row */ /* STATS — single column on mobile, single row on tablet+ */
.iu-stats { .iu-stats {
list-style: none; list-style: none;
margin: 0 0 clamp(0.5rem, 1.5vw, 1rem); margin: 0 0 clamp(0.5rem, 1.5vw, 1rem);
padding: 0; padding: 0;
display: flex; display: flex;
flex-direction: row; flex-direction: column;
flex-wrap: nowrap; gap: 0.55rem;
gap: 0.45rem;
} }
.iu-stat { .iu-stat {
position: relative; position: relative;
@ -106,9 +105,9 @@ export function IndustryUseCases({ limit }: { limit?: number }) {
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
gap: 0.22rem; gap: 0.22rem;
flex: 1; flex: 1 1 0;
min-width: 0; min-width: 0;
padding: 0.6rem 0.55rem; padding: 0.85rem 1rem;
border-radius: 14px; border-radius: 14px;
border: 1px solid rgba(120, 140, 255, 0.22); border: 1px solid rgba(120, 140, 255, 0.22);
background: background:
@ -167,8 +166,8 @@ export function IndustryUseCases({ limit }: { limit?: number }) {
position: relative; position: relative;
z-index: 1; z-index: 1;
} }
@media (min-width: 520px) { @media (min-width: 640px) {
.iu-stats { gap: 0.6rem; } .iu-stats { flex-direction: row; flex-wrap: nowrap; gap: 0.6rem; }
.iu-stat { padding: 0.72rem 0.85rem; gap: 0.28rem; border-radius: 16px; } .iu-stat { padding: 0.72rem 0.85rem; gap: 0.28rem; border-radius: 16px; }
} }
@media (min-width: 820px) { @media (min-width: 820px) {