"use client" import { useRef, type HTMLAttributes, type ReactNode } from "react"; import { SplitText } from "gsap/SplitText"; import gsap from 'gsap' import { cn } from "~/lib/utils"; import { useReveal } from "./useReveal"; const AnimateTextIn = ({ children, animation = "type", position = 0, speed = 1, scrollOnly = false, once = false, debugId, className }: { children: ReactNode, animation?: "type" | "slide", position?: gsap.Position, scrollOnly?: boolean, once?: boolean, debugId?: string, speed?: number, className?: HTMLAttributes['className'] }) => { const el = useRef(null) useReveal(el, { position, scrollOnly, once, debugId: debugId ?? `text-${position}`, makeReveal: (node) => { // The wrapper starts at opacity 0 (so there's no flash of unsplit text); // reveal the wrapper and let the per-character tween do the animation. gsap.set(node, { opacity: 1 }) const split = new SplitText(node, { type: 'chars' }) const fromVars = animation === "slide" ? { opacity: 0, x: -10, duration: 0.2 * speed, stagger: { each: 0.08 * speed }, ease: 'bounce.inOut' } : { opacity: 0, duration: 0.01 * speed, stagger: { each: 0.04 * speed }, ease: 'bounce.inOut' } return gsap.from(split.chars, { ...fromVars, paused: true }) }, }) return (
{children}
) } export default AnimateTextIn;