'use client';
import { motion, SpringOptions, useScroll, useSpring } from 'motion/react';
import { cn } from '@/lib/utils';
import { RefObject } from 'react';
export type ScrollProgressProps = {
className?: string;
springOptions?: SpringOptions;
containerRef?: RefObject<HTMLDivElement>;
};
const DEFAULT_SPRING_OPTIONS: SpringOptions = {
stiffness: 200,
damping: 50,
restDelta: 0.001,
};
export function ScrollProgress({
className,
springOptions,
containerRef,
}: ScrollProgressProps) {
const { scrollYProgress } = useScroll({
container: containerRef,
layoutEffect: Boolean(containerRef?.current),
});
const scaleX = useSpring(scrollYProgress, {
...DEFAULT_SPRING_OPTIONS,
...(springOptions ?? {}),
});
return (
<motion.div
className={cn('inset-x-0 top-0 h-1 origin-left', className)}
style={{
scaleX,
}}
/>
);
}