"use client"; import { HTMLAttributes, useEffect, useRef } from "react"; import { cn } from "@/utils/cn"; import { setIntervalOnVisible } from "@/utils/set-timeout-on-visible"; import data from "./grid-data.json"; interface SlateGridProps extends HTMLAttributes { interval?: number; color?: string; } export function SlateGrid({ interval = 200, color = "text-black-alpha-12", className, ...attrs }: SlateGridProps) { const ref = useRef(null); const wrapperRef = useRef(null); const frameIndex = useRef(0); useEffect(() => { const animate = () => { if (ref.current) { ref.current.innerHTML = data[frameIndex.current]; frameIndex.current = (frameIndex.current + 1) % data.length; } }; // Initialize first frame animate(); const cleanup = setIntervalOnVisible({ element: wrapperRef.current, callback: animate, interval, }); return () => cleanup?.(); }, [interval]); return (
); }