2026-06-15 23:52:28 +00:00
|
|
|
import { onMount } from "solid-js";
|
2026-04-22 15:40:44 +02:00
|
|
|
import gsap from "gsap";
|
|
|
|
|
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
|
|
|
|
|
|
|
|
|
gsap.registerPlugin(ScrollTrigger);
|
|
|
|
|
|
|
|
|
|
interface ScrollRevealOptions {
|
|
|
|
|
y?: number;
|
|
|
|
|
x?: number;
|
|
|
|
|
duration?: number;
|
|
|
|
|
delay?: number;
|
|
|
|
|
stagger?: number;
|
|
|
|
|
start?: string;
|
|
|
|
|
ease?: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useScrollReveal<T extends HTMLElement>(
|
|
|
|
|
options: ScrollRevealOptions = {}
|
|
|
|
|
) {
|
2026-06-15 23:52:28 +00:00
|
|
|
let ref: T | undefined;
|
2026-04-22 15:40:44 +02:00
|
|
|
|
2026-06-15 23:52:28 +00:00
|
|
|
onMount(() => {
|
|
|
|
|
const el = ref;
|
2026-04-22 15:40:44 +02:00
|
|
|
if (!el) return;
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
y = 40,
|
|
|
|
|
x = 0,
|
|
|
|
|
duration = 0.8,
|
|
|
|
|
delay = 0,
|
|
|
|
|
stagger = 0.1,
|
|
|
|
|
start = "top 85%",
|
|
|
|
|
ease = "power3.out",
|
|
|
|
|
} = options;
|
|
|
|
|
|
|
|
|
|
const children = el.children.length > 0 ? el.children : [el];
|
|
|
|
|
|
|
|
|
|
gsap.set(children, { opacity: 0, y, x });
|
|
|
|
|
|
|
|
|
|
const tween = gsap.to(children, {
|
|
|
|
|
opacity: 1,
|
|
|
|
|
y: 0,
|
|
|
|
|
x: 0,
|
|
|
|
|
duration,
|
|
|
|
|
delay,
|
|
|
|
|
stagger,
|
|
|
|
|
ease,
|
|
|
|
|
scrollTrigger: {
|
|
|
|
|
trigger: el,
|
|
|
|
|
start,
|
|
|
|
|
toggleActions: "play none none none",
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
tween.kill();
|
|
|
|
|
ScrollTrigger.getAll().forEach((st) => {
|
|
|
|
|
if (st.trigger === el) st.kill();
|
|
|
|
|
});
|
|
|
|
|
};
|
2026-06-15 23:52:28 +00:00
|
|
|
});
|
2026-04-22 15:40:44 +02:00
|
|
|
|
2026-06-15 23:52:28 +00:00
|
|
|
return (el: T) => {
|
|
|
|
|
ref = el;
|
|
|
|
|
};
|
2026-04-22 15:40:44 +02:00
|
|
|
}
|