ComponentsAboutContactPrivacyTerms

Built by Lacy Morrow

    Close file
    Close file
    Close file
    Close file
    '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,
          }}
        />
      );
    }