diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 82cb057..9533254 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -16,7 +16,7 @@ export default function Home() {

mediaQuery.removeEventListener('change', handler); }, []); - // On small screens the monitor and streamers have nowhere to sit without crossing - // the hero text, and the scroll parallax drags them over it. Use the static glow - // there instead. + // Track the mobile breakpoint so the monitor can be re-anchored and the parallax + // swapped for a fade. useEffect(() => { const mq = window.matchMedia('(max-width: 767px)'); setIsMobile(mq.matches); @@ -176,9 +184,8 @@ export const NebulaField = ({ className, density = 8, themeMode = 'dark', positi background: `radial-gradient(circle at center, ${glowColor} 0%, transparent 70%)`, } as const; - // Static background for reduced-motion users and small screens (still Cherenkov-tinted, - // with no monitor or streamers to overlap the hero text). - if (prefersReducedMotion || isMobile) { + // Return static background for reduced motion users (still tinted Cherenkov blue, no motion). + if (prefersReducedMotion) { return (
- {/* Base Cherenkov gradient wash */} + {/* Base Cherenkov gradient wash (always on; only the active layer below fades) */}
+ {/* Monitor + streamers + glow. On mobile this layer glides up and fades as the + hero scrolls away, so it never crosses the content below. */} + + {/* Slowly-pulsing Cherenkov "reactor pool" bloom */} @@ -244,7 +255,7 @@ export const NebulaField = ({ className, density = 8, themeMode = 'dark', positi viewBox="0 0 100 100" preserveAspectRatio="none" className="w-full h-full opacity-50 dark:opacity-70 absolute inset-0" - style={{ y: yRange }} + style={{ y: parallaxY }} > {paths.map((d: string, i: number) => ( ))} +
); };