feat: initialize portfolio site with core components, pages, and content structure, and update Next.js configuration.
This commit is contained in:
1 parent
223746b898
commit
d00258dcd1
22 files changed
+1512
-8038
No files matched your search
@@ -1,40 +1,69 @@
|
||||
"use client";
|
||||
|
||||
import type { ReactNode } from "react";
|
||||
import { useEffect, useRef } from "react";
|
||||
import Lenis from "lenis";
|
||||
import { gsap } from "gsap";
|
||||
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
||||
|
||||
gsap.registerPlugin(ScrollTrigger);
|
||||
|
||||
export function SmoothScrollProvider({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
children: ReactNode;
|
||||
}) {
|
||||
const lenisRef = useRef<Lenis | null>(null);
|
||||
const teardownRef = useRef<() => void>(() => {});
|
||||
|
||||
useEffect(() => {
|
||||
const lenis = new Lenis({
|
||||
duration: 1.2,
|
||||
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // Expo ease
|
||||
smoothWheel: true,
|
||||
});
|
||||
const prefersReducedMotion = window.matchMedia(
|
||||
"(prefers-reduced-motion: reduce)",
|
||||
).matches;
|
||||
const hasCoarsePointer = window.matchMedia("(pointer: coarse)").matches;
|
||||
|
||||
lenisRef.current = lenis;
|
||||
if (prefersReducedMotion || hasCoarsePointer) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Sincroniza Lenis com GSAP ScrollTrigger — critico para evitar dessync
|
||||
lenis.on("scroll", ScrollTrigger.update);
|
||||
let isMounted = true;
|
||||
|
||||
gsap.ticker.add((time) => {
|
||||
lenis.raf(time * 1000);
|
||||
});
|
||||
const setupSmoothScroll = async () => {
|
||||
const [{ default: Lenis }, { gsap }, { ScrollTrigger }] =
|
||||
await Promise.all([
|
||||
import("lenis"),
|
||||
import("gsap"),
|
||||
import("gsap/ScrollTrigger"),
|
||||
]);
|
||||
|
||||
gsap.ticker.lagSmoothing(0);
|
||||
if (!isMounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
gsap.registerPlugin(ScrollTrigger);
|
||||
|
||||
const lenis = new Lenis({
|
||||
duration: 1.2,
|
||||
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
|
||||
smoothWheel: true,
|
||||
});
|
||||
|
||||
const handleScroll = () => ScrollTrigger.update();
|
||||
const tick = (time: number) => {
|
||||
lenis.raf(time * 1000);
|
||||
};
|
||||
|
||||
lenis.on("scroll", handleScroll);
|
||||
gsap.ticker.add(tick);
|
||||
gsap.ticker.lagSmoothing(0);
|
||||
|
||||
teardownRef.current = () => {
|
||||
lenis.off?.("scroll", handleScroll);
|
||||
gsap.ticker.remove(tick);
|
||||
lenis.destroy();
|
||||
};
|
||||
};
|
||||
|
||||
void setupSmoothScroll();
|
||||
|
||||
return () => {
|
||||
lenis.destroy();
|
||||
gsap.ticker.remove((time) => lenis.raf(time * 1000));
|
||||
isMounted = false;
|
||||
teardownRef.current();
|
||||
teardownRef.current = () => {};
|
||||
};
|
||||
}, []);
|
||||
|
||||
|
||||
Reference in new issue
Block a user