"use client"; import { HTMLAttributes, useEffect, useRef } from "react"; import { cn } from "@/utils/cn"; import { setIntervalOnVisible } from "@/utils/set-timeout-on-visible"; import data from "./explosion-data.json"; interface SubtleExplosionProps extends HTMLAttributes { interval?: number; delay?: number; opacity?: number; } export function SubtleExplosion({ interval = 80, delay = 30, opacity = 0.08, className, ...attrs }: SubtleExplosionProps) { const ref = useRef(null); const wrapperRef = useRef(null); useEffect(() => { let index = -delay; const animate = () => { index++; if (index >= data.length) index = -delay; if (index < 0) return; if (ref.current) { ref.current.innerHTML = data[index]; } }; const cleanup = setIntervalOnVisible({ element: wrapperRef.current, callback: animate, interval, }); return () => cleanup?.(); }, [interval, delay]); return (
); }