diff --git a/app/components/ClientProviders.tsx b/app/components/ClientProviders.tsx index ffb498d..d9c9eea 100644 --- a/app/components/ClientProviders.tsx +++ b/app/components/ClientProviders.tsx @@ -56,8 +56,15 @@ function GatedProviders({ const [deferredReady, setDeferredReady] = useState(false); useEffect(() => { if (!mounted) return; - const id = requestIdleCallback(() => setDeferredReady(true), { timeout: 5000 }); - return () => cancelIdleCallback(id); + // Safari < 16.4 lacks requestIdleCallback — fall back to setTimeout + let id: ReturnType | number; + if (typeof requestIdleCallback !== "undefined") { + id = requestIdleCallback(() => setDeferredReady(true), { timeout: 5000 }); + return () => cancelIdleCallback(id as number); + } else { + id = setTimeout(() => setDeferredReady(true), 1); + return () => clearTimeout(id); + } }, [mounted]); return ( diff --git a/app/components/ScrollFadeIn.tsx b/app/components/ScrollFadeIn.tsx index dd1194e..ae8ae45 100644 --- a/app/components/ScrollFadeIn.tsx +++ b/app/components/ScrollFadeIn.tsx @@ -24,6 +24,12 @@ export default function ScrollFadeIn({ children, className = "", delay = 0 }: Sc const el = ref.current; if (!el) return; + // Fallback for browsers without IntersectionObserver + if (typeof IntersectionObserver === "undefined") { + setIsVisible(true); + return; + } + const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) {