feat: add animated number transitions to dashboard stats

Numbers smoothly count up/down when switching date ranges,
applying filters, or as real-time visitor count changes.
Uses framer-motion useSpring for natural spring physics.
This commit is contained in:
Usman Baig
2026-03-15 21:37:11 +01:00
parent df2b3cadd7
commit c21d7b9073
4 changed files with 40 additions and 3 deletions

View File

@@ -0,0 +1,29 @@
'use client'
import { useEffect, useRef } from 'react'
import { useMotionValue, useSpring, useTransform, motion } from 'framer-motion'
interface AnimatedNumberProps {
value: number
format: (v: number) => string
className?: string
}
export function AnimatedNumber({ value, format, className }: AnimatedNumberProps) {
const motionValue = useMotionValue(value)
const spring = useSpring(motionValue, { stiffness: 120, damping: 20, mass: 0.5 })
const display = useTransform(spring, (v) => format(Math.round(v)))
const isFirst = useRef(true)
useEffect(() => {
if (isFirst.current) {
// Skip animation on initial render — jump straight to value
motionValue.jump(value)
isFirst.current = false
} else {
motionValue.set(value)
}
}, [value, motionValue])
return <motion.span className={className}>{display}</motion.span>
}