ComponentsAboutContactPrivacyTerms

Built by Lacy Morrow

    Close file
    Close file
    Close file
    Close file
    'use client';
    import { cn } from '@/lib/utils';
    import { motion, SpringOptions, useSpring, useTransform } from 'motion/react';
    import { useEffect } from 'react';
    
    export type AnimatedNumberProps = {
      value: number;
      className?: string;
      springOptions?: SpringOptions;
      as?: React.ElementType;
    };
    
    export function AnimatedNumber({
      value,
      className,
      springOptions,
      as = 'span',
    }: AnimatedNumberProps) {
      const MotionComponent = motion.create(as as keyof JSX.IntrinsicElements);
    
      const spring = useSpring(value, springOptions);
      const display = useTransform(spring, (current) =>
        Math.round(current).toLocaleString()
      );
    
      useEffect(() => {
        spring.set(value);
      }, [spring, value]);
    
      return (
        <MotionComponent className={cn('tabular-nums', className)}>
          {display}
        </MotionComponent>
      );
    }