src/components/animated-number.tsx
Rama main · réplica de lectura del repositorio original.
"use client";
import { useEffect, useRef, useState } from "react";
import { animate, useInView } from "framer-motion";
export function AnimatedNumber({
value,
duration = 0.9,
suffix = "",
}: {
value: number;
duration?: number;
suffix?: string;
}) {
const ref = useRef<HTMLSpanElement>(null);
const inView = useInView(ref, { once: true, margin: "-40px" });
const [display, setDisplay] = useState(0);
useEffect(() => {
if (!inView) return;
const controls = animate(0, value, {
duration,
ease: [0.16, 1, 0.3, 1],
onUpdate: (latest) => setDisplay(Math.round(latest)),
});
return () => controls.stop();
}, [inView, value, duration]);
return (
<span ref={ref} className="tabular-nums">
{display}
{suffix}
</span>
);
}